diff --git a/.editorconfig b/.editorconfig index 61696372..1c96e937 100644 --- a/.editorconfig +++ b/.editorconfig @@ -14,6 +14,10 @@ ij_smart_tabs = false ij_visual_guides = none ij_wrap_on_typing = false +[*.yml] +indent_size = 2 +tab_width = 2 + [*.blade.php] ij_blade_keep_indents_on_empty_lines = false diff --git a/.github/workflows/code_standarts.yml b/.github/workflows/code_standarts.yml index e8ce5708..868a0eb1 100644 --- a/.github/workflows/code_standarts.yml +++ b/.github/workflows/code_standarts.yml @@ -3,8 +3,8 @@ run-name: Check code standarts on: pull_request: - types: [opened, reopened, synchronize] - branches: [ "master", "dev" ] + types: [ opened, reopened, synchronize ] + branches: [ "master", "dev" ] permissions: contents: write @@ -14,31 +14,28 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 - - # Get composer cache directory - - id: get-composer-cache-directory - name: Get Composer caches directory path - run: echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT - shell: bash - - # Mount composer cache directory - - id: mount-composer-cache-directory - name: Mount composer cache directory - uses: actions/cache@v3 - with: - path: ${{ steps.get-composer-cache-directory.outputs.dir }} - key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} - restore-keys: ${{ runner.os }}-composer- + - uses: actions/checkout@v4 + + - name: Get Composer caches directory path + run: echo "COMPOSER_CACHE_DIR=$(composer config cache-files-dir)" >> $GITHUB_ENV + shell: bash + + - name: Cache Composer dependencies + uses: actions/cache@v4 + with: + path: ${{ env.COMPOSER_CACHE_DIR }} + key: "${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}" + restore-keys: | + ${{ runner.os }}-composer- # Install composer deps, if .lock file was changed - - id: install-composer-dependencies - name: Install composer dependencies - run: composer install --prefer-dist --no-progress - shell: bash - - - name: PHP Code Standarts - run: | - chmod +x ./bin/phpcs.sh - ./bin/phpcs.sh -full - shell: bash + - id: install-composer-dependencies + name: Install composer dependencies + run: composer install --prefer-dist --no-progress + shell: bash + + - name: PHP Code Standarts + run: | + chmod +x ./bin/phpcs.sh + ./bin/phpcs.sh -full + shell: bash diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml new file mode 100644 index 00000000..d175cc49 --- /dev/null +++ b/.github/workflows/deploy.yml @@ -0,0 +1,79 @@ +name: Deploy Plugin to Test Site + +on: + workflow_dispatch: + push: + branches: + - '*' + +jobs: + deploy: + runs-on: ubuntu-latest + steps: + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: 20 + + - name: Install Bun + run: npm install -g bun + + - name: Get code + uses: actions/checkout@v4 + + - name: Extract branch name + run: echo "BRANCH_NAME=${GITHUB_REF#refs/heads/}" >> $GITHUB_ENV + + - name: Get Composer caches directory path + run: echo "COMPOSER_CACHE_DIR=$(composer config cache-files-dir)" >> $GITHUB_ENV + shell: bash + + - name: Cache Composer dependencies + uses: actions/cache@v4 + with: + path: ${{ env.COMPOSER_CACHE_DIR }} + key: "${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}" + restore-keys: | + ${{ runner.os }}-composer- + + - name: Cache npm dependencies + uses: actions/cache@v4 + with: + path: node_modules + key: "${{ runner.os }}-node-${{ hashFiles('package-lock.json') }}" + restore-keys: | + ${{ runner.os }}-node- + + - name: Cache vite dependencies + uses: actions/cache@v4 + with: + path: vite/node_modules + key: "${{ runner.os }}-vite-${{ hashFiles('vite/bun.lockb') }}" + restore-keys: | + ${{ runner.os }}-vite- + + - name: Update Plugin Name + run: | + export TZ=Europe/Moscow + BRANCH_NAME=${{ env.BRANCH_NAME }} + CURRENT_DATE=$(date +"%d.%m.%Y %H:%M:%S") + sed -i "s/\(Plugin Name: .*\)/\1 (${BRANCH_NAME})/" reepay-woocommerce-payment.php + sed -i "s/\(Description: .*\)/\1 (Upload date: ${CURRENT_DATE})/" reepay-woocommerce-payment.php + + - name: Build and zip project + run: | + chmod +x ./bin/zip.sh + ./bin/zip.sh + shell: bash + + - name: Deploy code via SSH + uses: appleboy/scp-action@v0.1.7 + with: + host: ${{ secrets.DEPLOY_HOST }} + username: ${{ secrets.DEPLOY_NAME }} + password: ${{ secrets.DEPLOY_PASSWORD }} + source: "build/reepay-woocommerce-payment/*" + target: public_html/wp-content/plugins/billwerk-woocommerce-payment-${{ env.BRANCH_NAME }} + rm: true + overwrite: true + strip_components: 2 diff --git a/.github/workflows/download.yml b/.github/workflows/download.yml index ebe18ae3..494e2907 100644 --- a/.github/workflows/download.yml +++ b/.github/workflows/download.yml @@ -1,8 +1,8 @@ name: Download run-name: Download -on: [workflow_dispatch] - +on: [ workflow_dispatch ] + permissions: contents: write @@ -12,40 +12,56 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 - - # Get composer cache directory - - id: get-composer-cache-directory - name: Get Composer caches directory path - run: echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT - shell: bash - - # Mount composer cache directory - - id: mount-composer-cache-directory - name: Mount composer cache directory - uses: actions/cache@v3 + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: 20 + + - name: Install Bun + run: npm install -g bun + + - uses: actions/checkout@v4 + + - name: Get Composer caches directory path + run: echo "COMPOSER_CACHE_DIR=$(composer config cache-files-dir)" >> $GITHUB_ENV + shell: bash + + - name: Cache Composer dependencies + uses: actions/cache@v4 with: - path: ${{ steps.get-composer-cache-directory.outputs.dir }} - key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} - restore-keys: ${{ runner.os }}-composer- - - # Mount composer cache directory - - id: mount-npm-cache-directory - name: Mount npm cache directory - uses: actions/cache@v3 + path: ${{ env.COMPOSER_CACHE_DIR }} + key: "${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}" + restore-keys: | + ${{ runner.os }}-composer- + + - name: Cache npm dependencies + uses: actions/cache@v4 + with: + path: | + ~/.npm + node_modules + key: "${{ runner.os }}-node-${{ hashFiles('package-lock.json') }}" + restore-keys: | + ${{ runner.os }}-node- + + - name: Cache vite dependencies + uses: actions/cache@v4 + with: + path: | + ~/.npm + vite/node_modules + key: "${{ runner.os }}-vite-${{ hashFiles('vite/bun.lockb') }}" + restore-keys: | + ${{ runner.os }}-vite- + + - name: Build and zip project + run: | + chmod +x ./bin/zip.sh + ./bin/zip.sh + shell: bash + + - name: Add archive to artifacts + uses: actions/upload-artifact@v3 with: - path: node_modules - key: ${{ runner.os }}-npm-${{ hashFiles('**/package-lock.json') }} - restore-keys: ${{ runner.os }}-npm- - - - name: Build and zip project - run: | - chmod 777 ./bin/zip.sh - sudo bash ./bin/zip.sh - shell: bash - - - name: Add archive to artifacts - uses: actions/upload-artifact@v3 - with: - name: reepay-woocommerce-payment - path: ./build/reepay-woocommerce-payment/ + name: reepay-woocommerce-payment + path: ./build/reepay-woocommerce-payment/ diff --git a/.github/workflows/phpunit_dev.yml b/.github/workflows/phpunit_dev.yml index 249bc8fe..b7258df4 100644 --- a/.github/workflows/phpunit_dev.yml +++ b/.github/workflows/phpunit_dev.yml @@ -3,46 +3,47 @@ run-name: PHPUnit - Dev on: pull_request: - types: [opened, reopened, synchronize] + types: [ opened, reopened, synchronize ] branches: [ "dev" ] jobs: - run: + run: runs-on: ${{ matrix.operating-system }} strategy: fail-fast: false matrix: - operating-system: [ubuntu-latest] - php-versions: ['7.4', '8.0', '8.1', '8.2'] + operating-system: [ ubuntu-latest ] + php-versions: [ '7.4', '8.0', '8.1', '8.2' ] name: PHP ${{ matrix.php-versions }} Test on ${{ matrix.operating-system }} steps: - - name: Checkout - uses: actions/checkout@v1 - - - name: Setup PHP - uses: shivammathur/setup-php@v2 - with: - php-version: ${{ matrix.php-versions }} - extension-csv: mbstring, intl #optional, setup extensions - ini-values-csv: post_max_size=256M, short_open_tag=On #optional, setup php.ini configuration - coverage: xdebug #optional, setup coverage driver - pecl: false #optional, setup PECL - - - name: Check PHP Version - run: php -v - - - name: Composer install - run: | + - name: Checkout + # @TODO update version + uses: actions/checkout@v1 + + - name: Setup PHP + uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php-versions }} + extension-csv: mbstring, intl #optional, setup extensions + ini-values-csv: post_max_size=256M, short_open_tag=On #optional, setup php.ini configuration + coverage: xdebug #optional, setup coverage driver + pecl: false #optional, setup PECL + + - name: Check PHP Version + run: php -v + + - name: Composer install + run: | composer update composer install --optimize-autoloader --prefer-dist - - name: Set up MySQL + - name: Set up MySQL run: | - sudo /etc/init.d/mysql start - mysql --user="root" --password="root" --execute="ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'root';" - - - name: Install WP Tests - run: bash bin/install-wp-tests.sh wordpress_test root root - - - name: phpunit tests - run: npm run phpunit + sudo /etc/init.d/mysql start + mysql --user="root" --password="root" --execute="ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'root';" + + - name: Install WP Tests + run: bash bin/install-wp-tests.sh wordpress_test root root + + - name: phpunit tests + run: npm run phpunit diff --git a/.github/workflows/phpunit_master.yml b/.github/workflows/phpunit_master.yml index 2d6d4afb..b6d1e4f2 100644 --- a/.github/workflows/phpunit_master.yml +++ b/.github/workflows/phpunit_master.yml @@ -3,46 +3,47 @@ run-name: PHPUnit - Master on: pull_request: - types: [opened, reopened, synchronize] + types: [ opened, reopened, synchronize ] branches: [ "master" ] jobs: - run: + run: runs-on: ${{ matrix.operating-system }} strategy: fail-fast: false matrix: - operating-system: [ubuntu-latest] - php-versions: ['7.4', '8.0', '8.1', '8.2'] + operating-system: [ ubuntu-latest ] + php-versions: [ '7.4', '8.0', '8.1', '8.2' ] name: PHP ${{ matrix.php-versions }} Test on ${{ matrix.operating-system }} steps: - - name: Checkout - uses: actions/checkout@v1 - - - name: Setup PHP - uses: shivammathur/setup-php@v2 - with: - php-version: ${{ matrix.php-versions }} - extension-csv: mbstring, intl #optional, setup extensions - ini-values-csv: post_max_size=256M, short_open_tag=On #optional, setup php.ini configuration - coverage: xdebug #optional, setup coverage driver - pecl: false #optional, setup PECL - - - name: Check PHP Version - run: php -v - - - name: Composer install - run: | + - name: Checkout + # @TODO update version + uses: actions/checkout@v1 + + - name: Setup PHP + uses: shivammathur/setup-php@v2 + with: + php-version: ${{ matrix.php-versions }} + extension-csv: mbstring, intl #optional, setup extensions + ini-values-csv: post_max_size=256M, short_open_tag=On #optional, setup php.ini configuration + coverage: xdebug #optional, setup coverage driver + pecl: false #optional, setup PECL + + - name: Check PHP Version + run: php -v + + - name: Composer install + run: | composer update composer install --optimize-autoloader --prefer-dist - - name: Set up MySQL + - name: Set up MySQL run: | - sudo /etc/init.d/mysql start - mysql --user="root" --password="root" --execute="ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'root';" - - - name: Install WP Tests - run: bash bin/install-wp-tests.sh wordpress_test root root - - - name: phpunit tests - run: npm run phpunit:full + sudo /etc/init.d/mysql start + mysql --user="root" --password="root" --execute="ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'root';" + + - name: Install WP Tests + run: bash bin/install-wp-tests.sh wordpress_test root root + + - name: phpunit tests + run: npm run phpunit:full diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index bf16ef45..da643721 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -1,11 +1,11 @@ name: Release run-name: Release -on: +on: push: tags: - - 'v*' - + - 'v*' + permissions: contents: write @@ -15,40 +15,56 @@ jobs: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 - - # Get composer cache directory - - id: get-composer-cache-directory - name: Get Composer caches directory path - run: echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT - shell: bash - - # Mount composer cache directory - - id: mount-composer-cache-directory - name: Mount composer cache directory - uses: actions/cache@v3 + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: 20 + + - name: Install Bun + run: npm install -g bun + + - uses: actions/checkout@v3 + + - name: Get Composer caches directory path + run: echo "COMPOSER_CACHE_DIR=$(composer config cache-files-dir)" >> $GITHUB_ENV + shell: bash + + - name: Cache Composer dependencies + uses: actions/cache@v4 with: - path: ${{ steps.get-composer-cache-directory.outputs.dir }} - key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }} - restore-keys: ${{ runner.os }}-composer- - - # Mount composer cache directory - - id: mount-npm-cache-directory - name: Mount npm cache directory - uses: actions/cache@v3 + path: ${{ env.COMPOSER_CACHE_DIR }} + key: "${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}" + restore-keys: | + ${{ runner.os }}-composer- + + - name: Cache npm dependencies + uses: actions/cache@v4 + with: + path: | + ~/.npm + node_modules + key: "${{ runner.os }}-node-${{ hashFiles('package-lock.json') }}" + restore-keys: | + ${{ runner.os }}-node- + + - name: Cache vite dependencies + uses: actions/cache@v4 + with: + path: | + ~/.npm + vite/node_modules + key: "${{ runner.os }}-vite-${{ hashFiles('vite/bun.lockb') }}" + restore-keys: | + ${{ runner.os }}-vite- + + - name: Build and zip project + run: | + chmod +x ./bin/zip.sh + ./bin/zip.sh + shell: bash + + - uses: ncipollo/release-action@v1 with: - path: node_modules - key: ${{ runner.os }}-npm-${{ hashFiles('**/package-lock.json') }} - restore-keys: ${{ runner.os }}-npm- - - - name: Zip code - run: | - chmod 777 ./bin/zip.sh - sudo bash ./bin/zip.sh - shell: bash - - - uses: ncipollo/release-action@v1 - with: - artifactErrorsFailBuild: true - allowUpdates: true - artifacts: "./build/reepay-woocommerce-payment.zip" + artifactErrorsFailBuild: true + allowUpdates: true + artifacts: "./build/reepay-woocommerce-payment.zip" diff --git a/bin/install-wp-tests.sh b/bin/install-wp-tests.sh index 5ff6c9bf..d7580981 100644 --- a/bin/install-wp-tests.sh +++ b/bin/install-wp-tests.sh @@ -183,26 +183,26 @@ install_dependencies() { cd "$WP_CORE_DIR" curl -O https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar - [ ! -f ./wp-config.php ] && php wp-cli.phar core config --dbname=$DB_NAME --dbuser=$DB_USER --dbpass=$DB_PASS --dbhost=$DB_HOST --dbprefix=wptests_ + [ ! -f ./wp-config.php ] && php wp-cli.phar core config --dbname=$DB_NAME --dbuser=$DB_USER --dbpass=$DB_PASS --dbhost=$DB_HOST --dbprefix=wptests_ --allow-root - php wp-cli.phar config set --raw WP_DEBUG true - php wp-cli.phar config set --raw WP_DEBUG_LOG true - php wp-cli.phar config set --raw WP_DEBUG_DISPLAY true + php wp-cli.phar config set --raw WP_DEBUG true --allow-root + php wp-cli.phar config set --raw WP_DEBUG_LOG true --allow-root + php wp-cli.phar config set --raw WP_DEBUG_DISPLAY true --allow-root - php wp-cli.phar db check - php wp-cli.phar db import $WP_DB_DATA - php wp-cli.phar db check + php wp-cli.phar db check --allow-root + php wp-cli.phar db import $WP_DB_DATA --allow-root + php wp-cli.phar db check --allow-root # php wp-cli.phar search-replace "http://local.wordpress.test" "$WP_SITE_URL" # php wp-cli.phar theme install twentyseventeen --activate - php wp-cli.phar plugin install woocommerce --activate --force + php wp-cli.phar plugin install woocommerce --activate --force --allow-root - php wp-cli.phar plugin install https://github.com/reepay/reepay-woocommerce-subscriptions/archive/refs/heads/main.zip --activate --force + php wp-cli.phar plugin install https://github.com/reepay/reepay-woocommerce-subscriptions/archive/refs/heads/main.zip --activate --force --allow-root mv ./wp-content/plugins/reepay-woocommerce-subscriptions ./wp-content/plugins/reepay-subscriptions-for-woocommerce - php wp-cli.phar plugin install https://git.one-pix.com/onepix/woocommerce-subscriptions-for-phpunit/-/archive/main/woocommerce-subscriptions-for-phpunit-main.zip --activate --force + php wp-cli.phar plugin install https://git.one-pix.com/onepix/woocommerce-subscriptions-for-phpunit/-/archive/main/woocommerce-subscriptions-for-phpunit-main.zip --activate --force --allow-root mv ./wp-content/plugins/woocommerce-subscriptions-for-phpunit-main ./wp-content/plugins/woocommerce-subscriptions - php wp-cli.phar plugin list + php wp-cli.phar plugin list --allow-root } install_wp diff --git a/bin/zip.sh b/bin/zip.sh index 3da57067..36934feb 100644 --- a/bin/zip.sh +++ b/bin/zip.sh @@ -52,12 +52,11 @@ cd ./vite if [ ! -d "./node_modules" ]; then status "Installing npm Vite dependencies... 🚀" - npm ci + bun i --frozen-lockfile fi status "Building Vite scripts... 🚀️" -npm run build:meta-fields -npm run build:debug-page +bun run build cd ../ diff --git a/composer.json b/composer.json index 46f9b927..9220e616 100644 --- a/composer.json +++ b/composer.json @@ -30,6 +30,9 @@ } }, "require": { - "ext-json": "*" + "ext-json": "*", + "billwerk/php-sdk": "^1.0", + "guzzlehttp/guzzle": "^7.0", + "ext-mbstring": "*" } } \ No newline at end of file diff --git a/composer.lock b/composer.lock index 77975e8b..3e1f1e00 100644 --- a/composer.lock +++ b/composer.lock @@ -4,8 +4,652 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "a5b1a5c0d67993a5e7cf348b58b6a70f", - "packages": [], + "content-hash": "48f4ba2911d22f4aa2f162726bec87af", + "packages": [ + { + "name": "billwerk/php-sdk", + "version": "v1.0.7", + "source": { + "type": "git", + "url": "https://github.com/0zd0/billwerk-sdk-php.git", + "reference": "e8632117fe9b4e0328e64678477f5a281c0ee198" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/0zd0/billwerk-sdk-php/zipball/e8632117fe9b4e0328e64678477f5a281c0ee198", + "reference": "e8632117fe9b4e0328e64678477f5a281c0ee198", + "shasum": "" + }, + "require": { + "ext-json": "*", + "php": ">=7.4.0", + "psr/http-client": "^1.0", + "psr/http-factory": "^1.0" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^1.0", + "guzzlehttp/guzzle": "^7.0", + "phpunit/phpunit": "^9.6.19", + "spatie/phpunit-snapshot-assertions": "^4.2", + "squizlabs/php_codesniffer": "^3.9.2", + "yosymfony/toml": "^1.0" + }, + "type": "lib", + "autoload": { + "psr-4": { + "Billwerk\\Sdk\\": "src/", + "Billwerk\\Sdk\\Stub\\": "stubs/", + "Billwerk\\Sdk\\Test\\": "tests/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Api SDK for Billwerk+", + "support": { + "issues": "https://github.com/0zd0/billwerk-sdk-php/issues", + "source": "https://github.com/0zd0/billwerk-sdk-php/tree/v1.0.7" + }, + "time": "2024-06-11T18:34:11+00:00" + }, + { + "name": "guzzlehttp/guzzle", + "version": "7.8.1", + "source": { + "type": "git", + "url": "https://github.com/guzzle/guzzle.git", + "reference": "41042bc7ab002487b876a0683fc8dce04ddce104" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/guzzle/zipball/41042bc7ab002487b876a0683fc8dce04ddce104", + "reference": "41042bc7ab002487b876a0683fc8dce04ddce104", + "shasum": "" + }, + "require": { + "ext-json": "*", + "guzzlehttp/promises": "^1.5.3 || ^2.0.1", + "guzzlehttp/psr7": "^1.9.1 || ^2.5.1", + "php": "^7.2.5 || ^8.0", + "psr/http-client": "^1.0", + "symfony/deprecation-contracts": "^2.2 || ^3.0" + }, + "provide": { + "psr/http-client-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "ext-curl": "*", + "php-http/client-integration-tests": "dev-master#2c025848417c1135031fdf9c728ee53d0a7ceaee as 3.0.999", + "php-http/message-factory": "^1.1", + "phpunit/phpunit": "^8.5.36 || ^9.6.15", + "psr/log": "^1.1 || ^2.0 || ^3.0" + }, + "suggest": { + "ext-curl": "Required for CURL handler support", + "ext-intl": "Required for Internationalized Domain Name (IDN) support", + "psr/log": "Required for using the Log middleware" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "files": [ + "src/functions_include.php" + ], + "psr-4": { + "GuzzleHttp\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Jeremy Lindblom", + "email": "jeremeamia@gmail.com", + "homepage": "https://github.com/jeremeamia" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle is a PHP HTTP client library", + "keywords": [ + "client", + "curl", + "framework", + "http", + "http client", + "psr-18", + "psr-7", + "rest", + "web service" + ], + "support": { + "issues": "https://github.com/guzzle/guzzle/issues", + "source": "https://github.com/guzzle/guzzle/tree/7.8.1" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/guzzle", + "type": "tidelift" + } + ], + "time": "2023-12-03T20:35:24+00:00" + }, + { + "name": "guzzlehttp/promises", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/guzzle/promises.git", + "reference": "bbff78d96034045e58e13dedd6ad91b5d1253223" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/promises/zipball/bbff78d96034045e58e13dedd6ad91b5d1253223", + "reference": "bbff78d96034045e58e13dedd6ad91b5d1253223", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "phpunit/phpunit": "^8.5.36 || ^9.6.15" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Promise\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + } + ], + "description": "Guzzle promises library", + "keywords": [ + "promise" + ], + "support": { + "issues": "https://github.com/guzzle/promises/issues", + "source": "https://github.com/guzzle/promises/tree/2.0.2" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/promises", + "type": "tidelift" + } + ], + "time": "2023-12-03T20:19:20+00:00" + }, + { + "name": "guzzlehttp/psr7", + "version": "2.6.2", + "source": { + "type": "git", + "url": "https://github.com/guzzle/psr7.git", + "reference": "45b30f99ac27b5ca93cb4831afe16285f57b8221" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/guzzle/psr7/zipball/45b30f99ac27b5ca93cb4831afe16285f57b8221", + "reference": "45b30f99ac27b5ca93cb4831afe16285f57b8221", + "shasum": "" + }, + "require": { + "php": "^7.2.5 || ^8.0", + "psr/http-factory": "^1.0", + "psr/http-message": "^1.1 || ^2.0", + "ralouphie/getallheaders": "^3.0" + }, + "provide": { + "psr/http-factory-implementation": "1.0", + "psr/http-message-implementation": "1.0" + }, + "require-dev": { + "bamarni/composer-bin-plugin": "^1.8.2", + "http-interop/http-factory-tests": "^0.9", + "phpunit/phpunit": "^8.5.36 || ^9.6.15" + }, + "suggest": { + "laminas/laminas-httphandlerrunner": "Emit PSR-7 responses" + }, + "type": "library", + "extra": { + "bamarni-bin": { + "bin-links": true, + "forward-command": false + } + }, + "autoload": { + "psr-4": { + "GuzzleHttp\\Psr7\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Graham Campbell", + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" + }, + { + "name": "Michael Dowling", + "email": "mtdowling@gmail.com", + "homepage": "https://github.com/mtdowling" + }, + { + "name": "George Mponos", + "email": "gmponos@gmail.com", + "homepage": "https://github.com/gmponos" + }, + { + "name": "Tobias Nyholm", + "email": "tobias.nyholm@gmail.com", + "homepage": "https://github.com/Nyholm" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://github.com/sagikazarmark" + }, + { + "name": "Tobias Schultze", + "email": "webmaster@tubo-world.de", + "homepage": "https://github.com/Tobion" + }, + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com", + "homepage": "https://sagikazarmark.hu" + } + ], + "description": "PSR-7 message implementation that also provides common utility methods", + "keywords": [ + "http", + "message", + "psr-7", + "request", + "response", + "stream", + "uri", + "url" + ], + "support": { + "issues": "https://github.com/guzzle/psr7/issues", + "source": "https://github.com/guzzle/psr7/tree/2.6.2" + }, + "funding": [ + { + "url": "https://github.com/GrahamCampbell", + "type": "github" + }, + { + "url": "https://github.com/Nyholm", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/guzzlehttp/psr7", + "type": "tidelift" + } + ], + "time": "2023-12-03T20:05:35+00:00" + }, + { + "name": "psr/http-client", + "version": "1.0.3", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-client.git", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-client/zipball/bb5906edc1c324c9a05aa0873d40117941e5fa90", + "reference": "bb5906edc1c324c9a05aa0873d40117941e5fa90", + "shasum": "" + }, + "require": { + "php": "^7.0 || ^8.0", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Client\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP clients", + "homepage": "https://github.com/php-fig/http-client", + "keywords": [ + "http", + "http-client", + "psr", + "psr-18" + ], + "support": { + "source": "https://github.com/php-fig/http-client" + }, + "time": "2023-09-23T14:17:50+00:00" + }, + { + "name": "psr/http-factory", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-factory.git", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-factory/zipball/2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "reference": "2b4765fddfe3b508ac62f829e852b1501d3f6e8a", + "shasum": "" + }, + "require": { + "php": ">=7.1", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "PSR-17: Common interfaces for PSR-7 HTTP message factories", + "keywords": [ + "factory", + "http", + "message", + "psr", + "psr-17", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-factory" + }, + "time": "2024-04-15T12:06:14+00:00" + }, + { + "name": "psr/http-message", + "version": "2.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/http-message.git", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/http-message/zipball/402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "reference": "402d35bcb92c70c026d1a6a9883f06b2ead23d71", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for HTTP messages", + "homepage": "https://github.com/php-fig/http-message", + "keywords": [ + "http", + "http-message", + "psr", + "psr-7", + "request", + "response" + ], + "support": { + "source": "https://github.com/php-fig/http-message/tree/2.0" + }, + "time": "2023-04-04T09:54:51+00:00" + }, + { + "name": "ralouphie/getallheaders", + "version": "3.0.3", + "source": { + "type": "git", + "url": "https://github.com/ralouphie/getallheaders.git", + "reference": "120b605dfeb996808c31b6477290a714d356e822" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/ralouphie/getallheaders/zipball/120b605dfeb996808c31b6477290a714d356e822", + "reference": "120b605dfeb996808c31b6477290a714d356e822", + "shasum": "" + }, + "require": { + "php": ">=5.6" + }, + "require-dev": { + "php-coveralls/php-coveralls": "^2.1", + "phpunit/phpunit": "^5 || ^6.5" + }, + "type": "library", + "autoload": { + "files": [ + "src/getallheaders.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Ralph Khattar", + "email": "ralph.khattar@gmail.com" + } + ], + "description": "A polyfill for getallheaders.", + "support": { + "issues": "https://github.com/ralouphie/getallheaders/issues", + "source": "https://github.com/ralouphie/getallheaders/tree/develop" + }, + "time": "2019-03-08T08:55:37+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v2.5.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "80d075412b557d41002320b96a096ca65aa2c98d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/80d075412b557d41002320b96a096ca65aa2c98d", + "reference": "80d075412b557d41002320b96a096ca65aa2c98d", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "2.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2023-01-24T14:02:46+00:00" + } + ], "packages-dev": [ { "name": "dealerdirect/phpcodesniffer-composer-installer", @@ -216,20 +860,21 @@ }, { "name": "phar-io/manifest", - "version": "2.0.3", + "version": "2.0.4", "source": { "type": "git", "url": "https://github.com/phar-io/manifest.git", - "reference": "97803eca37d319dfa7826cc2437fc020857acb53" + "reference": "54750ef60c58e43759730615a392c31c80e23176" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phar-io/manifest/zipball/97803eca37d319dfa7826cc2437fc020857acb53", - "reference": "97803eca37d319dfa7826cc2437fc020857acb53", + "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", @@ -270,9 +915,15 @@ "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.3" + "source": "https://github.com/phar-io/manifest/tree/2.0.4" }, - "time": "2021-07-20T11:28:43+00:00" + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2024-03-03T12:33:53+00:00" }, { "name": "phar-io/version", @@ -405,22 +1056,22 @@ }, { "name": "phpcsstandards/phpcsutils", - "version": "1.0.9", + "version": "1.0.12", "source": { "type": "git", "url": "https://github.com/PHPCSStandards/PHPCSUtils.git", - "reference": "908247bc65010c7b7541a9551e002db12e9dae70" + "reference": "87b233b00daf83fb70f40c9a28692be017ea7c6c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHPCSStandards/PHPCSUtils/zipball/908247bc65010c7b7541a9551e002db12e9dae70", - "reference": "908247bc65010c7b7541a9551e002db12e9dae70", + "url": "https://api.github.com/repos/PHPCSStandards/PHPCSUtils/zipball/87b233b00daf83fb70f40c9a28692be017ea7c6c", + "reference": "87b233b00daf83fb70f40c9a28692be017ea7c6c", "shasum": "" }, "require": { "dealerdirect/phpcodesniffer-composer-installer": "^0.4.1 || ^0.5 || ^0.6.2 || ^0.7 || ^1.0", "php": ">=5.4", - "squizlabs/php_codesniffer": "^3.8.0 || 4.0.x-dev@dev" + "squizlabs/php_codesniffer": "^3.10.0 || 4.0.x-dev@dev" }, "require-dev": { "ext-filter": "*", @@ -489,20 +1140,20 @@ "type": "open_collective" } ], - "time": "2023-12-08T14:50:00+00:00" + "time": "2024-05-20T13:34:27+00:00" }, { "name": "phpunit/php-code-coverage", - "version": "7.0.15", + "version": "7.0.17", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "819f92bba8b001d4363065928088de22f25a3a48" + "reference": "40a4ed114a4aea5afd6df8d0f0c9cd3033097f66" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/819f92bba8b001d4363065928088de22f25a3a48", - "reference": "819f92bba8b001d4363065928088de22f25a3a48", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/40a4ed114a4aea5afd6df8d0f0c9cd3033097f66", + "reference": "40a4ed114a4aea5afd6df8d0f0c9cd3033097f66", "shasum": "" }, "require": { @@ -554,7 +1205,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/7.0.15" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/7.0.17" }, "funding": [ { @@ -562,20 +1213,20 @@ "type": "github" } ], - "time": "2021-07-26T12:20:09+00:00" + "time": "2024-03-02T06:09:37+00:00" }, { "name": "phpunit/php-file-iterator", - "version": "2.0.5", + "version": "2.0.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "42c5ba5220e6904cbfe8b1a1bda7c0cfdc8c12f5" + "reference": "69deeb8664f611f156a924154985fbd4911eb36b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/42c5ba5220e6904cbfe8b1a1bda7c0cfdc8c12f5", - "reference": "42c5ba5220e6904cbfe8b1a1bda7c0cfdc8c12f5", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/69deeb8664f611f156a924154985fbd4911eb36b", + "reference": "69deeb8664f611f156a924154985fbd4911eb36b", "shasum": "" }, "require": { @@ -614,7 +1265,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", - "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/2.0.5" + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/2.0.6" }, "funding": [ { @@ -622,7 +1273,7 @@ "type": "github" } ], - "time": "2021-12-02T12:42:26+00:00" + "time": "2024-03-01T13:39:50+00:00" }, { "name": "phpunit/php-text-template", @@ -671,16 +1322,16 @@ }, { "name": "phpunit/php-timer", - "version": "2.1.3", + "version": "2.1.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "2454ae1765516d20c4ffe103d85a58a9a3bd5662" + "reference": "a691211e94ff39a34811abd521c31bd5b305b0bb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/2454ae1765516d20c4ffe103d85a58a9a3bd5662", - "reference": "2454ae1765516d20c4ffe103d85a58a9a3bd5662", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/a691211e94ff39a34811abd521c31bd5b305b0bb", + "reference": "a691211e94ff39a34811abd521c31bd5b305b0bb", "shasum": "" }, "require": { @@ -718,7 +1369,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-timer/issues", - "source": "https://github.com/sebastianbergmann/php-timer/tree/2.1.3" + "source": "https://github.com/sebastianbergmann/php-timer/tree/2.1.4" }, "funding": [ { @@ -726,7 +1377,7 @@ "type": "github" } ], - "time": "2020-11-30T08:20:02+00:00" + "time": "2024-03-01T13:42:41+00:00" }, { "name": "phpunit/php-token-stream", @@ -790,16 +1441,16 @@ }, { "name": "phpunit/phpunit", - "version": "8.5.36", + "version": "8.5.38", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "9652df58e06a681429d8cfdaec3c43d6de581d5a" + "reference": "1ecad678646c817a29e55a32c930f3601c3f5a8c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/9652df58e06a681429d8cfdaec3c43d6de581d5a", - "reference": "9652df58e06a681429d8cfdaec3c43d6de581d5a", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/1ecad678646c817a29e55a32c930f3601c3f5a8c", + "reference": "1ecad678646c817a29e55a32c930f3601c3f5a8c", "shasum": "" }, "require": { @@ -868,7 +1519,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/8.5.36" + "source": "https://github.com/sebastianbergmann/phpunit/tree/8.5.38" }, "funding": [ { @@ -884,20 +1535,20 @@ "type": "tidelift" } ], - "time": "2023-12-01T16:52:15+00:00" + "time": "2024-04-05T04:31:23+00:00" }, { "name": "sebastian/code-unit-reverse-lookup", - "version": "1.0.2", + "version": "1.0.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", - "reference": "1de8cd5c010cb153fcd68b8d0f64606f523f7619" + "reference": "92a1a52e86d34cde6caa54f1b5ffa9fda18e5d54" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/1de8cd5c010cb153fcd68b8d0f64606f523f7619", - "reference": "1de8cd5c010cb153fcd68b8d0f64606f523f7619", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/92a1a52e86d34cde6caa54f1b5ffa9fda18e5d54", + "reference": "92a1a52e86d34cde6caa54f1b5ffa9fda18e5d54", "shasum": "" }, "require": { @@ -931,7 +1582,7 @@ "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", "support": { "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", - "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/1.0.2" + "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/1.0.3" }, "funding": [ { @@ -939,7 +1590,7 @@ "type": "github" } ], - "time": "2020-11-30T08:15:22+00:00" + "time": "2024-03-01T13:45:45+00:00" }, { "name": "sebastian/comparator", @@ -1017,16 +1668,16 @@ }, { "name": "sebastian/diff", - "version": "3.0.4", + "version": "3.0.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "6296a0c086dd0117c1b78b059374d7fcbe7545ae" + "reference": "98ff311ca519c3aa73ccd3de053bdb377171d7b6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/6296a0c086dd0117c1b78b059374d7fcbe7545ae", - "reference": "6296a0c086dd0117c1b78b059374d7fcbe7545ae", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/98ff311ca519c3aa73ccd3de053bdb377171d7b6", + "reference": "98ff311ca519c3aa73ccd3de053bdb377171d7b6", "shasum": "" }, "require": { @@ -1071,7 +1722,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/diff/issues", - "source": "https://github.com/sebastianbergmann/diff/tree/3.0.4" + "source": "https://github.com/sebastianbergmann/diff/tree/3.0.6" }, "funding": [ { @@ -1079,20 +1730,20 @@ "type": "github" } ], - "time": "2023-05-07T05:30:20+00:00" + "time": "2024-03-02T06:16:36+00:00" }, { "name": "sebastian/environment", - "version": "4.2.4", + "version": "4.2.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "d47bbbad83711771f167c72d4e3f25f7fcc1f8b0" + "reference": "56932f6049a0482853056ffd617c91ffcc754205" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/d47bbbad83711771f167c72d4e3f25f7fcc1f8b0", - "reference": "d47bbbad83711771f167c72d4e3f25f7fcc1f8b0", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/56932f6049a0482853056ffd617c91ffcc754205", + "reference": "56932f6049a0482853056ffd617c91ffcc754205", "shasum": "" }, "require": { @@ -1134,7 +1785,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/environment/issues", - "source": "https://github.com/sebastianbergmann/environment/tree/4.2.4" + "source": "https://github.com/sebastianbergmann/environment/tree/4.2.5" }, "funding": [ { @@ -1142,24 +1793,24 @@ "type": "github" } ], - "time": "2020-11-30T07:53:42+00:00" + "time": "2024-03-01T13:49:59+00:00" }, { "name": "sebastian/exporter", - "version": "3.1.5", + "version": "3.1.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "73a9676f2833b9a7c36968f9d882589cd75511e6" + "reference": "1939bc8fd1d39adcfa88c5b35335910869214c56" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/73a9676f2833b9a7c36968f9d882589cd75511e6", - "reference": "73a9676f2833b9a7c36968f9d882589cd75511e6", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/1939bc8fd1d39adcfa88c5b35335910869214c56", + "reference": "1939bc8fd1d39adcfa88c5b35335910869214c56", "shasum": "" }, "require": { - "php": ">=7.0", + "php": ">=7.2", "sebastian/recursion-context": "^3.0" }, "require-dev": { @@ -1211,7 +1862,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/exporter/issues", - "source": "https://github.com/sebastianbergmann/exporter/tree/3.1.5" + "source": "https://github.com/sebastianbergmann/exporter/tree/3.1.6" }, "funding": [ { @@ -1219,20 +1870,20 @@ "type": "github" } ], - "time": "2022-09-14T06:00:17+00:00" + "time": "2024-03-02T06:21:38+00:00" }, { "name": "sebastian/global-state", - "version": "3.0.3", + "version": "3.0.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "66783ce213de415b451b904bfef9dda0cf9aeae0" + "reference": "91c7c47047a971f02de57ed6f040087ef110c5d9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/66783ce213de415b451b904bfef9dda0cf9aeae0", - "reference": "66783ce213de415b451b904bfef9dda0cf9aeae0", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/91c7c47047a971f02de57ed6f040087ef110c5d9", + "reference": "91c7c47047a971f02de57ed6f040087ef110c5d9", "shasum": "" }, "require": { @@ -1275,7 +1926,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/global-state/issues", - "source": "https://github.com/sebastianbergmann/global-state/tree/3.0.3" + "source": "https://github.com/sebastianbergmann/global-state/tree/3.0.5" }, "funding": [ { @@ -1283,20 +1934,20 @@ "type": "github" } ], - "time": "2023-08-02T09:23:32+00:00" + "time": "2024-03-02T06:13:16+00:00" }, { "name": "sebastian/object-enumerator", - "version": "3.0.4", + "version": "3.0.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-enumerator.git", - "reference": "e67f6d32ebd0c749cf9d1dbd9f226c727043cdf2" + "reference": "ac5b293dba925751b808e02923399fb44ff0d541" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/e67f6d32ebd0c749cf9d1dbd9f226c727043cdf2", - "reference": "e67f6d32ebd0c749cf9d1dbd9f226c727043cdf2", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/ac5b293dba925751b808e02923399fb44ff0d541", + "reference": "ac5b293dba925751b808e02923399fb44ff0d541", "shasum": "" }, "require": { @@ -1332,7 +1983,7 @@ "homepage": "https://github.com/sebastianbergmann/object-enumerator/", "support": { "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", - "source": "https://github.com/sebastianbergmann/object-enumerator/tree/3.0.4" + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/3.0.5" }, "funding": [ { @@ -1340,20 +1991,20 @@ "type": "github" } ], - "time": "2020-11-30T07:40:27+00:00" + "time": "2024-03-01T13:54:02+00:00" }, { "name": "sebastian/object-reflector", - "version": "1.1.2", + "version": "1.1.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/object-reflector.git", - "reference": "9b8772b9cbd456ab45d4a598d2dd1a1bced6363d" + "reference": "1d439c229e61f244ff1f211e5c99737f90c67def" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/9b8772b9cbd456ab45d4a598d2dd1a1bced6363d", - "reference": "9b8772b9cbd456ab45d4a598d2dd1a1bced6363d", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/1d439c229e61f244ff1f211e5c99737f90c67def", + "reference": "1d439c229e61f244ff1f211e5c99737f90c67def", "shasum": "" }, "require": { @@ -1387,7 +2038,7 @@ "homepage": "https://github.com/sebastianbergmann/object-reflector/", "support": { "issues": "https://github.com/sebastianbergmann/object-reflector/issues", - "source": "https://github.com/sebastianbergmann/object-reflector/tree/1.1.2" + "source": "https://github.com/sebastianbergmann/object-reflector/tree/1.1.3" }, "funding": [ { @@ -1395,20 +2046,20 @@ "type": "github" } ], - "time": "2020-11-30T07:37:18+00:00" + "time": "2024-03-01T13:56:04+00:00" }, { "name": "sebastian/recursion-context", - "version": "3.0.1", + "version": "3.0.2", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "367dcba38d6e1977be014dc4b22f47a484dac7fb" + "reference": "9bfd3c6f1f08c026f542032dfb42813544f7d64c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/367dcba38d6e1977be014dc4b22f47a484dac7fb", - "reference": "367dcba38d6e1977be014dc4b22f47a484dac7fb", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/9bfd3c6f1f08c026f542032dfb42813544f7d64c", + "reference": "9bfd3c6f1f08c026f542032dfb42813544f7d64c", "shasum": "" }, "require": { @@ -1450,7 +2101,7 @@ "homepage": "http://www.github.com/sebastianbergmann/recursion-context", "support": { "issues": "https://github.com/sebastianbergmann/recursion-context/issues", - "source": "https://github.com/sebastianbergmann/recursion-context/tree/3.0.1" + "source": "https://github.com/sebastianbergmann/recursion-context/tree/3.0.2" }, "funding": [ { @@ -1458,20 +2109,20 @@ "type": "github" } ], - "time": "2020-11-30T07:34:24+00:00" + "time": "2024-03-01T14:07:30+00:00" }, { "name": "sebastian/resource-operations", - "version": "2.0.2", + "version": "2.0.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/resource-operations.git", - "reference": "31d35ca87926450c44eae7e2611d45a7a65ea8b3" + "reference": "72a7f7674d053d548003b16ff5a106e7e0e06eee" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/31d35ca87926450c44eae7e2611d45a7a65ea8b3", - "reference": "31d35ca87926450c44eae7e2611d45a7a65ea8b3", + "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/72a7f7674d053d548003b16ff5a106e7e0e06eee", + "reference": "72a7f7674d053d548003b16ff5a106e7e0e06eee", "shasum": "" }, "require": { @@ -1501,8 +2152,7 @@ "description": "Provides a list of PHP built-in functions that operate on resources", "homepage": "https://www.github.com/sebastianbergmann/resource-operations", "support": { - "issues": "https://github.com/sebastianbergmann/resource-operations/issues", - "source": "https://github.com/sebastianbergmann/resource-operations/tree/2.0.2" + "source": "https://github.com/sebastianbergmann/resource-operations/tree/2.0.3" }, "funding": [ { @@ -1510,20 +2160,20 @@ "type": "github" } ], - "time": "2020-11-30T07:30:19+00:00" + "time": "2024-03-01T13:59:09+00:00" }, { "name": "sebastian/type", - "version": "1.1.4", + "version": "1.1.5", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/type.git", - "reference": "0150cfbc4495ed2df3872fb31b26781e4e077eb4" + "reference": "18f071c3a29892b037d35e6b20ddf3ea39b42874" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/0150cfbc4495ed2df3872fb31b26781e4e077eb4", - "reference": "0150cfbc4495ed2df3872fb31b26781e4e077eb4", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/18f071c3a29892b037d35e6b20ddf3ea39b42874", + "reference": "18f071c3a29892b037d35e6b20ddf3ea39b42874", "shasum": "" }, "require": { @@ -1558,7 +2208,7 @@ "homepage": "https://github.com/sebastianbergmann/type", "support": { "issues": "https://github.com/sebastianbergmann/type/issues", - "source": "https://github.com/sebastianbergmann/type/tree/1.1.4" + "source": "https://github.com/sebastianbergmann/type/tree/1.1.5" }, "funding": [ { @@ -1566,7 +2216,7 @@ "type": "github" } ], - "time": "2020-11-30T07:25:11+00:00" + "time": "2024-03-01T14:04:07+00:00" }, { "name": "sebastian/version", @@ -1617,16 +2267,16 @@ }, { "name": "squizlabs/php_codesniffer", - "version": "3.9.0", + "version": "3.10.1", "source": { "type": "git", "url": "https://github.com/PHPCSStandards/PHP_CodeSniffer.git", - "reference": "d63cee4890a8afaf86a22e51ad4d97c91dd4579b" + "reference": "8f90f7a53ce271935282967f53d0894f8f1ff877" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/d63cee4890a8afaf86a22e51ad4d97c91dd4579b", - "reference": "d63cee4890a8afaf86a22e51ad4d97c91dd4579b", + "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/8f90f7a53ce271935282967f53d0894f8f1ff877", + "reference": "8f90f7a53ce271935282967f53d0894f8f1ff877", "shasum": "" }, "require": { @@ -1693,20 +2343,20 @@ "type": "open_collective" } ], - "time": "2024-02-16T15:06:51+00:00" + "time": "2024-05-22T21:24:41+00:00" }, { "name": "theseer/tokenizer", - "version": "1.2.2", + "version": "1.2.3", "source": { "type": "git", "url": "https://github.com/theseer/tokenizer.git", - "reference": "b2ad5003ca10d4ee50a12da31de12a5774ba6b96" + "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/b2ad5003ca10d4ee50a12da31de12a5774ba6b96", - "reference": "b2ad5003ca10d4ee50a12da31de12a5774ba6b96", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", + "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", "shasum": "" }, "require": { @@ -1735,7 +2385,7 @@ "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.2" + "source": "https://github.com/theseer/tokenizer/tree/1.2.3" }, "funding": [ { @@ -1743,20 +2393,20 @@ "type": "github" } ], - "time": "2023-11-20T00:12:19+00:00" + "time": "2024-03-03T12:36:25+00:00" }, { "name": "wp-coding-standards/wpcs", - "version": "3.0.1", + "version": "3.1.0", "source": { "type": "git", "url": "https://github.com/WordPress/WordPress-Coding-Standards.git", - "reference": "b4caf9689f1a0e4a4c632679a44e638c1c67aff1" + "reference": "9333efcbff231f10dfd9c56bb7b65818b4733ca7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/WordPress/WordPress-Coding-Standards/zipball/b4caf9689f1a0e4a4c632679a44e638c1c67aff1", - "reference": "b4caf9689f1a0e4a4c632679a44e638c1c67aff1", + "url": "https://api.github.com/repos/WordPress/WordPress-Coding-Standards/zipball/9333efcbff231f10dfd9c56bb7b65818b4733ca7", + "reference": "9333efcbff231f10dfd9c56bb7b65818b4733ca7", "shasum": "" }, "require": { @@ -1765,16 +2415,16 @@ "ext-tokenizer": "*", "ext-xmlreader": "*", "php": ">=5.4", - "phpcsstandards/phpcsextra": "^1.1.0", - "phpcsstandards/phpcsutils": "^1.0.8", - "squizlabs/php_codesniffer": "^3.7.2" + "phpcsstandards/phpcsextra": "^1.2.1", + "phpcsstandards/phpcsutils": "^1.0.10", + "squizlabs/php_codesniffer": "^3.9.0" }, "require-dev": { "php-parallel-lint/php-console-highlighter": "^1.0.0", "php-parallel-lint/php-parallel-lint": "^1.3.2", "phpcompatibility/php-compatibility": "^9.0", "phpcsstandards/phpcsdevtools": "^1.2.0", - "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0" + "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.0" }, "suggest": { "ext-iconv": "For improved results", @@ -1805,24 +2455,24 @@ }, "funding": [ { - "url": "https://opencollective.com/thewpcc/contribute/wp-php-63406", + "url": "https://opencollective.com/php_codesniffer", "type": "custom" } ], - "time": "2023-09-14T07:06:09+00:00" + "time": "2024-03-25T16:39:00+00:00" }, { "name": "yoast/phpunit-polyfills", - "version": "1.1.0", + "version": "1.1.1", "source": { "type": "git", "url": "https://github.com/Yoast/PHPUnit-Polyfills.git", - "reference": "224e4a1329c03d8bad520e3fc4ec980034a4b212" + "reference": "a0f7d708794a738f328d7b6c94380fd1d6c40446" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Yoast/PHPUnit-Polyfills/zipball/224e4a1329c03d8bad520e3fc4ec980034a4b212", - "reference": "224e4a1329c03d8bad520e3fc4ec980034a4b212", + "url": "https://api.github.com/repos/Yoast/PHPUnit-Polyfills/zipball/a0f7d708794a738f328d7b6c94380fd1d6c40446", + "reference": "a0f7d708794a738f328d7b6c94380fd1d6c40446", "shasum": "" }, "require": { @@ -1830,7 +2480,9 @@ "phpunit/phpunit": "^4.8.36 || ^5.7.21 || ^6.0 || ^7.0 || ^8.0 || ^9.0" }, "require-dev": { - "yoast/yoastcs": "^2.3.0" + "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": { @@ -1867,9 +2519,10 @@ ], "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": "2023-08-19T14:25:08+00:00" + "time": "2024-04-05T16:01:51+00:00" } ], "aliases": [], @@ -1877,7 +2530,10 @@ "stability-flags": [], "prefer-stable": false, "prefer-lowest": false, - "platform": [], + "platform": { + "ext-json": "*", + "ext-mbstring": "*" + }, "platform-dev": [], - "plugin-api-version": "2.3.0" + "plugin-api-version": "2.6.0" } diff --git a/includes/Admin/LogsPage.php b/includes/Admin/LogsPage.php new file mode 100644 index 00000000..cb576d2a --- /dev/null +++ b/includes/Admin/LogsPage.php @@ -0,0 +1,49 @@ +get_template( + 'admin/logs-page.php', + $template_args + ); + } +} diff --git a/includes/Admin/Main.php b/includes/Admin/Main.php index 6afa38c1..63456e67 100644 --- a/includes/Admin/Main.php +++ b/includes/Admin/Main.php @@ -24,6 +24,7 @@ class Main { public function __construct() { new PluginsPage(); new DebugPage(); + new LogsPage(); new Ajax(); new MetaBoxes\Order(); new MetaBoxes\User(); @@ -37,7 +38,8 @@ public function __construct() { * @param string $hook current page hook. */ public function admin_enqueue_scripts( string $hook ) { - $debug = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG; + $debug = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG; + $vite_dev = defined( 'VITE_DEV' ) && VITE_DEV; if ( 'post.php' === $hook || rp_hpos_is_order_page() ) { $suffix = $debug ? '' : '.min'; @@ -87,8 +89,12 @@ public function admin_enqueue_scripts( string $hook ) { 'nested_path' => '/debug-page/', 'file' => 'src/admin/debug-page/main.tsx', ), + array( + 'nested_path' => '/logs-page/', + 'file' => 'src/admin/logs-page/main.tsx', + ), ); - if ( $debug ) { + if ( $vite_dev ) { ViteAssetsLoader::dev( $vite_entry_points ); } else { ViteAssetsLoader::production( diff --git a/includes/Api.php b/includes/Api.php index 91eebb24..dc59f491 100644 --- a/includes/Api.php +++ b/includes/Api.php @@ -757,6 +757,7 @@ public function settle( WC_Order $order, $amount = null, $items_data = false, $l $request_data ); } else { + // @TODO $line_item can be an array $price = OrderCapture::get_item_price( $line_item, $order ); if ( $remaining > 0 && round( $remaining / 100 ) === $price['with_tax'] && diff --git a/includes/Api/Controller/LogsController.php b/includes/Api/Controller/LogsController.php new file mode 100644 index 00000000..f34e5081 --- /dev/null +++ b/includes/Api/Controller/LogsController.php @@ -0,0 +1,77 @@ +namespace = 'billwerk/v1'; + $this->rest_base = 'logs'; + } + + /** + * Register API routes + * + * @return void + */ + public function register_routes() { + register_rest_route( + $this->namespace, + "/$this->rest_base/", + array( + array( + 'methods' => WP_REST_Server::CREATABLE, + 'callback' => array( $this, 'get_logs' ), + 'permission_callback' => array( $this, 'get_items_permissions_check' ), + ), + 'schema' => array( $this, 'get_item_schema' ), + ) + ); + } + + /** + * Retrieves files logs + * + * @param WP_REST_Request $request Full details about the request. + * + * @return WP_REST_Response|WP_Error Response object on success, or WP_Error object on failure. + */ + public function get_logs( WP_REST_Request $request ) { + $files = reepay()->log()->get_files(); + + return rest_ensure_response( $files ); + } + + /** + * Checks if a given request has access to get items. + * + * @param WP_REST_Request $request Full details about the request. + * + * @return true|WP_Error True if the request has read access, WP_Error object otherwise. + */ + public function get_items_permissions_check( $request ) { + if ( ! current_user_can( 'manage_options' ) ) { + return new WP_Error( 'rest_forbidden', esc_html__( 'You cannot view the post resource.' ), array( 'status' => rest_authorization_required_code() ) ); + } + + return true; + } +} diff --git a/includes/DIContainer.php b/includes/DIContainer.php index 47eac8de..592be5d1 100644 --- a/includes/DIContainer.php +++ b/includes/DIContainer.php @@ -69,6 +69,17 @@ public function has( $id ): bool { return isset( $this->classes[ $id ] ) || class_exists( $id ); } + /** + * Check exist class in container + * + * @param string $id Identifier. + * + * @return bool + */ + public function is_set( string $id ): bool { + return isset( $this->classes[ $id ] ); + } + /** * Finds an entry of the container by its identifier and returns it. * diff --git a/includes/Gateways/ReepayCheckout.php b/includes/Gateways/ReepayCheckout.php index 109ffca9..51ccc93a 100644 --- a/includes/Gateways/ReepayCheckout.php +++ b/includes/Gateways/ReepayCheckout.php @@ -8,6 +8,8 @@ namespace Reepay\Checkout\Gateways; +use Billwerk\Sdk\Enum\PaymentMethodEnum; +use Billwerk\Sdk\Exception\BillwerkApiException; use Exception; use Reepay\Checkout\Utils\LoggingTrait; use Reepay\Checkout\Plugin\Statistics; @@ -137,22 +139,22 @@ public function init_form_fields() { }, ), 'account' => array( - 'title' => __( 'Account', 'reepay-checkout-gateway' ), - 'type' => 'account_info', - 'show' => function () { + 'title' => __( 'Account', 'reepay-checkout-gateway' ), + 'type' => 'account_info', + 'show' => function () { return ! empty( $this->get_option( 'private_key' ) ); }, - 'info_type' => 'name', - 'is_test' => false, + 'getter' => 'getName', + 'is_test' => false, ), 'state' => array( - 'title' => __( 'State', 'reepay-checkout-gateway' ), - 'type' => 'account_info', - 'show' => function () { + 'title' => __( 'State', 'reepay-checkout-gateway' ), + 'type' => 'account_info', + 'show' => function () { return ! empty( $this->get_option( 'private_key' ) ); }, - 'info_type' => 'state', - 'is_test' => false, + 'getter' => 'getState', + 'is_test' => false, ), 'is_webhook_configured_live' => array( 'type' => 'webhook_status', @@ -177,22 +179,22 @@ public function init_form_fields() { }, ), 'account_test' => array( - 'title' => __( 'Account', 'reepay-checkout-gateway' ), - 'type' => 'account_info', - 'show' => function () { + 'title' => __( 'Account', 'reepay-checkout-gateway' ), + 'type' => 'account_info', + 'show' => function () { return ! empty( $this->get_option( 'private_key_test' ) ); }, - 'info_type' => 'name', - 'is_test' => true, + 'getter' => 'getName', + 'is_test' => true, ), 'state_test' => array( - 'title' => __( 'State', 'reepay-checkout-gateway' ), - 'type' => 'account_info', - 'show' => function () { + 'title' => __( 'State', 'reepay-checkout-gateway' ), + 'type' => 'account_info', + 'show' => function () { return ! empty( $this->get_option( 'private_key_test' ) ); }, - 'info_type' => 'state', - 'is_test' => true, + 'getter' => 'getState', + 'is_test' => true, ), 'is_webhook_configured_test' => array( 'type' => 'webhook_status', @@ -245,31 +247,62 @@ public function init_form_fields() { 'type' => 'multiselect', 'css' => 'height: 250px', 'options' => array( - 'card' => 'All available debit / credit cards', - 'dankort' => 'Dankort', - 'visa' => 'VISA', - 'visa_dk' => 'VISA/Dankort', - 'visa_elec' => 'VISA Electron', - 'mc' => 'MasterCard', - 'amex' => 'American Express', - 'mobilepay' => 'MobilePay', - 'viabill' => 'ViaBill', - 'klarna_pay_later' => 'Klarna Pay Later', - 'klarna_pay_now' => 'Klarna Pay Now', - 'klarna_slice_it' => 'Klarna Slice It', - 'resurs' => 'Resurs Bank', - 'swish' => 'Swish', - 'diners' => 'Diners Club', - 'maestro' => 'Maestro', - 'laser' => 'Laser', - 'discover' => 'Discover', - 'jcb' => 'JCB', - 'china_union_pay' => 'China Union Pay', - 'ffk' => 'Forbrugsforeningen', - 'paypal' => 'PayPal', - 'applepay' => 'Apple Pay', - 'googlepay' => 'Google Pay', - 'vipps' => 'Vipps', + PaymentMethodEnum::CARD => 'All available debit / credit cards', + PaymentMethodEnum::DANKORT => 'Dankort', + PaymentMethodEnum::VISA => 'VISA', + PaymentMethodEnum::VISA_ELEC => 'VISA Electron', + PaymentMethodEnum::MC => 'MasterCard', + PaymentMethodEnum::AMEX => 'American Express', + PaymentMethodEnum::MOBILEPAY => 'MobilePay Online', + PaymentMethodEnum::MOBILEPAY_SUBSCRIPTIONS => 'MobilePay Subscriptions', + PaymentMethodEnum::VIABILL => 'ViaBill', + PaymentMethodEnum::ANYDAY => 'AnyDay', + PaymentMethodEnum::RESURS => 'Resurs Bank', + PaymentMethodEnum::SWISH => 'Swish', + PaymentMethodEnum::VIPPS => 'Vipps', + PaymentMethodEnum::VIPPS_RECURRING => 'Vipps Recurring', + PaymentMethodEnum::DINERS => 'Diners Club', + PaymentMethodEnum::MAESTRO => 'Maestro', + PaymentMethodEnum::LASER => 'Laser', + PaymentMethodEnum::DISCOVER => 'Discover', + PaymentMethodEnum::JCB => 'JCB', + PaymentMethodEnum::CHINA_UNION_PAY => 'China Union Pay', + PaymentMethodEnum::FFK => 'Forbrugsforeningen', + PaymentMethodEnum::PAYPAL => 'PayPal', + PaymentMethodEnum::APPLEPAY => 'Apple Pay', + PaymentMethodEnum::GOOGLEPAY => 'Google Pay', + PaymentMethodEnum::KLARNA_PAY_LATER => 'Klarna Pay Later', + PaymentMethodEnum::KLARNA_PAY_NOW => 'Klarna Pay Now', + PaymentMethodEnum::KLARNA_SLICE_IT => 'Klarna Slice It', + PaymentMethodEnum::KLARNA_DIRECT_BANK_TRANSFER => 'Klarna Direct Bank Transfer', + PaymentMethodEnum::KLARNA_DIRECT_DEBIT => 'Klarna Direct Debit', + PaymentMethodEnum::IDEAL => 'iDEAL', + PaymentMethodEnum::BLIK => 'BLIK', + PaymentMethodEnum::P24 => 'Przelewy24 (P24)', + PaymentMethodEnum::VERKKOPANKKI => 'Finnish banks', + PaymentMethodEnum::GIROPAY => 'giropay', + PaymentMethodEnum::SEPA => 'SEPA Direct Debit', + PaymentMethodEnum::BANCOMATPAY => 'BANCOMAT Pay', + PaymentMethodEnum::BANCONTACT => 'Bancontact', + PaymentMethodEnum::EPS => 'EPS', + PaymentMethodEnum::ESTONIA_BANKS => 'Estonian Banks', + PaymentMethodEnum::LATVIA_BANKS => 'Latvian Banks', + PaymentMethodEnum::LITHUANIA_BANKS => 'Lithuanian Banks', + PaymentMethodEnum::MB_WAY => 'MB Way', + PaymentMethodEnum::MULTIBANCO => 'Multibanco', + PaymentMethodEnum::MYBANK => 'mBank', + PaymentMethodEnum::PAYCONIQ => 'Payconiq', + PaymentMethodEnum::PAYSAFECARD => 'Paysafecard', + PaymentMethodEnum::PAYSERA => 'Paysera', + PaymentMethodEnum::POSTFINANCE => 'PostFinance', + PaymentMethodEnum::SATISPAY => 'Satisfy', + PaymentMethodEnum::TRUSTLY => 'Trustly', + PaymentMethodEnum::TWINT => 'Twint', + PaymentMethodEnum::WECHATPAY => 'WeChat Pay', + PaymentMethodEnum::SANTANDER => 'Santander', + PaymentMethodEnum::OFFLINE_BANK_TRANSFER => 'Bank Transfer', + PaymentMethodEnum::OFFLINE_CASH => 'Cash', + PaymentMethodEnum::OFFLINE_OTHER => 'Other', ), 'default' => array(), ), @@ -351,24 +384,43 @@ public function init_form_fields() { 'css' => 'height: 250px', 'options' => array( 'dankort' => __( 'Dankort', 'reepay-checkout-gateway' ), + 'anyday' => __( 'Anyday', 'reepay-checkout-gateway' ), + 'applepay' => __( 'ApplePay', 'reepay-checkout-gateway' ), + 'googlepay' => __( 'Google pay', 'reepay-checkout-gateway' ), + 'klarna' => __( 'Klarna', 'reepay-checkout-gateway' ), + 'mobilepay' => __( 'MobilePay Online', 'reepay-checkout-gateway' ), + 'paypal' => __( 'Paypal', 'reepay-checkout-gateway' ), + 'resurs' => __( 'Resurs Bank', 'reepay-checkout-gateway' ), + 'swish' => __( 'Resurs Bank', 'reepay-checkout-gateway' ), + 'viabill' => __( 'Viabill', 'reepay-checkout-gateway' ), + 'vipps' => __( 'Vipps', 'reepay-checkout-gateway' ), + 'ideal' => __( 'iDEAL', 'reepay-checkout-gateway' ), + 'sepa' => __( 'SEPA', 'reepay-checkout-gateway' ), + 'bancontact' => __( 'Bancontact', 'reepay-checkout-gateway' ), + 'blik' => __( 'BLIK', 'reepay-checkout-gateway' ), + 'eps' => __( 'EPS', 'reepay-checkout-gateway' ), + 'giropay' => __( 'GiroPay', 'reepay-checkout-gateway' ), + 'mbway' => __( 'MB Way', 'reepay-checkout-gateway' ), + 'multibanco' => __( 'Multibanco', 'reepay-checkout-gateway' ), + 'mybank' => __( 'MyBank', 'reepay-checkout-gateway' ), + 'paycoinq' => __( 'Paycoinq', 'reepay-checkout-gateway' ), + 'paysafecard' => __( 'Paysafecard', 'reepay-checkout-gateway' ), + 'paysera' => __( 'Paysera', 'reepay-checkout-gateway' ), + 'postfinance' => __( 'PostFinance', 'reepay-checkout-gateway' ), + 'satispay' => __( 'Satisfy', 'reepay-checkout-gateway' ), + 'trustly' => __( 'Trustly', 'reepay-checkout-gateway' ), + 'wechatpay' => __( 'WeChat Pay', 'reepay-checkout-gateway' ), + 'santander' => __( 'Santander', 'reepay-checkout-gateway' ), 'visa' => __( 'Visa', 'reepay-checkout-gateway' ), 'mastercard' => __( 'MasterCard', 'reepay-checkout-gateway' ), 'visa-electron' => __( 'Visa Electron', 'reepay-checkout-gateway' ), 'maestro' => __( 'Maestro', 'reepay-checkout-gateway' ), - 'paypal' => __( 'Paypal', 'reepay-checkout-gateway' ), - 'mobilepay' => __( 'MobilePay Online', 'reepay-checkout-gateway' ), - 'applepay' => __( 'ApplePay', 'reepay-checkout-gateway' ), - 'klarna' => __( 'Klarna', 'reepay-checkout-gateway' ), - 'viabill' => __( 'Viabill', 'reepay-checkout-gateway' ), - 'resurs' => __( 'Resurs Bank', 'reepay-checkout-gateway' ), 'forbrugsforeningen' => __( 'Forbrugsforeningen', 'reepay-checkout-gateway' ), 'amex' => __( 'AMEX', 'reepay-checkout-gateway' ), 'jcb' => __( 'JCB', 'reepay-checkout-gateway' ), 'diners' => __( 'Diners Club', 'reepay-checkout-gateway' ), 'unionpay' => __( 'Unionpay', 'reepay-checkout-gateway' ), 'discover' => __( 'Discover', 'reepay-checkout-gateway' ), - 'googlepay' => __( 'Google pay', 'reepay-checkout-gateway' ), - 'vipps' => __( 'Vipps', 'reepay-checkout-gateway' ), ), 'select_buttons' => true, 'default' => array(), @@ -449,10 +501,10 @@ public function generate_account_info_html( string $key, array $data ): string { $data = wp_parse_args( $data, array( - 'title' => '', - 'info_type' => 'name', - 'is_test' => false, - 'show' => function () { + 'title' => '', + 'getter' => null, + 'is_test' => false, + 'show' => function () { return true; }, ) @@ -462,7 +514,11 @@ public function generate_account_info_html( string $key, array $data ): string { return ''; } - $info = $this->get_account_info( $data['is_test'] ); + try { + $account_info = $this->get_account_info( $data['is_test'] ); + } catch ( BillwerkApiException $e ) { + $account_info = null; + } ob_start(); ?> @@ -472,9 +528,9 @@ public function generate_account_info_html( string $key, array $data ): string {
- + - +
diff --git a/includes/Gateways/ReepayGateway.php b/includes/Gateways/ReepayGateway.php index 0e6aa039..f8e92c55 100644 --- a/includes/Gateways/ReepayGateway.php +++ b/includes/Gateways/ReepayGateway.php @@ -7,6 +7,8 @@ namespace Reepay\Checkout\Gateways; +use Billwerk\Sdk\Exception\BillwerkApiException; +use Billwerk\Sdk\Model\Account\AccountModel; use Exception; use Reepay\Checkout\Api; use Reepay\Checkout\Integrations\PWGiftCardsIntegration; @@ -378,32 +380,34 @@ public function is_gateway_settings_page(): bool { } /** - * Get reepay account info + * Get billwerk account info * - * @param bool $is_test use test or live reepay api keys. + * @param bool $is_test use test or live billwerk api keys. * - * @return array|mixed|object|WP_Error + * @return null|AccountModel + * + * @throws BillwerkApiException Api exception. */ - public function get_account_info( $is_test = false ) { + public function get_account_info( bool $is_test = false ): ?AccountModel { if ( $this->is_gateway_settings_page() ) { - $key = 'account_info'; - $force = true; + $key = 'account_info'; + $force_live_key = true; if ( $is_test ) { - $key = 'account_info_test'; - $force = false; + $key = 'account_info_test'; + $force_live_key = false; } $account_info = get_transient( $key ); if ( empty( $account_info ) ) { - $account_info = reepay()->api( $this )->request( 'GET', 'https://api.reepay.com/v1/account', array(), $force ); + $account_info = reepay()->sdk( $force_live_key )->account()->get(); set_transient( $key, $account_info, 5 ); } return $account_info; } - return array(); + return null; } diff --git a/includes/OrderFlow/InstantSettle.php b/includes/OrderFlow/InstantSettle.php index 38cb80d9..8e86a1b8 100644 --- a/includes/OrderFlow/InstantSettle.php +++ b/includes/OrderFlow/InstantSettle.php @@ -104,9 +104,11 @@ public function process_instant_settle( WC_Order $order ) { } } - self::$order_capture->settle_items( $order, $items_data, $total_all, $settle_items ); - $order->add_meta_data( '_is_instant_settled', '1' ); - $order->save_meta_data(); + $settle = self::$order_capture->settle_items( $order, $items_data, $total_all, $settle_items ); + if ( $settle ) { + $order->add_meta_data( '_is_instant_settled', '1' ); + $order->save_meta_data(); + } } } diff --git a/includes/OrderFlow/OrderCapture.php b/includes/OrderFlow/OrderCapture.php index c4108007..2c16830f 100644 --- a/includes/OrderFlow/OrderCapture.php +++ b/includes/OrderFlow/OrderCapture.php @@ -360,8 +360,7 @@ public function settle_item( WC_Order_Item $item, WC_Order $order ): bool { * @return bool */ public function check_capture_allowed( WC_Order $order ): bool { - if ( ! rp_is_order_paid_via_reepay( $order ) || - class_exists( WC_Reepay_Renewals::class ) && WC_Reepay_Renewals::is_order_contain_subscription( $order ) ) { + if ( ! rp_is_order_paid_via_reepay( $order ) || ( class_exists( WC_Reepay_Renewals::class ) && WC_Reepay_Renewals::is_order_contain_subscription( $order ) ) ) { return false; } diff --git a/includes/Utils/FilesystemUtil.php b/includes/Utils/FilesystemUtil.php new file mode 100644 index 00000000..fd782997 --- /dev/null +++ b/includes/Utils/FilesystemUtil.php @@ -0,0 +1,69 @@ +wp_filesystem = FilesystemUtil::get_wp_filesystem(); + + $this->directory_path = $directory_path; + $this->directory_url = $directory_url; + $this->source = $source; + } + + /** + * Source log. + * + * @param string $source Source log. + * + * @return self + */ + public function set_source( string $source ): self { + $this->source = $source; + return $this; + } + + /** + * Create directory logs + * + * @param string $log_directory log directory path. + * + * @return void + */ + public function create_nested_directories( string $log_directory ) { + $path_parts = explode( '/', $log_directory ); + $path = ''; + + foreach ( $path_parts as $part ) { + if ( ! empty( $part ) ) { + $path .= '/' . $part; + if ( ! $this->wp_filesystem->is_dir( $path ) ) { + $this->wp_filesystem->mkdir( $path, FS_CHMOD_DIR ); + } + } + } + } + + /** + * Get absolute path log file + * + * @return string + */ + private function get_log_file_path(): string { + $date = new DateTime(); + $year = $date->format( 'Y' ); + $month = $date->format( 'm' ); + $day = $date->format( 'd' ); + $log_directory = "{$this->directory_path}/{$year}/{$month}/{$day}"; + + if ( ! $this->wp_filesystem->is_dir( $log_directory ) ) { + $this->create_nested_directories( $log_directory ); + } + + return "{$log_directory}/{$this->source}.json"; + } + + /** + * Add ignored classes to backtrace + * + * @param array $names class names. + * + * @return self + */ + public function add_ignored_classes_backtrace( array $names ): self { + $this->ignore_classes_backtrace = array( ...$this->ignore_classes_backtrace, ...$names ); + return $this; + } + + /** + * Get log backtrace + * + * @return array + */ + private function get_backtrace(): array { + $backtrace = debug_backtrace( DEBUG_BACKTRACE_IGNORE_ARGS ); // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_debug_backtrace + + $ignore_classes = array( self::class, ...$this->ignore_classes_backtrace ); + + $backtrace = array_filter( + $backtrace, + function ( $trace ) use ( $ignore_classes ) { + return ! ( isset( $trace['class'] ) && in_array( $trace['class'], $ignore_classes, true ) ); + } + ); + + return array_values( $backtrace ); + } + + /** + * Logging to file + * + * @param string $level level log. + * @param string|array|int|float $message message log. + * @param array $context context log. + * + * @return void + */ + private function log( string $level, $message, array $context = array() ) { + $log_entry = array( + 'timestamp' => gmdate( 'c' ), + 'level' => $level, + 'message' => $message, + 'context' => $context, + 'backtrace' => $this->get_backtrace(), + ); + + $log_file_path = $this->get_log_file_path(); + + if ( $this->wp_filesystem->exists( $log_file_path ) ) { + $log_content = $this->wp_filesystem->get_contents( $log_file_path ); + $log_array = json_decode( $log_content, true ); + if ( ! is_array( $log_array ) ) { + $log_array = array(); + } + } else { + $log_array = array(); + } + + $log_array[] = $log_entry; + + $log_entry_json = wp_json_encode( $log_array ); + $this->wp_filesystem->put_contents( $log_file_path, $log_entry_json, FS_CHMOD_FILE ); + } + + /** + * Get file information + * + * @param SplFileInfo $file file path. + * + * @return array + */ + public function get_file_details( SplFileInfo $file ): array { + $pathname = $file->getPathname(); + $split_path = explode( self::FOLDER, $pathname ); + $nested_path = null; + if ( $split_path ) { + $nested_path = $this->directory_url . $split_path[1]; + } + return array( + 'name' => $file->getBasename( '.json' ), + 'url' => set_url_scheme( $nested_path ?? $pathname ), + 'size' => filesize( $pathname ), + 'created' => gmdate( DATE_ATOM, filectime( $pathname ) ), + 'modified' => gmdate( DATE_ATOM, filemtime( $pathname ) ), + ); + } + + /** + * Get files logs + * + * @return array + */ + public function get_files(): array { + $rii = new RecursiveIteratorIterator( new RecursiveDirectoryIterator( $this->directory_path ) ); + $files = array(); + + /** + * File log + * + * @var $file SplFileInfo + */ + foreach ( $rii as $file ) { + if ( ! $file->isFile() ) { + continue; + } + $files[] = $this->get_file_details( $file ); + } + + return $files; + } + + /** + * Adds info level message. + * + * @param string|array|int|float $message message log. + * @param array $context context log. + * + * @return void + */ + public function info( $message, array $context = array() ) { + $this->log( LevelLogger::INFO, $message, $context ); + } + + /** + * Adds debug level message. + * + * @param string|array|int|float $message message log. + * @param array $context context log. + * + * @return void + */ + public function debug( $message, array $context = array() ) { + $this->log( LevelLogger::DEBUG, $message, $context ); + } + + /** + * Adds error level message. + * + * @param string|array|int|float $message message log. + * @param array $context context log. + * + * @return void + */ + public function error( $message, array $context = array() ) { + $this->log( LevelLogger::ERROR, $message, $context ); + } + + /** + * Adds error level message. + * + * @param string|array|int|float $message message log. + * @param array $context context log. + * + * @return void + */ + public function warning( $message, array $context = array() ) { + $this->log( LevelLogger::WARNING, $message, $context ); + } +} diff --git a/includes/Utils/Logger/LevelLogger.php b/includes/Utils/Logger/LevelLogger.php new file mode 100644 index 00000000..5694c62a --- /dev/null +++ b/includes/Utils/Logger/LevelLogger.php @@ -0,0 +1,21 @@ +log( self::SOURCE )->debug( $message, $context ); + } + + /** + * Info log + * + * @param string|array|int|float $message message log. + * @param array $context context log. + * + * @return void + */ + public function info( $message, array $context = array() ) { + reepay()->log( self::SOURCE )->info( $message, $context ); + } + + /** + * Error log + * + * @param string|array|int|float $message message log. + * @param array $context context log. + * + * @return void + */ + public function error( $message, array $context = array() ) { + reepay()->log( self::SOURCE )->error( $message, $context ); + } +} diff --git a/includes/Utils/ViteAssetsLoader.php b/includes/Utils/ViteAssetsLoader.php index e05fdf2c..16adae66 100644 --- a/includes/Utils/ViteAssetsLoader.php +++ b/includes/Utils/ViteAssetsLoader.php @@ -15,6 +15,8 @@ class ViteAssetsLoader { public const HMR_HOST = 'http://localhost:5173'; public const MANIFEST_FILE_PATH = '.vite/manifest.json'; + public const WP_DEPS = array( 'wp-i18n', 'wp-element', 'wp-html-entities', 'moment', 'lodash' ); + public const WC_DEPS = array( 'wc-blocks-registry', 'wc-settings' ); /** * Displays vite scripts for development in the footer @@ -68,6 +70,26 @@ function () use ( $entry_point ) { ); } + /** + * Show error on site + * + * @param string $error_title error. + * + * @return void + */ + public static function show_error( + string $error_title + ): void { + wp_die( + wp_kses( + $error_title, + array( + 'b' => array(), + ) + ) + ); + } + /** * Gets the full manifest vite file * @@ -75,19 +97,24 @@ function () use ( $entry_point ) { * * @return mixed */ - public static function get_manifest_config( string $build_path ) { + public static function get_manifest_config( + string $build_path + ) { $file_path = $build_path . '/' . self::MANIFEST_FILE_PATH; $error_title = 'Error Billwerk+ Payments: '; if ( ! file_exists( $file_path ) ) { - wp_die( $error_title . __( 'Vite scripts manifest file not found', 'reepay-checkout-gateway' ), $error_title ); + $error_title = $error_title . __( 'Vite scripts manifest file not found', 'reepay-checkout-gateway' ); + self::show_error( $error_title ); } $json_data = file_get_contents( $file_path ); // phpcs:ignore if ( false === $json_data ) { - wp_die( $error_title . __( 'Vite scripts manifest file not read', 'reepay-checkout-gateway' ), $error_title ); + $error_title = $error_title . __( 'Vite scripts manifest file not read', 'reepay-checkout-gateway' ); + self::show_error( $error_title ); } $data = json_decode( $json_data, true ); if ( json_last_error() !== JSON_ERROR_NONE ) { - wp_die( $error_title . __( 'Vite scripts manifest file is not correct', 'reepay-checkout-gateway' ), $error_title ); + $error_title = $error_title . __( 'Vite scripts manifest file is not correct', 'reepay-checkout-gateway' ); + self::show_error( $error_title ); } return $data; @@ -101,7 +128,10 @@ public static function get_manifest_config( string $build_path ) { * * @return false|mixed */ - public static function get_entry_point_config( array $manifest_config, string $entry_point ) { + public static function get_entry_point_config( + array $manifest_config, + string $entry_point + ) { if ( array_key_exists( $entry_point, $manifest_config ) ) { return $manifest_config[ $entry_point ]; } @@ -110,22 +140,28 @@ public static function get_entry_point_config( array $manifest_config, string $e } /** - * Connects scripts to WordPress + * Connect script to WordPress * * @param array $entry_point_config entry point config. * @param string $build_url vite build url. * @param bool|string $plugin_version version. + * @param array|null $dependencies dependencies instead of default ones. * * @return void */ - public static function connecting_entry_point_scripts( array $entry_point_config, string $build_url, $plugin_version = false ): void { + public static function connecting_entry_point_script( + array $entry_point_config, + string $build_url, + $plugin_version = false, + ?array $dependencies = null + ): void { if ( ! $entry_point_config['isEntry'] ) { return; } wp_enqueue_script( $entry_point_config['src'], $build_url . $entry_point_config['file'], - array( 'wp-i18n', 'wp-element', 'moment' ), + $dependencies ? $dependencies : self::WP_DEPS, $plugin_version, true ); @@ -139,13 +175,33 @@ public static function connecting_entry_point_scripts( array $entry_point_config * * @return void */ - public static function dev( array $vite_entry_points, bool $admin_footer = true ) { - self::output_vite_dev(); + public static function dev( array $vite_entry_points, bool $admin_footer = true ): void { + self::output_vite_dev( $admin_footer ); foreach ( $vite_entry_points as $vite_entry_point ) { self::output_vite_dev_entry_point( $vite_entry_point['file'], $admin_footer ); } } + /** + * Fake script registration in dev mode, where it is very necessary + * + * @param array $vite_entry_points entry points from manifest. + * + * @return void + */ + public static function fake_register_scripts( + array $vite_entry_points + ) { + foreach ( $vite_entry_points as $vite_entry_point ) { + // phpcs:disable + wp_register_script( + $vite_entry_point['file'], + '', + ); + // phpcs:enable + } + } + /** * Displays all scripts for production * @@ -153,15 +209,22 @@ public static function dev( array $vite_entry_points, bool $admin_footer = true * @param string $build_path path to compiled vite scripts. * @param string $build_url vite build url. * @param bool|string $plugin_version version. + * @param array|null $dependencies dependencies instead of default ones. * * @return void */ - public static function production( array $vite_entry_points, string $build_path, string $build_url, $plugin_version = false ) { + public static function production( + array $vite_entry_points, + string $build_path, + string $build_url, + $plugin_version = false, + ?array $dependencies = null + ): void { foreach ( $vite_entry_points as $vite_entry_point ) { $config = self::get_manifest_config( $build_path . $vite_entry_point['nested_path'] ); $entry_point_config = self::get_entry_point_config( $config, $vite_entry_point['file'] ); if ( $entry_point_config ) { - self::connecting_entry_point_scripts( $entry_point_config, $build_url . $vite_entry_point['nested_path'], $plugin_version ); + self::connecting_entry_point_script( $entry_point_config, $build_url . $vite_entry_point['nested_path'], $plugin_version, $dependencies ); } } } diff --git a/phpunit.xml b/phpunit.xml index 0d04c116..c942540b 100644 --- a/phpunit.xml +++ b/phpunit.xml @@ -23,7 +23,7 @@ ./tests/unit/orderFlow - ./tests/unit/gatewaysTests + tests/unit/GatewaysTests ./tests/unit/tokens diff --git a/reepay-woocommerce-payment.php b/reepay-woocommerce-payment.php index ac64a3d8..08ef6ed9 100755 --- a/reepay-woocommerce-payment.php +++ b/reepay-woocommerce-payment.php @@ -13,8 +13,15 @@ * @package Reepay\Checkout */ +use Billwerk\Sdk\BillwerkClientFactory; +use Billwerk\Sdk\BillwerkRequest; +use Billwerk\Sdk\Sdk; +use Billwerk\Sdk\Service\AccountService; +use GuzzleHttp\Client; +use GuzzleHttp\Psr7\HttpFactory; use Reepay\Checkout\Api; use Reepay\Checkout\Api\Controller\DebugController; +use Reepay\Checkout\Api\Controller\LogsController; use Reepay\Checkout\Api\Controller\MetaFieldsController; use Reepay\Checkout\DIContainer; use Reepay\Checkout\Gateways; @@ -23,6 +30,8 @@ use Reepay\Checkout\Plugin\Statistics; use Reepay\Checkout\Plugin\WoocommerceExists; use Reepay\Checkout\Plugin\WoocommerceHPOS; +use Reepay\Checkout\Utils\Logger\JsonLogger; +use Reepay\Checkout\Utils\Logger\SdkLogger; defined( 'ABSPATH' ) || exit(); @@ -33,30 +42,30 @@ class WC_ReepayCheckout { /** * Class instance * - * @var WC_ReepayCheckout + * @var ?WC_ReepayCheckout */ - private static $instance; + private static ?WC_ReepayCheckout $instance = null; /** * Settings array * * @var array */ - private $settings = array(); + private array $settings = array(); /** * Gateways class instance * - * @var Gateways + * @var Gateways|null */ - private $gateways = null; + private ?Gateways $gateways = null; /** * Dependency injection container * - * @var DIContainer + * @var DIContainer|null */ - private $di_container = null; + private ?DIContainer $di_container = null; /** * Constructor @@ -194,7 +203,7 @@ public function get_setting( string $name ) { * Reset options from database. Now using only for testing purposes */ public function reset_settings() { - $this->settings = null; + $this->settings = array(); $this->get_setting( '' ); } @@ -243,6 +252,61 @@ public function api( $source ): Api { return $api; } + /** + * Get Billwerk sdk + * + * @param bool $force_live_key Force use live key. + * + * @return Sdk + */ + public function sdk( bool $force_live_key = false ): Sdk { + $api_key = ( ! $force_live_key && reepay()->get_setting( 'test_mode' ) === 'yes' ) + ? $this->get_setting( 'private_key_test' ) + : $this->get_setting( 'private_key' ); + + $sdk = new Sdk( + new BillwerkClientFactory( + new Client(), + new HttpFactory(), + new HttpFactory(), + ), + $api_key + ); + + $sdk->setLogger( + new SdkLogger() + ); + + if ( $this->di()->is_set( AccountService::class ) ) { + $account_service = $this->di()->get( AccountService::class ); + if ( $account_service instanceof AccountService ) { + $sdk->setAccountService( $account_service ); + } + } + + return $sdk; + } + + /** + * Get logger + * + * @param string $source Source log. + * + * @return JsonLogger + */ + public function log( string $source = 'billwerk' ): JsonLogger { + return ( new JsonLogger( + wp_upload_dir()['basedir'] . '/' . JsonLogger::FOLDER, + wp_upload_dir()['baseurl'] . '/' . JsonLogger::FOLDER, + $source + ) )->add_ignored_classes_backtrace( + array( + BillwerkRequest::class, + SdkLogger::class, + ) + ); + } + /** * Get gateways class instance * @@ -300,6 +364,7 @@ public function include_classes() { public function init_rest_api(): void { ( new MetaFieldsController() )->register_routes(); ( new DebugController() )->register_routes(); + ( new LogsController() )->register_routes(); } } diff --git a/templates/admin/logs-page.php b/templates/admin/logs-page.php new file mode 100644 index 00000000..3fefd98b --- /dev/null +++ b/templates/admin/logs-page.php @@ -0,0 +1,13 @@ + + +
+
+
diff --git a/tests/helpers/Reepay_UnitTestCase_Trait.php b/tests/helpers/Reepay_UnitTestCase_Trait.php index 491c6c99..61ec938f 100644 --- a/tests/helpers/Reepay_UnitTestCase_Trait.php +++ b/tests/helpers/Reepay_UnitTestCase_Trait.php @@ -7,7 +7,15 @@ namespace Reepay\Checkout\Tests\Helpers; +use Billwerk\Sdk\BillwerkClientFactory; +use Billwerk\Sdk\Sdk; +use Billwerk\Sdk\Service\AccountService; +use GuzzleHttp\Client; +use GuzzleHttp\Psr7\HttpFactory; use PHPUnit\Framework\MockObject\MockObject; +use Psr\Http\Client\ClientInterface; +use Psr\Http\Message\RequestFactoryInterface; +use Psr\Http\Message\StreamFactoryInterface; use Reepay\Checkout\Api; use Reepay\Checkout\OrderFlow\InstantSettle; use Reepay\Checkout\OrderFlow\OrderCapture; @@ -74,6 +82,20 @@ trait Reepay_UnitTestCase_Trait { */ protected Api $api_mock; + /** + * Api account service mock + * + * @var AccountService|MockObject + */ + protected AccountService $account_service_mock; + + /** + * Sdk api mock + * + * @var Sdk|MockObject + */ + protected Sdk $sdk_mock; + /** * Initializes necessary components and mocks */ @@ -102,6 +124,9 @@ public function set_up_data() { ) ); + $this->account_service_mock = $this->createMock( AccountService::class ); + reepay()->di()->set( AccountService::class, $this->account_service_mock ); + $this->api_mock = $this->getMockBuilder( Api::class )->getMock(); reepay()->di()->set( Api::class, $this->api_mock ); } diff --git a/tests/unit/gatewaysTests/ReepayCheckoutTest.php b/tests/unit/GatewaysTests/ReepayCheckoutTest.php similarity index 100% rename from tests/unit/gatewaysTests/ReepayCheckoutTest.php rename to tests/unit/GatewaysTests/ReepayCheckoutTest.php diff --git a/tests/unit/gatewaysTests/ReepayGatewayTest.php b/tests/unit/GatewaysTests/ReepayGatewayTest.php similarity index 74% rename from tests/unit/gatewaysTests/ReepayGatewayTest.php rename to tests/unit/GatewaysTests/ReepayGatewayTest.php index d624e9d9..b6e4aa2f 100644 --- a/tests/unit/gatewaysTests/ReepayGatewayTest.php +++ b/tests/unit/GatewaysTests/ReepayGatewayTest.php @@ -5,11 +5,17 @@ * @package Reepay\Checkout */ +namespace Reepay\Checkout\Tests\Unit\GatewaysTests; + +use Billwerk\Sdk\Exception\BillwerkApiException; +use Billwerk\Sdk\Model\Account\AccountModel; +use Exception; use Reepay\Checkout\Gateways\ReepayCheckout; use Reepay\Checkout\Gateways\ReepayGateway; use Reepay\Checkout\Tests\Helpers\OrderItemsGenerator; use Reepay\Checkout\Tests\Helpers\PLUGINS_STATE; use Reepay\Checkout\Tests\Helpers\Reepay_UnitTestCase; +use WP_Error; class ReepayGatewayTestChild extends ReepayGateway { @@ -53,7 +59,6 @@ public static function tear_down_after_class() { * ["swish"] * ["viabill"] * ["vipps"] - * */ public function test_check_is_active( string $gateway ) { self::$gateway->id = 'reepay_' . $gateway; @@ -97,47 +102,54 @@ public function test_is_gateway_settings_page( string $gateway ) { } /** - * @param bool $is_test use test or live reepay api keys. + * Test get_account_info * - * @testWith - * [true] - * [false] - */ - public function test_get_account_info_not_on_settings_page( bool $is_test ) { - $this->assertFalse( self::$gateway->is_gateway_settings_page() ); - $this->assertEmpty( self::$gateway->get_account_info( $is_test ) ); - } - - /** - * @param bool $is_test use test or live reepay api keys. + * @param bool $is_test use test or live billwerk api keys. * * @testWith * [true] * [false] + * @throws BillwerkApiException Api Error. */ public function test_get_account_info( bool $is_test ) { $_GET['tab'] = 'checkout'; $_GET['section'] = 'checkout'; self::$gateway->id = 'checkout'; - $result = array( - 'handle' => 'test_1234', - ); + $account = ( new AccountModel() ) + ->setHandle( 'test_1234' ); - $this->api_mock->method( 'request' )->willReturn( $result ); - $this->assertSame( - $result, + $this->account_service_mock + ->method( 'get' ) + ->willReturnOnConsecutiveCalls( $account, $account ); + + self::assertSame( + $account, self::$gateway->get_account_info( $is_test ) ); - $this->api_mock->method( 'request' )->willReturn( 'unused' ); - $this->assertSame( - $result, + self::assertEquals( + $account, self::$gateway->get_account_info( $is_test ), 'transient cache error' ); } + /** + * Test get_account_info not on settings page + * + * @param bool $is_test use test or live reepay api keys. + * + * @testWith + * [true] + * [false] + * @throws BillwerkApiException Api Error. + */ + public function test_get_account_info_not_on_settings_page( bool $is_test ) { + $this->assertFalse( self::$gateway->is_gateway_settings_page() ); + $this->assertNull( self::$gateway->get_account_info( $is_test ) ); + } + /** * @testWith * [true] @@ -169,7 +181,7 @@ public function test_can_cancel( bool $result ) { public function test_capture_payment_with_cancelled_order() { $this->order_generator->set_meta( '_reepay_order_cancelled', '1' ); - $this->expectException(Exception::class); + $this->expectException( Exception::class ); self::$gateway->capture_payment( $this->order_generator->order() ); } @@ -177,7 +189,7 @@ public function test_capture_payment_with_cancelled_order() { public function test_capture_payment_with_api_error() { $this->api_mock->method( 'capture_payment' )->willReturn( new WP_Error() ); - $this->expectException(Exception::class); + $this->expectException( Exception::class ); self::$gateway->capture_payment( $this->order_generator->order() ); } @@ -185,7 +197,7 @@ public function test_capture_payment_with_api_error() { public function test_cancel_payment_with_cancelled_order() { $this->order_generator->set_meta( '_reepay_order_cancelled', '1' ); - $this->expectException(Exception::class); + $this->expectException( Exception::class ); self::$gateway->cancel_payment( $this->order_generator->order() ); } @@ -193,7 +205,7 @@ public function test_cancel_payment_with_cancelled_order() { public function test_cancel_payment_with_api_error() { $this->api_mock->method( 'cancel_payment' )->willReturn( new WP_Error() ); - $this->expectException(Exception::class); + $this->expectException( Exception::class ); self::$gateway->cancel_payment( $this->order_generator->order() ); } @@ -201,15 +213,15 @@ public function test_cancel_payment_with_api_error() { public function test_refund_payment_with_cancelled_order() { $this->order_generator->set_meta( '_reepay_order_cancelled', '1' ); - $this->expectException(Exception::class); - $this->expectExceptionMessage('Order is already canceled'); + $this->expectException( Exception::class ); + $this->expectExceptionMessage( 'Order is already canceled' ); self::$gateway->refund_payment( $this->order_generator->order() ); } public function test_refund_payment_with_impossible_to_cancel_order() { - $this->expectException(Exception::class); - $this->expectExceptionMessage('Payment can\'t be refunded.'); + $this->expectException( Exception::class ); + $this->expectExceptionMessage( 'Payment can\'t be refunded.' ); self::$gateway->refund_payment( $this->order_generator->order() ); } @@ -232,8 +244,8 @@ public function test_refund_payment_with_different_amounts( $amount, bool $expec $this->api_mock->method( 'can_refund' )->willReturn( true ); if ( $expect_error ) { - $this->expectException(Exception::class); - $this->expectExceptionMessage('Refund amount must be greater than 0.'); + $this->expectException( Exception::class ); + $this->expectExceptionMessage( 'Refund amount must be greater than 0.' ); } else { $this->expectNotToPerformAssertions(); } @@ -281,17 +293,19 @@ public function test_get_order_items_line_items_simple( bool $include_tax, bool $order_items_generator = new OrderItemsGenerator( $this->order_generator, array( - 'include_tax' => $include_tax, + 'include_tax' => $include_tax, 'only_not_settled' => $only_not_settled, ) ); $order_items_generator->generate_line_item(); - $order_items_generator->generate_line_item( array( - 'order_item_meta' => array( - 'settled' => true + $order_items_generator->generate_line_item( + array( + 'order_item_meta' => array( + 'settled' => true, + ), ) - ) ); + ); $this->assertSame( $order_items_generator->get_order_items(), @@ -315,47 +329,57 @@ public function test_get_order_items_line_items_reepay_subscription( bool $inclu $order_items_generator = new OrderItemsGenerator( $this->order_generator, array( - 'include_tax' => $include_tax, + 'include_tax' => $include_tax, 'only_not_settled' => $only_not_settled, ) ); - $order_items_generator->generate_line_item(array( - 'type' => 'rp_sub' - )); - $order_items_generator->generate_line_item( array( - 'type' => 'rp_sub', - 'order_item_meta' => array( - 'settled' => true + $order_items_generator->generate_line_item( + array( + 'type' => 'rp_sub', + ) + ); + $order_items_generator->generate_line_item( + array( + 'type' => 'rp_sub', + 'order_item_meta' => array( + 'settled' => true, + ), ) - ) ); - $order_items_generator->generate_line_item(array( - 'type' => 'rp_sub', - 'product_meta' => array( - '_reepay_subscription_fee' => array( - 'enabled' => 'yes', - 'text' => 'test' + ); + $order_items_generator->generate_line_item( + array( + 'type' => 'rp_sub', + 'product_meta' => array( + '_reepay_subscription_fee' => array( + 'enabled' => 'yes', + 'text' => 'test', + ), + '_line_discount' => 10, ), - '_line_discount' => 10 ) - )); - $order_items_generator->generate_line_item( array( - 'type' => 'rp_sub', - 'product_meta' => array( - 'name' => 'Product #-1', - '_reepay_subscription_fee' => array( - 'enabled' => 'yes', - 'text' => 'test' + ); + $order_items_generator->generate_line_item( + array( + 'type' => 'rp_sub', + 'product_meta' => array( + 'name' => 'Product #-1', + '_reepay_subscription_fee' => array( + 'enabled' => 'yes', + 'text' => 'test', + ), + '_line_discount' => 10, + ), + 'order_item_meta' => array( + 'settled' => true, ), - '_line_discount' => 10 - ), - 'order_item_meta' => array( - 'settled' => true ) - ) ); - $order_items_generator->generate_fee_item(array( - 'name' => 'Product #-1 - test' - )); + ); + $order_items_generator->generate_fee_item( + array( + 'name' => 'Product #-1 - test', + ) + ); $this->assertSame( array(), @@ -377,27 +401,33 @@ public function test_get_order_items_shipping_items( bool $include_tax, bool $on $order_items_generator = new OrderItemsGenerator( $this->order_generator, array( - 'include_tax' => $include_tax, + 'include_tax' => $include_tax, 'only_not_settled' => $only_not_settled, ) ); - $order_items_generator->generate_line_item([ - 'price' => 200, - 'quantity' => 3, - 'tax' => 5 - ]); + $order_items_generator->generate_line_item( + array( + 'price' => 200, + 'quantity' => 3, + 'tax' => 5, + ) + ); - $order_items_generator->generate_shipping_item([ - 'price' => 300 - ]); + $order_items_generator->generate_shipping_item( + array( + 'price' => 300, + ) + ); - $order_items_generator->generate_shipping_item( array( - 'price' => 300, - 'meta' => array( - 'settled' => true + $order_items_generator->generate_shipping_item( + array( + 'price' => 300, + 'meta' => array( + 'settled' => true, + ), ) - ) ); + ); $this->assertSame( $order_items_generator->get_order_items(), @@ -419,17 +449,19 @@ public function test_get_order_items_fee_items( bool $include_tax, bool $only_no $order_items_generator = new OrderItemsGenerator( $this->order_generator, array( - 'include_tax' => $include_tax, + 'include_tax' => $include_tax, 'only_not_settled' => $only_not_settled, ) ); $order_items_generator->generate_fee_item(); - $order_items_generator->generate_fee_item( array( - 'meta' => array( - 'settled' => true + $order_items_generator->generate_fee_item( + array( + 'meta' => array( + 'settled' => true, + ), ) - ) ); + ); $this->assertSame( $order_items_generator->get_order_items(), @@ -453,20 +485,24 @@ public function test_get_order_reepay_subscription_with_fee( bool $include_tax, $order_items_generator = new OrderItemsGenerator( $this->order_generator, array( - 'include_tax' => $include_tax, + 'include_tax' => $include_tax, 'only_not_settled' => $only_not_settled, ) ); - $order_items_generator->generate_line_item(array( - 'type' => 'rp_sub' - )); + $order_items_generator->generate_line_item( + array( + 'type' => 'rp_sub', + ) + ); $order_items_generator->generate_fee_item(); - $order_items_generator->generate_fee_item( array( - 'meta' => array( - 'settled' => true + $order_items_generator->generate_fee_item( + array( + 'meta' => array( + 'settled' => true, + ), ) - ) ); + ); $this->assertSame( $order_items_generator->get_order_items(), @@ -488,19 +524,23 @@ public function test_get_order_items_total_discount( bool $include_tax, bool $on $order_items_generator = new OrderItemsGenerator( $this->order_generator, array( - 'include_tax' => $include_tax, + 'include_tax' => $include_tax, 'only_not_settled' => $only_not_settled, ) ); - $order_items_generator->generate_line_item(array( - 'price' => 99 - )); + $order_items_generator->generate_line_item( + array( + 'price' => 99, + ) + ); - $order_items_generator->add_total_discount( array( - 'amount' => 15, - 'tax' => 7 - ) ); + $order_items_generator->add_total_discount( + array( + 'amount' => 15, + 'tax' => 7, + ) + ); $this->assertSame( $order_items_generator->get_order_items(), @@ -530,7 +570,7 @@ public function test_get_order_items_pw_gift_card( bool $include_tax, bool $only * [false, false] * [false, true] * [true, false] - * [true, true] + * [true, true] */ public function test_get_order_items_giftup( bool $include_tax, bool $only_not_settled ) { $this->markTestIncomplete(); @@ -565,11 +605,11 @@ public function test_get_order_items_giftup( bool $include_tax, bool $only_not_s * ["vipps", "vipps"] */ public function test_logo( $card_type, $result ) { - $logo_svg_path = reepay()->get_setting( 'images_path' ) . 'svg/' . $result . '.logo.svg'; + $logo_svg_path = reepay()->get_setting( 'images_path' ) . 'svg/' . $result . '.logo.svg'; $this->assertSame( - file_exists($logo_svg_path) ? - reepay()->get_setting( 'images_url' ) . 'svg/' . $result . '.logo.svg' : - reepay()->get_setting( 'images_url' ) . $result . '.png', + file_exists( $logo_svg_path ) ? + reepay()->get_setting( 'images_url' ) . 'svg/' . $result . '.logo.svg' : + reepay()->get_setting( 'images_url' ) . $result . '.png', self::$gateway->get_logo( $card_type ) ); } diff --git a/vite/bun.lockb b/vite/bun.lockb new file mode 100755 index 00000000..beb8c5d7 Binary files /dev/null and b/vite/bun.lockb differ diff --git a/vite/package-lock.json b/vite/package-lock.json deleted file mode 100644 index bcbbc92b..00000000 --- a/vite/package-lock.json +++ /dev/null @@ -1,5845 +0,0 @@ -{ - "name": "react", - "version": "0.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "react", - "version": "0.0.0", - "dependencies": { - "-": "^0.0.1", - "@codemirror/lang-php": "^6.0.1", - "@hookform/resolvers": "^3.3.4", - "@monaco-editor/loader": "^1.4.0", - "@monaco-editor/react": "^4.6.0", - "@rematch/core": "^2.2.0", - "@rematch/immer": "^2.1.3", - "@rematch/loading": "^2.1.2", - "@rematch/updated": "^2.1.2", - "@types/uuid": "^9.0.8", - "@uiw/codemirror-theme-github": "^4.22.0", - "@uiw/react-codemirror": "^4.22.0", - "axios": "^1.6.8", - "clsx": "^2.1.1", - "immer": "^9.0.21", - "localforage": "^1.10.0", - "lodash": "^4.17.21", - "moment": "^2.30.1", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "react-hook-form": "^7.51.4", - "react-redux": "^9.1.2", - "rollup-plugin-copy": "^3.5.0", - "styled-components": "^6.1.11", - "uuid": "^9.0.1", - "zod": "^3.23.7" - }, - "devDependencies": { - "@types/node": "^20.12.8", - "@types/react": "^18.2.66", - "@types/react-dom": "^18.2.22", - "@typescript-eslint/eslint-plugin": "^7.2.0", - "@typescript-eslint/parser": "^7.2.0", - "@vitejs/plugin-react-swc": "^3.5.0", - "@wordpress/i18n": "^4.57.0", - "autoprefixer": "^10.4.19", - "eslint": "^8.57.0", - "eslint-config-prettier": "^9.1.0", - "eslint-plugin-jsx-a11y": "^6.8.0", - "eslint-plugin-react": "^7.34.1", - "eslint-plugin-react-hooks": "^4.6.0", - "eslint-plugin-react-refresh": "^0.4.6", - "postcss": "^8.4.38", - "prettier": "^3.2.5", - "prettier-plugin-tailwindcss": "^0.5.14", - "tailwindcss": "^3.4.3", - "typescript": "^5.2.2", - "vite": "^5.2.0", - "vite-plugin-monaco-editor": "^1.1.0" - }, - "optionalDependencies": { - "@rollup/rollup-linux-x64-gnu": "4.9.5" - } - }, - "node_modules/-": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/-/-/--0.0.1.tgz", - "integrity": "sha512-3HfneK3DGAm05fpyj20sT3apkNcvPpCuccOThOPdzz8sY7GgQGe0l93XH9bt+YzibcTIgUAIMoyVJI740RtgyQ==" - }, - "node_modules/@alloc/quick-lru": { - "version": "5.2.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@babel/runtime": { - "version": "7.24.5", - "license": "MIT", - "dependencies": { - "regenerator-runtime": "^0.14.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@codemirror/autocomplete": { - "version": "6.16.0", - "resolved": "https://registry.npmjs.org/@codemirror/autocomplete/-/autocomplete-6.16.0.tgz", - "integrity": "sha512-P/LeCTtZHRTCU4xQsa89vSKWecYv1ZqwzOd5topheGRf+qtacFgBeIMQi3eL8Kt/BUNvxUWkx+5qP2jlGoARrg==", - "dependencies": { - "@codemirror/language": "^6.0.0", - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.17.0", - "@lezer/common": "^1.0.0" - }, - "peerDependencies": { - "@codemirror/language": "^6.0.0", - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.0.0", - "@lezer/common": "^1.0.0" - } - }, - "node_modules/@codemirror/commands": { - "version": "6.5.0", - "resolved": "https://registry.npmjs.org/@codemirror/commands/-/commands-6.5.0.tgz", - "integrity": "sha512-rK+sj4fCAN/QfcY9BEzYMgp4wwL/q5aj/VfNSoH1RWPF9XS/dUwBkvlL3hpWgEjOqlpdN1uLC9UkjJ4tmyjJYg==", - "dependencies": { - "@codemirror/language": "^6.0.0", - "@codemirror/state": "^6.4.0", - "@codemirror/view": "^6.0.0", - "@lezer/common": "^1.1.0" - } - }, - "node_modules/@codemirror/lang-css": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/@codemirror/lang-css/-/lang-css-6.2.1.tgz", - "integrity": "sha512-/UNWDNV5Viwi/1lpr/dIXJNWiwDxpw13I4pTUAsNxZdg6E0mI2kTQb0P2iHczg1Tu+H4EBgJR+hYhKiHKko7qg==", - "dependencies": { - "@codemirror/autocomplete": "^6.0.0", - "@codemirror/language": "^6.0.0", - "@codemirror/state": "^6.0.0", - "@lezer/common": "^1.0.2", - "@lezer/css": "^1.0.0" - } - }, - "node_modules/@codemirror/lang-html": { - "version": "6.4.9", - "resolved": "https://registry.npmjs.org/@codemirror/lang-html/-/lang-html-6.4.9.tgz", - "integrity": "sha512-aQv37pIMSlueybId/2PVSP6NPnmurFDVmZwzc7jszd2KAF8qd4VBbvNYPXWQq90WIARjsdVkPbw29pszmHws3Q==", - "dependencies": { - "@codemirror/autocomplete": "^6.0.0", - "@codemirror/lang-css": "^6.0.0", - "@codemirror/lang-javascript": "^6.0.0", - "@codemirror/language": "^6.4.0", - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.17.0", - "@lezer/common": "^1.0.0", - "@lezer/css": "^1.1.0", - "@lezer/html": "^1.3.0" - } - }, - "node_modules/@codemirror/lang-javascript": { - "version": "6.2.2", - "resolved": "https://registry.npmjs.org/@codemirror/lang-javascript/-/lang-javascript-6.2.2.tgz", - "integrity": "sha512-VGQfY+FCc285AhWuwjYxQyUQcYurWlxdKYT4bqwr3Twnd5wP5WSeu52t4tvvuWmljT4EmgEgZCqSieokhtY8hg==", - "dependencies": { - "@codemirror/autocomplete": "^6.0.0", - "@codemirror/language": "^6.6.0", - "@codemirror/lint": "^6.0.0", - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.17.0", - "@lezer/common": "^1.0.0", - "@lezer/javascript": "^1.0.0" - } - }, - "node_modules/@codemirror/lang-php": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/@codemirror/lang-php/-/lang-php-6.0.1.tgz", - "integrity": "sha512-ublojMdw/PNWa7qdN5TMsjmqkNuTBD3k6ndZ4Z0S25SBAiweFGyY68AS3xNcIOlb6DDFDvKlinLQ40vSLqf8xA==", - "dependencies": { - "@codemirror/lang-html": "^6.0.0", - "@codemirror/language": "^6.0.0", - "@codemirror/state": "^6.0.0", - "@lezer/common": "^1.0.0", - "@lezer/php": "^1.0.0" - } - }, - "node_modules/@codemirror/language": { - "version": "6.10.1", - "resolved": "https://registry.npmjs.org/@codemirror/language/-/language-6.10.1.tgz", - "integrity": "sha512-5GrXzrhq6k+gL5fjkAwt90nYDmjlzTIJV8THnxNFtNKWotMIlzzN+CpqxqwXOECnUdOndmSeWntVrVcv5axWRQ==", - "dependencies": { - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.23.0", - "@lezer/common": "^1.1.0", - "@lezer/highlight": "^1.0.0", - "@lezer/lr": "^1.0.0", - "style-mod": "^4.0.0" - } - }, - "node_modules/@codemirror/lint": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/@codemirror/lint/-/lint-6.7.1.tgz", - "integrity": "sha512-rELba6QJD20/bNXWP/cKTGLrwVEcpa2ViwULCV03ONcY1Je85++7sczVRUlnE4TJMjatx3IJTz6HX4NXi+moXw==", - "dependencies": { - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.0.0", - "crelt": "^1.0.5" - } - }, - "node_modules/@codemirror/search": { - "version": "6.5.6", - "resolved": "https://registry.npmjs.org/@codemirror/search/-/search-6.5.6.tgz", - "integrity": "sha512-rpMgcsh7o0GuCDUXKPvww+muLA1pDJaFrpq/CCHtpQJYz8xopu4D1hPcKRoDD0YlF8gZaqTNIRa4VRBWyhyy7Q==", - "dependencies": { - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.0.0", - "crelt": "^1.0.5" - } - }, - "node_modules/@codemirror/state": { - "version": "6.4.1", - "resolved": "https://registry.npmjs.org/@codemirror/state/-/state-6.4.1.tgz", - "integrity": "sha512-QkEyUiLhsJoZkbumGZlswmAhA7CBU02Wrz7zvH4SrcifbsqwlXShVXg65f3v/ts57W3dqyamEriMhij1Z3Zz4A==" - }, - "node_modules/@codemirror/theme-one-dark": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/@codemirror/theme-one-dark/-/theme-one-dark-6.1.2.tgz", - "integrity": "sha512-F+sH0X16j/qFLMAfbciKTxVOwkdAS336b7AXTKOZhy8BR3eH/RelsnLgLFINrpST63mmN2OuwUt0W2ndUgYwUA==", - "dependencies": { - "@codemirror/language": "^6.0.0", - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.0.0", - "@lezer/highlight": "^1.0.0" - } - }, - "node_modules/@codemirror/view": { - "version": "6.26.3", - "resolved": "https://registry.npmjs.org/@codemirror/view/-/view-6.26.3.tgz", - "integrity": "sha512-gmqxkPALZjkgSxIeeweY/wGQXBfwTUaLs8h7OKtSwfbj9Ct3L11lD+u1sS7XHppxFQoMDiMDp07P9f3I2jWOHw==", - "dependencies": { - "@codemirror/state": "^6.4.0", - "style-mod": "^4.1.0", - "w3c-keyname": "^2.2.4" - } - }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@cspotcode/source-map-support/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "node_modules/@emotion/is-prop-valid": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.2.tgz", - "integrity": "sha512-uNsoYd37AFmaCdXlg6EYD1KaPOaRWRByMCYzbKUX4+hhMfrxdVSelShywL4JVaAeM/eHUOSprYBQls+/neX3pw==", - "dependencies": { - "@emotion/memoize": "^0.8.1" - } - }, - "node_modules/@emotion/memoize": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", - "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" - }, - "node_modules/@emotion/unitless": { - "version": "0.8.1", - "license": "MIT" - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.20.2", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "dev": true, - "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.10.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "2.1.4", - "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/brace-expansion": { - "version": "1.1.11", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/@eslint/eslintrc/node_modules/minimatch": { - "version": "3.1.2", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/@eslint/js": { - "version": "8.57.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@hookform/resolvers": { - "version": "3.3.4", - "resolved": "https://registry.npmjs.org/@hookform/resolvers/-/resolvers-3.3.4.tgz", - "integrity": "sha512-o5cgpGOuJYrd+iMKvkttOclgwRW86EsWJZZRC23prf0uU2i48Htq4PuT73AVb9ionFyZrwYEITuOFGF+BydEtQ==", - "peerDependencies": { - "react-hook-form": "^7.0.0" - } - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.14", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@humanwhocodes/object-schema": "^2.0.2", - "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", - "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", - "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", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "dev": true, - "license": "ISC", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@isaacs/cliui/node_modules/ansi-regex": { - "version": "6.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/@isaacs/cliui/node_modules/strip-ansi": { - "version": "7.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "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/sourcemap-codec": { - "version": "1.4.15", - "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/@lezer/common": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@lezer/common/-/common-1.2.1.tgz", - "integrity": "sha512-yemX0ZD2xS/73llMZIK6KplkjIjf2EvAHcinDi/TfJ9hS25G0388+ClHt6/3but0oOxinTcQHJLDXh6w1crzFQ==" - }, - "node_modules/@lezer/css": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/@lezer/css/-/css-1.1.8.tgz", - "integrity": "sha512-7JhxupKuMBaWQKjQoLtzhGj83DdnZY9MckEOG5+/iLKNK2ZJqKc6hf6uc0HjwCX7Qlok44jBNqZhHKDhEhZYLA==", - "dependencies": { - "@lezer/common": "^1.2.0", - "@lezer/highlight": "^1.0.0", - "@lezer/lr": "^1.0.0" - } - }, - "node_modules/@lezer/highlight": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@lezer/highlight/-/highlight-1.2.0.tgz", - "integrity": "sha512-WrS5Mw51sGrpqjlh3d4/fOwpEV2Hd3YOkp9DBt4k8XZQcoTHZFB7sx030A6OcahF4J1nDQAa3jXlTVVYH50IFA==", - "dependencies": { - "@lezer/common": "^1.0.0" - } - }, - "node_modules/@lezer/html": { - "version": "1.3.9", - "resolved": "https://registry.npmjs.org/@lezer/html/-/html-1.3.9.tgz", - "integrity": "sha512-MXxeCMPyrcemSLGaTQEZx0dBUH0i+RPl8RN5GwMAzo53nTsd/Unc/t5ZxACeQoyPUM5/GkPLRUs2WliOImzkRA==", - "dependencies": { - "@lezer/common": "^1.2.0", - "@lezer/highlight": "^1.0.0", - "@lezer/lr": "^1.0.0" - } - }, - "node_modules/@lezer/javascript": { - "version": "1.4.16", - "resolved": "https://registry.npmjs.org/@lezer/javascript/-/javascript-1.4.16.tgz", - "integrity": "sha512-84UXR3N7s11MPQHWgMnjb9571fr19MmXnr5zTv2XX0gHXXUvW3uPJ8GCjKrfTXmSdfktjRK0ayKklw+A13rk4g==", - "dependencies": { - "@lezer/common": "^1.2.0", - "@lezer/highlight": "^1.1.3", - "@lezer/lr": "^1.3.0" - } - }, - "node_modules/@lezer/lr": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@lezer/lr/-/lr-1.4.0.tgz", - "integrity": "sha512-Wst46p51km8gH0ZUmeNrtpRYmdlRHUpN1DQd3GFAyKANi8WVz8c2jHYTf1CVScFaCjQw1iO3ZZdqGDxQPRErTg==", - "dependencies": { - "@lezer/common": "^1.0.0" - } - }, - "node_modules/@lezer/php": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@lezer/php/-/php-1.0.2.tgz", - "integrity": "sha512-GN7BnqtGRpFyeoKSEqxvGvhJQiI4zkgmYnDk/JIyc7H7Ifc1tkPnUn/R2R8meH3h/aBf5rzjvU8ZQoyiNDtDrA==", - "dependencies": { - "@lezer/common": "^1.2.0", - "@lezer/highlight": "^1.0.0", - "@lezer/lr": "^1.1.0" - } - }, - "node_modules/@monaco-editor/loader": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@monaco-editor/loader/-/loader-1.4.0.tgz", - "integrity": "sha512-00ioBig0x642hytVspPl7DbQyaSWRaolYie/UFNjoTdvoKPzo6xrXLhTk9ixgIKcLH5b5vDOjVNiGyY+uDCUlg==", - "dependencies": { - "state-local": "^1.0.6" - }, - "peerDependencies": { - "monaco-editor": ">= 0.21.0 < 1" - } - }, - "node_modules/@monaco-editor/react": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/@monaco-editor/react/-/react-4.6.0.tgz", - "integrity": "sha512-RFkU9/i7cN2bsq/iTkurMWOEErmYcY6JiQI3Jn+WeR/FGISH8JbHERjpS9oRuSOPvDMJI0Z8nJeKkbOs9sBYQw==", - "dependencies": { - "@monaco-editor/loader": "^1.4.0" - }, - "peerDependencies": { - "monaco-editor": ">= 0.25.0 < 1", - "react": "^16.8.0 || ^17.0.0 || ^18.0.0", - "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "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", - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "license": "MIT", - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@rematch/core": { - "version": "2.2.0", - "license": "MIT", - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "redux": ">=4" - } - }, - "node_modules/@rematch/immer": { - "version": "2.1.3", - "license": "MIT", - "peerDependencies": { - "@rematch/core": ">=2", - "immer": ">=7 | >= 8 | >= 9", - "redux": ">=4" - } - }, - "node_modules/@rematch/loading": { - "version": "2.1.2", - "license": "MIT", - "peerDependencies": { - "@rematch/core": ">=2" - } - }, - "node_modules/@rematch/updated": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/@rematch/updated/-/updated-2.1.2.tgz", - "integrity": "sha512-Y89x2P8gslnRdU/uF5xgfgHLKXGVoCNFxIiTsQAB+5xc9trXmL5zldJyD5bzMBUBbAWn4b8XEq2P1A3XwX4u+Q==", - "peerDependencies": { - "@rematch/core": ">=2" - } - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.17.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.17.2.tgz", - "integrity": "sha512-NM0jFxY8bB8QLkoKxIQeObCaDlJKewVlIEkuyYKm5An1tdVZ966w2+MPQ2l8LBZLjR+SgyV+nRkTIunzOYBMLQ==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.17.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.17.2.tgz", - "integrity": "sha512-yeX/Usk7daNIVwkq2uGoq2BYJKZY1JfyLTaHO/jaiSwi/lsf8fTFoQW/n6IdAsx5tx+iotu2zCJwz8MxI6D/Bw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.17.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.17.2.tgz", - "integrity": "sha512-kcMLpE6uCwls023+kknm71ug7MZOrtXo+y5p/tsg6jltpDtgQY1Eq5sGfHcQfb+lfuKwhBmEURDga9N0ol4YPw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.17.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.17.2.tgz", - "integrity": "sha512-AtKwD0VEx0zWkL0ZjixEkp5tbNLzX+FCqGG1SvOu993HnSz4qDI6S4kGzubrEJAljpVkhRSlg5bzpV//E6ysTQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.17.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.17.2.tgz", - "integrity": "sha512-3reX2fUHqN7sffBNqmEyMQVj/CKhIHZd4y631duy0hZqI8Qoqf6lTtmAKvJFYa6bhU95B1D0WgzHkmTg33In0A==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.17.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.17.2.tgz", - "integrity": "sha512-uSqpsp91mheRgw96xtyAGP9FW5ChctTFEoXP0r5FAzj/3ZRv3Uxjtc7taRQSaQM/q85KEKjKsZuiZM3GyUivRg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.17.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.17.2.tgz", - "integrity": "sha512-EMMPHkiCRtE8Wdk3Qhtciq6BndLtstqZIroHiiGzB3C5LDJmIZcSzVtLRbwuXuUft1Cnv+9fxuDtDxz3k3EW2A==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.17.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.17.2.tgz", - "integrity": "sha512-NMPylUUZ1i0z/xJUIx6VUhISZDRT+uTWpBcjdv0/zkp7b/bQDF+NfnfdzuTiB1G6HTodgoFa93hp0O1xl+/UbA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.17.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.17.2.tgz", - "integrity": "sha512-T19My13y8uYXPw/L/k0JYaX1fJKFT/PWdXiHr8mTbXWxjVF1t+8Xl31DgBBvEKclw+1b00Chg0hxE2O7bTG7GQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.17.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.17.2.tgz", - "integrity": "sha512-BOaNfthf3X3fOWAB+IJ9kxTgPmMqPPH5f5k2DcCsRrBIbWnaJCgX2ll77dV1TdSy9SaXTR5iDXRL8n7AnoP5cg==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.17.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.17.2.tgz", - "integrity": "sha512-W0UP/x7bnn3xN2eYMql2T/+wpASLE5SjObXILTMPUBDB/Fg/FxC+gX4nvCfPBCbNhz51C+HcqQp2qQ4u25ok6g==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.9.5.tgz", - "integrity": "sha512-Dq1bqBdLaZ1Gb/l2e5/+o3B18+8TI9ANlA1SkejZqDgdU/jK/ThYaMPMJpVMMXy2uRHvGKbkz9vheVGdq3cJfA==", - "cpu": [ - "x64" - ], - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.17.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.17.2.tgz", - "integrity": "sha512-h1+yTWeYbRdAyJ/jMiVw0l6fOOm/0D1vNLui9iPuqgRGnXA0u21gAqOyB5iHjlM9MMfNOm9RHCQ7zLIzT0x11Q==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.17.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.17.2.tgz", - "integrity": "sha512-tmdtXMfKAjy5+IQsVtDiCfqbynAQE/TQRpWdVataHmhMb9DCoJxp9vLcCBjEQWMiUYxO1QprH/HbY9ragCEFLA==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.17.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.17.2.tgz", - "integrity": "sha512-7II/QCSTAHuE5vdZaQEwJq2ZACkBpQDOmQsE6D6XUbnBHW8IAhm4eTufL6msLJorzrHDFv3CF8oCA/hSIRuZeQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.17.2", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@swc/core": { - "version": "1.4.17", - "dev": true, - "hasInstallScript": true, - "license": "Apache-2.0", - "dependencies": { - "@swc/counter": "^0.1.2", - "@swc/types": "^0.1.5" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/swc" - }, - "optionalDependencies": { - "@swc/core-darwin-arm64": "1.4.17", - "@swc/core-darwin-x64": "1.4.17", - "@swc/core-linux-arm-gnueabihf": "1.4.17", - "@swc/core-linux-arm64-gnu": "1.4.17", - "@swc/core-linux-arm64-musl": "1.4.17", - "@swc/core-linux-x64-gnu": "1.4.17", - "@swc/core-linux-x64-musl": "1.4.17", - "@swc/core-win32-arm64-msvc": "1.4.17", - "@swc/core-win32-ia32-msvc": "1.4.17", - "@swc/core-win32-x64-msvc": "1.4.17" - }, - "peerDependencies": { - "@swc/helpers": "^0.5.0" - }, - "peerDependenciesMeta": { - "@swc/helpers": { - "optional": true - } - } - }, - "node_modules/@swc/core-win32-x64-msvc": { - "version": "1.4.17", - "cpu": [ - "x64" - ], - "dev": true, - "license": "Apache-2.0 AND MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=10" - } - }, - "node_modules/@swc/counter": { - "version": "0.1.3", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/@swc/types": { - "version": "0.1.6", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@swc/counter": "^0.1.3" - } - }, - "node_modules/@tannin/compile": { - "version": "1.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@tannin/evaluate": "^1.2.0", - "@tannin/postfix": "^1.1.0" - } - }, - "node_modules/@tannin/evaluate": { - "version": "1.2.0", - "dev": true, - "license": "MIT" - }, - "node_modules/@tannin/plural-forms": { - "version": "1.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@tannin/compile": "^1.1.0" - } - }, - "node_modules/@tannin/postfix": { - "version": "1.1.0", - "dev": true, - "license": "MIT" - }, - "node_modules/@tsconfig/node10": { - "version": "1.0.11", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.4", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true - }, - "node_modules/@types/estree": { - "version": "1.0.5", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/fs-extra": { - "version": "8.1.5", - "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-8.1.5.tgz", - "integrity": "sha512-0dzKcwO+S8s2kuF5Z9oUWatQJj5Uq/iqphEtE3GQJVRRYm/tD1LglU2UnXi2A8jLq5umkGouOXOR9y0n613ZwQ==", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", - "dependencies": { - "@types/minimatch": "*", - "@types/node": "*" - } - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/minimatch": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", - "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==" - }, - "node_modules/@types/node": { - "version": "20.12.8", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.8.tgz", - "integrity": "sha512-NU0rJLJnshZWdE/097cdCBbyW1h4hEg0xpovcoAQYHl8dnEyp/NAOiE45pvc+Bd1Dt+2r94v2eGFpQJ4R7g+2w==", - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "node_modules/@types/prop-types": { - "version": "15.7.12", - "devOptional": true, - "license": "MIT" - }, - "node_modules/@types/react": { - "version": "18.3.1", - "devOptional": true, - "license": "MIT", - "dependencies": { - "@types/prop-types": "*", - "csstype": "^3.0.2" - } - }, - "node_modules/@types/react-dom": { - "version": "18.3.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/react": "*" - } - }, - "node_modules/@types/semver": { - "version": "7.5.8", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/stylis": { - "version": "4.2.5", - "resolved": "https://registry.npmjs.org/@types/stylis/-/stylis-4.2.5.tgz", - "integrity": "sha512-1Xve+NMN7FWjY14vLoY5tL3BVEQ/n42YLwaqJIPYhotZ9uBHt87VceMwWQpzmdEt2TNXIorIFG+YeCUUW7RInw==" - }, - "node_modules/@types/use-sync-external-store": { - "version": "0.0.3", - "license": "MIT" - }, - "node_modules/@types/uuid": { - "version": "9.0.8", - "license": "MIT" - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "7.8.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "7.8.0", - "@typescript-eslint/type-utils": "7.8.0", - "@typescript-eslint/utils": "7.8.0", - "@typescript-eslint/visitor-keys": "7.8.0", - "debug": "^4.3.4", - "graphemer": "^1.4.0", - "ignore": "^5.3.1", - "natural-compare": "^1.4.0", - "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^7.0.0", - "eslint": "^8.56.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "7.8.0", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/scope-manager": "7.8.0", - "@typescript-eslint/types": "7.8.0", - "@typescript-eslint/typescript-estree": "7.8.0", - "@typescript-eslint/visitor-keys": "7.8.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.56.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "7.8.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "7.8.0", - "@typescript-eslint/visitor-keys": "7.8.0" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "7.8.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/typescript-estree": "7.8.0", - "@typescript-eslint/utils": "7.8.0", - "debug": "^4.3.4", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.56.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/types": { - "version": "7.8.0", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "7.8.0", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "@typescript-eslint/types": "7.8.0", - "@typescript-eslint/visitor-keys": "7.8.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "minimatch": "^9.0.4", - "semver": "^7.6.0", - "ts-api-utils": "^1.3.0" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "7.8.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.15", - "@types/semver": "^7.5.8", - "@typescript-eslint/scope-manager": "7.8.0", - "@typescript-eslint/types": "7.8.0", - "@typescript-eslint/typescript-estree": "7.8.0", - "semver": "^7.6.0" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^8.56.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "7.8.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@typescript-eslint/types": "7.8.0", - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^18.18.0 || >=20.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@uiw/codemirror-extensions-basic-setup": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@uiw/codemirror-extensions-basic-setup/-/codemirror-extensions-basic-setup-4.22.0.tgz", - "integrity": "sha512-3vdpMq1Oj3qRKGjNgi5NeMxWem/cJ/gL0dZSu62MLBR4w3BWlEVi6xsk/MEk0+mT1AVKOzQV3jFS5y7mzxrfeA==", - "dependencies": { - "@codemirror/autocomplete": "^6.0.0", - "@codemirror/commands": "^6.0.0", - "@codemirror/language": "^6.0.0", - "@codemirror/lint": "^6.0.0", - "@codemirror/search": "^6.0.0", - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.0.0" - }, - "funding": { - "url": "https://jaywcjlove.github.io/#/sponsor" - }, - "peerDependencies": { - "@codemirror/autocomplete": ">=6.0.0", - "@codemirror/commands": ">=6.0.0", - "@codemirror/language": ">=6.0.0", - "@codemirror/lint": ">=6.0.0", - "@codemirror/search": ">=6.0.0", - "@codemirror/state": ">=6.0.0", - "@codemirror/view": ">=6.0.0" - } - }, - "node_modules/@uiw/codemirror-theme-github": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@uiw/codemirror-theme-github/-/codemirror-theme-github-4.22.0.tgz", - "integrity": "sha512-toRG+V8xCKVvqZnyEHgR9posQ8fA28U0m8ALqn0fWTRRFuGPvYCSSX+i2mpA3HF06Sv7GWCzgHe8ioyYbrN2Lg==", - "dependencies": { - "@uiw/codemirror-themes": "4.22.0" - }, - "funding": { - "url": "https://jaywcjlove.github.io/#/sponsor" - } - }, - "node_modules/@uiw/codemirror-themes": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@uiw/codemirror-themes/-/codemirror-themes-4.22.0.tgz", - "integrity": "sha512-nn7K+lkfdLOSQN6NZx651ae24L5L2RiCuNOxIeP3/CcGm9tnic8i+9pq42IXZe+hEoxX64yUTZisoB5qtocvrQ==", - "dependencies": { - "@codemirror/language": "^6.0.0", - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.0.0" - }, - "funding": { - "url": "https://jaywcjlove.github.io/#/sponsor" - }, - "peerDependencies": { - "@codemirror/language": ">=6.0.0", - "@codemirror/state": ">=6.0.0", - "@codemirror/view": ">=6.0.0" - } - }, - "node_modules/@uiw/react-codemirror": { - "version": "4.22.0", - "resolved": "https://registry.npmjs.org/@uiw/react-codemirror/-/react-codemirror-4.22.0.tgz", - "integrity": "sha512-ZbC9NX1458McehTN0XGVUHK/hb79DJXwwP3SfvumcjzIx/zIwAK0wtGABposlGHpxifIF6RAxMmUcL3gDVpiMA==", - "dependencies": { - "@babel/runtime": "^7.18.6", - "@codemirror/commands": "^6.1.0", - "@codemirror/state": "^6.1.1", - "@codemirror/theme-one-dark": "^6.0.0", - "@uiw/codemirror-extensions-basic-setup": "4.22.0", - "codemirror": "^6.0.0" - }, - "funding": { - "url": "https://jaywcjlove.github.io/#/sponsor" - }, - "peerDependencies": { - "@babel/runtime": ">=7.11.0", - "@codemirror/state": ">=6.0.0", - "@codemirror/theme-one-dark": ">=6.0.0", - "@codemirror/view": ">=6.0.0", - "codemirror": ">=6.0.0", - "react": ">=16.8.0", - "react-dom": ">=16.8.0" - } - }, - "node_modules/@ungap/structured-clone": { - "version": "1.2.0", - "dev": true, - "license": "ISC" - }, - "node_modules/@vitejs/plugin-react-swc": { - "version": "3.6.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@swc/core": "^1.3.107" - }, - "peerDependencies": { - "vite": "^4 || ^5" - } - }, - "node_modules/@wordpress/hooks": { - "version": "3.57.0", - "dev": true, - "license": "GPL-2.0-or-later", - "dependencies": { - "@babel/runtime": "^7.16.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@wordpress/i18n": { - "version": "4.57.0", - "dev": true, - "license": "GPL-2.0-or-later", - "dependencies": { - "@babel/runtime": "^7.16.0", - "@wordpress/hooks": "^3.57.0", - "gettext-parser": "^1.3.1", - "memize": "^2.1.0", - "sprintf-js": "^1.1.1", - "tannin": "^1.2.0" - }, - "bin": { - "pot-to-php": "tools/pot-to-php.js" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/acorn": { - "version": "8.11.3", - "dev": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "dev": true, - "license": "MIT", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/acorn-walk": { - "version": "8.3.2", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">=0.4.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/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/any-promise": { - "version": "1.3.0", - "dev": true, - "license": "MIT" - }, - "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/arg": { - "version": "5.0.2", - "dev": true, - "license": "MIT" - }, - "node_modules/argparse": { - "version": "2.0.1", - "dev": true, - "license": "Python-2.0" - }, - "node_modules/aria-query": { - "version": "5.3.0", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "dequal": "^2.0.3" - } - }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.5", - "is-array-buffer": "^3.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "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.flat": { - "version": "1.3.2", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.flatmap": { - "version": "1.3.2", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/array.prototype.toreversed": { - "version": "1.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-shim-unscopables": "^1.0.0" - } - }, - "node_modules/array.prototype.tosorted": { - "version": "1.1.3", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.1.0", - "es-shim-unscopables": "^1.0.2" - } - }, - "node_modules/arraybuffer.prototype.slice": { - "version": "1.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.2.1", - "get-intrinsic": "^1.2.3", - "is-array-buffer": "^3.0.4", - "is-shared-array-buffer": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/ast-types-flow": { - "version": "0.0.8", - "dev": true, - "license": "MIT" - }, - "node_modules/asynckit": { - "version": "0.4.0", - "license": "MIT" - }, - "node_modules/autoprefixer": { - "version": "10.4.19", - "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.23.0", - "caniuse-lite": "^1.0.30001599", - "fraction.js": "^4.3.7", - "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", - "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.7.0", - "dev": true, - "license": "MPL-2.0", - "engines": { - "node": ">=4" - } - }, - "node_modules/axios": { - "version": "1.6.8", - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.0", - "proxy-from-env": "^1.1.0" - } - }, - "node_modules/axobject-query": { - "version": "3.2.1", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "dequal": "^2.0.3" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "license": "MIT" - }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/brace-expansion": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "license": "MIT", - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browserslist": { - "version": "4.23.0", - "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.30001587", - "electron-to-chromium": "^1.4.668", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.13" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/call-bind": { - "version": "1.0.7", - "dev": true, - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" - }, - "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/camelcase-css": { - "version": "2.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/camelize": { - "version": "1.0.1", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001616", - "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/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/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/chokidar/node_modules/glob-parent": { - "version": "5.1.2", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/clsx": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", - "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", - "engines": { - "node": ">=6" - } - }, - "node_modules/codemirror": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/codemirror/-/codemirror-6.0.1.tgz", - "integrity": "sha512-J8j+nZ+CdWmIeFIGXEFbFPtpiYacFMDR8GlHK3IyHQJMCaVRfGx9NT+Hxivv1ckLWPvNdZqndbr/7lVhrf/Svg==", - "dependencies": { - "@codemirror/autocomplete": "^6.0.0", - "@codemirror/commands": "^6.0.0", - "@codemirror/language": "^6.0.0", - "@codemirror/lint": "^6.0.0", - "@codemirror/search": "^6.0.0", - "@codemirror/state": "^6.0.0", - "@codemirror/view": "^6.0.0" - } - }, - "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/colorette": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-1.4.0.tgz", - "integrity": "sha512-Y2oEozpomLn7Q3HFP7dpww7AtMJplbM9lGZP6RDfHqmbeRjiwRg4n6VM6j4KLmRke85uWEI7JqF17f3pqdRA0g==" - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commander": { - "version": "4.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "license": "MIT" - }, - "node_modules/create-require": { - "version": "1.1.1", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true - }, - "node_modules/crelt": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/crelt/-/crelt-1.0.6.tgz", - "integrity": "sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==" - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/css-color-keywords": { - "version": "1.0.0", - "license": "ISC", - "engines": { - "node": ">=4" - } - }, - "node_modules/css-to-react-native": { - "version": "3.2.0", - "license": "MIT", - "dependencies": { - "camelize": "^1.0.0", - "css-color-keywords": "^1.0.0", - "postcss-value-parser": "^4.0.2" - } - }, - "node_modules/cssesc": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "bin": { - "cssesc": "bin/cssesc" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/csstype": { - "version": "3.1.3", - "license": "MIT" - }, - "node_modules/damerau-levenshtein": { - "version": "1.0.8", - "dev": true, - "license": "BSD-2-Clause" - }, - "node_modules/data-view-buffer": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/data-view-byte-length": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/data-view-byte-offset": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-data-view": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/debug": { - "version": "4.3.4", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "dev": true, - "license": "MIT" - }, - "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-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/delayed-stream": { - "version": "1.0.0", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/dequal": { - "version": "2.0.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/didyoumean": { - "version": "1.2.2", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/diff": { - "version": "4.0.2", - "dev": true, - "license": "BSD-3-Clause", - "optional": true, - "peer": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "license": "MIT", - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/dlv": { - "version": "1.1.3", - "dev": true, - "license": "MIT" - }, - "node_modules/doctrine": { - "version": "3.0.0", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "dev": true, - "license": "MIT" - }, - "node_modules/electron-to-chromium": { - "version": "1.4.756", - "dev": true, - "license": "ISC" - }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "dev": true, - "license": "MIT" - }, - "node_modules/encoding": { - "version": "0.1.13", - "dev": true, - "license": "MIT", - "dependencies": { - "iconv-lite": "^0.6.2" - } - }, - "node_modules/es-abstract": { - "version": "1.23.3", - "dev": true, - "license": "MIT", - "dependencies": { - "array-buffer-byte-length": "^1.0.1", - "arraybuffer.prototype.slice": "^1.0.3", - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "data-view-buffer": "^1.0.1", - "data-view-byte-length": "^1.0.1", - "data-view-byte-offset": "^1.0.0", - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.0.0", - "es-set-tostringtag": "^2.0.3", - "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.6", - "get-intrinsic": "^1.2.4", - "get-symbol-description": "^1.0.2", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.3", - "has-symbols": "^1.0.3", - "hasown": "^2.0.2", - "internal-slot": "^1.0.7", - "is-array-buffer": "^3.0.4", - "is-callable": "^1.2.7", - "is-data-view": "^1.0.1", - "is-negative-zero": "^2.0.3", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.3", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.13", - "is-weakref": "^1.0.2", - "object-inspect": "^1.13.1", - "object-keys": "^1.1.1", - "object.assign": "^4.1.5", - "regexp.prototype.flags": "^1.5.2", - "safe-array-concat": "^1.1.2", - "safe-regex-test": "^1.0.3", - "string.prototype.trim": "^1.2.9", - "string.prototype.trimend": "^1.0.8", - "string.prototype.trimstart": "^1.0.8", - "typed-array-buffer": "^1.0.2", - "typed-array-byte-length": "^1.0.1", - "typed-array-byte-offset": "^1.0.2", - "typed-array-length": "^1.0.6", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.15" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-define-property": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.2.4" - }, - "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.0.19", - "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-set-tostringtag": "^2.0.3", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "globalthis": "^1.0.3", - "has-property-descriptors": "^1.0.2", - "has-proto": "^1.0.3", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.7", - "iterator.prototype": "^1.1.2", - "safe-array-concat": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-object-atoms": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.2.4", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.1" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-shim-unscopables": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "hasown": "^2.0.0" - } - }, - "node_modules/es-to-primitive": { - "version": "1.2.1", - "dev": true, - "license": "MIT", - "dependencies": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/esbuild": { - "version": "0.20.2", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=12" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.20.2", - "@esbuild/android-arm": "0.20.2", - "@esbuild/android-arm64": "0.20.2", - "@esbuild/android-x64": "0.20.2", - "@esbuild/darwin-arm64": "0.20.2", - "@esbuild/darwin-x64": "0.20.2", - "@esbuild/freebsd-arm64": "0.20.2", - "@esbuild/freebsd-x64": "0.20.2", - "@esbuild/linux-arm": "0.20.2", - "@esbuild/linux-arm64": "0.20.2", - "@esbuild/linux-ia32": "0.20.2", - "@esbuild/linux-loong64": "0.20.2", - "@esbuild/linux-mips64el": "0.20.2", - "@esbuild/linux-ppc64": "0.20.2", - "@esbuild/linux-riscv64": "0.20.2", - "@esbuild/linux-s390x": "0.20.2", - "@esbuild/linux-x64": "0.20.2", - "@esbuild/netbsd-x64": "0.20.2", - "@esbuild/openbsd-x64": "0.20.2", - "@esbuild/sunos-x64": "0.20.2", - "@esbuild/win32-arm64": "0.20.2", - "@esbuild/win32-ia32": "0.20.2", - "@esbuild/win32-x64": "0.20.2" - } - }, - "node_modules/escalade": { - "version": "3.1.2", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "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/eslint": { - "version": "8.57.0", - "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.0", - "@humanwhocodes/config-array": "^0.11.14", - "@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": "9.1.0", - "dev": true, - "license": "MIT", - "bin": { - "eslint-config-prettier": "bin/cli.js" - }, - "peerDependencies": { - "eslint": ">=7.0.0" - } - }, - "node_modules/eslint-plugin-jsx-a11y": { - "version": "6.8.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/runtime": "^7.23.2", - "aria-query": "^5.3.0", - "array-includes": "^3.1.7", - "array.prototype.flatmap": "^1.3.2", - "ast-types-flow": "^0.0.8", - "axe-core": "=4.7.0", - "axobject-query": "^3.2.1", - "damerau-levenshtein": "^1.0.8", - "emoji-regex": "^9.2.2", - "es-iterator-helpers": "^1.0.15", - "hasown": "^2.0.0", - "jsx-ast-utils": "^3.3.5", - "language-tags": "^1.0.9", - "minimatch": "^3.1.2", - "object.entries": "^1.1.7", - "object.fromentries": "^2.0.7" - }, - "engines": { - "node": ">=4.0" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" - } - }, - "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-react": { - "version": "7.34.1", - "dev": true, - "license": "MIT", - "dependencies": { - "array-includes": "^3.1.7", - "array.prototype.findlast": "^1.2.4", - "array.prototype.flatmap": "^1.3.2", - "array.prototype.toreversed": "^1.1.2", - "array.prototype.tosorted": "^1.1.3", - "doctrine": "^2.1.0", - "es-iterator-helpers": "^1.0.17", - "estraverse": "^5.3.0", - "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "minimatch": "^3.1.2", - "object.entries": "^1.1.7", - "object.fromentries": "^2.0.7", - "object.hasown": "^1.1.3", - "object.values": "^1.1.7", - "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.5", - "semver": "^6.3.1", - "string.prototype.matchall": "^4.0.10" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" - } - }, - "node_modules/eslint-plugin-react-hooks": { - "version": "4.6.2", - "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-refresh": { - "version": "0.4.6", - "dev": true, - "license": "MIT", - "peerDependencies": { - "eslint": ">=7" - } - }, - "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-plugin-react/node_modules/semver": { - "version": "6.3.1", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/eslint-scope": { - "version": "7.2.2", - "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-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/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/minimatch": { - "version": "3.1.2", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/espree": { - "version": "9.6.1", - "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/esquery": { - "version": "1.5.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/fast-deep-equal": { - "version": "3.1.3", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-glob": { - "version": "3.3.2", - "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.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "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/fastq": { - "version": "1.17.1", - "license": "ISC", - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "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/flat-cache": { - "version": "3.2.0", - "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/flatted": { - "version": "3.3.1", - "dev": true, - "license": "ISC" - }, - "node_modules/follow-redirects": { - "version": "1.15.6", - "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.3", - "dev": true, - "license": "MIT", - "dependencies": { - "is-callable": "^1.1.3" - } - }, - "node_modules/foreground-child": { - "version": "3.1.1", - "dev": true, - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.0", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/form-data": { - "version": "4.0.0", - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 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/fs-extra": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-8.1.0.tgz", - "integrity": "sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==", - "dependencies": { - "graceful-fs": "^4.2.0", - "jsonfile": "^4.0.0", - "universalify": "^0.1.0" - }, - "engines": { - "node": ">=6 <7 || >=8" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "license": "ISC" - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "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.6", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "functions-have-names": "^1.2.3" - }, - "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/get-intrinsic": { - "version": "1.2.4", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-symbol-description": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.5", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gettext-parser": { - "version": "1.4.0", - "dev": true, - "license": "MIT", - "dependencies": { - "encoding": "^0.1.12", - "safe-buffer": "^5.1.1" - } - }, - "node_modules/glob": { - "version": "7.2.3", - "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/node_modules/brace-expansion": { - "version": "1.1.11", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/glob/node_modules/minimatch": { - "version": "3.1.2", - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "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/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/gopd": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" - }, - "node_modules/graphemer": { - "version": "1.4.0", - "dev": true, - "license": "MIT" - }, - "node_modules/has-bigints": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "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.0.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.0.3", - "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/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/ignore": { - "version": "5.3.1", - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/immediate": { - "version": "3.0.6", - "license": "MIT" - }, - "node_modules/immer": { - "version": "9.0.21", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/immer" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "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/imurmurhash": { - "version": "0.1.4", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "license": "ISC" - }, - "node_modules/internal-slot": { - "version": "1.0.7", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "hasown": "^2.0.0", - "side-channel": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/is-array-buffer": { - "version": "3.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-async-function": { - "version": "2.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-bigint": { - "version": "1.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "has-bigints": "^1.0.1" - }, - "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.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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.13.1", - "dev": true, - "license": "MIT", - "dependencies": { - "hasown": "^2.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-data-view": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-date-object": { - "version": "1.0.5", - "dev": true, - "license": "MIT", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-finalizationregistry": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2" - }, - "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-function": { - "version": "1.0.10", - "dev": true, - "license": "MIT", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "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-negative-zero": { - "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", - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-number-object": { - "version": "1.0.7", - "dev": true, - "license": "MIT", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-plain-object": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-3.0.1.tgz", - "integrity": "sha512-Xnpx182SBMrr/aBik8y+GuR4U1L9FqMSojwDQwPMmxyC6bvEqly9UBCxhauBF5vNh2gwWJNX6oDV7O+OM4z34g==", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-regex": { - "version": "1.1.4", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "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.3", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-string": { - "version": "1.0.7", - "dev": true, - "license": "MIT", - "dependencies": { - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-symbol": { - "version": "1.0.4", - "dev": true, - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.13", - "dev": true, - "license": "MIT", - "dependencies": { - "which-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "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.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-weakset": { - "version": "2.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/isarray": { - "version": "2.0.5", - "dev": true, - "license": "MIT" - }, - "node_modules/isexe": { - "version": "2.0.0", - "dev": true, - "license": "ISC" - }, - "node_modules/iterator.prototype": { - "version": "1.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "define-properties": "^1.2.1", - "get-intrinsic": "^1.2.1", - "has-symbols": "^1.0.3", - "reflect.getprototypeof": "^1.0.4", - "set-function-name": "^2.0.1" - } - }, - "node_modules/jackspeak": { - "version": "2.3.6", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/jiti": { - "version": "1.21.0", - "dev": true, - "license": "MIT", - "bin": { - "jiti": "bin/jiti.js" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "license": "MIT" - }, - "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/json-buffer": { - "version": "3.0.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/jsonfile": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", - "integrity": "sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==", - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "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", - "dev": true, - "license": "MIT", - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/language-subtag-registry": { - "version": "0.3.22", - "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/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", - "license": "MIT", - "dependencies": { - "immediate": "~3.0.5" - } - }, - "node_modules/lilconfig": { - "version": "2.1.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "dev": true, - "license": "MIT" - }, - "node_modules/localforage": { - "version": "1.10.0", - "license": "Apache-2.0", - "dependencies": { - "lie": "3.1.1" - } - }, - "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/lodash": { - "version": "4.17.21", - "license": "MIT" - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "dev": true, - "license": "MIT" - }, - "node_modules/loose-envify": { - "version": "1.4.0", - "license": "MIT", - "dependencies": { - "js-tokens": "^3.0.0 || ^4.0.0" - }, - "bin": { - "loose-envify": "cli.js" - } - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/make-error": { - "version": "1.3.6", - "dev": true, - "license": "ISC", - "optional": true, - "peer": true - }, - "node_modules/memize": { - "version": "2.1.0", - "dev": true, - "license": "MIT" - }, - "node_modules/merge2": { - "version": "1.4.1", - "license": "MIT", - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.5", - "license": "MIT", - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/minimatch": { - "version": "9.0.4", - "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/minipass": { - "version": "7.1.0", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/moment": { - "version": "2.30.1", - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/monaco-editor": { - "version": "0.48.0", - "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.48.0.tgz", - "integrity": "sha512-goSDElNqFfw7iDHMg8WDATkfcyeLTNpBHQpO8incK6p5qZt5G/1j41X0xdGzpIkGojGXM+QiRQyLjnfDVvrpwA==", - "peer": true - }, - "node_modules/ms": { - "version": "2.1.2", - "dev": true, - "license": "MIT" - }, - "node_modules/mz": { - "version": "2.7.0", - "dev": true, - "license": "MIT", - "dependencies": { - "any-promise": "^1.0.0", - "object-assign": "^4.0.1", - "thenify-all": "^1.0.0" - } - }, - "node_modules/nanoid": { - "version": "3.3.7", - "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/node-releases": { - "version": "2.0.14", - "dev": true, - "license": "MIT" - }, - "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/object-assign": { - "version": "4.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-hash": { - "version": "3.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/object-inspect": { - "version": "1.13.1", - "dev": true, - "license": "MIT", - "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.5", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.5", - "define-properties": "^1.2.1", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object.entries": { - "version": "1.1.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" - } - }, - "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.hasown": { - "version": "1.1.4", - "dev": true, - "license": "MIT", - "dependencies": { - "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.values": { - "version": "1.2.0", - "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/once": { - "version": "1.4.0", - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "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/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": "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/parent-module": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "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-scurry": { - "version": "1.10.2", - "dev": true, - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-scurry/node_modules/lru-cache": { - "version": "10.2.2", - "dev": true, - "license": "ISC", - "engines": { - "node": "14 || >=16.14" - } - }, - "node_modules/path-type": { - "version": "4.0.0", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/picocolors": { - "version": "1.0.0", - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "2.3.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pirates": { - "version": "4.0.6", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/possible-typed-array-names": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/postcss": { - "version": "8.4.38", - "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.7", - "picocolors": "^1.0.0", - "source-map-js": "^1.2.0" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/postcss-import": { - "version": "15.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-value-parser": "^4.0.0", - "read-cache": "^1.0.0", - "resolve": "^1.1.7" - }, - "engines": { - "node": ">=14.0.0" - }, - "peerDependencies": { - "postcss": "^8.0.0" - } - }, - "node_modules/postcss-js": { - "version": "4.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "camelcase-css": "^2.0.1" - }, - "engines": { - "node": "^12 || ^14 || >= 16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.4.21" - } - }, - "node_modules/postcss-load-config": { - "version": "4.0.2", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "lilconfig": "^3.0.0", - "yaml": "^2.3.4" - }, - "engines": { - "node": ">= 14" - }, - "peerDependencies": { - "postcss": ">=8.0.9", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "postcss": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/postcss-load-config/node_modules/lilconfig": { - "version": "3.1.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/antonk52" - } - }, - "node_modules/postcss-nested": { - "version": "6.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "postcss-selector-parser": "^6.0.11" - }, - "engines": { - "node": ">=12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.2.14" - } - }, - "node_modules/postcss-selector-parser": { - "version": "6.0.16", - "dev": true, - "license": "MIT", - "dependencies": { - "cssesc": "^3.0.0", - "util-deprecate": "^1.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/postcss-value-parser": { - "version": "4.2.0", - "license": "MIT" - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prettier": { - "version": "3.2.5", - "dev": true, - "license": "MIT", - "bin": { - "prettier": "bin/prettier.cjs" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/prettier-plugin-tailwindcss": { - "version": "0.5.14", - "resolved": "https://registry.npmjs.org/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.5.14.tgz", - "integrity": "sha512-Puaz+wPUAhFp8Lo9HuciYKM2Y2XExESjeT+9NQoVFXZsPPnc9VYss2SpxdQ6vbatmt8/4+SN0oe0I1cPDABg9Q==", - "dev": true, - "engines": { - "node": ">=14.21.3" - }, - "peerDependencies": { - "@ianvs/prettier-plugin-sort-imports": "*", - "@prettier/plugin-pug": "*", - "@shopify/prettier-plugin-liquid": "*", - "@trivago/prettier-plugin-sort-imports": "*", - "@zackad/prettier-plugin-twig-melody": "*", - "prettier": "^3.0", - "prettier-plugin-astro": "*", - "prettier-plugin-css-order": "*", - "prettier-plugin-import-sort": "*", - "prettier-plugin-jsdoc": "*", - "prettier-plugin-marko": "*", - "prettier-plugin-organize-attributes": "*", - "prettier-plugin-organize-imports": "*", - "prettier-plugin-sort-imports": "*", - "prettier-plugin-style-order": "*", - "prettier-plugin-svelte": "*" - }, - "peerDependenciesMeta": { - "@ianvs/prettier-plugin-sort-imports": { - "optional": true - }, - "@prettier/plugin-pug": { - "optional": true - }, - "@shopify/prettier-plugin-liquid": { - "optional": true - }, - "@trivago/prettier-plugin-sort-imports": { - "optional": true - }, - "@zackad/prettier-plugin-twig-melody": { - "optional": true - }, - "prettier-plugin-astro": { - "optional": true - }, - "prettier-plugin-css-order": { - "optional": true - }, - "prettier-plugin-import-sort": { - "optional": true - }, - "prettier-plugin-jsdoc": { - "optional": true - }, - "prettier-plugin-marko": { - "optional": true - }, - "prettier-plugin-organize-attributes": { - "optional": true - }, - "prettier-plugin-organize-imports": { - "optional": true - }, - "prettier-plugin-sort-imports": { - "optional": true - }, - "prettier-plugin-style-order": { - "optional": true - }, - "prettier-plugin-svelte": { - "optional": true - } - } - }, - "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/proxy-from-env": { - "version": "1.1.0", - "license": "MIT" - }, - "node_modules/punycode": { - "version": "2.3.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "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/react": { - "version": "18.3.1", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-dom": { - "version": "18.3.1", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0", - "scheduler": "^0.23.2" - }, - "peerDependencies": { - "react": "^18.3.1" - } - }, - "node_modules/react-hook-form": { - "version": "7.51.4", - "resolved": "https://registry.npmjs.org/react-hook-form/-/react-hook-form-7.51.4.tgz", - "integrity": "sha512-V14i8SEkh+V1gs6YtD0hdHYnoL4tp/HX/A45wWQN15CYr9bFRmmRdYStSO5L65lCCZRF+kYiSKhm9alqbcdiVA==", - "engines": { - "node": ">=12.22.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/react-hook-form" - }, - "peerDependencies": { - "react": "^16.8.0 || ^17 || ^18" - } - }, - "node_modules/react-is": { - "version": "16.13.1", - "dev": true, - "license": "MIT" - }, - "node_modules/react-redux": { - "version": "9.1.2", - "license": "MIT", - "dependencies": { - "@types/use-sync-external-store": "^0.0.3", - "use-sync-external-store": "^1.0.0" - }, - "peerDependencies": { - "@types/react": "^18.2.25", - "react": "^18.0", - "redux": "^5.0.0" - }, - "peerDependenciesMeta": { - "@types/react": { - "optional": true - }, - "redux": { - "optional": true - } - } - }, - "node_modules/read-cache": { - "version": "1.0.0", - "dev": true, - "license": "MIT", - "dependencies": { - "pify": "^2.3.0" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "dev": true, - "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/redux": { - "version": "5.0.1", - "license": "MIT", - "peer": true - }, - "node_modules/reflect.getprototypeof": { - "version": "1.0.6", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.1", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "globalthis": "^1.0.3", - "which-builtin-type": "^1.1.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.14.1", - "license": "MIT" - }, - "node_modules/regexp.prototype.flags": { - "version": "1.5.2", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.6", - "define-properties": "^1.2.1", - "es-errors": "^1.3.0", - "set-function-name": "^2.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve": { - "version": "1.22.8", - "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/resolve-from": { - "version": "4.0.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "license": "MIT", - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "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/rollup": { - "version": "4.17.2", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/estree": "1.0.5" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.17.2", - "@rollup/rollup-android-arm64": "4.17.2", - "@rollup/rollup-darwin-arm64": "4.17.2", - "@rollup/rollup-darwin-x64": "4.17.2", - "@rollup/rollup-linux-arm-gnueabihf": "4.17.2", - "@rollup/rollup-linux-arm-musleabihf": "4.17.2", - "@rollup/rollup-linux-arm64-gnu": "4.17.2", - "@rollup/rollup-linux-arm64-musl": "4.17.2", - "@rollup/rollup-linux-powerpc64le-gnu": "4.17.2", - "@rollup/rollup-linux-riscv64-gnu": "4.17.2", - "@rollup/rollup-linux-s390x-gnu": "4.17.2", - "@rollup/rollup-linux-x64-gnu": "4.17.2", - "@rollup/rollup-linux-x64-musl": "4.17.2", - "@rollup/rollup-win32-arm64-msvc": "4.17.2", - "@rollup/rollup-win32-ia32-msvc": "4.17.2", - "@rollup/rollup-win32-x64-msvc": "4.17.2", - "fsevents": "~2.3.2" - } - }, - "node_modules/rollup-plugin-copy": { - "version": "3.5.0", - "resolved": "https://registry.npmjs.org/rollup-plugin-copy/-/rollup-plugin-copy-3.5.0.tgz", - "integrity": "sha512-wI8D5dvYovRMx/YYKtUNt3Yxaw4ORC9xo6Gt9t22kveWz1enG9QrhVlagzwrxSC455xD1dHMKhIJkbsQ7d48BA==", - "dependencies": { - "@types/fs-extra": "^8.0.1", - "colorette": "^1.1.0", - "fs-extra": "^8.1.0", - "globby": "10.0.1", - "is-plain-object": "^3.0.0" - }, - "engines": { - "node": ">=8.3" - } - }, - "node_modules/rollup-plugin-copy/node_modules/globby": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.1.tgz", - "integrity": "sha512-sSs4inE1FB2YQiymcmTv6NWENryABjUNPeWhOvmn4SjtKybglsyPZxFB3U1/+L1bYi0rNZDqCLlHyLYDl1Pq5A==", - "dependencies": { - "@types/glob": "^7.1.1", - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.0.3", - "glob": "^7.1.3", - "ignore": "^5.1.1", - "merge2": "^1.2.3", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/rollup/node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.17.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.17.2.tgz", - "integrity": "sha512-Hy7pLwByUOuyaFC6mAr7m+oMC+V7qyifzs/nW2OJfC8H4hbCzOX07Ov0VFk/zP3kBsELWNFi7rJtgbKYsav9QQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "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/safe-array-concat": { - "version": "1.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "get-intrinsic": "^1.2.4", - "has-symbols": "^1.0.3", - "isarray": "^2.0.5" - }, - "engines": { - "node": ">=0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "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-regex-test": { - "version": "1.0.3", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.6", - "es-errors": "^1.3.0", - "is-regex": "^1.1.4" - }, - "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/scheduler": { - "version": "0.23.2", - "license": "MIT", - "dependencies": { - "loose-envify": "^1.1.0" - } - }, - "node_modules/semver": { - "version": "7.6.0", - "dev": true, - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "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/shallowequal": { - "version": "1.1.0", - "license": "MIT" - }, - "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/side-channel": { - "version": "1.0.6", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.4", - "object-inspect": "^1.13.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/signal-exit": { - "version": "4.1.0", - "dev": true, - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/slash": { - "version": "3.0.0", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/source-map-js": { - "version": "1.2.0", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/sprintf-js": { - "version": "1.1.3", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/state-local": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/state-local/-/state-local-1.0.7.tgz", - "integrity": "sha512-HTEHMNieakEnoe33shBYcZ7NX83ACUjCu8c40iOGEZsngj9zRnkqS9j1pqQPXwobB0ZcVTk27REb7COQ0UR59w==" - }, - "node_modules/string-width": { - "version": "5.1.2", - "dev": true, - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/string-width-cjs": { - "name": "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-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/string-width/node_modules/ansi-regex": { - "version": "6.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/string-width/node_modules/strip-ansi": { - "version": "7.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/string.prototype.matchall": { - "version": "4.0.11", - "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", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.7", - "regexp.prototype.flags": "^1.5.2", - "set-function-name": "^2.0.2", - "side-channel": "^1.0.6" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trim": { - "version": "1.2.9", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1", - "es-abstract": "^1.23.0", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/string.prototype.trimend": { - "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" - }, - "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-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "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/style-mod": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/style-mod/-/style-mod-4.1.2.tgz", - "integrity": "sha512-wnD1HyVqpJUI2+eKZ+eo1UwghftP6yuFheBqqe+bWCotBjC2K1YnteJILRMs3SM4V/0dLEW1SC27MWP5y+mwmw==" - }, - "node_modules/styled-components": { - "version": "6.1.11", - "resolved": "https://registry.npmjs.org/styled-components/-/styled-components-6.1.11.tgz", - "integrity": "sha512-Ui0jXPzbp1phYij90h12ksljKGqF8ncGx+pjrNPsSPhbUUjWT2tD1FwGo2LF6USCnbrsIhNngDfodhxbegfEOA==", - "dependencies": { - "@emotion/is-prop-valid": "1.2.2", - "@emotion/unitless": "0.8.1", - "@types/stylis": "4.2.5", - "css-to-react-native": "3.2.0", - "csstype": "3.1.3", - "postcss": "8.4.38", - "shallowequal": "1.1.0", - "stylis": "4.3.2", - "tslib": "2.6.2" - }, - "engines": { - "node": ">= 16" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/styled-components" - }, - "peerDependencies": { - "react": ">= 16.8.0", - "react-dom": ">= 16.8.0" - } - }, - "node_modules/stylis": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.2.tgz", - "integrity": "sha512-bhtUjWd/z6ltJiQwg0dUfxEJ+W+jdqQd8TbWLWyeIJHlnsqmGLRFFd8e5mA0AZi/zx90smXRlN66YMTcaSFifg==" - }, - "node_modules/sucrase": { - "version": "3.35.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.2", - "commander": "^4.0.0", - "glob": "^10.3.10", - "lines-and-columns": "^1.1.6", - "mz": "^2.7.0", - "pirates": "^4.0.1", - "ts-interface-checker": "^0.1.9" - }, - "bin": { - "sucrase": "bin/sucrase", - "sucrase-node": "bin/sucrase-node" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/sucrase/node_modules/glob": { - "version": "10.3.12", - "dev": true, - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^2.3.6", - "minimatch": "^9.0.1", - "minipass": "^7.0.4", - "path-scurry": "^1.10.2" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "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/tailwindcss": { - "version": "3.4.3", - "dev": true, - "license": "MIT", - "dependencies": { - "@alloc/quick-lru": "^5.2.0", - "arg": "^5.0.2", - "chokidar": "^3.5.3", - "didyoumean": "^1.2.2", - "dlv": "^1.1.3", - "fast-glob": "^3.3.0", - "glob-parent": "^6.0.2", - "is-glob": "^4.0.3", - "jiti": "^1.21.0", - "lilconfig": "^2.1.0", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "object-hash": "^3.0.0", - "picocolors": "^1.0.0", - "postcss": "^8.4.23", - "postcss-import": "^15.1.0", - "postcss-js": "^4.0.1", - "postcss-load-config": "^4.0.1", - "postcss-nested": "^6.0.1", - "postcss-selector-parser": "^6.0.11", - "resolve": "^1.22.2", - "sucrase": "^3.32.0" - }, - "bin": { - "tailwind": "lib/cli.js", - "tailwindcss": "lib/cli.js" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/tannin": { - "version": "1.2.0", - "dev": true, - "license": "MIT", - "dependencies": { - "@tannin/plural-forms": "^1.1.0" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "dev": true, - "license": "MIT" - }, - "node_modules/thenify": { - "version": "3.3.1", - "dev": true, - "license": "MIT", - "dependencies": { - "any-promise": "^1.0.0" - } - }, - "node_modules/thenify-all": { - "version": "1.6.0", - "dev": true, - "license": "MIT", - "dependencies": { - "thenify": ">= 3.1.0 < 4" - }, - "engines": { - "node": ">=0.8" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/ts-api-utils": { - "version": "1.3.0", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=16" - }, - "peerDependencies": { - "typescript": ">=4.2.0" - } - }, - "node_modules/ts-interface-checker": { - "version": "0.1.13", - "dev": true, - "license": "Apache-2.0" - }, - "node_modules/ts-node": { - "version": "10.9.2", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } - } - }, - "node_modules/ts-node/node_modules/arg": { - "version": "4.1.3", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true - }, - "node_modules/tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" - }, - "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-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/typed-array-buffer": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "es-errors": "^1.3.0", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/typed-array-byte-length": { - "version": "1.0.1", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-byte-offset": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typed-array-length": { - "version": "1.0.6", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/typescript": { - "version": "5.4.5", - "dev": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/unbox-primitive": { - "version": "1.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/undici-types": { - "version": "5.26.5", - "license": "MIT" - }, - "node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.0.15", - "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.1.2", - "picocolors": "^1.0.0" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/use-sync-external-store": { - "version": "1.2.2", - "license": "MIT", - "peerDependencies": { - "react": "^16.8.0 || ^17.0.0 || ^18.0.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "dev": true, - "license": "MIT" - }, - "node_modules/uuid": { - "version": "9.0.1", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true - }, - "node_modules/vite": { - "version": "5.2.11", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.11.tgz", - "integrity": "sha512-HndV31LWW05i1BLPMUCE1B9E9GFbOu1MbenhS58FuK6owSO5qHm7GiCotrNY1YE5rMeQSFBGmT5ZaLEjFizgiQ==", - "dev": true, - "dependencies": { - "esbuild": "^0.20.1", - "postcss": "^8.4.38", - "rollup": "^4.13.0" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || >=20.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || >=20.0.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.4.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - } - } - }, - "node_modules/vite-plugin-monaco-editor": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/vite-plugin-monaco-editor/-/vite-plugin-monaco-editor-1.1.0.tgz", - "integrity": "sha512-IvtUqZotrRoVqwT0PBBDIZPNraya3BxN/bfcNfnxZ5rkJiGcNtO5eAOWWSgT7zullIAEqQwxMU83yL9J5k7gww==", - "dev": true, - "peerDependencies": { - "monaco-editor": ">=0.33.0" - } - }, - "node_modules/w3c-keyname": { - "version": "2.2.8", - "resolved": "https://registry.npmjs.org/w3c-keyname/-/w3c-keyname-2.2.8.tgz", - "integrity": "sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==" - }, - "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.0.2", - "dev": true, - "license": "MIT", - "dependencies": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-builtin-type": { - "version": "1.1.3", - "dev": true, - "license": "MIT", - "dependencies": { - "function.prototype.name": "^1.1.5", - "has-tostringtag": "^1.0.0", - "is-async-function": "^2.0.0", - "is-date-object": "^1.0.5", - "is-finalizationregistry": "^1.0.2", - "is-generator-function": "^1.0.10", - "is-regex": "^1.1.4", - "is-weakref": "^1.0.2", - "isarray": "^2.0.5", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.9" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/which-collection": { - "version": "1.0.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.15", - "dev": true, - "license": "MIT", - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/word-wrap": { - "version": "1.2.5", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wrap-ansi": { - "version": "8.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs": { - "name": "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/wrap-ansi-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "dev": true, - "license": "MIT" - }, - "node_modules/wrap-ansi-cjs/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/wrap-ansi/node_modules/ansi-regex": { - "version": "6.0.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "6.2.1", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "7.1.0", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "license": "ISC" - }, - "node_modules/yallist": { - "version": "4.0.0", - "dev": true, - "license": "ISC" - }, - "node_modules/yaml": { - "version": "2.4.2", - "dev": true, - "license": "ISC", - "bin": { - "yaml": "bin.mjs" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/yn": { - "version": "3.1.1", - "dev": true, - "license": "MIT", - "optional": true, - "peer": true, - "engines": { - "node": ">=6" - } - }, - "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.7", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.7.tgz", - "integrity": "sha512-NBeIoqbtOiUMomACV/y+V3Qfs9+Okr18vR5c/5pHClPpufWOrsx8TENboDPe265lFdfewX2yBtNTLPvnmCxwog==", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - } - } -} diff --git a/vite/package.json b/vite/package.json index 4df33978..d850dc67 100644 --- a/vite/package.json +++ b/vite/package.json @@ -1,67 +1,71 @@ { - "name": "react", - "private": true, - "version": "0.0.0", - "type": "module", - "scripts": { - "dev:meta-fields": "vite -c vite.config.meta-fields.ts", - "build:meta-fields": "tsc && vite build -c vite.config.meta-fields.ts", - "dev:debug-page": "vite -c vite.config.debug-page.ts", - "build:debug-page": "tsc && vite build -c vite.config.debug-page.ts", - "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0" - }, - "dependencies": { - "-": "^0.0.1", - "@codemirror/lang-php": "^6.0.1", - "@hookform/resolvers": "^3.3.4", - "@monaco-editor/loader": "^1.4.0", - "@monaco-editor/react": "^4.6.0", - "@rematch/core": "^2.2.0", - "@rematch/immer": "^2.1.3", - "@rematch/loading": "^2.1.2", - "@rematch/updated": "^2.1.2", - "@types/uuid": "^9.0.8", - "@uiw/codemirror-theme-github": "^4.22.0", - "@uiw/react-codemirror": "^4.22.0", - "axios": "^1.6.8", - "clsx": "^2.1.1", - "immer": "^9.0.21", - "localforage": "^1.10.0", - "lodash": "^4.17.21", - "moment": "^2.30.1", - "react": "^18.2.0", - "react-dom": "^18.2.0", - "react-hook-form": "^7.51.4", - "react-redux": "^9.1.2", - "rollup-plugin-copy": "^3.5.0", - "styled-components": "^6.1.11", - "uuid": "^9.0.1", - "zod": "^3.23.7" - }, - "devDependencies": { - "@types/node": "^20.12.8", - "@types/react": "^18.2.66", - "@types/react-dom": "^18.2.22", - "@typescript-eslint/eslint-plugin": "^7.2.0", - "@typescript-eslint/parser": "^7.2.0", - "@vitejs/plugin-react-swc": "^3.5.0", - "@wordpress/i18n": "^4.57.0", - "autoprefixer": "^10.4.19", - "eslint": "^8.57.0", - "eslint-config-prettier": "^9.1.0", - "eslint-plugin-jsx-a11y": "^6.8.0", - "eslint-plugin-react": "^7.34.1", - "eslint-plugin-react-hooks": "^4.6.0", - "eslint-plugin-react-refresh": "^0.4.6", - "postcss": "^8.4.38", - "prettier": "^3.2.5", - "prettier-plugin-tailwindcss": "^0.5.14", - "tailwindcss": "^3.4.3", - "typescript": "^5.2.2", - "vite": "^5.2.0", - "vite-plugin-monaco-editor": "^1.1.0" - }, - "optionalDependencies": { - "@rollup/rollup-linux-x64-gnu": "4.9.5" - } + "name": "react", + "private": true, + "version": "0.0.0", + "type": "module", + "scripts": { + "dev:meta-fields": "vite -c vite.config.meta-fields.ts", + "build:meta-fields": "tsc && vite build -c vite.config.meta-fields.ts", + "dev:debug-page": "vite -c vite.config.debug-page.ts", + "build:debug-page": "tsc && vite build -c vite.config.debug-page.ts", + "dev:logs": "vite -c vite.config.logs.ts", + "build:logs": "tsc && vite build -c vite.config.logs.ts", + "build": "bun run build:meta-fields && bun run build:debug-page && bun run build:logs", + "lint": "eslint . --ext ts,tsx --report-unused-disable-directives --max-warnings 0" + }, + "dependencies": { + "-": "^0.0.1", + "@codemirror/lang-php": "^6.0.1", + "@heroicons/react": "^2.1.3", + "@hookform/resolvers": "^3.3.4", + "@rematch/core": "^2.2.0", + "@rematch/immer": "^2.1.3", + "@rematch/loading": "^2.1.2", + "@rematch/select": "^3.1.2", + "@rematch/updated": "^2.1.2", + "@types/uuid": "^9.0.8", + "@uiw/codemirror-theme-github": "^4.22.0", + "@uiw/react-codemirror": "^4.22.0", + "axios": "^1.6.8", + "clsx": "^2.1.1", + "filesize": "^10.1.2", + "immer": "^9.0.21", + "localforage": "^1.10.0", + "lodash": "^4.17.21", + "moment": "^2.30.1", + "react": "^18.2.0", + "react-dom": "^18.2.0", + "react-hook-form": "^7.51.4", + "react-json-view": "^1.21.3", + "react-redux": "^9.1.2", + "rollup-plugin-copy": "^3.5.0", + "styled-components": "^6.1.11", + "tailwind-merge": "^2.3.0", + "uuid": "^9.0.1", + "zod": "^3.23.7" + }, + "devDependencies": { + "@types/lodash": "^4.17.5", + "@types/node": "^20.12.8", + "@types/react": "^18.2.66", + "@types/react-dom": "^18.2.22", + "@typescript-eslint/eslint-plugin": "^7.2.0", + "@typescript-eslint/parser": "^7.2.0", + "@vitejs/plugin-react-swc": "^3.5.0", + "@wordpress/i18n": "^4.57.0", + "autoprefixer": "^10.4.19", + "eslint": "^8.57.0", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-jsx-a11y": "^6.8.0", + "eslint-plugin-react": "^7.34.1", + "eslint-plugin-react-hooks": "^4.6.0", + "eslint-plugin-react-refresh": "^0.4.6", + "postcss": "^8.4.38", + "prettier": "^3.2.5", + "prettier-plugin-tailwindcss": "^0.5.14", + "rollup-plugin-wordpress-dependency-extraction": "^1.0.3", + "tailwindcss": "^3.4.3", + "typescript": "^5.2.2", + "vite": "^5.2.0" + } } diff --git a/vite/plugins/rollup-plugin-wp-resolve.ts b/vite/plugins/rollup-plugin-wp-resolve.ts deleted file mode 100644 index 33a8d3c8..00000000 --- a/vite/plugins/rollup-plugin-wp-resolve.ts +++ /dev/null @@ -1,78 +0,0 @@ -import type { OutputOptions, InputOptions, ExternalOption } from 'rollup' - -const ns = '@wordpress/' -const nsExclude = ['icons', 'interface'] -const wordpressMatch = new RegExp(`^${ns}(?!(${nsExclude.join('|')})).*$`) // /^@wordpress\/(?!(icons|interface)).*$/ - -const external: Record = { - jquery: 'window.jQuery', - 'lodash-es': 'window.lodash', - lodash: 'window.lodash', - moment: 'window.moment', - 'react-dom': 'window.ReactDOM', - react: 'window.React', -} - -export default function wpResolve() { - return { - name: 'wp-resolve', - options: (options: InputOptions) => { - if (Array.isArray(options.external) === false) { - // If string, RegExp or function - options.external = [options.external].filter( - Boolean, - ) as ExternalOption - } - - if (Array.isArray(options.external)) { - options.external = options.external.concat( - Object.keys(external), - ) - options.external.push(wordpressMatch) - } - - return options - }, - outputOptions: (outputOptions: OutputOptions) => { - const configGlobals = outputOptions.globals - - const resolveGlobals = (id: string) => { - if ( - typeof configGlobals === 'object' && - id in configGlobals && - configGlobals[id] - ) { - return configGlobals[id] - } - - // options.globals is a function - defer to it - if (typeof configGlobals === 'function') { - const configGlobalId = configGlobals(id) - - if (configGlobalId && configGlobalId !== id) { - return configGlobalId - } - } - - // see if it's a static wp external - if (id in external && external[id]) { - return external[id] - } - - if (wordpressMatch.test(id)) { - // convert @namespace/component-name to namespace.componentName - return id - .replace(new RegExp(`^${ns}`), 'wp.') - .replace(/\//g, '.') - .replace(/-([a-z])/g, (_, letter) => - letter.toUpperCase(), - ) - } - - return '' - } - - outputOptions.globals = resolveGlobals - }, - } -} diff --git a/vite/src/admin/logs-page/App.tsx b/vite/src/admin/logs-page/App.tsx new file mode 100644 index 00000000..1aa43576 --- /dev/null +++ b/vite/src/admin/logs-page/App.tsx @@ -0,0 +1,17 @@ +import React from 'react' +import { Provider } from 'react-redux' +import Logs from '@/admin/logs-page/components/Logs' +import { store } from '@/admin/logs-page/store' +import clsx from 'clsx' + +const App: React.FC = () => { + return ( + +
+ +
+
+ ) +} + +export default App diff --git a/vite/src/admin/logs-page/components/File.tsx b/vite/src/admin/logs-page/components/File.tsx new file mode 100644 index 00000000..2c6c1d14 --- /dev/null +++ b/vite/src/admin/logs-page/components/File.tsx @@ -0,0 +1,58 @@ +import { ILogFile } from '@/types/WpLog' +import React from 'react' +import moment from 'moment' +import { filesize } from 'filesize' +import ResetButton from '@/components/ResetButton' +import { twJoin } from 'tailwind-merge' +import { isEven } from '@/utils/number' +import { twm } from '@/utils/twm' + +type FileProps = { + file: ILogFile + fileIndex: number + onOpen: () => void +} + +const File: React.FC = ({ file, fileIndex, onOpen }) => { + return ( + <> + + + onOpen()} + > + {file.name} + + + + {moment(file.created, moment.ISO_8601).format('YYYY-MM-DD')} + + + {moment(file.modified, moment.ISO_8601).format( + 'YYYY-MM-DD HH:mm:ss', + )} + + + {filesize(file.size, { round: 0 })} + + + + ) +} + +export default File diff --git a/vite/src/admin/logs-page/components/FilesList.tsx b/vite/src/admin/logs-page/components/FilesList.tsx new file mode 100644 index 00000000..026f744f --- /dev/null +++ b/vite/src/admin/logs-page/components/FilesList.tsx @@ -0,0 +1,190 @@ +import React, { + ButtonHTMLAttributes, + PropsWithChildren, + useEffect, + useState, +} from 'react' +import { __ } from '@wordpress/i18n' +import File from '@/admin/logs-page/components/File' +import { + ChevronDoubleLeftIcon, + ChevronDoubleRightIcon, + ChevronLeftIcon, + ChevronRightIcon, +} from '@heroicons/react/16/solid' +import { ILogFile, ILogTab } from '@/types/WpLog' +import moment from 'moment/moment' +import { useDispatch } from 'react-redux' +import { Dispatch } from '@/admin/logs-page/store' +import { twJoin } from 'tailwind-merge' + +const ITEMS_PER_PAGE = 10 + +type FilesListProps = { + tab: ILogTab +} + +const Th: React.FC = ({ children }) => { + return ( + + {children} + + ) +} + +const ButtonNavigation: React.FC< + ButtonHTMLAttributes & { + Icon: React.ComponentType> + } +> = ({ Icon, disabled, ...props }) => { + return ( + + ) +} + +const FilesList: React.FC = ({ tab }) => { + const dispatch = useDispatch() + const [currentPage, setCurrentPage] = useState(1) + + useEffect(() => { + dispatch.logs.fetchFiles({ tabId: tab.id }) + }, [dispatch, tab.id]) + + const sortedFiles = [...tab.files].sort( + (a, b) => + moment(b.created, moment.ISO_8601).valueOf() - + moment(a.created, moment.ISO_8601).valueOf(), + ) + + const indexOfLastFile = currentPage * ITEMS_PER_PAGE + const indexOfFirstFile = indexOfLastFile - ITEMS_PER_PAGE + const currentFiles = sortedFiles.slice(indexOfFirstFile, indexOfLastFile) + + const totalPages = Math.ceil(sortedFiles.length / ITEMS_PER_PAGE) + + const handleNextPage = () => { + if (currentPage < totalPages) { + setCurrentPage((prevPage) => prevPage + 1) + } + } + + const handlePrevPage = () => { + if (currentPage > 1) { + setCurrentPage((prevPage) => prevPage - 1) + } + } + + const handleFirstPage = () => { + setCurrentPage(1) + } + + const handleLastPage = () => { + setCurrentPage(totalPages) + } + + const handleOpenFile = (file: ILogFile) => { + dispatch.logs.setActiveFile({ tab, file }) + } + + return ( + <> +
+ + + + + + + + + + + {currentFiles.map((file, index) => ( + handleOpenFile(file)} + /> + ))} + +
{__('Name', 'reepay-checkout-gateway')} + {__('Date created', 'reepay-checkout-gateway')} + + {__('Date modified', 'reepay-checkout-gateway')} + + {__('File size', 'reepay-checkout-gateway')} +
+
+ + {tab.files.length}{' '} + {__('items', 'reepay-checkout-gateway')} + + + + + {currentPage} of {totalPages} + + + +
+
+ +
+ + ) +} + +export default FilesList diff --git a/vite/src/admin/logs-page/components/Level.tsx b/vite/src/admin/logs-page/components/Level.tsx new file mode 100644 index 00000000..5e235278 --- /dev/null +++ b/vite/src/admin/logs-page/components/Level.tsx @@ -0,0 +1,32 @@ +import React from 'react' +import { LogLevel } from '@/types/WpLog' +import { twm } from '@/utils/twm' + +type LevelProps = { + level: LogLevel +} + +const levelClasses = { + [LogLevel.ERROR]: 'bw-bg-red-500', + [LogLevel.INFO]: 'bw-bg-blue-500', + [LogLevel.WARNING]: 'bw-bg-yellow-500', + [LogLevel.NOTICE]: 'bw-bg-green-500', + [LogLevel.DEBUG]: 'bw-bg-gray-500', +} + +const Level: React.FC = ({ level }) => { + return ( + <> +
+ {level} +
+ + ) +} + +export default Level diff --git a/vite/src/admin/logs-page/components/LogItem.tsx b/vite/src/admin/logs-page/components/LogItem.tsx new file mode 100644 index 00000000..1318aa2a --- /dev/null +++ b/vite/src/admin/logs-page/components/LogItem.tsx @@ -0,0 +1,109 @@ +import React from 'react' +import { ILog, SelectLogFieldEnum } from '@/types/WpLog' +import { twJoin } from 'tailwind-merge' +import Level from '@/admin/logs-page/components/Level' +import { ChevronDownIcon, ChevronUpIcon } from '@heroicons/react/16/solid' +import ResetButton from '@/components/ResetButton' +import { useDispatch } from 'react-redux' +import { Dispatch, store } from '@/admin/logs-page/store' +import moment from 'moment/moment' +import ReactJson from 'react-json-view' + +type LogItemProps = { + log: ILog +} + +const OpenIcon: React.FC<{ + Icon: React.ComponentType> +}> = ({ Icon }) => { + return ( + + ) +} + +const LogItem: React.FC = ({ log }) => { + const dispatch = useDispatch() + const activeTabId = store.select.logs.getActiveTabId(store.getState()) + const openLogs = store.select.logs.getActiveOpenLogs(store.getState()) + + return ( + <> + { + dispatch.logs.toggleOpenLog({ + tabId: activeTabId, + logId: log.id, + }) + }} + > + +
{log.message}
+
+
+ {moment(log.timestamp, moment.ISO_8601).format( + 'DD.MM.YYYY HH:mm:ss', + )} +
+ +
+
+ {openLogs.includes(log.id) && ( +
+
+ {Object.values(SelectLogFieldEnum).map((field) => ( + { + dispatch.logs.setSelectInLog({ + tabId: activeTabId, + logId: log.id, + field, + }) + }} + > + {field} + + ))} +
+ + +
+ )} + + ) +} + +export default LogItem diff --git a/vite/src/admin/logs-page/components/Logs.tsx b/vite/src/admin/logs-page/components/Logs.tsx new file mode 100644 index 00000000..0adad61f --- /dev/null +++ b/vite/src/admin/logs-page/components/Logs.tsx @@ -0,0 +1,60 @@ +import { useDispatch, useSelector } from 'react-redux' +import { Dispatch, RootState } from '@/admin/logs-page/store' +import React from 'react' +import Tab from '@/admin/logs-page/components/Tab' +import TabContent from '@/admin/logs-page/components/TabContent' +import { ILogTab } from '@/types/WpLog' +import moment from 'moment' +import { twJoin } from 'tailwind-merge' + +const Logs: React.FC = () => { + const logsState = useSelector((state: RootState) => state.logs) + const dispatch = useDispatch() + + const getName = (tab: ILogTab, index: number): string => { + const fileName = tab.activeFile?.name + const fileCreated = tab.activeFile?.created + if (fileName && fileCreated) { + return `${fileName} (${moment(fileCreated, moment.ISO_8601).format('DD.MM.YYYY')})` + } + return fileName ?? (index + 1).toString() + } + + return ( + <> +
+ {logsState?.tabs.map((tab, index) => ( + dispatch.logs.setActiveTabId(tab.id)} + onDelete={() => { + dispatch.logs.deleteTab(tab.id) + }} + > + ))} + dispatch.logs.addTab()} + > +
+ +
+ {logsState?.tabs.map((tab, index) => ( + + ))} +
+ + ) +} + +export default Logs diff --git a/vite/src/admin/logs-page/components/LogsList.tsx b/vite/src/admin/logs-page/components/LogsList.tsx new file mode 100644 index 00000000..3c44b34f --- /dev/null +++ b/vite/src/admin/logs-page/components/LogsList.tsx @@ -0,0 +1,127 @@ +import { ILog } from '@/types/WpLog' +import React from 'react' +import ResetButton from '@/components/ResetButton' +import { __ } from '@wordpress/i18n' +import { + ChevronLeftIcon, + ChevronDoubleUpIcon, + ChevronDoubleDownIcon, + ArrowPathIcon, +} from '@heroicons/react/16/solid' +import { twJoin } from 'tailwind-merge' +import LogItem from '@/admin/logs-page/components/LogItem' +import { useDispatch, useSelector } from 'react-redux' +import { Dispatch, RootState, store } from '@/admin/logs-page/store' +import { twm } from '@/utils/twm' +import { getErrorMessage } from '@/utils/error' + +interface LogButtonProps { + className?: string + onClick?: () => void + Icon: React.ComponentType> + classNameIcon?: string + label: string +} + +const LogButton: React.FC = ({ + className, + onClick, + Icon, + classNameIcon, + label, +}) => ( + + + {label} + +) + +type LogsListProps = { + logs: ILog[] + onClose: () => void +} + +const LogsList: React.FC = ({ logs, onClose }) => { + const dispatch = useDispatch() + const activeTab = store.select.logs.getActiveTab(store.getState()) + + const { loading, error } = useSelector( + (rootState: RootState) => rootState.loading.effects.logs.fetchLogs, + ) + + return ( + <> +
+ onClose()} + /> + + dispatch.logs.setOpenLogs({ + tabId: activeTab.id, + logs: [], + }) + } + /> + + dispatch.logs.setOpenLogs({ + tabId: activeTab.id, + logs: activeTab.logs.map((log) => log.id), + }) + } + /> + + dispatch.logs.fetchLogs({ + tabId: activeTab.id, + activeFile: activeTab.activeFile, + }) + } + /> +
+
+ {loading && ( +
{__('Loading...', 'reepay-checkout-gateway')}
+ )} + {(error as Error) &&
{getErrorMessage(error)}
} + {!loading && + !error && + logs.map((log, index) => { + return ( + + ) + })} +
+ + ) +} + +export default LogsList diff --git a/vite/src/admin/logs-page/components/Tab.tsx b/vite/src/admin/logs-page/components/Tab.tsx new file mode 100644 index 00000000..468b32f8 --- /dev/null +++ b/vite/src/admin/logs-page/components/Tab.tsx @@ -0,0 +1,44 @@ +import React, { ButtonHTMLAttributes } from 'react' +import { XCircleIcon } from '@heroicons/react/16/solid' +import { twJoin } from 'tailwind-merge' + +type TabProps = ButtonHTMLAttributes & { + active: boolean + name: string + onDelete?: () => void +} + +const Tab: React.FC = ({ name, active, onDelete, ...props }) => { + return ( + <> + + + ) +} + +export default Tab diff --git a/vite/src/admin/logs-page/components/TabContent.tsx b/vite/src/admin/logs-page/components/TabContent.tsx new file mode 100644 index 00000000..23f2c9d3 --- /dev/null +++ b/vite/src/admin/logs-page/components/TabContent.tsx @@ -0,0 +1,48 @@ +import React, { useEffect } from 'react' +import { useDispatch } from 'react-redux' +import { Dispatch, store } from '@/admin/logs-page/store' +import FilesList from '@/admin/logs-page/components/FilesList' +import LogsList from '@/admin/logs-page/components/LogsList' +import { ILogTab } from '@/types/WpLog' + +type TabContentProps = { + tab: ILogTab +} + +const TabContent: React.FC = ({ tab }) => { + const dispatch = useDispatch() + const activeTab = store.select.logs.getActiveTab(store.getState()) + const activeFile = tab.activeFile + + useEffect(() => { + if (activeFile) { + dispatch.logs.fetchLogs({ tabId: tab.id, activeFile }) + } + }, [dispatch, tab.id, activeFile]) + + if (activeTab.id !== tab.id) return + + return ( + <> + {!activeFile && } + + {activeFile && ( + { + dispatch.logs.setLogs({ + tabId: tab.id, + logs: [], + }) + dispatch.logs.setActiveFile({ + tab, + file: undefined, + }) + }} + /> + )} + + ) +} + +export default TabContent diff --git a/vite/src/admin/logs-page/index.css b/vite/src/admin/logs-page/index.css new file mode 100644 index 00000000..bd6213e1 --- /dev/null +++ b/vite/src/admin/logs-page/index.css @@ -0,0 +1,3 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; \ No newline at end of file diff --git a/vite/src/admin/logs-page/main.tsx b/vite/src/admin/logs-page/main.tsx new file mode 100644 index 00000000..8899503e --- /dev/null +++ b/vite/src/admin/logs-page/main.tsx @@ -0,0 +1,15 @@ +import React from 'react' +import ReactDOM from 'react-dom/client' +import './index.css' +import App from './App' + +document.addEventListener('DOMContentLoaded', () => { + document.querySelectorAll('.billwerk-logs').forEach((el) => { + ReactDOM.createRoot(el!).render( + + + , + ) + }) +}) diff --git a/vite/src/admin/logs-page/store/index.ts b/vite/src/admin/logs-page/store/index.ts new file mode 100644 index 00000000..6ef890a4 --- /dev/null +++ b/vite/src/admin/logs-page/store/index.ts @@ -0,0 +1,22 @@ +import { init, RematchDispatch, RematchRootState } from '@rematch/core' +import immerPlugin from '@rematch/immer' +import loadingPlugin, { ExtraModelsFromLoading } from '@rematch/loading' +import updatedPlugin, { ExtraModelsFromUpdated } from '@rematch/updated' +import { models, RootModel } from '@/admin/logs-page/store/models' +import selectPlugin from '@rematch/select' + +type FullModel = ExtraModelsFromLoading & + ExtraModelsFromUpdated + +export const store = init({ + models, + plugins: [ + immerPlugin(), + loadingPlugin({ type: 'full' }), + updatedPlugin(), + selectPlugin(), + ], +}) +export type Store = typeof store +export type Dispatch = RematchDispatch +export type RootState = RematchRootState diff --git a/vite/src/admin/logs-page/store/models/LogsModel.ts b/vite/src/admin/logs-page/store/models/LogsModel.ts new file mode 100644 index 00000000..ed66a188 --- /dev/null +++ b/vite/src/admin/logs-page/store/models/LogsModel.ts @@ -0,0 +1,176 @@ +import { createModel } from '@rematch/core' +import { RootModel } from '.' +import { + IDefaultLog, + ILog, + ILogFile, + ILogTab, + SelectLogFieldEnum, +} from '@/types/WpLog' +import { v4 as uuidv4 } from 'uuid' +import { LogApi } from '@/api/wp/log' +import { reverse } from 'lodash' + +type LogsState = { + activeTabId: string | null + tabs: ILogTab[] +} + +export const logsModel = createModel()({ + state: { + activeTabId: null, + tabs: [ + { + id: uuidv4(), + filters: [], + logs: [], + files: [], + openLogs: [], + }, + ], + } as LogsState, + reducers: { + addTab(state) { + state.tabs = [ + ...state.tabs, + { + id: uuidv4(), + filters: [], + logs: [], + files: [], + openLogs: [], + }, + ] + }, + setActiveTabId(state, id: string) { + state.activeTabId = id + }, + setFiles( + state, + { tabId, files }: { tabId: string; files: ILogFile[] }, + ) { + const targetTab = state.tabs.find((item) => item.id === tabId) + if (targetTab) { + targetTab.files = files + } + }, + setLogs(state, { tabId, logs }: { tabId: string; logs: ILog[] }) { + const targetTab = state.tabs.find((item) => item.id === tabId) + if (targetTab) { + targetTab.logs = logs + } + }, + setReverseLogs( + state, + { tabId, logs }: { tabId: string; logs: IDefaultLog[] }, + ) { + const targetTab = state.tabs.find((item) => item.id === tabId) + if (!targetTab) return + + reverse(logs) + const currentLogsCount = targetTab.logs.length + + const newLogs = logs.map((log) => ({ id: uuidv4(), ...log })) + if (currentLogsCount > 0) { + targetTab.logs = [ + ...newLogs.slice(0, logs.length - currentLogsCount), + ...targetTab.logs, + ] + } else { + targetTab.logs = newLogs + } + }, + setActiveFile(state, { tab, file }: { tab: ILogTab; file?: ILogFile }) { + const targetTab = state.tabs.find((item) => item.id === tab.id) + if (targetTab) { + targetTab.activeFile = file + targetTab.openLogs = [] + } + }, + deleteTab(state, id: string) { + if (state.tabs.length === 1) return + + state.tabs = state.tabs.filter((tab) => tab.id !== id) + if (state.activeTabId === id) { + state.activeTabId = state.tabs[0].id + } + }, + setSelectInLog( + state, + { + tabId, + logId, + field, + }: { tabId: string; logId: string; field: SelectLogFieldEnum }, + ) { + const targetTab = state.tabs.find((item) => item.id === tabId) + if (targetTab) { + const targetLog = targetTab.logs.find( + (item) => item.id === logId, + ) + if (targetLog) { + targetLog.select = field + } + } + }, + setOpenLogs(state, { tabId, logs }: { tabId: string; logs: string[] }) { + const targetTab = state.tabs.find((item) => item.id === tabId) + if (targetTab) { + targetTab.openLogs = logs + } + }, + toggleOpenLog( + state, + { tabId, logId }: { tabId: string; logId: string }, + ) { + const targetTab = state.tabs.find((item) => item.id === tabId) + if (targetTab) { + targetTab.openLogs = + targetTab.openLogs.includes(logId) ? + targetTab.openLogs.filter((id) => id !== logId) + : [...targetTab.openLogs, logId] + } + }, + }, + selectors: (slice, createSelector) => ({ + getActiveTabId() { + return createSelector( + slice, + (state) => state.activeTabId || state.tabs[0].id, + ) + }, + getActiveTab() { + return createSelector( + slice, + (state) => + state.tabs.find((tab) => tab.id === state.activeTabId) || + state.tabs[0], + ) + }, + getActiveOpenLogs: () => + createSelector(slice, (state) => { + const activeTab = + state.tabs.find((tab) => tab.id === state.activeTabId) || + state.tabs[0] + return activeTab.openLogs + }), + }), + effects: (dispatch) => ({ + async fetchFiles({ tabId }: { tabId: string | null }) { + if (!tabId) return + const files = await LogApi.files() + dispatch.logs.setFiles({ tabId, files }) + }, + async fetchLogs({ + tabId, + activeFile, + }: { + tabId?: string + activeFile?: ILogFile + }) { + if (!activeFile || !tabId) return + const logs = await LogApi.logs(activeFile.url) + dispatch.logs.setReverseLogs({ tabId, logs }) + }, + }), +}) diff --git a/vite/src/admin/logs-page/store/models/index.ts b/vite/src/admin/logs-page/store/models/index.ts new file mode 100644 index 00000000..d710fbfe --- /dev/null +++ b/vite/src/admin/logs-page/store/models/index.ts @@ -0,0 +1,8 @@ +import { Models } from '@rematch/core' +import { logsModel } from '@/admin/logs-page/store/models/LogsModel' + +export interface RootModel extends Models { + logs: typeof logsModel +} + +export const models: RootModel = { logs: logsModel } diff --git a/vite/src/admin/meta-fields/App.css b/vite/src/admin/meta-fields/App.css deleted file mode 100644 index 4fa910cb..00000000 --- a/vite/src/admin/meta-fields/App.css +++ /dev/null @@ -1,7 +0,0 @@ -@tailwind base; -@tailwind components; -@tailwind utilities; - -#reepay_meta_fields > .inside { - @apply bw-mt-4; -} \ No newline at end of file diff --git a/vite/src/admin/meta-fields/App.tsx b/vite/src/admin/meta-fields/App.tsx index aa72a9b8..44432f7a 100644 --- a/vite/src/admin/meta-fields/App.tsx +++ b/vite/src/admin/meta-fields/App.tsx @@ -1,5 +1,4 @@ import React from 'react' -import './App.css' import { Provider, useDispatch } from 'react-redux' import { Dispatch, store } from '@/admin/meta-fields/store' import List from '@/admin/meta-fields/components/List' diff --git a/vite/src/admin/meta-fields/index.css b/vite/src/admin/meta-fields/index.css index bd6213e1..4fa910cb 100644 --- a/vite/src/admin/meta-fields/index.css +++ b/vite/src/admin/meta-fields/index.css @@ -1,3 +1,7 @@ @tailwind base; @tailwind components; -@tailwind utilities; \ No newline at end of file +@tailwind utilities; + +#reepay_meta_fields > .inside { + @apply bw-mt-4; +} \ No newline at end of file diff --git a/vite/src/api/wp/index.ts b/vite/src/api/wp/index.ts index f7acfcb9..fb215c82 100644 --- a/vite/src/api/wp/index.ts +++ b/vite/src/api/wp/index.ts @@ -1,10 +1,17 @@ import axios from 'axios' -export const DefaultConfig = { +export const ApiConfig = { baseURL: `/wp-json/`, headers: { 'X-WP-Nonce': window.BILLWERK_SETTINGS.nonce, }, } -export const WpApiInstance = axios.create(DefaultConfig) +export const DefaultConfig = { + headers: { + 'X-WP-Nonce': window.BILLWERK_SETTINGS.nonce, + }, +} + +export const WpApiInstance = axios.create(ApiConfig) +export const WpInstance = axios.create(DefaultConfig) diff --git a/vite/src/api/wp/log/index.ts b/vite/src/api/wp/log/index.ts new file mode 100644 index 00000000..34ba5f26 --- /dev/null +++ b/vite/src/api/wp/log/index.ts @@ -0,0 +1,24 @@ +import { WpApiInstance, WpInstance } from '@/api/wp' +import { PREFIX } from '@/const' +import { ILogFile, IDefaultLog } from '@/types/WpLog' +import { validationApiData } from '@/utils/api' +import moment from 'moment' + +const namespace = `${PREFIX}/v1` + +export const LogApi = { + async files(): Promise { + const { data } = await WpApiInstance.post( + `${namespace}/logs/`, + {}, + ) + return data + }, + async logs(logUrl: string): Promise { + const { data } = await WpInstance.get( + `${logUrl}?t=${moment().unix()}`, + ) + validationApiData(data) + return data + }, +} diff --git a/vite/src/components/ButtonLink.tsx b/vite/src/components/ButtonLink.tsx new file mode 100755 index 00000000..eefed879 --- /dev/null +++ b/vite/src/components/ButtonLink.tsx @@ -0,0 +1,23 @@ +import React, { HTMLProps, PropsWithChildren } from 'react' +import ResetButton from '@/components/ResetButton' +import { clsx } from 'clsx' + +const ButtonLink: React.FC>> = ({ + children, + className, + ...props +}) => { + return ( + + {children} + + ) +} + +export default ButtonLink diff --git a/vite/src/components/ResetButton.tsx b/vite/src/components/ResetButton.tsx new file mode 100755 index 00000000..773c910c --- /dev/null +++ b/vite/src/components/ResetButton.tsx @@ -0,0 +1,21 @@ +import React, { HTMLProps, PropsWithChildren } from 'react' +import { twm } from '@/utils/twm' + +const ResetButton: React.FC< + PropsWithChildren> +> = ({ children, className, ...props }) => { + return ( + + ) +} + +export default ResetButton diff --git a/vite/src/types/WpLog.ts b/vite/src/types/WpLog.ts new file mode 100644 index 00000000..202c3fcf --- /dev/null +++ b/vite/src/types/WpLog.ts @@ -0,0 +1,51 @@ +export enum LogLevel { + ERROR = 'ERROR', + INFO = 'INFO', + WARNING = 'WARNING', + NOTICE = 'NOTICE', + DEBUG = 'DEBUG', +} + +export enum SelectLogFieldEnum { + Context = 'context', + Backtrace = 'backtrace', +} + +export interface ILogBacktrace { + file: string + line: number + function: string + class?: string + type?: string + args?: string[] +} + +export interface IDefaultLog { + timestamp: string + level: LogLevel + message: string + backtrace: ILogBacktrace[] + context: object +} + +export interface ILog extends IDefaultLog { + select?: SelectLogFieldEnum + id: string +} + +export interface ILogFile { + name: string + url: string + created: string + modified: string + size: number +} + +export interface ILogTab { + id: string + filters: [] + activeFile?: ILogFile + files: ILogFile[] + logs: ILog[] + openLogs: string[] +} diff --git a/vite/src/utils/number.ts b/vite/src/utils/number.ts new file mode 100644 index 00000000..9f252302 --- /dev/null +++ b/vite/src/utils/number.ts @@ -0,0 +1 @@ +export const isEven = (num: number) => num % 2 === 0 diff --git a/vite/src/utils/twm.ts b/vite/src/utils/twm.ts new file mode 100644 index 00000000..76c07c57 --- /dev/null +++ b/vite/src/utils/twm.ts @@ -0,0 +1,7 @@ +import { ClassNameValue, extendTailwindMerge } from 'tailwind-merge' + +const twMerge = extendTailwindMerge({ prefix: 'bw-' }) + +export const twm = (...classLists: ClassNameValue[]): string => { + return twMerge(classLists) +} diff --git a/vite/tailwind.config.js b/vite/tailwind.config.js index d1f62a4e..394599c7 100644 --- a/vite/tailwind.config.js +++ b/vite/tailwind.config.js @@ -8,6 +8,9 @@ export default { boxShadow: { 'input-error': '0 0 0 1px #ef4444', }, + flex: { + '0-0-auto': '0 0 auto', + }, }, }, plugins: [], diff --git a/vite/vite.config.debug-page.ts b/vite/vite.config.debug-page.ts index 332bb1fc..2a305b84 100644 --- a/vite/vite.config.debug-page.ts +++ b/vite/vite.config.debug-page.ts @@ -1,14 +1,14 @@ import { defineConfig } from 'vite' import react from '@vitejs/plugin-react-swc' -import wpResolve from './plugins/rollup-plugin-wp-resolve' import { join } from 'path' import copy from 'rollup-plugin-copy' +import wpDependencyExtraction from 'rollup-plugin-wordpress-dependency-extraction' // https://vitejs.dev/config/ export default defineConfig({ plugins: [ react(), - wpResolve(), + wpDependencyExtraction(), copy({ targets: [{ src: 'public/*', dest: '../assets/dist/vite' }], }), diff --git a/vite/vite.config.logs.ts b/vite/vite.config.logs.ts new file mode 100644 index 00000000..09979531 --- /dev/null +++ b/vite/vite.config.logs.ts @@ -0,0 +1,38 @@ +import { defineConfig } from 'vite' +import react from '@vitejs/plugin-react-swc' +import { join } from 'path' +import copy from 'rollup-plugin-copy' +import wpDependencyExtraction from 'rollup-plugin-wordpress-dependency-extraction' + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [ + react(), + wpDependencyExtraction(), + copy({ + targets: [{ src: 'public/*', dest: '../assets/dist/vite' }], + }), + ], + build: { + manifest: true, + emptyOutDir: true, + copyPublicDir: false, + rollupOptions: { + input: { + 'meta-fields': 'src/admin/logs-page/main.tsx', + }, + output: { + dir: '../assets/dist/vite/logs-page', + format: 'iife', + }, + }, + }, + esbuild: { + minifyIdentifiers: false, + }, + resolve: { + alias: { + '@': join(__dirname, 'src'), + }, + }, +}) diff --git a/vite/vite.config.meta-fields.ts b/vite/vite.config.meta-fields.ts index dccfe79d..665b19ba 100644 --- a/vite/vite.config.meta-fields.ts +++ b/vite/vite.config.meta-fields.ts @@ -1,14 +1,14 @@ import { defineConfig } from 'vite' import react from '@vitejs/plugin-react-swc' -import wpResolve from './plugins/rollup-plugin-wp-resolve' import { join } from 'path' import copy from 'rollup-plugin-copy' +import wpDependencyExtraction from 'rollup-plugin-wordpress-dependency-extraction' // https://vitejs.dev/config/ export default defineConfig({ plugins: [ react(), - wpResolve(), + wpDependencyExtraction(), copy({ targets: [{ src: 'public/*', dest: '../assets/dist/vite' }], }),