From e020018008b0dbd33ba8530a5f33904c2086d1ae Mon Sep 17 00:00:00 2001
From: Yakir Sitbon
Date: Sun, 23 Jul 2023 13:38:23 +0300
Subject: [PATCH 001/290] Bump WP version
---
readme.txt | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/readme.txt b/readme.txt
index 523c5a37..1d8623f9 100644
--- a/readme.txt
+++ b/readme.txt
@@ -2,7 +2,7 @@
Contributors: pojo.me, KingYes, ariel.k, jzaltzberg, bainternet
Tags: Accessibility, A11y, Toolbar, Tools, wcag, accessible
Requires at least: 4.1
-Tested up to: 6.1
+Tested up to: 6.3
Requires PHP: 5.4
Stable tag: 2.1.0
License: GPLv2 or later
From ae23a192da6f90e66c6a66d6d847156678bd82ca Mon Sep 17 00:00:00 2001
From: Raz Ohad
Date: Tue, 5 Nov 2024 19:06:44 +0700
Subject: [PATCH 002/290] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20Initial=20Refactor?=
=?UTF-8?q?=20commit=20[APP-687]=20(#109)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* Initial refactor commit
* ✅ Added build and tests CI/CD
* PR Rejects
* Rejects leftover
---
.build-rsync-exclude | 33 +
.eslintignore | 10 +
.eslintrc | 52 ++
.github/checkstyle-problem-matcher.json | 23 +
.github/scripts/publish-to-wordpress-org.sh | 65 ++
.github/scripts/update-version-in-files.js | 65 ++
.github/scripts/validate-build-files.sh | 49 ++
.github/workflows/build.yml | 92 +++
.github/workflows/js-ci.yml | 45 ++
.github/workflows/php-coding-standards.yml | 55 ++
.github/workflows/phpunit.yml | 146 ++++
.gitignore | 8 +
.jshintrc | 16 -
.travis.yml | 35 -
Gruntfile.js | 297 --------
classes/database/database-constants.php | 73 ++
classes/database/entry.php | 386 ++++++++++
.../exceptions/missing-table-exception.php | 18 +
classes/database/table.php | 574 +++++++++++++++
classes/logger.php | 37 +
classes/module-base.php | 267 +++++++
classes/rest/route.php | 387 ++++++++++
classes/utils.php | 37 +
classes/utils/assets.php | 144 ++++
composer.json | 43 +-
includes/manager.php | 57 ++
includes/pojo-a11y-settings.php | 645 -----------------
.../legacy/assets}/css/style.css | 0
.../legacy/assets}/css/style.min.css | 0
.../legacy/assets}/js/app.dev.js | 0
.../legacy/assets}/js/app.min.js | 0
.../legacy/assets}/js/skip-link-focus-fix.js | 0
.../legacy/assets}/less/_background.less | 0
.../legacy/assets}/less/_high-contrast.less | 0
.../legacy/assets}/less/_mixing.less | 0
.../legacy/assets}/less/_toolbar.less | 0
.../legacy/assets}/less/_underline.less | 0
.../legacy/assets}/less/_visibility.less | 0
.../legacy/assets}/less/style.less | 0
.../legacy/components/admin.php | 24 +-
.../legacy/components/customizer.php | 308 ++++----
.../legacy/components/elementor.php | 11 +-
.../legacy/components/frontend.php | 112 +--
modules/legacy/components/settings.php | 671 ++++++++++++++++++
modules/legacy/module.php | 67 ++
package.json | 54 +-
phpunit.xml.dist | 43 ++
plugin.php | 111 +++
pojo-accessibility.php | 100 +--
ruleset.xml | 54 ++
tests/bootstrap.php | 54 +-
tests/phpunit/helpers/functions.php | 8 +
tests/phpunit/helpers/module-test-base.php | 77 ++
tests/phpunit/helpers/route-test.php | 31 +
tests/phpunit/helpers/test-base.php | 40 ++
.../plugin/modules/legacy/module-test.php | 20 +
tests/test-base.php | 13 -
webpack.config.js | 20 +
58 files changed, 4147 insertions(+), 1330 deletions(-)
create mode 100644 .build-rsync-exclude
create mode 100644 .eslintignore
create mode 100644 .eslintrc
create mode 100644 .github/checkstyle-problem-matcher.json
create mode 100644 .github/scripts/publish-to-wordpress-org.sh
create mode 100644 .github/scripts/update-version-in-files.js
create mode 100644 .github/scripts/validate-build-files.sh
create mode 100644 .github/workflows/build.yml
create mode 100644 .github/workflows/js-ci.yml
create mode 100644 .github/workflows/php-coding-standards.yml
create mode 100644 .github/workflows/phpunit.yml
delete mode 100755 .jshintrc
delete mode 100644 .travis.yml
delete mode 100644 Gruntfile.js
create mode 100644 classes/database/database-constants.php
create mode 100644 classes/database/entry.php
create mode 100644 classes/database/exceptions/missing-table-exception.php
create mode 100644 classes/database/table.php
create mode 100644 classes/logger.php
create mode 100644 classes/module-base.php
create mode 100644 classes/rest/route.php
create mode 100644 classes/utils.php
create mode 100644 classes/utils/assets.php
create mode 100644 includes/manager.php
delete mode 100644 includes/pojo-a11y-settings.php
rename {assets => modules/legacy/assets}/css/style.css (100%)
rename {assets => modules/legacy/assets}/css/style.min.css (100%)
rename {assets => modules/legacy/assets}/js/app.dev.js (100%)
rename {assets => modules/legacy/assets}/js/app.min.js (100%)
rename {assets => modules/legacy/assets}/js/skip-link-focus-fix.js (100%)
rename {assets => modules/legacy/assets}/less/_background.less (100%)
rename {assets => modules/legacy/assets}/less/_high-contrast.less (100%)
rename {assets => modules/legacy/assets}/less/_mixing.less (100%)
rename {assets => modules/legacy/assets}/less/_toolbar.less (100%)
rename {assets => modules/legacy/assets}/less/_underline.less (100%)
rename {assets => modules/legacy/assets}/less/_visibility.less (100%)
rename {assets => modules/legacy/assets}/less/style.less (100%)
rename includes/pojo-a11y-admin-ui.php => modules/legacy/components/admin.php (93%)
rename includes/pojo-a11y-customizer.php => modules/legacy/components/customizer.php (50%)
rename includes/pojo-a11y-elementor.php => modules/legacy/components/elementor.php (66%)
rename includes/pojo-a11y-frontend.php => modules/legacy/components/frontend.php (89%)
create mode 100644 modules/legacy/components/settings.php
create mode 100644 modules/legacy/module.php
create mode 100644 phpunit.xml.dist
create mode 100644 plugin.php
create mode 100644 ruleset.xml
mode change 100755 => 100644 tests/bootstrap.php
create mode 100644 tests/phpunit/helpers/functions.php
create mode 100644 tests/phpunit/helpers/module-test-base.php
create mode 100644 tests/phpunit/helpers/route-test.php
create mode 100644 tests/phpunit/helpers/test-base.php
create mode 100644 tests/phpunit/plugin/modules/legacy/module-test.php
delete mode 100755 tests/test-base.php
create mode 100644 webpack.config.js
diff --git a/.build-rsync-exclude b/.build-rsync-exclude
new file mode 100644
index 00000000..5a087443
--- /dev/null
+++ b/.build-rsync-exclude
@@ -0,0 +1,33 @@
+.bpg.json
+.babelrc
+ruleset.xml
+webpack.config.js
+phpunit.xml.dist
+.DS_Store
+node_modules/
+.git
+.gitignore
+.gitmodules
+.github/
+.editorconfig
+.gitattributes
+.eslintrc
+.eslintignore
+.phpcs.xml.dist
+.phpunit.xml.d
+coverage/
+assets/dev/
+.phpunit.result*
+bin/
+tests/
+package.json
+composer.json
+composer.lock
+package-lock.json
+jest.config.js
+
+.build-rsync-exclude
+one-click-accessibility/
+one-click-accessibility.zip
+.svn-assets/
+.husky/
diff --git a/.eslintignore b/.eslintignore
new file mode 100644
index 00000000..9184afc5
--- /dev/null
+++ b/.eslintignore
@@ -0,0 +1,10 @@
+assets/lib/**/*.js
+assets/js/*.js
+**/*.min.js
+**/node_modules/**
+**/vendor/**
+build/**
+libraries/**
+coverage/**
+assets/build/**
+tests/**
diff --git a/.eslintrc b/.eslintrc
new file mode 100644
index 00000000..bd2111c7
--- /dev/null
+++ b/.eslintrc
@@ -0,0 +1,52 @@
+{
+ "extends": [
+ "plugin:react/recommended",
+ "plugin:@wordpress/eslint-plugin/recommended-with-formatting",
+ "plugin:import/recommended",
+ "plugin:jsx-a11y/strict"
+ ],
+ "plugins": [
+ "babel",
+ "react"
+ ],
+ "env": {
+ "browser": true,
+ "node": true,
+ "es6": true,
+ "jquery": true
+ },
+ "globals": {
+ "jQuery": "writable"
+ },
+ "parserOptions": {
+ "ecmaVersion": 8,
+ "sourceType": "module",
+ "requireConfigFile": false
+ },
+ "rules": {
+ "no-console": "off",
+ "react-hooks/exhaustive-deps": "off",
+ "strict": [ "error", "global" ],
+ "curly": "warn",
+ "import/order": [
+ "error",
+ {
+ "groups": [
+ "builtin",
+ "external",
+ "internal",
+ "parent",
+ "sibling",
+ "index",
+ "object",
+ "type"
+ ],
+ "alphabetize": {
+ "order": "asc",
+ "caseInsensitive": false
+ }
+ }
+ ]
+ },
+ "parser": "@babel/eslint-parser"
+}
diff --git a/.github/checkstyle-problem-matcher.json b/.github/checkstyle-problem-matcher.json
new file mode 100644
index 00000000..5c6ce669
--- /dev/null
+++ b/.github/checkstyle-problem-matcher.json
@@ -0,0 +1,23 @@
+{
+ "problemMatcher": [
+ {
+ "owner": "phpcs",
+ "severity": "error",
+ "pattern": [
+ {
+ "regexp": "^$",
+ "file": 1
+ },
+ {
+ "regexp": "+)$",
+ "line": 1,
+ "column": 2,
+ "severity": 3,
+ "message": 4,
+ "code": 5,
+ "loop": true
+ }
+ ]
+ }
+ ]
+}
diff --git a/.github/scripts/publish-to-wordpress-org.sh b/.github/scripts/publish-to-wordpress-org.sh
new file mode 100644
index 00000000..dcbed84f
--- /dev/null
+++ b/.github/scripts/publish-to-wordpress-org.sh
@@ -0,0 +1,65 @@
+#!/bin/bash
+set -eo pipefail
+
+if [[ -z "$SVN_USERNAME" ]]; then
+ echo "Set the SVN_USERNAME secret"
+ exit 1
+fi
+
+if [[ -z "$SVN_PASSWORD" ]]; then
+ echo "Set the SVN_PASSWORD secret"
+ exit 1
+fi
+
+if [[ -z "$PLUGIN_VERSION" ]]; then
+ echo "Set the PLUGIN_VERSION env var"
+ exit 1
+fi
+
+if [[ -z "$PLUGIN_SLUG" ]]; then
+ echo "Set the PLUGIN_SLUG env var"
+ exit 1
+fi
+
+echo "Publish version: ${PLUGIN_VERSION}"
+
+PLUGIN_PATH="$GITHUB_WORKSPACE/${PLUGIN_SLUG}"
+SVN_PATH="$GITHUB_WORKSPACE/svn"
+
+cd $PLUGIN_PATH
+mkdir -p $SVN_PATH
+cd $SVN_PATH
+
+echo "Checkout from SVN"
+svn co https://plugins.svn.wordpress.org/${PLUGIN_SLUG}/trunk
+
+echo "Clean trunk folder"
+cd $SVN_PATH/trunk
+find . -maxdepth 1 -not -name ".svn" -not -name "." -not -name ".." -exec rm -rf {} +
+
+echo "Copy files"
+rsync -ah --progress $PLUGIN_PATH/* $SVN_PATH/trunk
+
+echo "Preparing files"
+cd $SVN_PATH/trunk
+
+echo "svn delete"
+svn status | grep -v '^.[ \t]*\\..*' | { grep '^!' || true; } | awk '{print $2}' | xargs -r svn delete;
+
+echo "svn add"
+svn status | grep -v '^.[ \t]*\\..*' | { grep '^?' || true; } | awk '{print $2}' | xargs -r svn add;
+
+svn status
+
+echo "Commit files to trunk"
+svn ci -m "Upload v${PLUGIN_VERSION}" --no-auth-cache --non-interactive --username "$SVN_USERNAME" --password "$SVN_PASSWORD"
+
+echo "Copy files from trunk to tag ${PLUGIN_VERSION}"
+svn cp https://plugins.svn.wordpress.org/${PLUGIN_SLUG}/trunk https://plugins.svn.wordpress.org/${PLUGIN_SLUG}/tags/${PLUGIN_VERSION} --message "Tagged ${PLUGIN_VERSION}" --no-auth-cache --non-interactive --username "$SVN_USERNAME" --password "$SVN_PASSWORD"
+svn update
+
+echo "Remove the SVN folder from the workspace (for multiple releases in the same Action)"
+#rm -rf $SVN_PATH
+
+echo "Back to the workspace root"
+cd $GITHUB_WORKSPACE
diff --git a/.github/scripts/update-version-in-files.js b/.github/scripts/update-version-in-files.js
new file mode 100644
index 00000000..4d816d74
--- /dev/null
+++ b/.github/scripts/update-version-in-files.js
@@ -0,0 +1,65 @@
+'use strict';
+
+const fs = require( "fs" );
+const MAIN_FILE_NAME = 'pojo-accessibility.php';
+const VERSION_CONSTANT = 'EA11Y_VERSION';
+
+const { VERSION } = process.env;
+ if ( ! VERSION ) {
+ throw new Error( 'VERSION is not defined in the environment variables.' );
+}
+
+async function replaceInFileWithArray( filePath, replacementArray ) {
+ try {
+ let content = fs.readFileSync( filePath, { encoding: 'utf8' } );
+
+ for ( const replacement of replacementArray ) {
+ console.log( `Replacing ${ replacement.from } with ${ replacement.to } in ${ filePath }` );
+ content = content.replace( replacement.from, replacement.to );
+ }
+ console.log( content );
+ //fs.writeFileSync( filePath, content, { encoding: 'utf8' } );
+ console.log( `All replacements in ${ filePath } were successful.`);
+ } catch (error) {
+ console.error( `An error occurred in ${ filePath }:`, error );
+ }
+}
+
+const run = async () => {
+ try {
+ // update stable tag in readme.txt
+ await replaceInFileWithArray( './readme.txt',
+ [
+ {
+ from: /Stable tag: (.*)/m,
+ to: `Stable tag: ${ VERSION }`,
+ },
+ {
+ from: /= NEXT_VERSION =/m,
+ to: `= ${ VERSION } =`,
+ },
+ ]
+ );
+
+ // update version in MAIN_FILE_NAME
+ await replaceInFileWithArray( `./${MAIN_FILE_NAME}`,
+ [
+ {
+ from: /\* Version: (.*)/m,
+ to: `* Version: ${ VERSION }`,
+ },
+ {
+ from: new RegExp(`define\\( '${VERSION_CONSTANT}', '(.*)' \\);`, 'm' ),
+ to: `define( '${VERSION_CONSTANT}', '${VERSION}' );`,
+ }
+ ]
+ );
+
+ } catch ( err ) {
+ // eslint-disable-next-line no-console
+ console.error( 'Error occurred:', err );
+ process.exit( 1 );
+ }
+};
+
+run();
diff --git a/.github/scripts/validate-build-files.sh b/.github/scripts/validate-build-files.sh
new file mode 100644
index 00000000..31fb621e
--- /dev/null
+++ b/.github/scripts/validate-build-files.sh
@@ -0,0 +1,49 @@
+#!/bin/bash
+set -eo pipefail
+
+if [[ -z "$PLUGIN_SLUG" ]]; then
+ echo "Set the PLUGIN_SLUG env var"
+ exit 1
+fi
+
+if [[ -z "$PLUGIN_VERSION" ]]; then
+ echo "Set the PLUGIN_VERSION env var"
+ exit 1
+fi
+
+PLUGIN_PATH="$GITHUB_WORKSPACE/${PLUGIN_SLUG}"
+
+cd $PLUGIN_PATH
+
+PLUGIN_MAIN_FILE="${PLUGIN_SLUG}.php"
+
+if [ ! -f "${PLUGIN_MAIN_FILE}" ]; then
+ echo "${PLUGIN_MAIN_FILE} file does not exist"
+ exit 1
+fi
+
+if [ ! -f "readme.txt" ]; then
+ echo "readme.txt file does not exist"
+ exit 1
+fi
+
+if [[ $(grep -c "Version: $PLUGIN_VERSION" "$PLUGIN_MAIN_FILE") -eq 0 ]]; then
+ echo "${PLUGIN_MAIN_FILE} file does not contain the correct build version : $PLUGIN_VERSION"
+ EXISTING_VERSION=$(sed -n 's/.*Version: \(.*\)/\1/p' "$PLUGIN_MAIN_FILE")
+ echo "Existing version: $EXISTING_VERSION"
+ exit 1
+fi
+
+if [[ $(grep -c "Stable tag: $PLUGIN_VERSION" "readme.txt") -eq 0 ]]; then
+ echo "readme.txt file does not contain the correct stable tag version : $PLUGIN_VERSION"
+ EXISTING_VERSION=$(sed -n 's/.*Stable tag: \(.*\)/\1/p' "readme.txt")
+ echo "Existing version: $EXISTING_VERSION"
+ exit 1
+fi
+
+echo "validate-build-files Details:"
+echo "---"
+echo "SVN Tag name: $PLUGIN_VERSION"
+echo "Package Version: $PACKAGE_VERSION"
+echo "Trunk Files:"
+ls -la
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
new file mode 100644
index 00000000..bfe9bf8f
--- /dev/null
+++ b/.github/workflows/build.yml
@@ -0,0 +1,92 @@
+name: Build
+on:
+ pull_request:
+ workflow_call:
+ workflow_dispatch:
+ inputs:
+ push_to_slack:
+ description: 'Push to Slack'
+ type: boolean
+ required: true
+ default: 'false'
+
+concurrency:
+ cancel-in-progress: true
+ group: ${{ github.workflow }}-${{ github.ref }}
+
+permissions:
+ contents: read
+
+jobs:
+ build:
+ name: Build
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v4
+
+ - name: Set up PHP
+ uses: shivammathur/setup-php@a36e1e52ff4a1c9e9c9be31551ee4712a6cb6bd0 # 2.27.1
+ with:
+ php-version: '7.4'
+ env:
+ fail-fast: 'true'
+
+ - name: OAuth Composer Authentication
+ run:
+ composer config -g github-oauth.github.com ${{ secrets.DEVOPS_TOKEN }}
+
+ - name: Install Composer dependencies cache
+ uses: ramsey/composer-install@v2
+
+ - name: Install Composer dependencies
+ run:
+ composer install --no-dev
+
+ - name: Get current date
+ id: date
+ run: echo "::set-output name=date::$(date +'%Y-%m-%d')"
+
+ - name: "Debug info: show tooling versions"
+ continue-on-error: true
+ run: |
+ set +e
+ echo "Start debug Info"
+ echo "Date: ${{ steps.date.outputs.date }}"
+ echo "PHP Version: $(php -v)"
+ echo "Composer Version: $(composer --version)"
+ echo "Node Version: $(node --version)"
+ echo "NPM Version: $(npm --version)"
+ echo "GIT Version: $(git --version)"
+ echo "The github context is:"
+ echo "${{ toJson(github) }}"
+ echo "End debug Info"
+ echo "exitcode=$?" >> $GITHUB_OUTPUT
+
+ - name: Install dependencies
+ run: npm ci
+
+ - name: Build
+ run: npm run build
+
+ - name: Build Plugin
+ run: |
+ rsync -av --exclude-from=.build-rsync-exclude . one-click-accessibility
+ zip -r one-click-accessibility.zip one-click-accessibility
+
+ - name: Archive
+ uses: actions/upload-artifact@v4
+ with:
+ name: one-click-accessibility
+ path: one-click-accessibility.zip
+ retention-days: 14
+
+ - name: Push to Slack on PR merge
+ if: ${{ github.event.pull_request.merged == true }}
+ run: |
+ curl -F file=@one-click-accessibility.zip -F "initial_comment=One Click Accessibility - A new PR has been pushed to the master branch by ${{ github.actor }}." title="${{ github.event.pull_request.title }}" -F channels=C07LFCFNGDB -H "Authorization: Bearer ${{ secrets.CLOUD_SLACK_BOT_TOKEN }}" https://slack.com/api/files.upload
+
+ - name: Push to Slack on Manual Trigger
+ if: ${{ github.event.inputs.push_to_slack == 'true' }}
+ run: |
+ curl -F file=@one-click-accessibility.zip -F "initial_comment=One Click Accessibility - A new build was triggered by ${{ github.actor }}." title="Manuall ${{ steps.date.outputs.date }}" -F channels=C07LFCFNGDB -H "Authorization: Bearer ${{ secrets.CLOUD_SLACK_BOT_TOKEN }}" https://slack.com/api/files.upload
diff --git a/.github/workflows/js-ci.yml b/.github/workflows/js-ci.yml
new file mode 100644
index 00000000..efcf141b
--- /dev/null
+++ b/.github/workflows/js-ci.yml
@@ -0,0 +1,45 @@
+name: NPM CI
+
+on:
+ push:
+ branches:
+ - main
+ pull_request:
+ workflow_dispatch:
+
+concurrency:
+ cancel-in-progress: true
+ group: ${{ github.workflow }}-${{ github.ref }}
+
+env:
+ token: ${{ secrets.CLOUD_DEVOPS_TOKEN }}
+
+jobs:
+ build:
+ runs-on: ubuntu-latest
+
+ strategy:
+ matrix:
+ node-version: [18.x]
+
+ steps:
+ - uses: actions/checkout@v2
+
+ - name: Use Node.js ${{ matrix.node-version }}
+ uses: actions/setup-node@v2
+ with:
+ node-version: ${{ matrix.node-version }}
+ cache: 'npm'
+ cache-dependency-path: package-lock.json
+
+ - name: Install Dependencies
+ run: npm ci
+
+ - name: Build
+ run: npm run build
+
+ - name: Lint
+ run: npm run lint:js
+
+# - name: Test
+# run: npm run test
diff --git a/.github/workflows/php-coding-standards.yml b/.github/workflows/php-coding-standards.yml
new file mode 100644
index 00000000..26a91dc4
--- /dev/null
+++ b/.github/workflows/php-coding-standards.yml
@@ -0,0 +1,55 @@
+name: PHP Lint
+
+on:
+ push:
+ branches:
+ - main
+ pull_request:
+ workflow_dispatch:
+
+concurrency:
+ cancel-in-progress: true
+ group: ${{ github.workflow }}-${{ github.ref }}
+
+permissions:
+ contents: read
+
+jobs:
+ PHP-Code-Standards:
+ name: Lint PHP files
+ runs-on: ubuntu-latest
+ if: "!contains(github.event.head_commit.message, '[skip PHPCS]') || !contains(github.event.head_commit.message, '[skip CI]')"
+ steps:
+ - name: Check out source code
+ uses: actions/checkout@v4
+
+ - name: Set up PHP
+ uses: shivammathur/setup-php@a36e1e52ff4a1c9e9c9be31551ee4712a6cb6bd0 # 2.27.1
+ with:
+ php-version: '7.4'
+ coverage: none
+ tools: composer, cs2pr, phpcs
+ env:
+ fail-fast: 'true'
+
+ - name: Log debug information
+ run: |
+ export PATH=$HOME/.composer/vendor/bin:$PATH
+ php --version
+ phpcs -i
+ composer --version
+
+ - name: Oauth Composer authentication
+ run: composer config -g github-oauth.github.com ${{ secrets.DEVOPS_TOKEN }}
+
+ - name: Install dependencies
+ uses: ramsey/composer-install@83af392bf5f031813d25e6fe4cd626cdba9a2df6 # 2.2.0
+
+ - name: Add error matcher
+ run: echo "::add-matcher::$(pwd)/.github/checkstyle-problem-matcher.json"
+
+ - name: Run style check
+ run: |
+ export PATH=$HOME/.composer/vendor/bin:$PATH
+ composer run lint -- --report=checkstyle
+
diff --git a/.github/workflows/phpunit.yml b/.github/workflows/phpunit.yml
new file mode 100644
index 00000000..2f9665c7
--- /dev/null
+++ b/.github/workflows/phpunit.yml
@@ -0,0 +1,146 @@
+name: PHPUnit
+
+on:
+ push:
+ branches:
+ - main
+ pull_request:
+ workflow_dispatch:
+
+concurrency:
+ cancel-in-progress: true
+ group: ${{ github.workflow }}-${{ github.ref }}
+
+permissions:
+ contents: read
+
+jobs:
+ unit-tests:
+ name: "WP ${{ matrix.wp }}, multisite: ${{ matrix.ms }}, PHP: ${{ matrix.php }}"
+ if: "!contains(github.event.head_commit.message, '[ci skip]')"
+ runs-on: ubuntu-latest
+ strategy:
+ fail-fast: false
+ matrix:
+ php: [7.4, 8.0, 8.1, 8.2]
+ wp: [6.4.x, latest, nightly]
+ ms: [no, yes]
+ coverage: [no]
+ phpunit: [9]
+ include:
+ # PHP 7.4 is not supported by PHPUnit 9
+ - phpunit: 7
+ php: 7.4
+ # add coverage job
+ - coverage: yes
+ php: 8.0
+ wp: latest
+ ms: no
+ phpunit: 9
+
+ services:
+ mysql:
+ image: mariadb:latest
+ ports:
+ - "3306:3306"
+ env:
+ MYSQL_ROOT_PASSWORD: wordpress
+ MARIADB_INITDB_SKIP_TZINFO: 1
+ MYSQL_USER: wordpress
+ MYSQL_PASSWORD: wordpress
+ MYSQL_DATABASE: wordpress_test
+ steps:
+ - name: Checkout repository
+ uses: actions/checkout@v2
+
+ - name: Matrix variables
+ id: matrix
+ run: |
+ echo "::group::Matrix variables"
+ echo "PHP version = ${{ matrix.php }}"
+ echo "WordPress = ${{ matrix.wp }}"
+ echo "Multisite = ${{ matrix.ms }}"
+ echo "Coverage = ${{ matrix.coverage }}"
+ echo "PHPUnit = ${{ matrix.phpunit }}"
+ echo "::endgroup::"
+
+ - name: Decide whether to enable coverage
+ id: coverage
+ run: |
+ if [ "${{ matrix.coverage }}" = "yes" ]; then
+ echo "coverage=pcov" >> $GITHUB_OUTPUT
+ echo 'ini=pcov.directory=inc, pcov.exclude="~/(vendor|tests|node_modules)/~"'
+ else
+ echo "coverage=none" >> $GITHUB_OUTPUT
+ echo "ini=opcache.enable_cli=1, opcache.jit=tracing, opcache.jit_buffer_size=64M" >> $GITHUB_OUTPUT
+ fi
+
+ - name: Set up PHP
+ uses: shivammathur/setup-php@a36e1e52ff4a1c9e9c9be31551ee4712a6cb6bd0 # 2.27.1
+ with:
+ coverage: ${{ steps.coverage.outputs.coverage }}
+ ini-values: ${{ steps.coverage.outputs.ini }}
+ php-version: ${{ matrix.php }}
+ env:
+ fail-fast: 'true'
+
+ - name: Install PHPUnit
+ run: |
+ wget -q -O /usr/local/bin/phpunit "https://phar.phpunit.de/phpunit-${{ matrix.phpunit }}.phar"
+ chmod +x /usr/local/bin/phpunit
+
+ - name: Oauth Composer authentication
+ run:
+ composer config -g github-oauth.github.com ${{ secrets.DEVOPS_TOKEN }}
+
+ - name: Install dependencies
+ uses: ramsey/composer-install@83af392bf5f031813d25e6fe4cd626cdba9a2df6 # 2.2.0
+
+ #- name: Install Node.js
+ # uses: actions/setup-node@v2
+ # with:
+ # node-version: 18.x
+
+ #- name: Install dependencies
+ # run: npm ci
+
+ #- name: Build assets
+ # run: npm run build
+
+ - name: Set up WordPress and WordPress Test Library
+ uses: sjinks/setup-wordpress-test-library@dd7f8144e892b042e034d713b734f7a19446abe1 # 2.0.1
+ with:
+ version: ${{ matrix.wp }}
+
+ - name: Set up multisite mode
+ run: echo "WP_MULTISITE=1" >> $GITHUB_ENV
+ if: matrix.ms == 'yes'
+
+ - name: Update wp-test-config.php
+ run: |
+ if php -r 'exit(PHP_VERSION_ID < 80100);'; then
+ echo "Disabling WP_DEBUG in wp-test-config.php"
+ sed -i "s@define( 'WP_DEBUG', true );@// define( 'WP_DEBUG', true );@" /tmp/wordpress-tests-lib/wp-tests-config.php
+ fi
+
+ - name: Verify MariaDB connection
+ run: |
+ while ! mysqladmin ping -h 127.0.0.1 -P ${{ job.services.mysql.ports[3306] }} --silent; do
+ sleep 1
+ done
+ timeout-minutes: 1
+
+ - name: Run tests
+ run: |
+ OPTIONS=
+ if [ "${{ steps.coverage.outputs.coverage }}" != 'none' ]; then
+ OPTIONS="$OPTIONS --coverage-clover=clover.xml"
+ fi
+ phpunit --order-by=random ${OPTIONS}
+
+ - name: Upload coverage report
+ uses: codecov/codecov-action@eaaf4bedf32dbdc6b720b63067d99c4d77d6047d # v3.1.4
+ with:
+ files: clover.xml
+ flags: unittests
+ if: ${{ steps.coverage.outputs.coverage != 'none' }}
diff --git a/.gitignore b/.gitignore
index 26b1f11f..4d1728c0 100644
--- a/.gitignore
+++ b/.gitignore
@@ -8,3 +8,11 @@ composer.lock
npm-debug.log
.DS_Store
package-lock.json
+bin/.env
+*/node_modules
+!assets/dev/*
+assets/js/
+coverage/
+.phpunit.result.cache
+.editorconfig
+.vscode
diff --git a/.jshintrc b/.jshintrc
deleted file mode 100755
index 1164285c..00000000
--- a/.jshintrc
+++ /dev/null
@@ -1,16 +0,0 @@
-{
- "bitwise": true,
- "browser": true,
- "curly": true,
- "eqeqeq": true,
- "eqnull": true,
- "esnext": true,
- "immed": true,
- "jquery": true,
- "latedef": true,
- "newcap": true,
- "noarg": true,
- "node": true,
- "strict": false,
- "trailing": true
-}
\ No newline at end of file
diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644
index 5ab28c59..00000000
--- a/.travis.yml
+++ /dev/null
@@ -1,35 +0,0 @@
-# Travis CI Configuration File
-
-sudo: false
-
-# Tell Travis CI we're using PHP
-language: php
-
-# PHP version used in first build configuration.
-php:
- - 5.3
- - 5.4
- - 5.5
- - 5.6
- - 7.0
-
-# WordPress version used in first build configuration.
-env:
- - WP_VERSION=latest WP_MULTISITE=0
- - WP_VERSION=latest WP_MULTISITE=1
- - WP_VERSION=4.0 WP_MULTISITE=0
- - WP_VERSION=4.0 WP_MULTISITE=1
- - WP_VERSION=4.1 WP_MULTISITE=0
- - WP_VERSION=4.1 WP_MULTISITE=1
- - WP_VERSION=4.2 WP_MULTISITE=0
- - WP_VERSION=4.2 WP_MULTISITE=1
- - WP_VERSION=4.3 WP_MULTISITE=0
- - WP_VERSION=4.3 WP_MULTISITE=1
-
-before_script:
- - bash bin/install-wp-tests.sh wordpress_test root '' localhost $WP_VERSION
-
-after_success:
- - bash <(curl -s https://codecov.io/bash)
-
-script: phpunit --coverage-clover=coverage.xml
\ No newline at end of file
diff --git a/Gruntfile.js b/Gruntfile.js
deleted file mode 100644
index 6f76dcaf..00000000
--- a/Gruntfile.js
+++ /dev/null
@@ -1,297 +0,0 @@
-/**
- * Pojo Makefile
- */
-'use strict';
-
-module.exports = function( grunt ) {
-
- require( 'matchdep' ).filterDev( 'grunt-*' ).forEach( grunt.loadNpmTasks );
-
- // Project configuration.
- grunt.initConfig( {
- pkg: grunt.file.readJSON( 'package.json' ),
-
- banner: '/*! <%= pkg.name %> - v<%= pkg.version %> - ' +
- '<%= grunt.template.today("dd-mm-yyyy") %> */',
-
- checktextdomain: {
- standard: {
- options:{
- text_domain: 'pojo-accessibility',
- correct_domain: true,
- keywords: [
- // WordPress keywords
- '__:1,2d',
- '_e:1,2d',
- '_x:1,2c,3d',
- 'esc_html__:1,2d',
- 'esc_html_e:1,2d',
- 'esc_html_x:1,2c,3d',
- 'esc_attr__:1,2d',
- 'esc_attr_e:1,2d',
- 'esc_attr_x:1,2c,3d',
- '_ex:1,2c,3d',
- '_n:1,2,4d',
- '_nx:1,2,4c,5d',
- '_n_noop:1,2,3d',
- '_nx_noop:1,2,3c,4d'
- ]
- },
- files: [ {
- src: [
- '**/*.php',
- '!node_modules/**',
- '!build/**',
- '!tests/**',
- '!vendor/**',
- '!*~'
- ],
- expand: true
- } ]
- }
- },
-
- usebanner: {
- dist: {
- options: {
- banner: '<%= banner %>'
- },
- files: {
- src: [
- 'assets/js/app.min.js',
- 'assets/css/style.css',
- 'assets/css/style.min.css'
- ]
- }
- }
- },
-
- jshint: {
- options: {
- jshintrc: '.jshintrc'
- },
- all: [
- 'Gruntfile.js',
- 'assets/js/skip-link-focus-fix.js',
- 'assets/js/app.dev.js'
- ]
- },
-
- uglify: {
- options: {},
- dist: {
- files: {
- 'assets/js/app.min.js': [
- 'assets/js/skip-link-focus-fix.js',
- 'assets/js/app.dev.js'
- ]
- }
- }
- },
-
- less: {
- dist: {
- options: {
- //cleancss: true
- },
- files: {
- 'assets/css/style.css': 'assets/less/style.less'
- }
- },
-
- mincss: {
- options: {
- compress: true
- },
- files: {
- 'assets/css/style.min.css': 'assets/less/style.less'
- }
- }
- },
-
- watch: {
- js: {
- files: [
- '**/*.js',
- '!**/*.min.js'
- ],
- tasks: [
- 'scripts'
- ],
- options: {}
- },
-
- less: {
-
- files: [
- '**/*.less'
- ],
- tasks: [
- 'styles'
- ],
- options: {}
- }
- },
-
- bumpup: {
- options: {
- updateProps: {
- pkg: 'package.json'
- }
- },
- file: 'package.json'
- },
-
- replace: {
- plugin_main: {
- src: [ 'pojo-accessibility.php' ],
- overwrite: true,
- replacements: [
- {
- from: /Version: \d{1,1}\.\d{1,2}\.\d{1,2}/g,
- to: 'Version: <%= pkg.version %>'
- }
- ]
- },
-
- readme: {
- src: [ 'readme.txt' ],
- overwrite: true,
- replacements: [
- {
- from: /Stable tag: \d{1,1}\.\d{1,2}\.\d{1,2}/g,
- to: 'Stable tag: <%= pkg.version %>'
- }
- ]
- }
- },
-
- shell: {
- git_add_all : {
- command: [
- 'git add --all',
- 'git commit -m "Bump to <%= pkg.version %>"'
- ].join( '&&' )
- }
- },
-
- release: {
- options: {
- bump: false,
- npm: false,
- commit: false,
- tagName: 'v<%= version %>',
- commitMessage: 'released v<%= version %>',
- tagMessage: 'Tagged as v<%= version %>'
- }
- },
-
- wp_readme_to_markdown: {
- github: {
- options: {
- screenshot_url: 'assets/{screenshot}.png',
- wordpressPluginSlug: 'pojo-accessibility',
- travisUrlRepo: 'https://travis-ci.org/pojome/one-click-accessibility',
- gruntDependencyStatusUrl: 'https://david-dm.org/pojome/pojo-accessibility'
- },
- files: {
- 'README.md': 'readme.txt'
- }
- }
- },
-
- copy: {
- main: {
- src: [
- '**',
- '!node_modules/**',
- '!build/**',
- '!bin/**',
- '!.git/**',
- '!tests/**',
- '!.travis.yml',
- '!.jshintrc',
- '!README.md',
- '!phpunit.xml',
- '!vendor/**',
- '!Gruntfile.js',
- '!package.json',
- '!package-lock.json',
- '!npm-debug.log',
- '!composer.json',
- '!composer.lock',
- '!assets/less/**',
- '!wp-assets/**',
- '!.gitignore',
- '!.gitmodules',
- '!*~'
- ],
- expand: true,
- dest: 'build/'
- }
- },
-
- clean: {
- //Clean up build folder
- main: [
- 'build'
- ]
- },
-
- wp_deploy: {
- deploy:{
- options: {
- plugin_slug: '<%= pkg.slug %>',
- svn_user: 'KingYes',
- build_dir: 'build/',
- assets_dir: 'wp-assets/'
- }
- }
- },
-
- phpunit: {
- classes: {
- dir: ''
- },
- options: {
- bin: 'phpunit',
- bootstrap: 'tests/bootstrap.php',
- colors: true
- }
- }
-
- } );
-
- // Default task(s).
- grunt.registerTask( 'default', [
- 'checktextdomain',
- 'scripts',
- 'styles',
- 'usebanner',
- 'wp_readme_to_markdown',
- //'phpunit'
- ] );
-
- grunt.registerTask( 'build', [
- 'default',
- 'clean',
- 'copy'
- ] );
-
- grunt.registerTask( 'scripts', [
- 'jshint',
- 'uglify'
- ] );
-
- grunt.registerTask( 'styles', [
- 'less'
- ] );
-
- grunt.registerTask( 'publish', [
- 'default',
- 'bumpup',
- 'replace',
- 'shell:git_add_all',
- 'release'
- ] );
-};
diff --git a/classes/database/database-constants.php b/classes/database/database-constants.php
new file mode 100644
index 00000000..1af5f37f
--- /dev/null
+++ b/classes/database/database-constants.php
@@ -0,0 +1,73 @@
+ value entries for direct comparison
+ * joined with the AND logical operator, or in the format of column => [column =>
+ * string, value =>string|int|array, comparison operator => string,
+ * relation_before=>string, optional, relation_after=>string, optional].
+ *
+ * @return Entry Returns the entry with the data found.
+ */
+ private function init_by( string $by, $value ): Entry {
+ $data = static::get_by( $by, $value );
+
+ return $this->init_by_data( $data );
+ }
+
+ /**
+ * get_by
+ *
+ * Returns the first row in the table that satisfies the conditions set by the parameters.
+ *
+ * @param string $by The name of the field to compare the value parameter to in case the
+ * /value/ parameter is a string.
+ * Optional.
+ * Defaults to an empty string.
+ * @param array|string $value If a string, the value to compare against the column specified
+ * by the /by/ parameter.
+ * If an array, can be either a list of column => value entries for direct comparison
+ * joined with the AND logical operator, or in the format of column => [column =>
+ * string, value =>string|int|array, comparison operator => string,
+ * relation_before=>string, optional, relation_after=>string, optional]. Optional.
+ * Defaults to an empty string.
+ *
+ * @return mixed|\stdClass|null An object representing the row or NULL in case of an error.
+ */
+ protected function get_by( string $by = '', $value = '' ) {
+ $fields = '*';
+ $where = is_array( $value ) ? $value : [ $by => $value ];
+
+ return $this->db_table::first( $fields, $where );
+ }
+
+ /**
+ * init_by_data
+ *
+ * Returns an Entry object with its data set to the data passed by the /data/ parameter.
+ *
+ * @param array|object $data The data to set the entry with.
+ *
+ * @return $this Returns an entry loaded with the data passes in the parameter, or en Empty entry (representing
+ * null) on error
+ */
+ protected function init_by_data( $data ): Entry {
+ if ( ! $data || is_wp_error( $data ) ) {
+ return $this->return_empty();
+ }
+
+ return $this->set_data( $data );
+ }
+
+ /**
+ * return_empty
+ *
+ * Returns an empty entry project, representing an empty set/null.
+ *
+ * NOTE: An empty entry cannot be saved in the database unless you either unset the
+ * /id/ field or set it for a valid value for an update.
+ *
+ * @return Entry Returns the object back
+ */
+ private function return_empty(): Entry {
+ $this->set_data( [] );
+
+ return $this->set( 'id', 0 );
+ }
+
+ /**
+ * set_data
+ *
+ * Sets the data of this entry object
+ *
+ * @param array|object $data The data to set in the current object in the format of key => value
+ *
+ * @return $this Returns the object back
+ */
+ public function set_data( $data ): Entry {
+ $this->entry_data = (array) $data;
+
+ return $this;
+ }
+
+ /**
+ * init_by_id
+ *
+ * Loads the Entry with data from the database fetched by the /id/ column compared to the value passed with the
+ * /id/ parameter.
+ *
+ * @param string $id The value of the /id/ field
+ *
+ * @return $this The Entry loaded with the data gotten from the database by the specified ID.
+ */
+ protected function init_by_id( $id ): Entry {
+ $data = static::get_by( 'id', $id );
+
+ return $this->init_by_data( $data );
+ }
+
+ /**
+ * __get
+ * magic get properties
+ *
+ * Returns an Entry's data field by key name
+ *
+ * @param string $name The name of the field to return
+ *
+ * @return mixed|null The value of the field or null if it doesn't exist'
+ */
+ public function __get( $name ) {
+ return $this->entry_data[ $name ] ?? null;
+ }
+
+ /**
+ * __set
+ * magic set properties
+ *
+ * Sets an Entry's data field value by the specified key
+ *
+ * @param string $name The key of the field being set
+ * @param mixed $value The new value for the field
+ *
+ * @return $this Returns the current object back
+ */
+ public function __set( string $name, $value ) {
+ return $this->set( $name, $value );
+ }
+
+ /**
+ * set
+ *
+ * Sets and entry data field value by the specified key
+ *
+ * @param string $name The key of the field being set
+ * @param mixed $value The new value for the field
+ *
+ * @return $this Returns the current object back
+ */
+ public function set( string $name, $value ): Entry {
+ $this->entry_data[ $name ] = $value;
+
+ return $this;
+ }
+
+ /**
+ * class_short_name
+ *
+ * Returns just the name of the class, without its namespace. Used for hooks.
+ * Taken from https://coderwall.com/p/cpxxxw/php-get-class-name-without-namespace
+ *
+ * NOTE: Called on a class without a namespace will return the name of the class
+ * without the first letter in the name
+ * @return string The name of the current class
+ */
+ private function class_short_name(): string {
+ $class_name = get_called_class();
+
+ return ( substr( $class_name, strrpos( $class_name, '\\' ) + 1 ) );
+ }
+
+ /**
+ * trigger_change
+ *
+ * Raises action hooks following the create, delete and update operations.
+ * Raises the hook [ea11y/db/class_name>/change]. If the /event/
+ * parameter is not null, then it also raises the hook [ea11y/db/class_name/event].
+ *
+ * The parameters sent to both hooks is a reference to the current object and the value of the /data/ parameter.
+ *
+ * @param int|bool $data Numbers of rows changed or FALSE on database action failure
+ * @param string|null $event The name of the custom event hook to raise in addition to the /changed/ event hook
+ * Optional.
+ * Defaults to null. In this case, will raise only the defaults /changed/ event.
+ */
+ private function trigger_change( $data, string $event = null ): void {
+ if ( $event ) {
+ /**
+ * event specific
+ * @var Entry $this
+ * @var false|int $data
+ */
+ do_action( 'ea11y/db/' . $this->class_short_name() . '/' . $event, $this, $data );
+ }
+
+ /**
+ * entity change
+ * @var Entry $this
+ * @var false|int $data
+ */
+ do_action( 'ea11y/db/' . $this->class_short_name() . '/change', $this, $data );
+ }
+
+ /**
+ * save
+ *
+ * Writes the entry to the database.
+ * If the entry has a field called /id/ set, will
+ * perform an update, if it doesn't, will perform an insert.
+ * Update and create function triggers the change action hooks and the respective custom event
+ * @return false|int The number of rows inserted or FALSE on error.
+ */
+ public function save() {
+ if ( isset( $this->entry_data[ 'id' ] ) ) {
+ return $this->update( [ 'id' => $this->entry_data[ 'id' ] ] );
+ }
+
+ return $this->create();
+ }
+
+
+ /**
+ * delete
+ *
+ * Delete entries from the table.
+ * Bases on the field specified by the /by/ parameter and its current value.
+ * Triggers change action hooks and raises the /delete/ custom event.
+ *
+ * @param string $by The field name to delete by.
+ * Optional.
+ * Defaults to 'id'.
+ *
+ * @return false|int The number of rows deleted or false on error.
+ */
+ public function delete( string $by = 'id' ) {
+ $results = $this->db_table::delete( [ $by => $this->{$by} ] );
+
+ $this->trigger_change( $results, 'delete' );
+
+ return $results;
+ }
+
+ /**
+ * update
+ *
+ * Updates the database with the data of this entry based on the conditions passed
+ * by the /where/ parameter.
+ * Triggers change action hooks and raises the /update/ custom event.
+ *
+ * NOTE: If no conditions are supplied, the update is going to be performed on all rows,
+ *
+ * @param array $where Array of column => (raw) values as a group of AND WHERE conditionals for the UPDATE
+ * statement. Optional. Defaults to an empty array.
+ *
+ * @return false|int The number of rows updated or false on error.
+ */
+ public function update( array $where = [] ) {
+ $results = $this->db_table::update( $this->entry_data, $where );
+
+ $this->trigger_change( $results, 'update' );
+
+ return $results;
+ }
+
+ /**
+ * create
+ *
+ * Inserts the entry to the database table.
+ * Trigger change action hooks and raises the /create/ custom event,
+ *
+ * @param string $id On successful insertion, will set the field passes in the /id/ parameter
+ * ot the value of the last inserted ID as returned from the database.
+ * Optional.
+ * Defaults to 'id'
+ *
+ * @return false|int The numbers of rows affected or FALSE on error
+ */
+ public function create( string $id = 'id' ) {
+ $results = $this->db_table::insert( $this->entry_data );
+ if ( $results ) {
+ // Set row id once created
+ $this->set( $id, $this->db_table::db()->insert_id );
+ }
+
+ $this->trigger_change( $results, 'create' );
+
+ return $results;
+ }
+
+ /**
+ * reset
+ *
+ * Clears all of this entry's data.
+ */
+ public function reset(): void {
+ $this->entry_data = [];
+ }
+
+ /**
+ * @return bool
+ */
+ public function exists(): bool {
+ return isset( $this->entry_data['id'] ) && 0 < $this->entry_data['id'];
+ }
+
+ /**
+ * DB_Entry_Base constructor.
+ * Uses the passed on arguments to initialize/set the Entry.
+ * Will through an exception in case the Entry's table property is not set correctly, and the /Table/ class
+ * linking this entry to a database table is not found.
+ *
+ * @param array $args The arguments to set this Entry by.
+ * If arguments /by/ and /value/ are set,
+ * will fetch the data according to the column name specified by /by/ and the value(s) specified
+ * by /value/. See doc for /init_by/ for details.
+ *
+ * if argument /data/ is set, will set the Entry's data with the data specified.
+ * See doc for /init_by_data/ for details.
+ *
+ * if argument /id/ is specified, will load the data of the row whose /id/ column has the value specified by the
+ * argument.
+ *
+ * Optional.
+ * Defaults to an empty array which will make this entry as the Empty Entry representing null,
+ * which cannot be saved unless properly modified to a non-null entry.
+ *
+ * @throws Missing_Table_Exception If the Entry table property is not found.
+ */
+ public function __construct( array $args = [] ) {
+ $this->db_table = static::get_helper_class();
+
+ if ( empty( $this->db_table ) ) {
+ throw new Missing_Table_Exception();
+ }
+ if ( isset( $args[ 'by' ] ) && isset( $args[ 'value' ] ) ) {
+ return $this->init_by( $args[ 'by' ], $args[ 'value' ] );
+ }
+
+ if ( isset( $args[ 'data' ] ) ) {
+ return $this->init_by_data( $args[ 'data' ] );
+ }
+
+ if ( isset( $args[ 'id' ] ) ) {
+ return $this->init_by_id( $args[ 'id' ] );
+ }
+
+ return $this->return_empty();
+ }
+}
diff --git a/classes/database/exceptions/missing-table-exception.php b/classes/database/exceptions/missing-table-exception.php
new file mode 100644
index 00000000..5a9a2495
--- /dev/null
+++ b/classes/database/exceptions/missing-table-exception.php
@@ -0,0 +1,18 @@
+prefix . static::$table_name;
+ }
+
+ /**
+ * set_table_prefix
+ *
+ * Saves the table name as a property in the WP database object and
+ * sets it value to the table name and its prefix.
+ */
+ protected static function set_table_prefix(): void {
+ static::db()->{static::$table_name} = static::table_name();
+ }
+
+ /**
+ * get_columns
+ *
+ * Should return an array of table columns details in the format of
+ * column_name => [ type => db_type, key => key_data (optional), flags => other_modifiers (optional) ]
+ *
+ * NOTE: A primary key column named /id/ which is an auto-incremented int/big int is assumed to exist and must be one
+ * of the columns this function returns.
+ * @return array The table column data.
+ */
+ public static function get_columns(): array {
+ return [];
+ }
+
+ /**
+ * get_extra_keys
+ *
+ * Extra keys to the table definitions to be merged with column key definitions
+ * @return string[] SQL table key definitions
+ */
+ protected static function get_extra_keys(): array {
+ return [];
+ }
+
+ /**
+ * get_keys
+ *
+ * Extracts the key definitions from the table's columns and merges with
+ * any extra key definitions
+ * @return string[] SQL table key definitions
+ */
+ protected static function get_keys(): array {
+ $columns = static::get_columns();
+ $keys = [];
+ foreach ( $columns as $column ) {
+ if ( ! isset( $column['key'] ) ) {
+ continue;
+ }
+ $keys[] = $column['key'];
+ }
+ return array_merge( $keys, static::get_extra_keys() );
+ }
+
+ /**
+ * install
+ *
+ * This function compares the version of the installed table and the current version as reported by
+ * the class.
+ * If the versions are different, the table will be installed or updated, and the option
+ * will be set to the current version.
+ */
+ public static function install(): void {
+ $installed_ver = get_option( static::DB_VERSION_FLAG_NAME, -1 );
+
+ if ( static::DB_VERSION !== $installed_ver ) {
+
+ $sql = static::get_create_table_sql();
+
+ require_once ABSPATH . 'wp-admin/includes/upgrade.php';
+ dbDelta( $sql );
+
+ update_option( static::DB_VERSION_FLAG_NAME, static::DB_VERSION, false );
+ }
+
+ static::set_table_prefix();
+ }
+
+ /**
+ * get_create_table_sql
+ *
+ * Generates the SQL command to run in the database to create the table
+ * based on the definitions of columns and keys.
+ * @return string The SQL command to create the table
+ */
+ protected static function get_create_table_sql(): string {
+ $table = static::table_name();
+ $keys = static::get_keys();
+ $charset_collate = static::db()->get_charset_collate();
+ $table_columns = [];
+ $sql = [];
+ $sql[] = 'CREATE TABLE ' . $table . ' (';
+ $columns = static::get_columns();
+ foreach ( $columns as $column_name => $column ) {
+ $table_columns[] = sprintf( '`%s` %s %s,',
+ $column_name,
+ $column['type'],
+ $column['flags'] ?? ''
+ );
+ }
+
+ $sql[] = "\t" . implode( "\n\t", $table_columns );
+ $sql[] = "\t" . implode( ",\n\t", $keys );
+ $sql[] = ") AUTO_INCREMENT=11 {$charset_collate};";
+ return implode( "\n", $sql );
+ }
+
+ /**
+ * where
+ *
+ * Generates a proper WHERE clause for an SQL query.
+ * @param string|array $where Either a string of where clause (returns as is) or an array of
+ * conditions join with an AND, and in the format of column => (int|string) for exact value comparison
+ * or in the format of column => [column => string, value =>string|int|array,
+ * comparison operator => string, relation_before=>string, optional, relation_after=>string, optional]
+ *
+ * @return string WHERE clause built from the function input
+ */
+ public static function where( $where ): string {
+ if ( ! is_array( $where ) ) {
+ return $where;
+ }
+ $needs_relationship = false;
+ $where_string = '';
+ foreach ( $where as $key => $filter ) {
+ if ( ! is_array( $filter ) ) {
+ if ( $needs_relationship ) {
+ $where_string .= ' AND';
+ }
+ $where_string .= ' ' . self::get_where_string( $key, $filter );
+ $needs_relationship = true;
+ continue;
+ }
+
+ $where_string .= self::maybe_add_relation( $filter );
+ $where_string .= self::get_where_string( $filter['column'], $filter['value'], $filter['operator'] );
+ $where_string .= self::maybe_add_relation( $filter, false );
+
+ }
+ return $where_string;
+
+ }
+
+ /**
+ * maybe_add_relation
+ *
+ * Adds a logical relation ship (AND, OR...) if exists, based on the position (before|after) related to the condition.
+ * @param array $filter Object array describing the where condition that may contain the keys /relation_before/
+ * or /relation_after/ containing the logical relationship to add to the main WHERE condition.
+ * @param bool $is_before Whether the current position in the text is before the condition the object describes.
+ * Optional.
+ * Defaults to TRUE.
+ *
+ * @return string If the logical relationship exists, returns it. Otherwise - an empty string.
+ */
+ private static function maybe_add_relation( array $filter, bool $is_before = true ): string {
+ $key_to_check = $is_before ? 'relation_before' : 'relation_after';
+ return isset( $filter[ $key_to_check ] ) ? ' ' . $filter[ $key_to_check ] : ' ';
+ }
+
+ /**
+ * get_where_string
+ *
+ * @param string $key The column name in the condition
+ * @param string|int|array $value The value being compared. If an array will be translated to a set.
+ * @param string $operator The comparison operator.
+ * Optional.
+ * Defaults to '='.
+ * @param null $format Unused.
+ *
+ * @return string An SQL condition based on the parameters.
+ */
+ private static function get_where_string( string $key, $value, string $operator = '=', $format = null ): string {
+ $param_string = is_int( $value ) ? '%d' : '%s';
+ if ( is_array( $value ) ) {
+ $param_string = '(';
+ $count = count( $value );
+ for ( $i = 0; $i < $count; $i++ ) {
+ $param_string .= is_int( $value[ $i ] ) ? '%d' : '%s';
+ $param_string .= ( $i !== $count - 1 ) ? ', ' : '';
+ }
+ $param_string .= ')';
+ }
+ return static::db()->prepare( "$key $operator $param_string", $value );
+ }
+
+ /**
+ * get_columns_for_insert
+ * This function tries to get the column names for an INSERT operation based on the table column
+ * definition, and if that fails based on the /data/ parameter.
+ * The function will remove any column called /id/.
+ * @param mixed $data If a two-dimensional array, where the elements are in the form of column => value,
+ * the function will try to get the names of the columns off the first element.
+ *
+ * @return false|string A string representing the list of columns, comma separated and surrounded by parenthesis;
+ * or false in case of function failure.
+ */
+ private static function get_columns_for_insert( $data ) {
+ $cols = static::get_columns();
+ if ( count( $cols ) ) {
+ $columns = array_keys( $cols );
+ } elseif ( is_array( $data ) ) {
+ //try to get from data
+ $columns = array_keys( $data[0] );
+ }
+
+ if ( empty( $columns ) || ! is_array( $columns ) ) {
+ return false;
+ }
+
+ // remove id $column
+ if ( ! empty( $columns['id'] ) ) {
+ unset( $columns['id'] );
+ }
+ $index = array_search( 'id', $columns, true );
+ if ( false !== $index ) {
+ unset( $columns[ $index ] );
+ }
+
+ return ' (`' . implode( '`,`', $columns ) . '`) ';
+ }
+
+ /**
+ * select_var
+ *
+ * Selects a single cell in the table and returns its value as string.
+ * Will return the first cell of the first row in the result set.
+ * @param string|array $fields A string of comma-separated list, or an array of columns from the table.
+ * Optional.
+ * Defaults to '*' (all table columns)
+ * @param string|array $where A string of WHERE conditions or an array of column => value entries connected with the
+ * AND logical operator. Or in the format of column => [column => string, value =>string|int|array,
+ * comparison operator => string, relation_before=>string, optional, relation_after=>string, optional]
+ * Optional.
+ * Defaults tp '1', which is evaluated to true and will bring all records (no condition).
+ * @param int|null $limit Limit the number of results to return to this number, or NULL for no limit.
+ * Optional.
+ * Defaults to NULL (no limit)
+ * @param int|null $offset Skip this number of results or NULL for no skip
+ * Optional.
+ * Defaults to NULL (no offset)
+ * @param string $join JOIN table clause.
+ * Optional.
+ * Defaults to an empty string (no join)
+ *
+ * @return string|null The query result or NULL on error.
+ */
+ public static function select_var( $fields = '*', $where = '1', int $limit = null, int $offset = null, string $join = '' ): ?string {
+ return static::db()->get_var( static::build_sql_string( $fields, $where, $limit, $offset, $join ) );
+ }
+
+ /**
+ * build_sql_string
+ *
+ * Generates a SELECT query based on the function input.
+ * @param string|array $fields A string of comma-separated list, or an array of columns from the table.
+ * Optional.
+ * Defaults to '*' (all table columns)
+ * @param string|array $where A string of WHERE conditions or an array of column => value entries connected with
+ * the AND logical operator. r in the format of column => [column => string, value =>string|int|array,
+ * comparison operator => string, relation_before=>string, optional, relation_after=>string, optional]
+ * Optional.
+ * Defaults to '1', which is evaluated to true and will bring all records (no condition).
+ * @param int|null $limit Maximum number of results to return.
+ * Optional.
+ * Defaults to NULL (no limit)
+ * @param int|null $offset Start the results from a certain ordinal position.
+ * Optional.
+ * Defaults to NULL (no offset)
+ * @param string $join A table JOIN clause.
+ * Optional.
+ * Defaults to an empty string (no join)
+ * @param array $order_by an array of column => direction (asc|desc) to sort the results by.
+ * Optional.
+ * Defaults to an empty array (Default sort).
+ *
+ * @return string The SQL SELECT statement built according to the function parameters.
+ */
+ private static function build_sql_string( $fields = '*', $where = '1', int $limit = null, int $offset = null, string $join = '', array $order_by = [] ): string {
+ if ( is_array( $fields ) ) {
+ $fields = implode( ', ', $fields );
+ }
+
+ $db = static::db();
+ $query_string = 'SELECT %s FROM %s %s WHERE %s';
+ $query_string = sprintf( $query_string,
+ $fields,
+ static::table_name(),
+ $join,
+ static::where( $where )
+ );
+
+ if ( $order_by ) {
+ $query_string .= static::build_order_by_sql_string( $order_by );
+ }
+
+ if ( $limit ) {
+ $query_string .= $db->prepare( ' LIMIT %d', $limit );
+ }
+
+ if ( $offset ) {
+ $query_string .= $db->prepare( ' OFFSET %d', $offset );
+ }
+
+ return $query_string;
+ }
+
+ /**
+ * build_order_by_sql_string
+ *
+ * Generates the ORDER BY clause of the query based on the passed on parameter
+ * @param array $order_by An array of column => direction (asc/desc) pairs
+ *
+ * @return string The ORDER BY clause for a query
+ */
+ public static function build_order_by_sql_string( array $order_by ): string {
+ return ' ORDER BY ' . implode( ', ', array_map( function( $column, $direction ) {
+ return "{$column} {$direction}";
+ }, array_keys( $order_by ), $order_by ) );
+ }
+
+ /**
+ * select
+ *
+ * Runs a SELECT query and returns the results as an array of objects, each object represents a row,
+ * @param string|array $fields A string of comma-separated list, or an array of columns from the table.
+ * Optional.
+ * Defaults to '*' (all table columns)
+ * @param string|array $where A string of WHERE conditions, or an array of column => value enteries
+ * for direct comparison joined with the AND logical operator, or in the format of column => [column => string, value =>string|int|array,
+ * comparison operator => string, relation_before=>string, optional, relation_after=>string, optional]
+ * Optional.
+ * Defaults to '1', which is evaluated to true and will bring all records (no condition).
+ * @param int|null $limit Maximum number of results to return.
+ * Optional.
+ * Defaults to NULL (no limit)
+ * @param int|null $offset Start the results from a certain ordinal position.
+ * Optional.
+ * Defaults to NULL (no offset)
+ * @param string|array $join A table JOIN clause.
+ * Optional.
+ * Defaults to an empty string (no join)
+ * @param array $order_by an array of column => direction (asc|desc) to sort the results by.
+ * Optional.
+ * Defaults to an empty array (Default sort).
+ *
+ * @return array|object|\stdClass[]|null On success, an array of objects. Null on error.
+ */
+ public static function select( $fields = '*', $where = '1', int $limit = null, int $offset = null, $join = '', array $order_by = [] ) {
+ // TODO: handle $wpdb->last_error
+ $query = static::build_sql_string( $fields, $where, $limit, $offset, $join, $order_by );
+ return static::db()->get_results( $query );
+ }
+
+ /**
+ * get_col
+ *
+ * Returns the first column of the result set.
+ * @param string $column The column to return.
+ * Optional.
+ * Defaults to an empty string.
+ * @param string|array $where A string of WHERE conditions or an array of column => value entries
+ * for direct comparison joined with the AND logical operator or in the format of column => [column => string, value =>string|int|array,
+ * comparison operator => string, relation_before=>string, optional, relation_after=>string, optional]
+ * Optional.
+ * Defaults to '1', which is evaluated to true and will bring all records (no condition).
+ * @param int|null $limit Maximum number of results to return.
+ * Optional.
+ * Defaults to NULL (no limit)
+ * @param int|null $offset Start the results from a certain ordinal position.
+ * Optional.
+ * Defaults to NULL (no offset)
+ * @param string $join A table JOIN clause.
+ * Optional.
+ * Defaults to an empty string (no join)
+ * @param array $order_by an array of column => direction (asc|desc) to sort the results by.
+ * Optional.
+ * Defaults to an empty array (Default sort).
+ *
+ * @return string[] Array of the values of the column as strings, or an empty one on error.
+ */
+ public static function get_col( string $column = '', $where = '1', int $limit = null, int $offset = null, string $join = '', array $order_by = [] ) : array {
+ return static::db()->get_col( static::build_sql_string( $column, $where, $limit, $offset, $join, $order_by ) );
+ }
+
+ /**
+ * first
+ *
+ * Returns the first row in the table according to the query filters.
+ * @param string|array $fields A string of comma-separated list, or an array of columns from the table.
+ * Optional.
+ * Defaults to '*' (all table columns)
+ * @param string|array $where A string of WHERE conditions or an array of column => value entries
+ * for direct comparison joined with the logical AND operator,
+ * or in the format of column => [column => string, value =>string|int|array,
+ * comparison operator => string, relation_before=>string, optional, relation_after=>string, optional]
+ * Optional.
+ * Defaults to '1', which is evaluated to true and will bring all records (no condition).
+ * @param int $limit Unnecessary since we are only returning the first row.
+ * Optional.
+ * Defaults to 1.
+ * @param null $offset Start the results from a certain ordinal position.
+ * Optional.
+ * Defaults to NULL (no offset)
+ * @param string $join A table JOIN clause.
+ * Optional.
+ * Defaults to an empty string (no join)
+ *
+ * @return \stdClass|null An object representing the first row, or null on error
+ */
+ public static function first( $fields = '*', $where = '1', int $limit = 1, $offset = null, string $join = '' ): ?\stdClass {
+ $result = static::select( $fields, $where, $limit, $offset, $join );
+ return ( ! empty( $result[0] ) ) ? $result[0] : null;
+ }
+
+ /**
+ * replace
+ *
+ * Replace a row in a table if it exists or insert a new row in a table if the row does not already exist.
+ * @param array $data Array of data in the form of column => (raw) value.
+ * Optional.
+ * Defaults to an empty array.
+ *
+ * @return false|int The number of rows affected or FALSE on error.
+ */
+ public static function replace( array $data = [] ) {
+ return static::db()->replace( static::table_name(), $data );
+ }
+
+ /**
+ * insert
+ *
+ * Insert a single row into the table.
+ * @param array $data Array of data to insert in column => (raw) value format.
+ * Optional, defaults to an empty array.
+ *
+ * @return false|int The number of rows affected or FALSE on error
+ */
+ public static function insert( array $data = [] ) {
+ return static::db()->insert( static::table_name(), $data );
+ }
+
+ /**
+ * insert_many
+ * Performs a bulk INSERT of many datasets/rows to the table
+ *
+ * @param array $data Optional. Defaults to an empty array.
+ * An array of datasets to be INSERTed into the table. Each value needs to be seperated by a comma,
+ * each data set needs to be surrounded by parenthesis.
+ * @param string|null $columns Optional. The columns being inserted. Defaults to NULL.
+ * Either a string of comma-separated column names surrounded by parenthesis, or NULL for the
+ * function to try guessing based on the data and column definitions.
+ *
+ * @return false|int Number of rows affected or false on error
+ */
+ public static function insert_many( array $data = [], string $columns = null ) {
+ if ( null === $columns ) {
+ $columns = static::get_columns_for_insert( $data );
+ if ( ! $columns ) {
+ return false;
+ }
+ }
+ $insert_sql = 'INSERT INTO ' . static::table_name() . $columns . ' VALUES ' . implode( ",\n", $data ) . ';';
+ return static::db()->query( $insert_sql ); // no params so no need for `prepare`.
+ }
+
+ /**
+ * update
+ *
+ * Updates data in the table, based on where conditionals
+ * @param array $data Optional. Array of column => (raw) values to be updated.
+ * Defaults to an empty array.
+ * @param array $where Optional. Array of column => (raw) values as a group of AND
+ * WHERE conditionals for the UPDATE statement. Defaults to an empty array.
+ *
+ * @return false|int The numbers of rows affected, or FALSE on error
+ */
+ public static function update( array $data = [], array $where = [] ) {
+ return static::db()->update( static::table_name(), $data, $where );
+ }
+
+ /**
+ * delete
+ *
+ * Delete rows from this table based on optional where conditions.
+ *
+ * @param array $where Optional. And array of column => (raw) values
+ * as a group of AND conditions for the DELETE statement. Defaults to an empty array.
+ *
+ * @return false|int The number of rows updated, or false on error.
+ */
+ public static function delete( array $where = [] ) {
+ return static::db()->delete( static::table_name(), $where );
+ }
+
+ /**
+ * query
+ *
+ * Execute any SQL query on the database.
+ * It is best used when there is a need for specific,
+ * custom, or otherwise complex SQL queries.
+ * @param string $query The query to be executed. Defaults to an empty string
+ *
+ * @return false|int Boolean true for CREATE, ALTER, TRUNCATE and DROP queries.
+ * Number of rows affected/selected for all other queries. Boolean false on error.
+ */
+ public static function query( string $query = '' ) {
+ return static::db()->query( $query );
+ }
+
+ /**
+ * get_class_name
+ *
+ * Returns the name of this /Table/ class (or its derivative)
+ * @return string - The name of the current class
+ */
+ public static function get_class_name(): string {
+ return get_called_class();
+ }
+}
diff --git a/classes/logger.php b/classes/logger.php
new file mode 100644
index 00000000..e68a69b8
--- /dev/null
+++ b/classes/logger.php
@@ -0,0 +1,37 @@
+reflection ) {
+ try {
+ $this->reflection = new ReflectionClass( $this );
+ } catch ( ReflectionException $e ) {
+ if ( defined( 'WP_DEBUG' ) && WP_DEBUG ) {
+ // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_error_log
+ error_log( $e->getMessage() );
+ }
+ }
+ }
+
+ return $this->reflection;
+ }
+
+ /**
+ * Add module component.
+ *
+ * Add new component to the current module.
+ * @access public
+ *
+ * @param string $id Component ID.
+ * @param mixed $instance An instance of the component.
+ */
+ public function add_component( $id, $instance ) {
+ $this->components[ $id ] = $instance;
+ }
+
+ /**
+ * Add module route.
+ *
+ * Add new route to the current module.
+ * @access public
+ *
+ * @param string $id Route ID.
+ * @param mixed $instance An instance of the route.
+ */
+ public function add_route( string $id, $instance ) {
+ $this->routes[ $id ] = $instance;
+ }
+
+ /**
+ * @access public
+ * @return Module[]
+ */
+ public function get_components() {
+ return $this->components;
+ }
+
+ /**
+ * Get module component.
+ *
+ * Retrieve the module component.
+ * @access public
+ *
+ * @param string $id Component ID.
+ *
+ * @return mixed An instance of the component, or `false` if the component
+ * doesn't exist.
+ * @codeCoverageIgnore
+ */
+ public function get_component( $id ) {
+ if ( isset( $this->components[ $id ] ) ) {
+ return $this->components[ $id ];
+ }
+
+ return false;
+ }
+
+ /**
+ * Retrieve the namespace of the class
+ *
+ * @access public
+ * @static
+ */
+ public static function namespace_name() {
+ $class_name = static::class_name();
+ return substr( $class_name, 0, strrpos( $class_name, '\\' ) );
+ }
+
+
+
+ public static function routes_list() : array {
+ return [];
+ }
+
+ public static function component_list() : array {
+ return [];
+ }
+
+ /**
+ * Adds an array of components.
+ * Assumes namespace structure contains `\Components\`
+ *
+ * @param array $components_ids => component's class name.
+ */
+ public function register_components( $components_ids = null ) {
+ $namespace = static::namespace_name();
+ $components_ids = $components_ids ?? static::component_list();
+ foreach ( $components_ids as $component_id ) {
+ $class_name = $namespace . '\\Components\\' . $component_id;
+ $this->add_component( $component_id, new $class_name() );
+ }
+ }
+
+ /**
+ * Adds an array of routes.
+ * Assumes namespace structure contains `\Rest\`
+ */
+ public function register_routes() {
+ $namespace = static::namespace_name();
+ $routes_ids = static::routes_list();
+
+ foreach ( $routes_ids as $route_id ) {
+ $class_name = $namespace . '\\Rest\\' . $route_id;
+ $this->add_route( $route_id, new $class_name() );
+ }
+ }
+}
+
diff --git a/classes/rest/route.php b/classes/rest/route.php
new file mode 100644
index 00000000..921b8a49
--- /dev/null
+++ b/classes/rest/route.php
@@ -0,0 +1,387 @@
+get_methods();
+ if ( empty( $methods ) ) {
+ return;
+ }
+
+ //$callbacks = false;
+ $callbacks = [];
+ foreach ( (array) $methods as $method ) {
+ if ( ! in_array( $method, $this->valid_http_methods, true ) ) {
+ continue;
+ }
+ $callbacks[] = $this->build_endpoint_method_config( $method );
+ }
+
+ $arguments = $this->get_arguments();
+
+ if ( ! $callbacks && empty( $arguments ) ) {
+ return;
+ }
+
+ $arguments = array_merge( $arguments, (array) $callbacks );
+ register_rest_route( $this->namespace, '/' . $this->get_endpoint() . '/', $arguments, $this->override );
+ }
+
+ /**
+ * get_methods
+ * Rest Endpoint methods
+ *
+ * Returns an array of the supported REST methods for this route
+ * @return array REST methods being configured for this route.
+ */
+ abstract public function get_methods(): array;
+
+ /**
+ * get_callback
+ *
+ * Returns a reference to the callback function to handle the REST method specified by the /method/ parameter.
+ * @param string $method The REST method name
+ *
+ * @return callable A reference to a member function with the same name as the REST method being passed as a parameter,
+ * or a reference to the default function /callback/.
+ */
+ public function get_callback_method( string $method ): callable {
+ $method_name = strtolower( $method );
+ $callback = $this->method_exists_in_current_class( $method_name ) ? $method_name : 'callback';
+ return [ $this, $callback ];
+ }
+
+ /**
+ * get_permission_callback_method
+ *
+ * Returns a reference to the permission callback for the method if exists or the default one if it doesn't.
+ * @param string $method The REST method name
+ *
+ * @return callable If a method called (rest-method)_permission_callback exists, returns a reference to it, otherwise
+ * returns a reference to the default member method /permission_callback/.
+ */
+ public function get_permission_callback_method( string $method ): callable {
+ $method_name = strtolower( $method );
+ $permission_callback_method = $method_name . '_permission_callback';
+ $permission_callback = $this->method_exists_in_current_class( $permission_callback_method ) ? $permission_callback_method : 'permission_callback';
+ return [ $this, $permission_callback ];
+ }
+
+ /**
+ * maybe_add_args_to_config
+ *
+ * Checks if the class has a method call (rest-method)_args.
+ * If it does, the function calls it and adds its response to the config object passed to the function, under the /args/ key.
+ * @param string $method The REST method name being configured
+ * @param array $config The configuration object for the method
+ *
+ * @return array The configuration object for the method, possibly after being amended
+ */
+ public function maybe_add_args_to_config( string $method, array $config ): array {
+ $method_name = strtolower( $method );
+ $method_args = $method_name . '_args';
+ if ( $this->method_exists_in_current_class( $method_args ) ) {
+ $config['args'] = $this->{$method_args}();
+ }
+ return $config;
+ }
+
+ /**
+ * maybe_add_response_to_swagger
+ *
+ * If the function method /(rest-method)_response_callback/ exists, adds the filter
+ * /swagger_api_response_(namespace with slashes replaced with underscores)_(endpoint with slashes replaced with underscores)/
+ * with the aforementioned function method.
+ * This filter is used with the WP API Swagger UI plugin to create documentation for the API.
+ * The value being passed is an array: [
+ '200' => ['description' => 'OK'],
+ '404' => ['description' => 'Not Found'],
+ '400' => ['description' => 'Bad Request']
+ ]
+ * @param string $method REST method name
+ */
+ public function maybe_add_response_to_swagger( string $method ): void {
+ $method_name = strtolower( $method );
+ $method_response_callback = $method_name . '_response_callback';
+ if ( $this->method_exists_in_current_class( $method_response_callback ) ) {
+ $response_filter = $method_name . '_' . str_replace(
+ '/',
+ '_',
+ $this->namespace . '/' . $this->get_endpoint()
+ );
+ add_filter( 'swagger_api_responses_' . $response_filter, [ $this, $method_response_callback ] );
+ }
+ }
+
+ /**
+ * build_endpoint_method_config
+ *
+ * Builds a configuration array for the endpoint based on the presence of the callback, permission, additional parameters,
+ * and response to Swagger member functions.
+ * @param string $method The REST method for the endpoint
+ *
+ * @return array The endpoint configuration for the method specified by the parameter
+ */
+ private function build_endpoint_method_config( string $method ): array {
+ $config = [
+ 'methods' => $method,
+ 'callback' => $this->get_callback_method( $method ),
+ 'permission_callback' => $this->get_permission_callback_method( $method ),
+ ];
+ $config = $this->maybe_add_args_to_config( $method, $config );
+ return $config;
+ }
+
+ /**
+ * method_exists_in_current_class
+ *
+ * Uses reflection to check if this class has the /method/ method.
+ * @param string $method The name of the method being checked.
+ *
+ * @return bool TRUE if the class has the /method/ method, FALSE otherwise.
+ */
+ private function method_exists_in_current_class( string $method ): bool {
+ $class_name = get_class( $this );
+ try {
+ $reflection = new ReflectionClass( $class_name );
+ } catch ( \ReflectionException $e ) {
+ return false;
+ }
+ if ( ! $reflection->hasMethod( $method ) ) {
+ return false;
+ }
+ $method_ref = $reflection->getMethod( $method );
+
+ return ( $method_ref && $class_name === $method_ref->class );
+ }
+
+ /**
+ * @param $data
+ *
+ * @return WP_REST_Response
+ */
+ public function respond_success_json( $data = [] ): WP_REST_Response {
+ return new WP_REST_Response([
+ 'success' => true,
+ 'data' => $data,
+ ]);
+ }
+
+ /**
+ * @param array{message: string, code: string} $data
+ *
+ * @return WP_Error
+ */
+ public function respond_error_json( array $data ): WP_Error {
+ if ( ! isset( $data['message'] ) || ! isset( $data['code'] ) ) {
+ _doing_it_wrong(
+ __FUNCTION__,
+ esc_html__( 'Both `message` and `code` keys must be provided', 'pojo-accessibility' ),
+ '1.0.0'
+ ); // @codeCoverageIgnore
+ }
+
+ return new WP_Error(
+ $data['code'] ?? 'internal_server_error',
+ $data['message'] ?? esc_html__( 'Internal server error', 'pojo-accessibility' ),
+ );
+ }
+
+ public function verify_capability( $capability = 'manage_options' ) {
+ if ( ! current_user_can( $capability ) ) {
+ return $this->respond_error_json([
+ 'message' => esc_html__( 'You do not have sufficient permissions to access this data.', 'pojo-accessibility' ),
+ 'code' => '401 Unauthorized',
+ ]);
+ }
+ }
+
+ /**
+ * permission_callback
+ * Permissions callback fallback for the endpoint
+ * Gets the current user ID and sets the /current_user_id/ property.
+ * If the /auth/ property is set to /true/ will make sure that the user is logged in (has an id greater than 0)
+ *
+ * @param WP_REST_Request $request unused
+ *
+ * @return bool TRUE, if permission granted, FALSE otherwise
+ */
+ public function permission_callback( WP_REST_Request $request ): bool {
+ // try to get current user
+ $this->current_user_id = get_current_user_id();
+ if ( $this->auth ) {
+ return $this->current_user_id > 0;
+ }
+
+ return true;
+ }
+
+ /**
+ * callback
+ * Fallback callback function, returns a response consisting of the string /ok/.
+ *
+ * @param WP_REST_Request $request unused
+ *
+ * @return WP_REST_Response Default Response of the string 'ok'.
+ */
+ public function callback( WP_REST_Request $request ): WP_REST_Response {
+ return rest_ensure_response( [ 'OK' ] );
+ }
+
+ /**
+ * respond_wrong_method
+ *
+ * Creates a WordPress error object with the /rest_no_route/ code and the message and code supplied or the defaults.
+ * @param null $message The error message for the wrong method.
+ * Optional.
+ * Defaults to null, which makes sets the message to /No route was found matching the URL and request method/
+ * @param int $code The HTTP status code.
+ * Optional.
+ * Defaults to 404 (Not found).
+ *
+ * @return WP_Error The WordPress error object with the error message and status code supplied
+ */
+ public function respond_wrong_method( $message = null, int $code = 404 ): WP_Error {
+ if ( null === $message ) {
+ $message = __( 'No route was found matching the URL and request method', 'pojo-accessibility' );
+ }
+
+ return new WP_Error( 'rest_no_route', $message, [ 'status' => $code ] );
+ }
+
+ /**
+ * respond_with_code
+ * Create a new /WP_REST_Response/ object with the specified data and HTTP response code.
+ *
+ * @param array|null $data The data to return in this response
+ * @param int $code The HTTP response code.
+ * Optional.
+ * Defaults to 200 (OK).
+ *
+ * @return WP_REST_Response The WordPress response object loaded with the data and the response code.
+ */
+ public function respond_with_code( ?array $data = null, int $code = 200 ): WP_REST_Response {
+ return new WP_REST_Response( $data, $code );
+ }
+
+ /**
+ * get_user_from_request
+ *
+ * Returns the current user object.
+ * Depends on the property /current_user_id/ to be set.
+ * @return WP_User|false The user object or false if not found or on error.
+ */
+ public function get_user_from_request() {
+ return get_user_by( 'id', $this->current_user_id );
+ }
+
+ /**
+ * get_arguments
+ * Rest Endpoint extra arguments
+ * @return array Additional arguments for the route configuration
+ */
+ public function get_arguments(): array {
+ return [];
+ }
+
+ /**
+ * get_endpoint
+ * Rest route Endpoint
+ * @return string Endpoint uri component (comes after the route namespace)
+ */
+ abstract public function get_endpoint(): string;
+
+ /**
+ * get_name
+ * @return string The name of the route
+ */
+ abstract public function get_name(): string;
+
+ /**
+ * get_self_url
+ *
+ * @param string $endpoint
+ *
+ * @return string
+ */
+ public function get_self_url( string $endpoint = '' ): string {
+ return rest_url( $this->namespace . '/' . $endpoint );
+ }
+
+ public function verify_nonce( $nonce = '', $name = '' ) {
+ if ( ! wp_verify_nonce( sanitize_text_field( wp_unslash( $nonce ) ), $name ) ) {
+ return $this->respond_error_json([
+ 'message' => esc_html__( 'Invalid nonce', 'pojo-accessibility' ),
+ 'code' => 'bad_request',
+ ]);
+ }
+ }
+
+ public function verify_nonce_and_capability( $nonce = '', $name = '', $capability = 'manage_options' ) {
+ $this->verify_nonce( $nonce, $name );
+
+ if ( ! current_user_can( $capability ) ) {
+ return $this->respond_error_json([
+ 'message' => esc_html__( 'You do not have sufficient permissions to access this data.', 'pojo-accessibility' ),
+ 'code' => 'bad_request',
+ ]);
+ }
+ }
+
+}
diff --git a/classes/utils.php b/classes/utils.php
new file mode 100644
index 00000000..ee124871
--- /dev/null
+++ b/classes/utils.php
@@ -0,0 +1,37 @@
+id, 'ea11y-' );
+ }
+ public static function user_is_admin(): bool {
+ return current_user_can( 'manage_options' );
+ }
+ public static function is_wp_dashboard_page(): bool {
+ $current_screen = get_current_screen();
+
+ return str_contains( $current_screen->id, 'dashboard' );
+ }
+
+ public static function is_wp_settings_page(): bool {
+ $current_screen = get_current_screen();
+
+ return str_contains( $current_screen->id, 'options-' );
+ }
+
+ public static function is_elementor_installed() {
+ $file_path = 'elementor/elementor.php';
+ $installed_plugins = get_plugins();
+ return isset( $installed_plugins[ $file_path ] );
+ }
+
+}
diff --git a/classes/utils/assets.php b/classes/utils/assets.php
new file mode 100644
index 00000000..db3ac8ed
--- /dev/null
+++ b/classes/utils/assets.php
@@ -0,0 +1,144 @@
+ self::get_assets_version( $version ),
+ 'suffix' => self::get_assets_suffix(),
+ ];
+ }
+
+ /**
+ * get_assets_path
+ *
+ * @param string $asset_name
+ * @param string $asset_type
+ * @param string $suffix
+ *
+ * @return string
+ */
+ private static function get_assets_path( string $asset_name, string $asset_type, string $suffix = '' ) : string {
+ return EA11Y_ASSETS_URL . '/build/' . $asset_name . $suffix . '.' . $asset_type;
+ }
+
+ /**
+ * enqueue_app_assets
+ *
+ * @param string $handle
+ * @param bool $with_css
+ */
+ public static function enqueue_app_assets( string $handle = '', bool $with_css = true ) : void {
+ $dir = EA11Y_ASSETS_PATH . 'build/';
+ $url = EA11Y_ASSETS_URL . 'build/';
+
+ $script_asset_path = $dir . $handle . '.asset.php';
+ if ( ! file_exists( $script_asset_path ) ) {
+ throw new \Error(
+ 'You need to run `npm start` or `npm run build` for the "' . esc_html( $handle ) . '" script first.'
+ );
+ }
+
+ // enqueue js
+ $script_asset = require $script_asset_path;
+ wp_enqueue_script(
+ $handle,
+ $url . $handle . '.js',
+ array_merge( $script_asset['dependencies'], [ 'wp-util' ] ),
+ $script_asset['version'],
+ true,
+ );
+
+ // add translation support
+ wp_set_script_translations( $handle, 'elementor-sw' );
+
+ if ( ! $with_css ) {
+ return;
+ }
+ // enqueue css
+ $css_file_name = 'style-' . $handle . '.css';
+ $css_version = ( defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ) ? filemtime( $dir . $css_file_name ) : EA11Y_VERSION;
+ wp_enqueue_style(
+ $handle,
+ $url . $css_file_name,
+ [ 'wp-components' ],
+ $css_version
+ );
+ }
+}
diff --git a/composer.json b/composer.json
index d91f30d5..97f699d3 100644
--- a/composer.json
+++ b/composer.json
@@ -9,7 +9,44 @@
"email": "yakir@pojo.me"
}
],
- "require": {
- "phpunit/phpunit": "4.8.8"
- }
+ "require-dev": {
+ "johnpbloch/wordpress-core": "^6.0",
+ "dealerdirect/phpcodesniffer-composer-installer": "^0.7.1",
+ "squizlabs/php_codesniffer": "^3.6",
+ "wp-coding-standards/wpcs": "2.3",
+ "php-stubs/wordpress-stubs": "^6.0",
+ "elementor/eunit": "^0.0.10",
+ "phpcompatibility/phpcompatibility-wp": "^2.1",
+ "phpunit/php-code-coverage": "^9.2",
+ "wildwolf/wordpress-test-library-stubs": "^6.0",
+ "wp-phpunit/wp-phpunit": "^6.0",
+ "yoast/phpunit-polyfills": "^2.0"
+ },
+ "scripts": {
+ "lint": "phpcs --standard=./ruleset.xml ./**/*.php"
+ },
+ "require": {
+ "firebase/php-jwt": "^6.10"
+ },
+ "config": {
+ "allow-plugins": {
+ "composer/installers": true,
+ "dealerdirect/phpcodesniffer-composer-installer": true
+ }
+ },
+ "extra": {
+ "imposter": {
+ "namespace": "...",
+ "excludes": [ "firebase/php-jwt"]
+ },
+ "installer-paths": {
+ "vendor/{$vendor}/{$name}/": [ "firebase/php-jwt"]
+ }
+ },
+ "repositories":[
+ {
+ "type": "vcs",
+ "url": "git@github.com:elementor/eunit.git"
+ }
+ ]
}
diff --git a/includes/manager.php b/includes/manager.php
new file mode 100644
index 00000000..a8b29d6b
--- /dev/null
+++ b/includes/manager.php
@@ -0,0 +1,57 @@
+modules[ $module_name ] = $class_name::instance();
+ }
+ }
+ }
+
+ /**
+ * @param string $module_name
+ *
+ * @return Module_Base|Module_Base[]
+ */
+ public function get_modules( string $module_name ) {
+ if ( $module_name ) {
+ if ( isset( $this->modules[ $module_name ] ) ) {
+ return $this->modules[ $module_name ];
+ }
+
+ return null;
+ }
+
+ return $this->modules;
+ }
+}
diff --git a/includes/pojo-a11y-settings.php b/includes/pojo-a11y-settings.php
deleted file mode 100644
index f2e43c23..00000000
--- a/includes/pojo-a11y-settings.php
+++ /dev/null
@@ -1,645 +0,0 @@
- 'pojo_a11y_toolbar',
- 'title' => __( 'Display Toolbar', 'pojo-accessibility' ),
- 'type' => self::FIELD_SELECT,
- 'options' => array(
- 'enable' => __( 'Show on all devices', 'pojo-accessibility' ),
- 'visible-desktop' => __( 'Visible Desktop', 'pojo-accessibility' ),
- 'visible-tablet' => __( 'Visible Tablet', 'pojo-accessibility' ),
- 'visible-phone' => __( 'Visible Phone', 'pojo-accessibility' ),
- 'hidden-desktop' => __( 'Hidden Desktop', 'pojo-accessibility' ),
- 'hidden-tablet' => __( 'Hidden Tablet', 'pojo-accessibility' ),
- 'hidden-phone' => __( 'Hidden Phone', 'pojo-accessibility' ),
- 'disable' => __( 'Disable', 'pojo-accessibility' ),
- ),
- 'std' => 'enable',
- );
-
- $toolbar_options_classes = 'pojo-a11y-toolbar-button';
-
- $fields[] = array(
- 'id' => 'pojo_a11y_toolbar_title',
- 'title' => __( 'Title', 'pojo-accessibility' ),
- 'type' => self::FIELD_TEXT,
- 'desc' => __( 'Title top of the toolbar (recommended).', 'pojo-accessibility' ),
- 'class' => $toolbar_options_classes,
- 'std' => __( 'Accessibility Tools', 'pojo-accessibility' ),
- );
-
- $fields[] = array(
- 'id' => 'pojo_a11y_toolbar_button_resize_font',
- 'title' => __( 'Resize Font', 'pojo-accessibility' ),
- 'type' => self::FIELD_SELECT,
- 'class' => $toolbar_options_classes,
- 'options' => array(
- 'enable' => __( 'Enable', 'pojo-accessibility' ),
- 'disable' => __( 'Disable', 'pojo-accessibility' ),
- ),
- 'std' => 'enable',
- );
-
- $fields[] = array(
- 'id' => 'pojo_a11y_toolbar_button_resize_font_add_title',
- 'title' => __( 'Increase Text', 'pojo-accessibility' ),
- 'type' => self::FIELD_TEXT,
- 'class' => $toolbar_options_classes . ' pojo-settings-child-row no-border',
- 'std' => __( 'Increase Text', 'pojo-accessibility' ),
- );
-
- $fields[] = array(
- 'id' => 'pojo_a11y_toolbar_button_resize_font_less_title',
- 'title' => __( 'Decrease Text', 'pojo-accessibility' ),
- 'type' => self::FIELD_TEXT,
- 'class' => $toolbar_options_classes . ' pojo-settings-child-row',
- 'std' => __( 'Decrease Text', 'pojo-accessibility' ),
- );
-
- $fields[] = array(
- 'id' => 'pojo_a11y_toolbar_button_grayscale',
- 'title' => __( 'Grayscale', 'pojo-accessibility' ),
- 'type' => self::FIELD_SELECT,
- 'class' => $toolbar_options_classes,
- 'options' => array(
- 'enable' => __( 'Enable', 'pojo-accessibility' ),
- 'disable' => __( 'Disable', 'pojo-accessibility' ),
- ),
- 'std' => 'enable',
- );
-
- $fields[] = array(
- 'id' => 'pojo_a11y_toolbar_button_grayscale_title',
- 'title' => __( 'Grayscale Title', 'pojo-accessibility' ),
- 'type' => self::FIELD_TEXT,
- 'class' => $toolbar_options_classes . ' pojo-settings-child-row',
- 'std' => __( 'Grayscale', 'pojo-accessibility' ),
- );
-
- $fields[] = array(
- 'id' => 'pojo_a11y_toolbar_button_high_contrast',
- 'title' => __( 'High Contrast', 'pojo-accessibility' ),
- 'type' => self::FIELD_SELECT,
- 'class' => $toolbar_options_classes,
- 'options' => array(
- 'enable' => __( 'Enable', 'pojo-accessibility' ),
- 'disable' => __( 'Disable', 'pojo-accessibility' ),
- ),
- 'std' => 'enable',
- );
-
- $fields[] = array(
- 'id' => 'pojo_a11y_toolbar_button_high_contrast_title',
- 'title' => __( 'High Contrast Title', 'pojo-accessibility' ),
- 'type' => self::FIELD_TEXT,
- 'class' => $toolbar_options_classes . ' pojo-settings-child-row',
- 'std' => __( 'High Contrast', 'pojo-accessibility' ),
- );
-
- $fields[] = array(
- 'id' => 'pojo_a11y_toolbar_button_negative_contrast',
- 'title' => __( 'Negative Contrast', 'pojo-accessibility' ),
- 'type' => self::FIELD_SELECT,
- 'class' => $toolbar_options_classes,
- 'options' => array(
- 'enable' => __( 'Enable', 'pojo-accessibility' ),
- 'disable' => __( 'Disable', 'pojo-accessibility' ),
- ),
- 'std' => 'enable',
- );
-
- $fields[] = array(
- 'id' => 'pojo_a11y_toolbar_button_negative_contrast_title',
- 'title' => __( 'Negative Contrast Title', 'pojo-accessibility' ),
- 'type' => self::FIELD_TEXT,
- 'class' => $toolbar_options_classes . ' pojo-settings-child-row',
- 'std' => __( 'Negative Contrast', 'pojo-accessibility' ),
- );
-
- $fields[] = array(
- 'id' => 'pojo_a11y_toolbar_button_light_bg',
- 'title' => __( 'Light Background', 'pojo-accessibility' ),
- 'type' => self::FIELD_SELECT,
- 'class' => $toolbar_options_classes,
- 'options' => array(
- 'enable' => __( 'Enable', 'pojo-accessibility' ),
- 'disable' => __( 'Disable', 'pojo-accessibility' ),
- ),
- 'std' => 'enable',
- );
-
- $fields[] = array(
- 'id' => 'pojo_a11y_toolbar_button_light_bg_title',
- 'title' => __( 'Light Background Title', 'pojo-accessibility' ),
- 'type' => self::FIELD_TEXT,
- 'class' => $toolbar_options_classes . ' pojo-settings-child-row',
- 'std' => __( 'Light Background', 'pojo-accessibility' ),
- );
-
- $fields[] = array(
- 'id' => 'pojo_a11y_toolbar_button_links_underline',
- 'title' => __( 'Links Underline', 'pojo-accessibility' ),
- 'type' => self::FIELD_SELECT,
- 'class' => $toolbar_options_classes,
- 'options' => array(
- 'enable' => __( 'Enable', 'pojo-accessibility' ),
- 'disable' => __( 'Disable', 'pojo-accessibility' ),
- ),
- 'std' => 'enable',
- );
-
- $fields[] = array(
- 'id' => 'pojo_a11y_toolbar_button_links_underline_title',
- 'title' => __( 'Links Underline Title', 'pojo-accessibility' ),
- 'type' => self::FIELD_TEXT,
- 'class' => $toolbar_options_classes . ' pojo-settings-child-row',
- 'std' => __( 'Links Underline', 'pojo-accessibility' ),
- );
-
- $fields[] = array(
- 'id' => 'pojo_a11y_toolbar_button_readable_font',
- 'title' => __( 'Readable Font', 'pojo-accessibility' ),
- 'type' => self::FIELD_SELECT,
- 'class' => $toolbar_options_classes,
- 'options' => array(
- 'enable' => __( 'Enable', 'pojo-accessibility' ),
- 'disable' => __( 'Disable', 'pojo-accessibility' ),
- ),
- 'std' => 'enable',
- );
-
- $fields[] = array(
- 'id' => 'pojo_a11y_toolbar_button_readable_font_title',
- 'title' => __( 'Readable Font Title', 'pojo-accessibility' ),
- 'type' => self::FIELD_TEXT,
- 'class' => $toolbar_options_classes . ' pojo-settings-child-row',
- 'std' => __( 'Readable Font', 'pojo-accessibility' ),
- );
-
- $fields[] = array(
- 'id' => 'pojo_a11y_toolbar_button_sitemap_title',
- 'title' => __( 'Sitemap Title', 'pojo-accessibility' ),
- 'type' => self::FIELD_TEXT,
- 'class' => $toolbar_options_classes,
- 'std' => __( 'Sitemap', 'pojo-accessibility' ),
- );
-
- $fields[] = array(
- 'id' => 'pojo_a11y_toolbar_button_sitemap_link',
- 'title' => __( 'Sitemap Link', 'pojo-accessibility' ),
- 'type' => self::FIELD_TEXT,
- 'placeholder' => 'http://your-domain.com/sitemap',
- 'desc' => __( 'Link for sitemap page in your website. Leave blank to disable.', 'pojo-accessibility' ),
- 'class' => $toolbar_options_classes . ' pojo-settings-child-row',
- 'std' => '',
- );
-
- $fields[] = array(
- 'id' => 'pojo_a11y_toolbar_button_help_title',
- 'title' => __( 'Help Title', 'pojo-accessibility' ),
- 'type' => self::FIELD_TEXT,
- 'class' => $toolbar_options_classes,
- 'std' => __( 'Help', 'pojo-accessibility' ),
- );
-
- $fields[] = array(
- 'id' => 'pojo_a11y_toolbar_button_help_link',
- 'title' => __( 'Help Link', 'pojo-accessibility' ),
- 'type' => self::FIELD_TEXT,
- 'placeholder' => 'http://your-domain.com/help',
- 'desc' => __( 'Link for help page in your website. Leave blank to disable.', 'pojo-accessibility' ),
- 'class' => $toolbar_options_classes . ' pojo-settings-child-row',
- 'std' => '',
- );
-
- $fields[] = array(
- 'id' => 'pojo_a11y_toolbar_button_feedback_title',
- 'title' => __( 'Feedback Title', 'pojo-accessibility' ),
- 'type' => self::FIELD_TEXT,
- 'class' => $toolbar_options_classes,
- 'std' => __( 'Feedback', 'pojo-accessibility' ),
- );
-
- $fields[] = array(
- 'id' => 'pojo_a11y_toolbar_button_feedback_link',
- 'title' => __( 'Feedback Link', 'pojo-accessibility' ),
- 'type' => self::FIELD_TEXT,
- 'placeholder' => 'http://your-domain.com/feedback',
- 'desc' => __( 'Link for feedback page in your website. Leave blank to disable.', 'pojo-accessibility' ),
- 'class' => $toolbar_options_classes . ' pojo-settings-child-row',
- 'std' => '',
- );
-
- $sections[] = array(
- 'id' => 'section-a11y-toolbar',
- 'page' => self::TOOLBAR_PAGE,
- 'title' => __( 'Toolbar Settings', 'pojo-accessibility' ),
- 'intro' => '',
- 'fields' => $fields,
- );
-
- $sections[] = array(
- 'id' => 'section-a11y-styles',
- 'page' => self::TOOLBAR_PAGE,
- 'title' => __( 'Style Settings', 'pojo-accessibility' ),
- 'intro' => sprintf( __( 'For style settings of accessibility tools go to > Customize > Accessibility .', 'pojo-accessibility' ), $this->get_admin_url( 'customizer' ) ),
- 'fields' => array(),
- );
-
- return $sections;
- }
-
- public function section_a11y_settings( $sections ) {
- $fields = array();
-
- $fields[] = array(
- 'id' => 'pojo_a11y_focusable',
- 'title' => __( 'Add Outline Focus', 'pojo-accessibility' ),
- 'type' => self::FIELD_SELECT,
- 'desc' => __( 'Add outline to elements on keyboard focus.', 'pojo-accessibility' ),
- 'options' => array(
- 'enable' => __( 'Enable', 'pojo-accessibility' ),
- 'disable' => __( 'Disable', 'pojo-accessibility' ),
- ),
- 'std' => 'disable',
- );
-
- $fields[] = array(
- 'id' => 'pojo_a11y_skip_to_content_link',
- 'title' => __( 'Skip to Content link', 'pojo-accessibility' ),
- 'type' => self::FIELD_SELECT,
- 'desc' => __( 'Add skip to content link when using keyboard.', 'pojo-accessibility' ),
- 'options' => array(
- 'enable' => __( 'Enable', 'pojo-accessibility' ),
- 'disable' => __( 'Disable', 'pojo-accessibility' ),
- ),
- 'std' => 'enable',
- );
-
- $fields[] = array(
- 'id' => 'pojo_a11y_skip_to_content_link_element_id',
- 'title' => __( 'Skip to Content Element ID', 'pojo-accessibility' ),
- 'placeholder' => 'content',
- 'type' => self::FIELD_TEXT,
- 'std' => 'content',
- );
-
- $fields[] = array(
- 'id' => 'pojo_a11y_remove_link_target',
- 'title' => __( 'Remove target attribute from links', 'pojo-accessibility' ),
- 'type' => self::FIELD_SELECT,
- 'desc' => __( 'This option will reset all your target links to open in the same window or tab.', 'pojo-accessibility' ),
- 'options' => array(
- 'enable' => __( 'Enable', 'pojo-accessibility' ),
- 'disable' => __( 'Disable', 'pojo-accessibility' ),
- ),
- 'std' => 'disable',
- );
-
- $fields[] = array(
- 'id' => 'pojo_a11y_add_role_links',
- 'title' => __( 'Add landmark roles to all links', 'pojo-accessibility' ),
- 'type' => self::FIELD_SELECT,
- 'desc' => __( 'This option will add role="link" to all links on the page.', 'pojo-accessibility' ),
- 'options' => array(
- 'enable' => __( 'Enable', 'pojo-accessibility' ),
- 'disable' => __( 'Disable', 'pojo-accessibility' ),
- ),
- 'std' => 'enable',
- );
-
- $fields[] = array(
- 'id' => 'pojo_a11y_save',
- 'title' => __( 'Sitewide Accessibility', 'pojo-accessibility' ),
- 'desc' => __( 'Consistent accessibility throughout your site visit. Site remembers you and stays accessible.', 'pojo-accessibility' ),
- 'type' => self::FIELD_SELECT,
- 'options' => array(
- 'enable' => __( 'Enable', 'pojo-accessibility' ),
- 'disable' => __( 'Disable', 'pojo-accessibility' ),
- ),
- 'std' => 'enable',
- );
-
- $fields[] = array(
- 'id' => 'pojo_a11y_save_expiration',
- 'title' => __( 'Remember user for', 'pojo-accessibility' ),
- 'type' => self::FIELD_SELECT,
- 'desc' => __( 'Define how long your toolbar settings will be remembered', 'pojo-accessibility' ),
- 'options' => array(
- '1' => __( '1 Hour', 'pojo-accessibility' ),
- '6' => __( '6 Hours', 'pojo-accessibility' ),
- '12' => __( '12 Hours', 'pojo-accessibility' ),
- '24' => __( '1 Day', 'pojo-accessibility' ),
- '48' => __( '2 Days', 'pojo-accessibility' ),
- '72' => __( '3 Days', 'pojo-accessibility' ),
- '168' => __( '1 Week', 'pojo-accessibility' ),
- '720' => __( '1 Month', 'pojo-accessibility' ),
- ),
- 'std' => '12',
- );
-
- $sections[] = array(
- 'id' => 'section-a11y-settings',
- 'page' => self::SETTINGS_PAGE,
- 'title' => __( 'General Settings', 'pojo-accessibility' ),
- 'intro' => '',
- 'fields' => $fields,
- );
-
- return $sections;
- }
-
- public function print_js() {
- // TODO: Maybe need to move to other file
- ?>
-
- section_a11y_toolbar( $sections );
- $sections = $this->section_a11y_settings( $sections );
- $this->_sections = $sections;
- return $this->_sections;
- }
-
- public function add_settings_section( $args = array() ) {
- $args = wp_parse_args( $args, array(
- 'id' => '',
- 'title' => '',
- ) );
-
- foreach ( $this->_sections as $section ) {
- if ( $args['id'] !== $section['id'] ) {
- continue;
- }
- if ( empty( $section['intro'] ) ) {
- return;
- }
- printf( '%s
', $section['intro'] );
- break;
- }
- }
-
- public function add_settings_field( $args = array() ) {
- if ( empty( $args ) ) {
- return;
- }
-
- $args = wp_parse_args( $args, array(
- 'id' => '',
- 'std' => '',
- 'type' => self::FIELD_TEXT,
- ) );
-
- if ( empty( $args['id'] ) || empty( $args['type'] ) ) {
- return;
- }
-
- $field_callback = 'render_' . $args['type'] . '_field';
- if ( method_exists( $this, $field_callback ) ) {
- call_user_func( array( $this, $field_callback ), $args );
- }
- }
-
- public function render_select_field( $field ) {
- $options = array();
- foreach ( $field['options'] as $option_key => $option_value ) {
- $options[] = sprintf(
- '%3$s ',
- esc_attr( $option_key ),
- selected( get_option( $field['id'], $field['std'] ), $option_key, false ),
- $option_value
- );
- }
- ?>
-
-
-
-
-
-
-
-
- />
-
-
-
-
- get_settings_sections() as $section_key => $section ) {
- add_settings_section(
- $section['id'],
- $section['title'],
- array( &$this, 'add_settings_section' ),
- $section['page']
- );
-
- if ( empty( $section['fields'] ) ) {
- continue;
- }
-
- foreach ( $section['fields'] as $field ) {
- add_settings_field(
- $field['id'],
- $field['title'],
- array( &$this, 'add_settings_field' ),
- $section['page'],
- $section['id'],
- $field
- );
-
- $sanitize_callback = array( $this, 'field_html' );
- if ( ! empty( $field['type'] ) && self::FIELD_CHECKBOX_LIST === $field['type'] ) {
- $sanitize_callback = array( $this, 'field_checkbox_list' );
- }
- if ( ! empty( $field['sanitize_callback'] ) ) {
- $sanitize_callback = $field['sanitize_callback'];
- }
-
- register_setting( $section['page'], $field['id'], $sanitize_callback );
- }
- }
- }
-
- public static function field_html( $input ) {
- return stripslashes( wp_filter_post_kses( addslashes( $input ) ) );
- }
-
- public static function field_checkbox_list( $input ) {
- if ( empty( $input ) ) {
- $input = array();
- }
-
- return $input;
- }
-
- public function display_settings_page() {
- $screen = get_current_screen();
- $screen_id = $screen->id;
- if ( false !== strpos( $screen_id, 'toolbar' ) ) {
- $screen_id = self::TOOLBAR_PAGE;
- }
- ?>
-
-
_page_title; ?>
-
-
-
-
- menu_slug = add_menu_page(
- __( 'Accessibility', 'pojo-accessibility' ),
- __( 'Accessibility', 'pojo-accessibility' ),
- 'manage_options',
- 'accessibility-settings',
- array( &$this, 'display_settings_page' ),
- 'dashicons-universal-access-alt'
- );
- add_submenu_page(
- 'accessibility-settings',
- __( 'Accessibility Settings', 'pojo-accessibility' ),
- __( 'Settings', 'pojo-accessibility' ),
- 'manage_options',
- 'accessibility-settings',
- array( &$this, 'display_settings_page' )
- );
- add_submenu_page(
- 'accessibility-settings',
- __( 'Accessibility Toolbar', 'pojo-accessibility' ),
- __( 'Toolbar', 'pojo-accessibility' ),
- 'manage_options',
- 'accessibility-toolbar',
- array( &$this, 'display_settings_page' )
- );
- add_submenu_page(
- 'accessibility-settings',
- __( 'Customize', 'pojo-accessibility' ),
- __( 'Customize', 'pojo-accessibility' ),
- 'manage_options',
- '/customize.php?autofocus[section]=accessibility'
- );
- }
-
- public function plugin_action_links( $links, $plugin_file ) {
- if ( POJO_A11Y_BASE === $plugin_file ) {
- $settings = '' . __( 'Settings', 'pojo-accessibility' ) . ' ';
- $toolbar = '' . __( 'Toolbar', 'pojo-accessibility' ) . ' ';
- $customizer = '' . __( 'Customize', 'pojo-accessibility' ) . ' ';
- array_unshift( $links, $customizer );
- array_unshift( $links, $toolbar );
- array_unshift( $links, $settings );
- }
- return $links;
- }
-
- private function get_admin_url( $type ) {
- switch ( $type ) {
- case 'customizer':
- return admin_url( 'customize.php?autofocus[section]=accessibility' );
- break;
- case 'general':
- return admin_url( 'admin.php?page=accessibility-settings' );
- break;
- case 'toolbar':
- return admin_url( 'admin.php?page=accessibility-toolbar' );
- break;
- }
- }
-
- private function get_default_values() {
- if ( empty( $this->_defaults ) ) {
- if ( empty( $this->_sections ) ) {
- $this->get_settings_sections();
- }
- $defaults = array();
- foreach ( $this->_sections as $section ) {
- foreach ( $section['fields'] as $field ) {
- $defaults[ $field['id'] ] = isset( $field['std'] ) ? $field['std'] : '';
- }
- }
- $this->_defaults = $defaults;
- }
- }
-
- public function get_default_title_text( $option ) {
- $this->get_default_values();
- $default = isset( $this->_defaults[ $option ] ) ? $this->_defaults[ $option ] : '';
-
- return get_option( $option, $default );
- }
-
- public function __construct() {
- $this->_page_title = __( 'One Click Accessibility', 'pojo-accessibility' );
- $this->_page_menu_title = __( 'One Click Accessibility', 'pojo-accessibility' );
- $this->_menu_parent = 'themes.php';
-
- add_action( 'admin_menu', array( &$this, 'admin_menu' ), 20 );
- add_action( 'admin_init', array( &$this, 'admin_init' ), 20 );
- add_action( 'admin_footer', array( &$this, 'print_js' ) );
- add_filter( 'plugin_action_links_' . POJO_A11Y_BASE, [ $this, 'plugin_action_links' ], 10, 2 );
- }
-}
\ No newline at end of file
diff --git a/assets/css/style.css b/modules/legacy/assets/css/style.css
similarity index 100%
rename from assets/css/style.css
rename to modules/legacy/assets/css/style.css
diff --git a/assets/css/style.min.css b/modules/legacy/assets/css/style.min.css
similarity index 100%
rename from assets/css/style.min.css
rename to modules/legacy/assets/css/style.min.css
diff --git a/assets/js/app.dev.js b/modules/legacy/assets/js/app.dev.js
similarity index 100%
rename from assets/js/app.dev.js
rename to modules/legacy/assets/js/app.dev.js
diff --git a/assets/js/app.min.js b/modules/legacy/assets/js/app.min.js
similarity index 100%
rename from assets/js/app.min.js
rename to modules/legacy/assets/js/app.min.js
diff --git a/assets/js/skip-link-focus-fix.js b/modules/legacy/assets/js/skip-link-focus-fix.js
similarity index 100%
rename from assets/js/skip-link-focus-fix.js
rename to modules/legacy/assets/js/skip-link-focus-fix.js
diff --git a/assets/less/_background.less b/modules/legacy/assets/less/_background.less
similarity index 100%
rename from assets/less/_background.less
rename to modules/legacy/assets/less/_background.less
diff --git a/assets/less/_high-contrast.less b/modules/legacy/assets/less/_high-contrast.less
similarity index 100%
rename from assets/less/_high-contrast.less
rename to modules/legacy/assets/less/_high-contrast.less
diff --git a/assets/less/_mixing.less b/modules/legacy/assets/less/_mixing.less
similarity index 100%
rename from assets/less/_mixing.less
rename to modules/legacy/assets/less/_mixing.less
diff --git a/assets/less/_toolbar.less b/modules/legacy/assets/less/_toolbar.less
similarity index 100%
rename from assets/less/_toolbar.less
rename to modules/legacy/assets/less/_toolbar.less
diff --git a/assets/less/_underline.less b/modules/legacy/assets/less/_underline.less
similarity index 100%
rename from assets/less/_underline.less
rename to modules/legacy/assets/less/_underline.less
diff --git a/assets/less/_visibility.less b/modules/legacy/assets/less/_visibility.less
similarity index 100%
rename from assets/less/_visibility.less
rename to modules/legacy/assets/less/_visibility.less
diff --git a/assets/less/style.less b/modules/legacy/assets/less/style.less
similarity index 100%
rename from assets/less/style.less
rename to modules/legacy/assets/less/style.less
diff --git a/includes/pojo-a11y-admin-ui.php b/modules/legacy/components/admin.php
similarity index 93%
rename from includes/pojo-a11y-admin-ui.php
rename to modules/legacy/components/admin.php
index 05c963a8..ffc15fd2 100644
--- a/includes/pojo-a11y-admin-ui.php
+++ b/modules/legacy/components/admin.php
@@ -1,23 +1,27 @@
_is_elementor_installed() ) {
+ if ( ! current_user_can( 'install_plugins' ) || Utils::is_elementor_installed() ) {
return;
}
@@ -152,7 +156,7 @@ public function admin_footer_text( $footer_text ) {
$current_screen = get_current_screen();
if ( in_array( $current_screen->id, array( self::SETTINGS_SLUG, self::TOOLBAR_SLUG ) ) ) {
$footer_text = sprintf(
- /* translators: 1: One Click Accessibility, 2: Link to plugin review */
+ /* translators: 1: One Click Accessibility, 2: Link to plugin review */
__( 'Enjoyed %1$s? Please leave us a %2$s rating. We really appreciate your support!', 'pojo-accessibility' ),
'' . __( 'One Click Accessibility', 'pojo-accessibility' ) . ' ',
'★★★★★ '
diff --git a/includes/pojo-a11y-customizer.php b/modules/legacy/components/customizer.php
similarity index 50%
rename from includes/pojo-a11y-customizer.php
rename to modules/legacy/components/customizer.php
index ed8985fa..464c831f 100644
--- a/includes/pojo-a11y-customizer.php
+++ b/modules/legacy/components/customizer.php
@@ -1,158 +1,166 @@
'a11y_toolbar_icon',
- 'title' => __( 'Toolbar Icon', 'pojo-accessibility' ),
- 'type' => 'select',
- 'choices' => array(
- 'one-click' => __( 'One Click', 'pojo-accessibility' ),
- 'wheelchair' => __( 'Wheelchair', 'pojo-accessibility' ),
+ $fields = [];
+
+ $fields[] = [
+ 'id' => 'a11y_toolbar_icon',
+ 'title' => __( 'Toolbar Icon', 'pojo-accessibility' ),
+ 'type' => 'select',
+ 'choices' => [
+ 'one-click' => __( 'One Click', 'pojo-accessibility' ),
+ 'wheelchair' => __( 'Wheelchair', 'pojo-accessibility' ),
'accessibility' => __( 'Accessibility', 'pojo-accessibility' ),
- ),
- 'std' => 'one-click',
+ ],
+ 'std' => 'one-click',
'description' => __( 'Set Toolbar Icon', 'pojo-accessibility' ),
- );
-
- $fields[] = array(
- 'id' => 'a11y_toolbar_position',
- 'title' => __( 'Toolbar Position', 'pojo-accessibility' ),
- 'type' => 'select',
- 'choices' => array(
- 'left' => __( 'Left', 'pojo-accessibility' ),
+ ];
+
+ $fields[] = [
+ 'id' => 'a11y_toolbar_position',
+ 'title' => __( 'Toolbar Position', 'pojo-accessibility' ),
+ 'type' => 'select',
+ 'choices' => [
+ 'left' => __( 'Left', 'pojo-accessibility' ),
'right' => __( 'Right', 'pojo-accessibility' ),
- ),
- 'std' => is_rtl() ? 'right' : 'left',
+ ],
+ 'std' => is_rtl() ? 'right' : 'left',
'description' => __( 'Set Toolbar Position', 'pojo-accessibility' ),
- );
+ ];
- $fields[] = array(
- 'id' => 'a11y_toolbar_distance_top',
- 'title' => __( 'Offset from Top (Desktop)', 'pojo-accessibility' ),
- 'type' => 'text',
- 'std' => '100px',
+ $fields[] = [
+ 'id' => 'a11y_toolbar_distance_top',
+ 'title' => __( 'Offset from Top (Desktop)', 'pojo-accessibility' ),
+ 'type' => 'text',
+ 'std' => '100px',
'description' => __( 'Set Toolbar top offset (Desktop)', 'pojo-accessibility' ),
- );
+ ];
- $fields[] = array(
- 'id' => 'a11y_toolbar_distance_top_mobile',
- 'title' => __( 'Offset from Top (Mobile)', 'pojo-accessibility' ),
- 'type' => 'text',
- 'std' => '50px',
+ $fields[] = [
+ 'id' => 'a11y_toolbar_distance_top_mobile',
+ 'title' => __( 'Offset from Top (Mobile)', 'pojo-accessibility' ),
+ 'type' => 'text',
+ 'std' => '50px',
'description' => __( 'Set Toolbar top offset (Mobile)', 'pojo-accessibility' ),
- );
-
- $fields[] = array(
- 'id' => 'a11y_bg_toolbar',
- 'title' => __( 'Toolbar Background', 'pojo-accessibility' ),
- 'type' => 'color',
- 'std' => '#ffffff',
- 'selector' => '#pojo-a11y-toolbar .pojo-a11y-toolbar-overlay',
+ ];
+
+ $fields[] = [
+ 'id' => 'a11y_bg_toolbar',
+ 'title' => __( 'Toolbar Background', 'pojo-accessibility' ),
+ 'type' => 'color',
+ 'std' => '#ffffff',
+ 'selector' => '#pojo-a11y-toolbar .pojo-a11y-toolbar-overlay',
'change_type' => 'bg_color',
'description' => __( 'Set Toolbar background color', 'pojo-accessibility' ),
- );
-
- $fields[] = array(
- 'id' => 'a11y_color_toolbar',
- 'title' => __( 'Toolbar Color', 'pojo-accessibility' ),
- 'type' => 'color',
- 'std' => '#333333',
- 'selector' => '#pojo-a11y-toolbar .pojo-a11y-toolbar-overlay ul.pojo-a11y-toolbar-items li.pojo-a11y-toolbar-item a, #pojo-a11y-toolbar .pojo-a11y-toolbar-overlay p.pojo-a11y-toolbar-title',
+ ];
+
+ $fields[] = [
+ 'id' => 'a11y_color_toolbar',
+ 'title' => __( 'Toolbar Color', 'pojo-accessibility' ),
+ 'type' => 'color',
+ 'std' => '#333333',
+ 'selector' => '#pojo-a11y-toolbar .pojo-a11y-toolbar-overlay ul.pojo-a11y-toolbar-items li.pojo-a11y-toolbar-item a, #pojo-a11y-toolbar .pojo-a11y-toolbar-overlay p.pojo-a11y-toolbar-title',
'change_type' => 'color',
'description' => __( 'Set Toolbar text color', 'pojo-accessibility' ),
- );
+ ];
- $fields[] = array(
- 'id' => 'a11y_toggle_button_bg_color',
- 'title' => __( 'Toggle Button Background', 'pojo-accessibility' ),
- 'type' => 'color',
- 'std' => '#4054b2',
+ $fields[] = [
+ 'id' => 'a11y_toggle_button_bg_color',
+ 'title' => __( 'Toggle Button Background', 'pojo-accessibility' ),
+ 'type' => 'color',
+ 'std' => '#4054b2',
'description' => __( 'Set Toolbar toggle button background color', 'pojo-accessibility' ),
- );
-
- $fields[] = array(
- 'id' => 'a11y_toggle_button_color',
- 'title' => __( 'Toggle Button Color', 'pojo-accessibility' ),
- 'type' => 'color',
- 'std' => '#ffffff',
- 'selector' => '#pojo-a11y-toolbar .pojo-a11y-toolbar-toggle a',
+ ];
+
+ $fields[] = [
+ 'id' => 'a11y_toggle_button_color',
+ 'title' => __( 'Toggle Button Color', 'pojo-accessibility' ),
+ 'type' => 'color',
+ 'std' => '#ffffff',
+ 'selector' => '#pojo-a11y-toolbar .pojo-a11y-toolbar-toggle a',
'change_type' => 'color',
'description' => __( 'Set Toolbar toggle button icon color', 'pojo-accessibility' ),
- );
-
- $fields[] = array(
- 'id' => 'a11y_bg_active',
- 'title' => __( 'Active Background', 'pojo-accessibility' ),
- 'type' => 'color',
- 'std' => '#4054b2',
- 'selector' => '#pojo-a11y-toolbar .pojo-a11y-toolbar-overlay ul.pojo-a11y-toolbar-items li.pojo-a11y-toolbar-item a.active',
+ ];
+
+ $fields[] = [
+ 'id' => 'a11y_bg_active',
+ 'title' => __( 'Active Background', 'pojo-accessibility' ),
+ 'type' => 'color',
+ 'std' => '#4054b2',
+ 'selector' => '#pojo-a11y-toolbar .pojo-a11y-toolbar-overlay ul.pojo-a11y-toolbar-items li.pojo-a11y-toolbar-item a.active',
'change_type' => 'bg_color',
'description' => __( 'Set Toolbar active background color', 'pojo-accessibility' ),
- );
-
- $fields[] = array(
- 'id' => 'a11y_color_active',
- 'title' => __( 'Active Color', 'pojo-accessibility' ),
- 'type' => 'color',
- 'std' => '#ffffff',
- 'selector' => '#pojo-a11y-toolbar .pojo-a11y-toolbar-overlay ul.pojo-a11y-toolbar-items li.pojo-a11y-toolbar-item a.active',
+ ];
+
+ $fields[] = [
+ 'id' => 'a11y_color_active',
+ 'title' => __( 'Active Color', 'pojo-accessibility' ),
+ 'type' => 'color',
+ 'std' => '#ffffff',
+ 'selector' => '#pojo-a11y-toolbar .pojo-a11y-toolbar-overlay ul.pojo-a11y-toolbar-items li.pojo-a11y-toolbar-item a.active',
'change_type' => 'color',
'description' => __( 'Set Toolbar active text color', 'pojo-accessibility' ),
- );
-
- $fields[] = array(
- 'id' => 'a11y_focus_outline_style',
- 'title' => __( 'Focus Outline Style', 'pojo-accessibility' ),
- 'type' => 'select',
- 'choices' => array(
- 'solid' => __( 'Solid', 'pojo-accessibility' ),
- 'dotted' => __( 'Dotted', 'pojo-accessibility' ),
- 'dashed' => __( 'Dashed', 'pojo-accessibility' ),
- 'double' => __( 'Double', 'pojo-accessibility' ),
- 'groove' => __( 'Groove', 'pojo-accessibility' ),
- 'ridge' => __( 'Ridge', 'pojo-accessibility' ),
- 'outset' => __( 'Outset', 'pojo-accessibility' ),
+ ];
+
+ $fields[] = [
+ 'id' => 'a11y_focus_outline_style',
+ 'title' => __( 'Focus Outline Style', 'pojo-accessibility' ),
+ 'type' => 'select',
+ 'choices' => [
+ 'solid' => __( 'Solid', 'pojo-accessibility' ),
+ 'dotted' => __( 'Dotted', 'pojo-accessibility' ),
+ 'dashed' => __( 'Dashed', 'pojo-accessibility' ),
+ 'double' => __( 'Double', 'pojo-accessibility' ),
+ 'groove' => __( 'Groove', 'pojo-accessibility' ),
+ 'ridge' => __( 'Ridge', 'pojo-accessibility' ),
+ 'outset' => __( 'Outset', 'pojo-accessibility' ),
'initial' => __( 'Initial', 'pojo-accessibility' ),
- ),
- 'std' => 'solid',
+ ],
+ 'std' => 'solid',
'description' => __( 'Set Focus outline style', 'pojo-accessibility' ),
- );
-
- $fields[] = array(
- 'id' => 'a11y_focus_outline_width',
- 'title' => __( 'Focus Outline Width', 'pojo-accessibility' ),
- 'type' => 'select',
- 'choices' => array(
- '1px' => '1px',
- '2px' => '2px',
- '3px' => '3px',
- '4px' => '4px',
- '5px' => '5px',
- '6px' => '6px',
- '7px' => '7px',
- '8px' => '8px',
- '9px' => '9px',
+ ];
+
+ $fields[] = [
+ 'id' => 'a11y_focus_outline_width',
+ 'title' => __( 'Focus Outline Width', 'pojo-accessibility' ),
+ 'type' => 'select',
+ 'choices' => [
+ '1px' => '1px',
+ '2px' => '2px',
+ '3px' => '3px',
+ '4px' => '4px',
+ '5px' => '5px',
+ '6px' => '6px',
+ '7px' => '7px',
+ '8px' => '8px',
+ '9px' => '9px',
'10px' => '10px',
- ),
- 'std' => '1px',
+ ],
+ 'std' => '1px',
'description' => __( 'Set Focus outline width', 'pojo-accessibility' ),
- );
+ ];
- $fields[] = array(
- 'id' => 'a11y_focus_outline_color',
- 'title' => __( 'Focus Outline Color', 'pojo-accessibility' ),
- 'type' => 'color',
- 'std' => '#FF0000',
+ $fields[] = [
+ 'id' => 'a11y_focus_outline_color',
+ 'title' => __( 'Focus Outline Color', 'pojo-accessibility' ),
+ 'type' => 'color',
+ 'std' => '#FF0000',
'description' => __( 'Set Focus outline color', 'pojo-accessibility' ),
- );
+ ];
return $fields;
}
@@ -162,51 +170,52 @@ public function customize_a11y( $wp_customize ) {
$section_description = '' . __( 'Use the control below to customize the appearance and layout of the Accessibility Toolbar', 'pojo-accessibility' ) . '
' .
sprintf( __( 'Additional Toolbar settings can be configured at the %s page.', 'pojo-accessibility' ),
- '' . __( 'Accessibility Toolbar', 'pojo-accessibility' ) . ' '
+ '' . __( 'Accessibility Toolbar', 'pojo-accessibility' ) . ' '
) . '
';
- $wp_customize->add_section( 'accessibility', array(
- 'title' => __( 'Accessibility', 'pojo-accessibility' ),
- 'priority' => 30,
+ $wp_customize->add_section( 'accessibility', [
+ 'title' => __( 'Accessibility', 'pojo-accessibility' ),
+ 'priority' => 30,
'description' => $section_description,
- ) );
+ ] );
foreach ( $fields as $field ) {
$customizer_id = POJO_A11Y_CUSTOMIZER_OPTIONS . '[' . $field['id'] . ']';
- $wp_customize->add_setting( $customizer_id, array(
+ $wp_customize->add_setting( $customizer_id, [
'default' => $field['std'] ? $field['std'] : null,
- 'type' => 'option',
- ) );
+ 'type' => 'option',
+ ] );
switch ( $field['type'] ) {
case 'color':
- $wp_customize->add_control( new WP_Customize_Color_Control( $wp_customize, $field['id'], array(
- 'label' => $field['title'],
- 'section' => 'accessibility',
- 'settings' => $customizer_id,
+ $wp_customize->add_control( new \WP_Customize_Color_Control( $wp_customize, $field['id'], [
+ 'label' => $field['title'],
+ 'section' => 'accessibility',
+ 'settings' => $customizer_id,
'description' => isset( $field['description'] ) ? $field['description'] : null,
- ) ) );
+ ] ) );
break;
case 'select':
case 'text':
- $wp_customize->add_control( $field['id'], array(
- 'label' => $field['title'],
- 'section' => 'accessibility',
- 'settings' => $customizer_id,
- 'type' => $field['type'],
- 'choices' => isset( $field['choices'] ) ? $field['choices'] : null,
+ $wp_customize->add_control( $field['id'], [
+ 'label' => $field['title'],
+ 'section' => 'accessibility',
+ 'settings' => $customizer_id,
+ 'type' => $field['type'],
+ 'choices' => isset( $field['choices'] ) ? $field['choices'] : null,
'description' => isset( $field['description'] ) ? $field['description'] : null,
- ) );
+ ] );
break;
}
}
}
public function get_custom_css_code() {
- $options = $this->get_customizer_options();
+ $options = $this->get_customizer_options();
$bg_color = $options['a11y_toggle_button_bg_color']; // get_theme_mod( 'a11y_toggle_button_bg_color', '#4054b2' );
if ( ! empty( $bg_color ) ) {
$this->add_css_rule( '#pojo-a11y-toolbar .pojo-a11y-toolbar-toggle a', 'background-color', $bg_color );
- $this->add_css_rule( '#pojo-a11y-toolbar .pojo-a11y-toolbar-overlay, #pojo-a11y-toolbar .pojo-a11y-toolbar-overlay ul.pojo-a11y-toolbar-items.pojo-a11y-links', 'border-color', $bg_color );
+ $this->add_css_rule( '#pojo-a11y-toolbar .pojo-a11y-toolbar-overlay, #pojo-a11y-toolbar .pojo-a11y-toolbar-overlay ul.pojo-a11y-toolbar-items.pojo-a11y-links',
+ 'border-color', $bg_color );
}
$outline_style = $options['a11y_focus_outline_style']; //get_theme_mod( 'a11y_focus_outline_style', 'solid' );
@@ -255,12 +264,13 @@ private function get_customizer_options() {
if ( false === $options ) {
$options = get_option( POJO_A11Y_CUSTOMIZER_OPTIONS );
}
+
return $options;
}
private function add_css_rule( $selector, $rule, $value ) {
if ( ! isset( $this->css_rules[ $selector ] ) ) {
- $this->css_rules[ $selector ] = array();
+ $this->css_rules[ $selector ] = [];
}
$this->css_rules[ $selector ][] = $rule . ': ' . $value . ';';
}
@@ -279,7 +289,7 @@ public function print_css_code() {
}
public function __construct() {
- add_filter( 'customize_register', array( &$this, 'customize_a11y' ), 610 );
- add_filter( 'wp_head', array( &$this, 'print_css_code' ) );
+ add_filter( 'customize_register', [ $this, 'customize_a11y' ], 610 );
+ add_filter( 'wp_head', [ $this, 'print_css_code' ] );
}
-}
\ No newline at end of file
+}
diff --git a/includes/pojo-a11y-elementor.php b/modules/legacy/components/elementor.php
similarity index 66%
rename from includes/pojo-a11y-elementor.php
rename to modules/legacy/components/elementor.php
index 819c1aa5..a260e5c6 100644
--- a/includes/pojo-a11y-elementor.php
+++ b/modules/legacy/components/elementor.php
@@ -1,8 +1,15 @@
preview->is_preview_mode() ) {
$is_active = false;
diff --git a/includes/pojo-a11y-frontend.php b/modules/legacy/components/frontend.php
similarity index 89%
rename from includes/pojo-a11y-frontend.php
rename to modules/legacy/components/frontend.php
index 05a56599..1e957e17 100644
--- a/includes/pojo-a11y-frontend.php
+++ b/modules/legacy/components/frontend.php
@@ -1,8 +1,18 @@
settings->get_default_title_text( "pojo_a11y_toolbar_button_{$button_type}_title" );
+ /**
+ * @var Settings $settings
+ */
+ $settings = Module::get_settings();
+ $title = $settings->get_default_title_text( "pojo_a11y_toolbar_button_{$button_type}_title" );
return '' . $this->get_toolbar_svg( $button_type, $title ) . ' ' . $title . ' ';
}
public function enqueue_scripts() {
wp_register_script(
'pojo-a11y',
- POJO_A11Y_ASSETS_URL . 'js/app.min.js',
- array(
- 'jquery',
- ),
+ EA11Y_URL . 'modules/legacy/js/app.min.js',
+ [ 'jquery' ],
'1.0.0',
true
);
wp_register_style(
'pojo-a11y',
- POJO_A11Y_ASSETS_URL . 'css/style.min.css',
- array(),
+ EA11Y_URL . 'modules/legacy/assets/css/style.min.css',
+ [],
'1.0.0'
);
@@ -46,13 +58,13 @@ public function enqueue_scripts() {
wp_localize_script(
'pojo-a11y',
'PojoA11yOptions',
- array(
+ [
'focusable' => ( 'enable' === get_option( 'pojo_a11y_focusable' ) ),
'remove_link_target' => ( 'enable' === get_option( 'pojo_a11y_remove_link_target' ) ),
'add_role_links' => ( 'enable' === get_option( 'pojo_a11y_add_role_links' ) ),
'enable_save' => ( 'enable' === get_option( 'pojo_a11y_save' ) ),
'save_expiration' => get_option( 'pojo_a11y_save_expiration' ),
- )
+ ]
);
}
@@ -77,16 +89,16 @@ public function print_toolbar() {
$customizer_options = get_option( POJO_A11Y_CUSTOMIZER_OPTIONS );
$toolbar_position = $customizer_options['a11y_toolbar_position'];
- if ( empty( $toolbar_position ) || ! in_array( $toolbar_position, array( 'right', 'left' ) ) ) {
+ if ( empty( $toolbar_position ) || ! in_array( $toolbar_position, [ 'right', 'left' ] ) ) {
$toolbar_position = 'left';
}
-
- $toolbar_title = Pojo_Accessibility::$instance->settings->get_default_title_text( 'pojo_a11y_toolbar_title' );
+ $settings = Module::get_settings();
+ $toolbar_title = $settings->get_default_title_text( 'pojo_a11y_toolbar_title' );
$toolbar_visibility = get_option( 'pojo_a11y_toolbar' );
- $wrapper_classes = array(
+ $wrapper_classes = [
'pojo-a11y-toolbar-' . $toolbar_position,
- );
+ ];
if ( 'enable' !== $toolbar_visibility ) {
$wrapper_classes[] = 'pojo-a11y-' . $toolbar_visibility;
@@ -114,7 +126,7 @@ public function print_toolbar() {
@@ -219,7 +231,7 @@ public function print_toolbar() {
}
private function get_toolbar_svg( $icon, $icon_title = '' ) {
- $icons = array(
+ $icons = [
'resize_font_add' => ' ',
'resize_font_less' => ' ',
'grayscale' => ' ',
@@ -232,7 +244,7 @@ private function get_toolbar_svg( $icon, $icon_title = '' ) {
'sitemap' => ' ',
'help' => ' ',
'feedback' => ' ',
- );
+ ];
if ( isset( $icons[ $icon ] ) ) {
$icon_title_html = '';
@@ -248,11 +260,11 @@ private function get_toolbar_svg( $icon, $icon_title = '' ) {
private function get_svg_icon( $icon ) {
if ( null === $this->svg_icons ) {
- $this->svg_icons = array(
+ $this->svg_icons = [
'wheelchair' => ' ',
'one-click' => ' ',
'accessibility' => ' ',
- );
+ ];
}
if ( isset( $this->svg_icons[ $icon ] ) ) {
@@ -263,10 +275,8 @@ private function get_svg_icon( $icon ) {
}
public function __construct() {
- add_action( 'wp_enqueue_scripts', array( &$this, 'enqueue_scripts' ) );
-
- add_action( 'wp_footer', array( &$this, 'print_skip_to_content_link' ), 20 );
- add_action( 'wp_footer', array( &$this, 'print_toolbar' ), 30 );
+ add_action( 'wp_enqueue_scripts', [ $this, 'enqueue_scripts' ] );
+ add_action( 'wp_footer', [ $this, 'print_skip_to_content_link' ], 20 );
+ add_action( 'wp_footer', [ $this, 'print_toolbar' ], 30 );
}
-
}
diff --git a/modules/legacy/components/settings.php b/modules/legacy/components/settings.php
new file mode 100644
index 00000000..6e86fb4d
--- /dev/null
+++ b/modules/legacy/components/settings.php
@@ -0,0 +1,671 @@
+ 'pojo_a11y_toolbar',
+ 'title' => __( 'Display Toolbar', 'pojo-accessibility' ),
+ 'type' => self::FIELD_SELECT,
+ 'options' => [
+ 'enable' => __( 'Show on all devices', 'pojo-accessibility' ),
+ 'visible-desktop' => __( 'Visible Desktop', 'pojo-accessibility' ),
+ 'visible-tablet' => __( 'Visible Tablet', 'pojo-accessibility' ),
+ 'visible-phone' => __( 'Visible Phone', 'pojo-accessibility' ),
+ 'hidden-desktop' => __( 'Hidden Desktop', 'pojo-accessibility' ),
+ 'hidden-tablet' => __( 'Hidden Tablet', 'pojo-accessibility' ),
+ 'hidden-phone' => __( 'Hidden Phone', 'pojo-accessibility' ),
+ 'disable' => __( 'Disable', 'pojo-accessibility' ),
+ ],
+ 'std' => 'enable',
+ ];
+
+ $toolbar_options_classes = 'pojo-a11y-toolbar-button';
+
+ $fields[] = [
+ 'id' => 'pojo_a11y_toolbar_title',
+ 'title' => __( 'Title', 'pojo-accessibility' ),
+ 'type' => self::FIELD_TEXT,
+ 'desc' => __( 'Title top of the toolbar (recommended).', 'pojo-accessibility' ),
+ 'class' => $toolbar_options_classes,
+ 'std' => __( 'Accessibility Tools', 'pojo-accessibility' ),
+ ];
+
+ $fields[] = [
+ 'id' => 'pojo_a11y_toolbar_button_resize_font',
+ 'title' => __( 'Resize Font', 'pojo-accessibility' ),
+ 'type' => self::FIELD_SELECT,
+ 'class' => $toolbar_options_classes,
+ 'options' => [
+ 'enable' => __( 'Enable', 'pojo-accessibility' ),
+ 'disable' => __( 'Disable', 'pojo-accessibility' ),
+ ],
+ 'std' => 'enable',
+ ];
+
+ $fields[] = [
+ 'id' => 'pojo_a11y_toolbar_button_resize_font_add_title',
+ 'title' => __( 'Increase Text', 'pojo-accessibility' ),
+ 'type' => self::FIELD_TEXT,
+ 'class' => $toolbar_options_classes . ' pojo-settings-child-row no-border',
+ 'std' => __( 'Increase Text', 'pojo-accessibility' ),
+ ];
+
+ $fields[] = [
+ 'id' => 'pojo_a11y_toolbar_button_resize_font_less_title',
+ 'title' => __( 'Decrease Text', 'pojo-accessibility' ),
+ 'type' => self::FIELD_TEXT,
+ 'class' => $toolbar_options_classes . ' pojo-settings-child-row',
+ 'std' => __( 'Decrease Text', 'pojo-accessibility' ),
+ ];
+
+ $fields[] = [
+ 'id' => 'pojo_a11y_toolbar_button_grayscale',
+ 'title' => __( 'Grayscale', 'pojo-accessibility' ),
+ 'type' => self::FIELD_SELECT,
+ 'class' => $toolbar_options_classes,
+ 'options' => [
+ 'enable' => __( 'Enable', 'pojo-accessibility' ),
+ 'disable' => __( 'Disable', 'pojo-accessibility' ),
+ ],
+ 'std' => 'enable',
+ ];
+
+ $fields[] = [
+ 'id' => 'pojo_a11y_toolbar_button_grayscale_title',
+ 'title' => __( 'Grayscale Title', 'pojo-accessibility' ),
+ 'type' => self::FIELD_TEXT,
+ 'class' => $toolbar_options_classes . ' pojo-settings-child-row',
+ 'std' => __( 'Grayscale', 'pojo-accessibility' ),
+ ];
+
+ $fields[] = [
+ 'id' => 'pojo_a11y_toolbar_button_high_contrast',
+ 'title' => __( 'High Contrast', 'pojo-accessibility' ),
+ 'type' => self::FIELD_SELECT,
+ 'class' => $toolbar_options_classes,
+ 'options' => [
+ 'enable' => __( 'Enable', 'pojo-accessibility' ),
+ 'disable' => __( 'Disable', 'pojo-accessibility' ),
+ ],
+ 'std' => 'enable',
+ ];
+
+ $fields[] = [
+ 'id' => 'pojo_a11y_toolbar_button_high_contrast_title',
+ 'title' => __( 'High Contrast Title', 'pojo-accessibility' ),
+ 'type' => self::FIELD_TEXT,
+ 'class' => $toolbar_options_classes . ' pojo-settings-child-row',
+ 'std' => __( 'High Contrast', 'pojo-accessibility' ),
+ ];
+
+ $fields[] = [
+ 'id' => 'pojo_a11y_toolbar_button_negative_contrast',
+ 'title' => __( 'Negative Contrast', 'pojo-accessibility' ),
+ 'type' => self::FIELD_SELECT,
+ 'class' => $toolbar_options_classes,
+ 'options' => [
+ 'enable' => __( 'Enable', 'pojo-accessibility' ),
+ 'disable' => __( 'Disable', 'pojo-accessibility' ),
+ ],
+ 'std' => 'enable',
+ ];
+
+ $fields[] = [
+ 'id' => 'pojo_a11y_toolbar_button_negative_contrast_title',
+ 'title' => __( 'Negative Contrast Title', 'pojo-accessibility' ),
+ 'type' => self::FIELD_TEXT,
+ 'class' => $toolbar_options_classes . ' pojo-settings-child-row',
+ 'std' => __( 'Negative Contrast', 'pojo-accessibility' ),
+ ];
+
+ $fields[] = [
+ 'id' => 'pojo_a11y_toolbar_button_light_bg',
+ 'title' => __( 'Light Background', 'pojo-accessibility' ),
+ 'type' => self::FIELD_SELECT,
+ 'class' => $toolbar_options_classes,
+ 'options' => [
+ 'enable' => __( 'Enable', 'pojo-accessibility' ),
+ 'disable' => __( 'Disable', 'pojo-accessibility' ),
+ ],
+ 'std' => 'enable',
+ ];
+
+ $fields[] = [
+ 'id' => 'pojo_a11y_toolbar_button_light_bg_title',
+ 'title' => __( 'Light Background Title', 'pojo-accessibility' ),
+ 'type' => self::FIELD_TEXT,
+ 'class' => $toolbar_options_classes . ' pojo-settings-child-row',
+ 'std' => __( 'Light Background', 'pojo-accessibility' ),
+ ];
+
+ $fields[] = [
+ 'id' => 'pojo_a11y_toolbar_button_links_underline',
+ 'title' => __( 'Links Underline', 'pojo-accessibility' ),
+ 'type' => self::FIELD_SELECT,
+ 'class' => $toolbar_options_classes,
+ 'options' => [
+ 'enable' => __( 'Enable', 'pojo-accessibility' ),
+ 'disable' => __( 'Disable', 'pojo-accessibility' ),
+ ],
+ 'std' => 'enable',
+ ];
+
+ $fields[] = [
+ 'id' => 'pojo_a11y_toolbar_button_links_underline_title',
+ 'title' => __( 'Links Underline Title', 'pojo-accessibility' ),
+ 'type' => self::FIELD_TEXT,
+ 'class' => $toolbar_options_classes . ' pojo-settings-child-row',
+ 'std' => __( 'Links Underline', 'pojo-accessibility' ),
+ ];
+
+ $fields[] = [
+ 'id' => 'pojo_a11y_toolbar_button_readable_font',
+ 'title' => __( 'Readable Font', 'pojo-accessibility' ),
+ 'type' => self::FIELD_SELECT,
+ 'class' => $toolbar_options_classes,
+ 'options' => [
+ 'enable' => __( 'Enable', 'pojo-accessibility' ),
+ 'disable' => __( 'Disable', 'pojo-accessibility' ),
+ ],
+ 'std' => 'enable',
+ ];
+
+ $fields[] = [
+ 'id' => 'pojo_a11y_toolbar_button_readable_font_title',
+ 'title' => __( 'Readable Font Title', 'pojo-accessibility' ),
+ 'type' => self::FIELD_TEXT,
+ 'class' => $toolbar_options_classes . ' pojo-settings-child-row',
+ 'std' => __( 'Readable Font', 'pojo-accessibility' ),
+ ];
+
+ $fields[] = [
+ 'id' => 'pojo_a11y_toolbar_button_sitemap_title',
+ 'title' => __( 'Sitemap Title', 'pojo-accessibility' ),
+ 'type' => self::FIELD_TEXT,
+ 'class' => $toolbar_options_classes,
+ 'std' => __( 'Sitemap', 'pojo-accessibility' ),
+ ];
+
+ $fields[] = [
+ 'id' => 'pojo_a11y_toolbar_button_sitemap_link',
+ 'title' => __( 'Sitemap Link', 'pojo-accessibility' ),
+ 'type' => self::FIELD_TEXT,
+ 'placeholder' => 'http://your-domain.com/sitemap',
+ 'desc' => __( 'Link for sitemap page in your website. Leave blank to disable.',
+ 'pojo-accessibility' ),
+ 'class' => $toolbar_options_classes . ' pojo-settings-child-row',
+ 'std' => '',
+ ];
+
+ $fields[] = [
+ 'id' => 'pojo_a11y_toolbar_button_help_title',
+ 'title' => __( 'Help Title', 'pojo-accessibility' ),
+ 'type' => self::FIELD_TEXT,
+ 'class' => $toolbar_options_classes,
+ 'std' => __( 'Help', 'pojo-accessibility' ),
+ ];
+
+ $fields[] = [
+ 'id' => 'pojo_a11y_toolbar_button_help_link',
+ 'title' => __( 'Help Link', 'pojo-accessibility' ),
+ 'type' => self::FIELD_TEXT,
+ 'placeholder' => 'http://your-domain.com/help',
+ 'desc' => __( 'Link for help page in your website. Leave blank to disable.', 'pojo-accessibility' ),
+ 'class' => $toolbar_options_classes . ' pojo-settings-child-row',
+ 'std' => '',
+ ];
+
+ $fields[] = [
+ 'id' => 'pojo_a11y_toolbar_button_feedback_title',
+ 'title' => __( 'Feedback Title', 'pojo-accessibility' ),
+ 'type' => self::FIELD_TEXT,
+ 'class' => $toolbar_options_classes,
+ 'std' => __( 'Feedback', 'pojo-accessibility' ),
+ ];
+
+ $fields[] = [
+ 'id' => 'pojo_a11y_toolbar_button_feedback_link',
+ 'title' => __( 'Feedback Link', 'pojo-accessibility' ),
+ 'type' => self::FIELD_TEXT,
+ 'placeholder' => 'http://your-domain.com/feedback',
+ 'desc' => __( 'Link for feedback page in your website. Leave blank to disable.',
+ 'pojo-accessibility' ),
+ 'class' => $toolbar_options_classes . ' pojo-settings-child-row',
+ 'std' => '',
+ ];
+
+ $sections[] = [
+ 'id' => 'section-a11y-toolbar',
+ 'page' => self::TOOLBAR_PAGE,
+ 'title' => __( 'Toolbar Settings', 'pojo-accessibility' ),
+ 'intro' => '',
+ 'fields' => $fields,
+ ];
+
+ $sections[] = [
+ 'id' => 'section-a11y-styles',
+ 'page' => self::TOOLBAR_PAGE,
+ 'title' => __( 'Style Settings', 'pojo-accessibility' ),
+ 'intro' => sprintf( __( 'For style settings of accessibility tools go to > Customize > Accessibility .', 'pojo-accessibility' ),
+ $this->get_admin_url( 'customizer' )
+ ),
+ 'fields' => [],
+ ];
+
+ return $sections;
+ }
+
+ public function section_a11y_settings( $sections ) {
+ $fields = [];
+
+ $fields[] = [
+ 'id' => 'pojo_a11y_focusable',
+ 'title' => __( 'Add Outline Focus', 'pojo-accessibility' ),
+ 'type' => self::FIELD_SELECT,
+ 'desc' => __( 'Add outline to elements on keyboard focus.', 'pojo-accessibility' ),
+ 'options' => [
+ 'enable' => __( 'Enable', 'pojo-accessibility' ),
+ 'disable' => __( 'Disable', 'pojo-accessibility' ),
+ ],
+ 'std' => 'disable',
+ ];
+
+ $fields[] = [
+ 'id' => 'pojo_a11y_skip_to_content_link',
+ 'title' => __( 'Skip to Content link', 'pojo-accessibility' ),
+ 'type' => self::FIELD_SELECT,
+ 'desc' => __( 'Add skip to content link when using keyboard.', 'pojo-accessibility' ),
+ 'options' => [
+ 'enable' => __( 'Enable', 'pojo-accessibility' ),
+ 'disable' => __( 'Disable', 'pojo-accessibility' ),
+ ],
+ 'std' => 'enable',
+ ];
+
+ $fields[] = [
+ 'id' => 'pojo_a11y_skip_to_content_link_element_id',
+ 'title' => __( 'Skip to Content Element ID', 'pojo-accessibility' ),
+ 'placeholder' => 'content',
+ 'type' => self::FIELD_TEXT,
+ 'std' => 'content',
+ ];
+
+ $fields[] = [
+ 'id' => 'pojo_a11y_remove_link_target',
+ 'title' => __( 'Remove target attribute from links', 'pojo-accessibility' ),
+ 'type' => self::FIELD_SELECT,
+ 'desc' => __( 'This option will reset all your target links to open in the same window or tab.',
+ 'pojo-accessibility' ),
+ 'options' => [
+ 'enable' => __( 'Enable', 'pojo-accessibility' ),
+ 'disable' => __( 'Disable', 'pojo-accessibility' ),
+ ],
+ 'std' => 'disable',
+ ];
+
+ $fields[] = [
+ 'id' => 'pojo_a11y_add_role_links',
+ 'title' => __( 'Add landmark roles to all links', 'pojo-accessibility' ),
+ 'type' => self::FIELD_SELECT,
+ 'desc' => __( 'This option will add role="link" to all links on the page.',
+ 'pojo-accessibility' ),
+ 'options' => [
+ 'enable' => __( 'Enable', 'pojo-accessibility' ),
+ 'disable' => __( 'Disable', 'pojo-accessibility' ),
+ ],
+ 'std' => 'enable',
+ ];
+
+ $fields[] = [
+ 'id' => 'pojo_a11y_save',
+ 'title' => __( 'Sitewide Accessibility', 'pojo-accessibility' ),
+ 'desc' => __( 'Consistent accessibility throughout your site visit. Site remembers you and stays accessible.',
+ 'pojo-accessibility' ),
+ 'type' => self::FIELD_SELECT,
+ 'options' => [
+ 'enable' => __( 'Enable', 'pojo-accessibility' ),
+ 'disable' => __( 'Disable', 'pojo-accessibility' ),
+ ],
+ 'std' => 'enable',
+ ];
+
+ $fields[] = [
+ 'id' => 'pojo_a11y_save_expiration',
+ 'title' => __( 'Remember user for', 'pojo-accessibility' ),
+ 'type' => self::FIELD_SELECT,
+ 'desc' => __( 'Define how long your toolbar settings will be remembered', 'pojo-accessibility' ),
+ 'options' => [
+ '1' => __( '1 Hour', 'pojo-accessibility' ),
+ '6' => __( '6 Hours', 'pojo-accessibility' ),
+ '12' => __( '12 Hours', 'pojo-accessibility' ),
+ '24' => __( '1 Day', 'pojo-accessibility' ),
+ '48' => __( '2 Days', 'pojo-accessibility' ),
+ '72' => __( '3 Days', 'pojo-accessibility' ),
+ '168' => __( '1 Week', 'pojo-accessibility' ),
+ '720' => __( '1 Month', 'pojo-accessibility' ),
+ ],
+ 'std' => '12',
+ ];
+
+ $sections[] = [
+ 'id' => 'section-a11y-settings',
+ 'page' => self::SETTINGS_PAGE,
+ 'title' => __( 'General Settings', 'pojo-accessibility' ),
+ 'intro' => '',
+ 'fields' => $fields,
+ ];
+
+ return $sections;
+ }
+
+ public function print_js() {
+ // TODO: Maybe need to move to other file
+ ?>
+
+ section_a11y_toolbar( $sections );
+ $sections = $this->section_a11y_settings( $sections );
+ $this->_sections = $sections;
+
+ return $this->_sections;
+ }
+
+ public function add_settings_section( $args = [] ) {
+ $args = wp_parse_args( $args, [
+ 'id' => '',
+ 'title' => '',
+ ] );
+
+ foreach ( $this->_sections as $section ) {
+ if ( $args['id'] !== $section['id'] ) {
+ continue;
+ }
+ if ( empty( $section['intro'] ) ) {
+ return;
+ }
+ printf( '%s
', $section['intro'] );
+ break;
+ }
+ }
+
+ public function add_settings_field( $args = [] ) {
+ if ( empty( $args ) ) {
+ return;
+ }
+
+ $args = wp_parse_args( $args, [
+ 'id' => '',
+ 'std' => '',
+ 'type' => self::FIELD_TEXT,
+ ] );
+
+ if ( empty( $args['id'] ) || empty( $args['type'] ) ) {
+ return;
+ }
+
+ $field_callback = 'render_' . $args['type'] . '_field';
+ if ( method_exists( $this, $field_callback ) ) {
+ call_user_func( [ $this, $field_callback ], $args );
+ }
+ }
+
+ public function render_select_field( $field ) {
+ $options = [];
+ foreach ( $field['options'] as $option_key => $option_value ) {
+ $options[] = sprintf(
+ '%3$s ',
+ esc_attr( $option_key ),
+ selected( get_option( $field['id'], $field['std'] ), $option_key, false ),
+ $option_value
+ );
+ }
+ ?>
+
+
+
+
+
+
+
+
+ />
+
+
+
+
+ get_settings_sections() as $section_key => $section ) {
+ add_settings_section(
+ $section['id'],
+ $section['title'],
+ [ &$this, 'add_settings_section' ],
+ $section['page']
+ );
+
+ if ( empty( $section['fields'] ) ) {
+ continue;
+ }
+
+ foreach ( $section['fields'] as $field ) {
+ add_settings_field(
+ $field['id'],
+ $field['title'],
+ [ &$this, 'add_settings_field' ],
+ $section['page'],
+ $section['id'],
+ $field
+ );
+
+ $sanitize_callback = [ $this, 'field_html' ];
+ if ( ! empty( $field['type'] ) && self::FIELD_CHECKBOX_LIST === $field['type'] ) {
+ $sanitize_callback = [ $this, 'field_checkbox_list' ];
+ }
+ if ( ! empty( $field['sanitize_callback'] ) ) {
+ $sanitize_callback = $field['sanitize_callback'];
+ }
+
+ register_setting( $section['page'], $field['id'], $sanitize_callback );
+ }
+ }
+ }
+
+ public static function field_html( $input ) {
+ return stripslashes( wp_filter_post_kses( addslashes( $input ) ) );
+ }
+
+ public static function field_checkbox_list( $input ) {
+ if ( empty( $input ) ) {
+ $input = [];
+ }
+
+ return $input;
+ }
+
+ public function display_settings_page() {
+ $screen = get_current_screen();
+ $screen_id = $screen->id;
+ if ( false !== strpos( $screen_id, 'toolbar' ) ) {
+ $screen_id = self::TOOLBAR_PAGE;
+ }
+ ?>
+
+
_page_title; ?>
+
+
+
+
+ menu_slug = add_menu_page(
+ __( 'Accessibility', 'pojo-accessibility' ),
+ __( 'Accessibility', 'pojo-accessibility' ),
+ 'manage_options',
+ 'accessibility-settings',
+ [ &$this, 'display_settings_page' ],
+ 'dashicons-universal-access-alt'
+ );
+ add_submenu_page(
+ 'accessibility-settings',
+ __( 'Accessibility Settings', 'pojo-accessibility' ),
+ __( 'Settings', 'pojo-accessibility' ),
+ 'manage_options',
+ 'accessibility-settings',
+ [ &$this, 'display_settings_page' ]
+ );
+ add_submenu_page(
+ 'accessibility-settings',
+ __( 'Accessibility Toolbar', 'pojo-accessibility' ),
+ __( 'Toolbar', 'pojo-accessibility' ),
+ 'manage_options',
+ 'accessibility-toolbar',
+ [ &$this, 'display_settings_page' ]
+ );
+ add_submenu_page(
+ 'accessibility-settings',
+ __( 'Customize', 'pojo-accessibility' ),
+ __( 'Customize', 'pojo-accessibility' ),
+ 'manage_options',
+ '/customize.php?autofocus[section]=accessibility'
+ );
+ }
+
+ public function plugin_action_links( $links, $plugin_file ) {
+ if ( EA11Y_BASE === $plugin_file ) {
+ $settings = '' . __( 'Settings', 'pojo-accessibility' ) . ' ';
+ $toolbar = '' . __( 'Toolbar', 'pojo-accessibility' ) . ' ';
+ $customizer = '' . __( 'Customize', 'pojo-accessibility' ) . ' ';
+ array_unshift( $links, $customizer );
+ array_unshift( $links, $toolbar );
+ array_unshift( $links, $settings );
+ }
+
+ return $links;
+ }
+
+ private function get_admin_url( $type ) {
+ switch ( $type ) {
+ case 'customizer':
+ return admin_url( 'customize.php?autofocus[section]=accessibility' );
+ break;
+ case 'general':
+ return admin_url( 'admin.php?page=accessibility-settings' );
+ break;
+ case 'toolbar':
+ return admin_url( 'admin.php?page=accessibility-toolbar' );
+ break;
+ }
+ }
+
+ private function get_default_values() {
+ if ( empty( $this->_defaults ) ) {
+ if ( empty( $this->_sections ) ) {
+ $this->get_settings_sections();
+ }
+ $defaults = [];
+ foreach ( $this->_sections as $section ) {
+ foreach ( $section['fields'] as $field ) {
+ $defaults[ $field['id'] ] = isset( $field['std'] ) ? $field['std'] : '';
+ }
+ }
+ $this->_defaults = $defaults;
+ }
+ }
+
+ public function get_default_title_text( $option ) {
+ $this->get_default_values();
+ $default = isset( $this->_defaults[ $option ] ) ? $this->_defaults[ $option ] : '';
+
+ return get_option( $option, $default );
+ }
+
+ public function __construct() {
+ $this->_page_title = __( 'One Click Accessibility', 'pojo-accessibility' );
+ $this->_page_menu_title = __( 'One Click Accessibility', 'pojo-accessibility' );
+ $this->_menu_parent = 'themes.php';
+
+ add_action( 'admin_menu', [ &$this, 'admin_menu' ], 20 );
+ add_action( 'admin_init', [ &$this, 'admin_init' ], 20 );
+ add_action( 'admin_footer', [ &$this, 'print_js' ] );
+ add_filter( 'plugin_action_links_' . EA11Y_BASE, [ $this, 'plugin_action_links' ], 10, 2 );
+ }
+}
diff --git a/modules/legacy/module.php b/modules/legacy/module.php
new file mode 100644
index 00000000..3b04414b
--- /dev/null
+++ b/modules/legacy/module.php
@@ -0,0 +1,67 @@
+get_components( 'Customizer' );
+ $customizer_fields = $customizer->get_customizer_fields();
+ $options = [];
+ $mods = get_theme_mods();
+ foreach ( $customizer_fields as $field ) {
+ if ( isset( $mods[ $field['id'] ] ) ) {
+ $options[ $field['id'] ] = $mods[ $field['id'] ];
+ } else {
+ $options[ $field['id'] ] = $field['std'];
+ }
+ }
+ update_option( POJO_A11Y_CUSTOMIZER_OPTIONS, $options );
+ }
+ }
+
+ public function add_elementor_support() {
+ $this->register_components( [ 'Elementor' ] );
+ }
+
+ public static function get_settings() {
+ /**
+ * @var Settings $settings
+ */
+ return Plugin::instance()->modules_manager->get_modules( 'Legacy' )->get_component( 'Settings' );
+ }
+
+ /**
+ * Module constructor.
+ */
+ public function __construct() {
+ $this->register_components();
+ add_action( 'admin_init', [ $this, 'backwards_compatibility' ] );
+ add_action( 'elementor/init', [ $this, 'add_elementor_support' ] );
+ }
+}
diff --git a/package.json b/package.json
index 8caef295..2ed55696 100644
--- a/package.json
+++ b/package.json
@@ -4,23 +4,41 @@
"homepage": "http://pojo.me/",
"description": "",
"version": "2.1.0",
+ "scripts": {
+ "build": "wp-scripts build",
+ "start": "wp-scripts start",
+ "format": "wp-scripts format",
+ "lint:js": "wp-scripts lint-js",
+ "prepare": "husky install",
+ "local:start": "wp-env start",
+ "local:stop": "wp-env stop",
+ "local:composer:dev": "wp-env run cli --env-cwd=wp-content/plugins/one-click-accessibility composer install",
+ "local:composer:build": "wp-env run cli --env-cwd=wp-content/plugins/one-click-accessibility composer install --no-dev",
+ "local:wp-cli": "wp-env run cli --env-cwd=wp-content/plugins/one-click-accessibility wp",
+ "local:phpunit": "wp-env run tests-cli --env-cwd=wp-content/plugins/one-click-accessibility ./vendor/bin/phpunit",
+ "local:phpunit:cov": "wp-env start --xdebug=coverage && wp-env run tests-cli --env-cwd=wp-content/plugins/one-click-accessibility ./vendor/bin/phpunit --coverage-html /var/www/html/wp-content/plugins/one-click-accessibility/coverage"
+ },
"devDependencies": {
- "grunt": "~1.0.2",
- "grunt-checktextdomain": "~1.0.1",
- "grunt-phpunit": "~0.3.6",
- "grunt-wp-readme-to-markdown-with-extra": "~2.2.0",
- "grunt-contrib-jshint": "~1.1.0",
- "grunt-contrib-watch": "~1.0.1",
- "grunt-contrib-uglify": "~3.3.0",
- "grunt-contrib-less": "~1.4.1",
- "grunt-banner": "~0.6.0",
- "grunt-bumpup": "~0.6.3",
- "grunt-shell": "~2.1.0",
- "grunt-text-replace": "~0.4.0",
- "grunt-release": "~0.14.0",
- "grunt-contrib-copy": "~1.0.0",
- "grunt-contrib-clean": "~1.1.0",
- "grunt-wp-deploy": "~1.2.1",
- "matchdep": "~2.0.0"
+ "@eslint/js": "^9.13.0",
+ "@wordpress/dom-ready": "^4.10.0",
+ "@wordpress/env": "^10.10.0",
+ "@wordpress/eslint-plugin": "^21.3.0",
+ "@wordpress/scripts": "^30.3.0",
+ "eslint": "^8.57.1",
+ "eslint-plugin-babel": "^5.3.1",
+ "eslint-plugin-import": "^2.31.0",
+ "eslint-plugin-jsx-a11y": "^6.10.1",
+ "eslint-plugin-react": "^7.37.1"
+ },
+ "dependencies": {
+ "@elementor/icons": "^1.17.0",
+ "@elementor/ui": "^1.21.2",
+ "@wordpress/api-fetch": "^7.10.0",
+ "@wordpress/core-data": "^7.10.0",
+ "@wordpress/data": "^10.10.0",
+ "@wordpress/date": "^5.10.0",
+ "@wordpress/element": "^6.10.0",
+ "@wordpress/i18n": "^5.10.0",
+ "@wordpress/url": "^4.10.0"
}
-}
\ No newline at end of file
+}
diff --git a/phpunit.xml.dist b/phpunit.xml.dist
new file mode 100644
index 00000000..24f5e897
--- /dev/null
+++ b/phpunit.xml.dist
@@ -0,0 +1,43 @@
+
+
+
+
+
+
+
+
+
+
+
+ ./tests/phpunit/plugin
+
+
+
+
+
+ ./
+
+ .github
+ assets
+ bin
+ build
+ docs
+ node_modules
+ tests
+ includes/libraries
+ libraries
+ libraries/action-scheduler
+ vendor
+ coverage
+
+
+
+
diff --git a/plugin.php b/plugin.php
new file mode 100644
index 00000000..d0f561bd
--- /dev/null
+++ b/plugin.php
@@ -0,0 +1,111 @@
+classes_aliases[ $class ] );
+
+ // Backward Compatibility: Save old class name for set an alias after the new class is loaded
+ if ( $has_class_alias ) {
+ $class_alias_name = $this->classes_aliases[ $class ];
+ $class_to_load = $class_alias_name;
+ } else {
+ $class_to_load = $class;
+ }
+
+ if ( ! class_exists( $class_to_load ) ) {
+ $filename = strtolower(
+ preg_replace(
+ [ '/^' . __NAMESPACE__ . '\\\/', '/([a-z])([A-Z])/', '/_/', '/\\\/' ],
+ [ '', '$1-$2', '-', DIRECTORY_SEPARATOR ],
+ $class_to_load
+ )
+ );
+ $filename = EA11Y_PATH . $filename . '.php';
+
+ if ( is_readable( $filename ) ) {
+ include $filename;
+ }
+ }
+
+ if ( $has_class_alias ) {
+ class_alias( $class_alias_name, $class );
+ }
+ }
+
+ private function includes() {
+ require_once EA11Y_PATH . 'includes/manager.php';
+ $this->modules_manager = new \EA11y\Manager();
+ }
+
+ /**
+ * Plugin class constructor
+ *
+ * Register plugin action hooks and filters
+ *
+ * @access public
+ */
+ public function __construct() {
+ static $autoloader_registered = false;
+ if ( ! $autoloader_registered ) {
+ $autoloader_registered = spl_autoload_register( [ $this, 'autoload' ] );
+ }
+ $this->includes();
+ }
+}
+// Instantiate Plugin Class
+Plugin::instance();
diff --git a/pojo-accessibility.php b/pojo-accessibility.php
index 54f0af1c..b41e9e94 100644
--- a/pojo-accessibility.php
+++ b/pojo-accessibility.php
@@ -9,15 +9,21 @@
Text Domain: pojo-accessibility
Domain Path: /languages/
*/
-if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
+if ( ! defined( 'ABSPATH' ) ) {
+ exit;
+} // Exit if accessed directly
-define( 'POJO_A11Y__FILE__', __FILE__ );
-define( 'POJO_A11Y_BASE', plugin_basename( POJO_A11Y__FILE__ ) );
-define( 'POJO_A11Y_URL', plugins_url( '/', POJO_A11Y__FILE__ ) );
-define( 'POJO_A11Y_ASSETS_PATH', plugin_dir_path( POJO_A11Y__FILE__ ) . 'assets/' );
-define( 'POJO_A11Y_ASSETS_URL', POJO_A11Y_URL . 'assets/' );
+// Legacy
define( 'POJO_A11Y_CUSTOMIZER_OPTIONS', 'pojo_a11y_customizer_options' );
+define( 'EA11Y_VERSION', '2.1.0' );
+define( 'EA11Y_MAIN_FILE', __FILE__ );
+define( 'EA11Y_BASE', plugin_basename( EA11Y_MAIN_FILE ) );
+define( 'EA11Y_PATH', plugin_dir_path( __FILE__ ) );
+define( 'EA11Y_URL', plugins_url( '/', __FILE__ ) );
+define( 'EA11Y_ASSETS_PATH', EA11Y_PATH . 'assets/' );
+define( 'EA11Y_ASSETS_URL', EA11Y_URL . 'assets/' );
+
final class Pojo_Accessibility {
/**
@@ -26,38 +32,16 @@ final class Pojo_Accessibility {
*/
public static $instance = null;
- /**
- * @var Pojo_A11y_Frontend
- */
- public $frontend;
-
- /**
- * @var Pojo_A11y_Customizer
- */
- public $customizer;
-
- /**
- * @var Pojo_A11y_Settings
- */
- public $settings;
-
- /**
- * @var Pojo_A11y_Admin_UI
- */
- public $admin_ui;
-
- public function load_textdomain() {
+ public function i18n() {
load_plugin_textdomain( 'pojo-accessibility' );
}
/**
* Throw error on object clone
- *
* The whole idea of the singleton design pattern is that there is a single
* object therefore, we don't want the object to be cloned.
- *
- * @since 1.0.0
* @return void
+ * @since 1.0.0
*/
public function __clone() {
// Cloning instances of the class is forbidden
@@ -66,9 +50,8 @@ public function __clone() {
/**
* Disable unserializing of the class
- *
- * @since 1.0.0
* @return void
+ * @since 1.0.0
*/
public function __wakeup() {
// Unserializing instances of the class is forbidden
@@ -82,49 +65,30 @@ public static function instance() {
if ( is_null( self::$instance ) ) {
self::$instance = new self();
}
- return self::$instance;
- }
-
- public function bootstrap() {
- require( 'includes/pojo-a11y-frontend.php' );
- require( 'includes/pojo-a11y-customizer.php' );
- require( 'includes/pojo-a11y-settings.php' );
- require( 'includes/pojo-a11y-admin-ui.php' );
- $this->frontend = new Pojo_A11y_Frontend();
- $this->customizer = new Pojo_A11y_Customizer();
- $this->settings = new Pojo_A11y_Settings();
- $this->admin_ui = new Pojo_A11y_Admin_UI();
- }
-
- public function backwards_compatibility() {
- if ( false === get_option( POJO_A11Y_CUSTOMIZER_OPTIONS, false ) ) {
- $customizer_fields = $this->customizer->get_customizer_fields();
- $options = array();
- $mods = get_theme_mods();
- foreach ( $customizer_fields as $field ) {
- if ( isset( $mods[ $field['id'] ] ) ) {
- $options[ $field['id'] ] = $mods[ $field['id'] ];
- } else {
- $options[ $field['id'] ] = $field['std'];
- }
- }
- update_option( POJO_A11Y_CUSTOMIZER_OPTIONS, $options );
- }
+ return self::$instance;
}
- public function add_elementor_support() {
- require( 'includes/pojo-a11y-elementor.php' );
-
- new Pojo_A11y_Elementor();
+ /**
+ * Initialize the plugin
+ * Do your Validations here:
+ * for example checks for basic plugin requirements, if one check fail don't continue,
+ * if all check have passed include the plugin class.
+ * Fired by `plugins_loaded` action hook.
+ * @since 2.2.0
+ * @access public
+ */
+ public function init() {
+ // Once we get here, We have passed all validation checks, so we can safely include our plugin
+ require_once 'plugin.php';
}
private function __construct() {
- add_action( 'init', array( &$this, 'bootstrap' ) );
- add_action( 'admin_init', array( &$this, 'backwards_compatibility' ) );
- add_action( 'plugins_loaded', array( &$this, 'load_textdomain' ) );
+ // Load translation
+ add_action( 'init', [ $this, 'i18n' ] );
- add_action( 'elementor/init', array( $this, 'add_elementor_support' ) );
+ // Init Plugin
+ add_action( 'plugins_loaded', [ $this, 'init' ] );
}
}
diff --git a/ruleset.xml b/ruleset.xml
new file mode 100644
index 00000000..654bb9fe
--- /dev/null
+++ b/ruleset.xml
@@ -0,0 +1,54 @@
+
+
+ Elementor Coding Standard
+
+
+
+
+
+ vendor/
+ tmp/
+ build/
+ node_modules/
+ includes/libraries/
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/bootstrap.php b/tests/bootstrap.php
old mode 100755
new mode 100644
index 2b9ce1bf..b2392946
--- a/tests/bootstrap.php
+++ b/tests/bootstrap.php
@@ -1,32 +1,40 @@
array( PLUGIN_PATH ),
-);
+if ( ! file_exists( $_tests_dir . '/includes/functions.php' ) ) {
+ // phpcs:ignore WordPress.Security.EscapeOutput.ExceptionNotEscaped -- CLI
+ throw new Exception( "Could not find $_tests_dir/includes/functions.php, have you run bin/install-wp-tests.sh?" ); // NOSONAR
+}
+// Give access to tests_add_filter() function.
+/** @psalm-suppress UnresolvableInclude */
require_once $_tests_dir . '/includes/functions.php';
-tests_add_filter(
- 'muplugins_loaded',
- function() {
- // Manually load plugin
- require dirname( __DIR__ ) . '/' . PLUGIN_FILE;
- }
-);
+function _manually_load_plugin(): void {
+ require dirname( __DIR__ ) . '/pojo-accessibility.php';
+}
+
+tests_add_filter( 'muplugins_loaded', '_manually_load_plugin' );
+
+// Start up the WP testing environment.
+/** @psalm-suppress UnresolvableInclude */
+require $_tests_dir . '/includes/bootstrap.php';
-// Removes all sql tables on shutdown
-// Do this action last
-tests_add_filter( 'shutdown', 'drop_tables', 999999 );
+// @phpcs:disable
-require $_tests_dir . '/includes/bootstrap.php';
\ No newline at end of file
+//module tests
+include_once dirname( __DIR__ ) . '/tests/phpunit/helpers/module-test-base.php';
+//rest tests
+include_once dirname( __DIR__ ) . '/tests/phpunit/helpers/route-test.php';
+//test base with factories
+include_once dirname( __DIR__ ) . '/tests/phpunit/helpers/test-base.php';
+// functions
+include_once dirname( __DIR__ ) . '/tests/phpunit/helpers/functions.php';
+// phpcs:enable
diff --git a/tests/phpunit/helpers/functions.php b/tests/phpunit/helpers/functions.php
new file mode 100644
index 00000000..979173de
--- /dev/null
+++ b/tests/phpunit/helpers/functions.php
@@ -0,0 +1,8 @@
+module;
+
+
+ if ( ! method_exists( $module, 'routes_list' ) || empty( $module::routes_list() ) ) {
+ $this->assertTrue( true, 'No routes to test' );
+ return;
+ }
+ $routes = $module::routes_list();
+
+ $this->assertTrue( is_array( $routes ),
+ 'Test that the routes are returned as an array'
+ );
+
+ $this->assertCount( count( $this->routes ), $routes,
+ 'Test that the number of routes are as expected'
+ );
+
+ foreach ( $this->routes as $route ) {
+ $this->assertContains( $route, $routes,
+ 'Test that Route "' . $route . '" is registered'
+ );
+ }
+ }
+
+ public function test_components() {
+ /**
+ * @var Module_Base $module
+ */
+ $module = $this->module;
+ if ( method_exists( $module, 'component_list' ) === false || empty( $module::component_list() ) ) {
+ $this->assertTrue( true, 'No components to test' );
+ return;
+ }
+ $components = $module::component_list();
+
+ $this->assertTrue( is_array( $components ),
+ 'Test that the components are returned as an array'
+ );
+
+ $this->assertCount( count( $this->components ), $components,
+ 'Test that the number of components are as expected'
+ );
+
+ foreach ( $this->components as $component ) {
+ $this->assertContains( $component, $components,
+ 'Test that component "' . $component . '" is registered'
+ );
+ }
+ }
+
+ /**
+ * test_constructor
+ */
+ public function test_constructor() {
+ $this->test_components();
+ $this->test_routes();
+ }
+}
diff --git a/tests/phpunit/helpers/route-test.php b/tests/phpunit/helpers/route-test.php
new file mode 100644
index 00000000..446ce0f0
--- /dev/null
+++ b/tests/phpunit/helpers/route-test.php
@@ -0,0 +1,31 @@
+route with an actual instance of the route class we are testing
+ $this->route = $this->get_plugin_module( $this->module_name )->routes[ $this->class_name ];
+
+ /**
+ * this includes automated unit tests for:
+ * - Test that the route is registered
+ * - Test route name is correct
+ * - Test allowed methods are correct
+ * - Test Endpoint is configured correctly
+ */
+ }
+}
diff --git a/tests/phpunit/helpers/test-base.php b/tests/phpunit/helpers/test-base.php
new file mode 100644
index 00000000..a9d165c8
--- /dev/null
+++ b/tests/phpunit/helpers/test-base.php
@@ -0,0 +1,40 @@
+subscriber = $this->factory->user->create( [ 'role' => 'subscriber' ] );
+ $this->editor = $this->factory->user->create( [ 'role' => 'editor' ] );
+ $this->administrator = $this->factory->user->create( [ 'role' => 'administrator' ] );
+
+ // Factories
+ $this->factory->log = new \WP_UnitTest_Factory_For_Log( $this->factory );
+ }
+
+
+ /**
+ * tearDown
+ */
+ public function tearDown() : void {
+ parent::tearDown();
+ }
+
+ public function get_plugin() {
+ return \EA11y\Plugin::instance();
+ }
+
+ public function get_plugin_module( $name ) {
+ /**
+ * @var Module_Base $module
+ */
+ $module = '\EA11y\\Modules\\' . $name . '\Module';
+ return $module::instance();
+ }
+}
diff --git a/tests/phpunit/plugin/modules/legacy/module-test.php b/tests/phpunit/plugin/modules/legacy/module-test.php
new file mode 100644
index 00000000..4f5af7ab
--- /dev/null
+++ b/tests/phpunit/plugin/modules/legacy/module-test.php
@@ -0,0 +1,20 @@
+assertTrue( is_plugin_active( PLUGIN_PATH ) );
- }
-
- public function test_getInstance() {
- $this->assertInstanceOf( 'Pojo_Accessibility', Pojo_Accessibility::instance() );
- }
-
-}
\ No newline at end of file
diff --git a/webpack.config.js b/webpack.config.js
new file mode 100644
index 00000000..7216c1cf
--- /dev/null
+++ b/webpack.config.js
@@ -0,0 +1,20 @@
+const path = require( 'path' );
+const defaultConfig = require( '@wordpress/scripts/config/webpack.config' );
+
+// add your entry points here
+const entryPoints = {
+ // admin: path.resolve(
+ // process.cwd(),
+ // 'assets/dev/js',
+ // 'admin.js',
+ // ),
+};
+
+module.exports = {
+ ...defaultConfig,
+ entry: entryPoints,
+ output: {
+ ...defaultConfig.output,
+ path: path.resolve( process.cwd(), 'assets/build' ),
+ },
+};
From afdac766505bf4c90738c4d41c32eff89b6b936a Mon Sep 17 00:00:00 2001
From: Nirbhay Singh <121793120+nirbhayel@users.noreply.github.com>
Date: Thu, 7 Nov 2024 13:02:12 +0530
Subject: [PATCH 003/290] Setup base (#110)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* Initial refactor commit
* ✅ Added build and tests CI/CD
* update: add src for admin settings
* update: incorrect constant names
* update: namespace
* add: accessibility settings
* update: webpack to output files inside a folder
* update: build output folders
* update: removed commented code
* update: npm scripts
* add: webpack config
* add: hooks
* update: move admin setting to the module folder
* update: assets loading logic
* update: settings variable
* update: removed duplicate css import
* Update modules/settings/assets/js/api/index.js
Co-authored-by: VasylD
---------
Co-authored-by: Ohad
Co-authored-by: VasylD
---
classes/utils/assets.php | 10 +-
includes/manager.php | 1 +
modules/settings/assets/css/style.css | 37 +++++
modules/settings/assets/js/admin.js | 26 ++++
.../assets/js/api/exceptions/APIError.js | 9 ++
modules/settings/assets/js/api/index.js | 132 ++++++++++++++++++
modules/settings/assets/js/app.js | 14 ++
.../js/components/admin-top-bar/index.js | 35 +++++
modules/settings/assets/js/constants/index.js | 2 +
modules/settings/assets/js/hooks/index.js | 0
modules/settings/assets/js/hooks/use-auth.js | 33 +++++
modules/settings/assets/js/hooks/use-modal.js | 22 +++
.../assets/js/icons/elementor-logo.js | 21 +++
modules/settings/module.php | 97 +++++++++++++
webpack.config.js | 10 +-
15 files changed, 439 insertions(+), 10 deletions(-)
create mode 100644 modules/settings/assets/css/style.css
create mode 100644 modules/settings/assets/js/admin.js
create mode 100644 modules/settings/assets/js/api/exceptions/APIError.js
create mode 100644 modules/settings/assets/js/api/index.js
create mode 100644 modules/settings/assets/js/app.js
create mode 100644 modules/settings/assets/js/components/admin-top-bar/index.js
create mode 100644 modules/settings/assets/js/constants/index.js
create mode 100644 modules/settings/assets/js/hooks/index.js
create mode 100644 modules/settings/assets/js/hooks/use-auth.js
create mode 100644 modules/settings/assets/js/hooks/use-modal.js
create mode 100644 modules/settings/assets/js/icons/elementor-logo.js
create mode 100644 modules/settings/module.php
diff --git a/classes/utils/assets.php b/classes/utils/assets.php
index db3ac8ed..aa2e2cf5 100644
--- a/classes/utils/assets.php
+++ b/classes/utils/assets.php
@@ -60,7 +60,7 @@ public static function enqueue_styles( string $handle, string $style_name, array
* @return string
*/
private static function get_assets_version( string $version = '' ) : string {
- return empty( $version ) ? EA11Y_VERSION : $version;
+ return empty( $version ) ? \EA11Y_VERSION : $version;
}
/**
@@ -95,7 +95,7 @@ private static function get_asset_version_and_suffix( string $version = '' ) : a
* @return string
*/
private static function get_assets_path( string $asset_name, string $asset_type, string $suffix = '' ) : string {
- return EA11Y_ASSETS_URL . '/build/' . $asset_name . $suffix . '.' . $asset_type;
+ return \EA11Y_ASSETS_URL . '/build/' . $asset_name . $suffix . '.' . $asset_type;
}
/**
@@ -105,8 +105,8 @@ private static function get_assets_path( string $asset_name, string $asset_type,
* @param bool $with_css
*/
public static function enqueue_app_assets( string $handle = '', bool $with_css = true ) : void {
- $dir = EA11Y_ASSETS_PATH . 'build/';
- $url = EA11Y_ASSETS_URL . 'build/';
+ $dir = \EA11Y_ASSETS_PATH . 'build/';
+ $url = \EA11Y_ASSETS_URL . 'build/';
$script_asset_path = $dir . $handle . '.asset.php';
if ( ! file_exists( $script_asset_path ) ) {
@@ -133,7 +133,7 @@ public static function enqueue_app_assets( string $handle = '', bool $with_css =
}
// enqueue css
$css_file_name = 'style-' . $handle . '.css';
- $css_version = ( defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ) ? filemtime( $dir . $css_file_name ) : EA11Y_VERSION;
+ $css_version = ( defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ) ? filemtime( $dir . $css_file_name ) : \EA11Y_VERSION;
wp_enqueue_style(
$handle,
$url . $css_file_name,
diff --git a/includes/manager.php b/includes/manager.php
index a8b29d6b..b8517576 100644
--- a/includes/manager.php
+++ b/includes/manager.php
@@ -17,6 +17,7 @@ final class Manager {
public static function get_module_list(): array {
return [
'Legacy',
+ 'Settings'
];
}
diff --git a/modules/settings/assets/css/style.css b/modules/settings/assets/css/style.css
new file mode 100644
index 00000000..72965c8e
--- /dev/null
+++ b/modules/settings/assets/css/style.css
@@ -0,0 +1,37 @@
+body {
+ background: #fff;
+}
+.wrap {
+ margin-top: 0;
+}
+
+html:not([dir='rtl']) #ea11y-app {
+ margin-left: -20px;
+ background: white;
+}
+
+html[dir='rtl'] #ea11y-app {
+ margin-right: -20px;
+ background: white;
+}
+
+html:not([dir='rtl']) #ea11y-app-top-bar {
+ margin-left: -20px;
+ margin-bottom: 20px;
+}
+
+html[dir='rtl'] #ea11y-app-top-bar {
+ margin-right: -20px;
+ margin-bottom: 20px;
+}
+
+#ea11y-app * {
+ box-sizing: border-box;
+}
+
+.ea11y-textfield .MuiInputBase-input {
+ height: 40px;
+ padding: 8px 12px;
+ box-shadow: none;
+ border-color: rgba(12, 13, 14, 0.23);
+}
\ No newline at end of file
diff --git a/modules/settings/assets/js/admin.js b/modules/settings/assets/js/admin.js
new file mode 100644
index 00000000..4e51e3ad
--- /dev/null
+++ b/modules/settings/assets/js/admin.js
@@ -0,0 +1,26 @@
+import { ThemeProvider } from '@elementor/ui/styles';
+import { StrictMode, Fragment, createRoot } from '@wordpress/element';
+import App from './app';
+import AdminTopBar from './components/admin-top-bar';
+
+const rootNode = document.getElementById( 'ea11y-app' );
+const topBarNode = document.getElementById( 'ea11y-app-top-bar' );
+
+// Can't use the settings hook in the global scope so accessing directly
+const isDevelopment = window?.ea11ySettingsData?.isDevelopment;
+const AppWrapper = Boolean( isDevelopment ) ? StrictMode : Fragment;
+
+const root = createRoot( rootNode );
+const topBar = createRoot( topBarNode );
+
+topBar.render(
+
+
+ ,
+);
+
+root.render(
+
+
+ ,
+);
diff --git a/modules/settings/assets/js/api/exceptions/APIError.js b/modules/settings/assets/js/api/exceptions/APIError.js
new file mode 100644
index 00000000..f13a1f1f
--- /dev/null
+++ b/modules/settings/assets/js/api/exceptions/APIError.js
@@ -0,0 +1,9 @@
+class APIError extends Error {
+ constructor( message ) {
+ super( message );
+
+ this.name = 'APIError';
+ }
+}
+
+export default APIError;
diff --git a/modules/settings/assets/js/api/index.js b/modules/settings/assets/js/api/index.js
new file mode 100644
index 00000000..2648f103
--- /dev/null
+++ b/modules/settings/assets/js/api/index.js
@@ -0,0 +1,132 @@
+import apiFetch from '@wordpress/api-fetch';
+import { addQueryArgs } from '@wordpress/url';
+import APIError from './exceptions/APIError';
+
+const wpV2Prefix = '/wp/v2';
+const v1Prefix = '/ea11y/v1';
+
+class API {
+ static async request( { path, data, method = 'POST' } ) {
+ try {
+ if ( 'GET' === method && ! path.startsWith( wpV2Prefix ) ) {
+ path = addQueryArgs( path, { sb_time: new Date().getTime() } );
+ }
+
+ const response = await apiFetch( {
+ path,
+ method,
+ data,
+ } );
+
+ if ( path.startsWith( wpV2Prefix ) ) {
+ return response;
+ }
+
+ if ( ! response.success ) {
+ throw new APIError( response.data.message );
+ }
+
+ return response.data;
+ } catch ( e ) {
+ if ( e instanceof APIError ) {
+ throw e;
+ } else {
+ throw new APIError( e.message );
+ }
+ }
+ }
+
+ static async initConnect( context = 'new' ) {
+ const data = {
+ wp_rest: window?.ea11ySettingsData?.wpRestNonce,
+ };
+
+ if ( 'update' === context ) {
+ data.update_redirect_uri = true;
+ }
+
+ return API.request( {
+ method: 'POST',
+ path: `${ v1Prefix }/connect/authorize`,
+ data,
+ } );
+ }
+
+ static async clearSession() {
+ return API.request( {
+ method: 'POST',
+ path: `${ v1Prefix }/connect/deactivate_and_disconnect`,
+ data: {
+ wp_rest: window?.ea11ySettingsData?.wpRestNonce,
+ clear_session: true,
+ },
+ } );
+ }
+
+ static async deactivateAndDisconnect() {
+ return API.request( {
+ method: 'POST',
+ path: `${ v1Prefix }/connect/deactivate_and_disconnect`,
+ data: {
+ wp_rest: window?.ea11ySettingsData?.wpRestNonce,
+ },
+ } );
+ }
+
+ static async deactivate() {
+ return API.request( {
+ method: 'POST',
+ path: `${ v1Prefix }/connect/deactivate`,
+ data: {
+ wp_rest: window?.ea11ySettingsData?.wpRestNonce,
+ },
+ } );
+ }
+
+ static async disconnect() {
+ return API.request( {
+ method: 'POST',
+ path: `${ v1Prefix }/connect/disconnect`,
+ data: {
+ wp_rest: window?.ea11ySettingsData?.wpRestNonce,
+ },
+ } );
+ }
+
+ static async reconnect() {
+ return API.request( {
+ method: 'POST',
+ path: `${ v1Prefix }/connect/reconnect`,
+ data: {
+ wp_rest: window?.ea11ySettingsData?.wpRestNonce,
+ },
+ } );
+ }
+
+ static async getSettings() {
+ return API.request( {
+ method: 'GET',
+ path: `${ wpV2Prefix }/settings`,
+ } );
+ }
+
+ static async updateSettings( data ) {
+ return API.request( {
+ method: 'PUT',
+ path: `${ wpV2Prefix }/settings`,
+ data,
+ } );
+ }
+
+ /**
+ * @return {Promise} {}
+ */
+ static async getPluginSettings() {
+ return API.request( {
+ method: 'GET',
+ path: `${ v1Prefix }/settings/get-settings`,
+ } );
+ }
+}
+
+export default API;
diff --git a/modules/settings/assets/js/app.js b/modules/settings/assets/js/app.js
new file mode 100644
index 00000000..35d5bfb3
--- /dev/null
+++ b/modules/settings/assets/js/app.js
@@ -0,0 +1,14 @@
+import '../css/style.css';
+import DirectionProvider from '@elementor/ui/DirectionProvider';
+import { ThemeProvider } from '@elementor/ui/styles';
+
+const App = () => {
+ return (
+
+
+
+
+ );
+};
+
+export default App;
diff --git a/modules/settings/assets/js/components/admin-top-bar/index.js b/modules/settings/assets/js/components/admin-top-bar/index.js
new file mode 100644
index 00000000..b789079b
--- /dev/null
+++ b/modules/settings/assets/js/components/admin-top-bar/index.js
@@ -0,0 +1,35 @@
+import HelpIcon from '@elementor/icons/HelpIcon';
+import AppBar from '@elementor/ui/AppBar';
+import Grid from '@elementor/ui/Grid';
+import Link from '@elementor/ui/Link';
+import Toolbar from '@elementor/ui/Toolbar';
+import Typography from '@elementor/ui/Typography';
+import { __ } from '@wordpress/i18n';
+import { HELP_LINK } from '../../constants';
+import ElementorLogo from '../../icons/elementor-logo';
+
+const AdminTopBar = () => {
+ return (
+
+
+
+
+
+ { __( 'Accessibility', 'pojo-accessibility' ) }
+
+
+
+
+
+
+
+
+ );
+};
+
+export default AdminTopBar;
diff --git a/modules/settings/assets/js/constants/index.js b/modules/settings/assets/js/constants/index.js
new file mode 100644
index 00000000..c4169b45
--- /dev/null
+++ b/modules/settings/assets/js/constants/index.js
@@ -0,0 +1,2 @@
+export const HELP_LINK = 'https://go.elementor.com/';
+export const UPGRADE_LINK = 'https://go.elementor.com/';
diff --git a/modules/settings/assets/js/hooks/index.js b/modules/settings/assets/js/hooks/index.js
new file mode 100644
index 00000000..e69de29b
diff --git a/modules/settings/assets/js/hooks/use-auth.js b/modules/settings/assets/js/hooks/use-auth.js
new file mode 100644
index 00000000..22ae0650
--- /dev/null
+++ b/modules/settings/assets/js/hooks/use-auth.js
@@ -0,0 +1,33 @@
+import API from '../api';
+import { UPGRADE_LINK } from '../constants';
+import { usePluginSettingsContext } from '../context/plugin-settings-context';
+
+const useAuth = () => {
+ const { subscriptionId } = 123;
+
+ const redirectToConnect = async () => {
+ const link = await getConnectLink();
+
+ window.open( link, '_self' ).focus();
+ };
+
+ const getConnectLink = async () => {
+ return API.initConnect();
+ };
+
+ const getUpgradeLink = () => {
+ const url = new URL( UPGRADE_LINK );
+
+ url.searchParams.append( 'subscription_id', subscriptionId );
+
+ return url.toString();
+ };
+
+ return {
+ redirectToConnect,
+ getConnectLink,
+ getUpgradeLink,
+ };
+};
+
+export default useAuth;
diff --git a/modules/settings/assets/js/hooks/use-modal.js b/modules/settings/assets/js/hooks/use-modal.js
new file mode 100644
index 00000000..6ae362b5
--- /dev/null
+++ b/modules/settings/assets/js/hooks/use-modal.js
@@ -0,0 +1,22 @@
+import { useState } from '@wordpress/element';
+
+const useModal = ( defaultIsOpen = true ) => {
+ const [ isOpen, setIsOpen ] = useState( defaultIsOpen );
+
+ const open = () => {
+ setIsOpen( true );
+ };
+
+ const close = () => {
+ setIsOpen( false );
+ };
+
+ return {
+ isOpen,
+ setIsOpen,
+ open,
+ close,
+ };
+};
+
+export default useModal;
diff --git a/modules/settings/assets/js/icons/elementor-logo.js b/modules/settings/assets/js/icons/elementor-logo.js
new file mode 100644
index 00000000..cc62ff43
--- /dev/null
+++ b/modules/settings/assets/js/icons/elementor-logo.js
@@ -0,0 +1,21 @@
+import SvgIcon from '@elementor/ui/SvgIcon';
+
+const ElementorLogo = ( { size } ) => {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+ );
+};
+
+export default ElementorLogo;
diff --git a/modules/settings/module.php b/modules/settings/module.php
new file mode 100644
index 00000000..4cbd68f0
--- /dev/null
+++ b/modules/settings/module.php
@@ -0,0 +1,97 @@
+id ) {
+ return;
+ }
+
+ ?>
+
+
+
+
+
+
+
+
+ wp_create_nonce( 'wp_rest' ) ]
+ );
+ }
+
+ /**
+ * Module constructor.
+ */
+ public function __construct() {
+ $this->register_components();
+ add_action( 'admin_menu', [ $this, 'register_page' ] );
+ add_action( 'in_admin_header', [ $this, 'render_top_bar' ] );
+ add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_scripts' ] );
+ }
+}
diff --git a/webpack.config.js b/webpack.config.js
index 7216c1cf..b40d4aae 100644
--- a/webpack.config.js
+++ b/webpack.config.js
@@ -3,11 +3,11 @@ const defaultConfig = require( '@wordpress/scripts/config/webpack.config' );
// add your entry points here
const entryPoints = {
- // admin: path.resolve(
- // process.cwd(),
- // 'assets/dev/js',
- // 'admin.js',
- // ),
+ admin: path.resolve(
+ process.cwd(),
+ 'modules/settings/assets/js',
+ 'admin.js',
+ ),
};
module.exports = {
From 88d5396bf539edda9829383e1c0adfc5e7e365f0 Mon Sep 17 00:00:00 2001
From: Raz Ohad
Date: Wed, 13 Nov 2024 15:18:09 +0700
Subject: [PATCH 004/290] =?UTF-8?q?[Infra]=20=E2=9C=85=20updated=20Github?=
=?UTF-8?q?=20actions=20(#114)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* updated github actions
* removed composer github auth
* PHPCS
* removed package-lock.json from ignore to allow `npm ci`
* added missing husky
* ignore legacy
* removed unused non existing import
---
.eslintignore | 1 +
.github/workflows/build.yml | 8 +-
.github/workflows/js-ci.yml | 4 +-
.github/workflows/php-coding-standards.yml | 7 +-
.github/workflows/phpunit.yml | 19 +-
.gitignore | 1 -
.husky/pre-commit | 1 +
includes/manager.php | 2 +-
modules/settings/assets/js/hooks/use-auth.js | 1 -
package-lock.json | 23044 +++++++++++++++++
package.json | 3 +-
11 files changed, 23059 insertions(+), 32 deletions(-)
create mode 100644 .husky/pre-commit
create mode 100644 package-lock.json
diff --git a/.eslintignore b/.eslintignore
index 9184afc5..fdd896e1 100644
--- a/.eslintignore
+++ b/.eslintignore
@@ -8,3 +8,4 @@ libraries/**
coverage/**
assets/build/**
tests/**
+modules/legacy/assets/**
diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index bfe9bf8f..ff59e6b8 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -26,18 +26,14 @@ jobs:
uses: actions/checkout@v4
- name: Set up PHP
- uses: shivammathur/setup-php@a36e1e52ff4a1c9e9c9be31551ee4712a6cb6bd0 # 2.27.1
+ uses: shivammathur/setup-php@v2
with:
php-version: '7.4'
env:
fail-fast: 'true'
- - name: OAuth Composer Authentication
- run:
- composer config -g github-oauth.github.com ${{ secrets.DEVOPS_TOKEN }}
-
- name: Install Composer dependencies cache
- uses: ramsey/composer-install@v2
+ uses: ramsey/composer-install@v3
- name: Install Composer dependencies
run:
diff --git a/.github/workflows/js-ci.yml b/.github/workflows/js-ci.yml
index efcf141b..f5dfef7f 100644
--- a/.github/workflows/js-ci.yml
+++ b/.github/workflows/js-ci.yml
@@ -23,10 +23,10 @@ jobs:
node-version: [18.x]
steps:
- - uses: actions/checkout@v2
+ - uses: actions/checkout@@v4
- name: Use Node.js ${{ matrix.node-version }}
- uses: actions/setup-node@v2
+ uses: actions/setup-node@v4
with:
node-version: ${{ matrix.node-version }}
cache: 'npm'
diff --git a/.github/workflows/php-coding-standards.yml b/.github/workflows/php-coding-standards.yml
index 26a91dc4..1369ad63 100644
--- a/.github/workflows/php-coding-standards.yml
+++ b/.github/workflows/php-coding-standards.yml
@@ -24,7 +24,7 @@ jobs:
uses: actions/checkout@v4
- name: Set up PHP
- uses: shivammathur/setup-php@a36e1e52ff4a1c9e9c9be31551ee4712a6cb6bd0 # 2.27.1
+ uses: shivammathur/setup-php@v2
with:
php-version: '7.4'
coverage: none
@@ -39,11 +39,8 @@ jobs:
phpcs -i
composer --version
- - name: Oauth Composer authentication
- run: composer config -g github-oauth.github.com ${{ secrets.DEVOPS_TOKEN }}
-
- name: Install dependencies
- uses: ramsey/composer-install@83af392bf5f031813d25e6fe4cd626cdba9a2df6 # 2.2.0
+ uses: ramsey/composer-install@v3
- name: Add error matcher
run: echo "::add-matcher::$(pwd)/.github/checkstyle-problem-matcher.json"
diff --git a/.github/workflows/phpunit.yml b/.github/workflows/phpunit.yml
index 2f9665c7..a85ad10d 100644
--- a/.github/workflows/phpunit.yml
+++ b/.github/workflows/phpunit.yml
@@ -51,7 +51,7 @@ jobs:
MYSQL_DATABASE: wordpress_test
steps:
- name: Checkout repository
- uses: actions/checkout@v2
+ uses: actions/checkout@v4
- name: Matrix variables
id: matrix
@@ -76,7 +76,7 @@ jobs:
fi
- name: Set up PHP
- uses: shivammathur/setup-php@a36e1e52ff4a1c9e9c9be31551ee4712a6cb6bd0 # 2.27.1
+ uses: shivammathur/setup-php@v2
with:
coverage: ${{ steps.coverage.outputs.coverage }}
ini-values: ${{ steps.coverage.outputs.ini }}
@@ -89,12 +89,8 @@ jobs:
wget -q -O /usr/local/bin/phpunit "https://phar.phpunit.de/phpunit-${{ matrix.phpunit }}.phar"
chmod +x /usr/local/bin/phpunit
- - name: Oauth Composer authentication
- run:
- composer config -g github-oauth.github.com ${{ secrets.DEVOPS_TOKEN }}
-
- name: Install dependencies
- uses: ramsey/composer-install@83af392bf5f031813d25e6fe4cd626cdba9a2df6 # 2.2.0
+ uses: ramsey/composer-install@v3
#- name: Install Node.js
# uses: actions/setup-node@v2
@@ -108,7 +104,7 @@ jobs:
# run: npm run build
- name: Set up WordPress and WordPress Test Library
- uses: sjinks/setup-wordpress-test-library@dd7f8144e892b042e034d713b734f7a19446abe1 # 2.0.1
+ uses: sjinks/setup-wordpress-test-library@master
with:
version: ${{ matrix.wp }}
@@ -137,10 +133,3 @@ jobs:
OPTIONS="$OPTIONS --coverage-clover=clover.xml"
fi
phpunit --order-by=random ${OPTIONS}
-
- - name: Upload coverage report
- uses: codecov/codecov-action@eaaf4bedf32dbdc6b720b63067d99c4d77d6047d # v3.1.4
- with:
- files: clover.xml
- flags: unittests
- if: ${{ steps.coverage.outputs.coverage != 'none' }}
diff --git a/.gitignore b/.gitignore
index 4d1728c0..e0a3e550 100644
--- a/.gitignore
+++ b/.gitignore
@@ -7,7 +7,6 @@ vendor/
composer.lock
npm-debug.log
.DS_Store
-package-lock.json
bin/.env
*/node_modules
!assets/dev/*
diff --git a/.husky/pre-commit b/.husky/pre-commit
new file mode 100644
index 00000000..6566d25c
--- /dev/null
+++ b/.husky/pre-commit
@@ -0,0 +1 @@
+npm run lint:js
diff --git a/includes/manager.php b/includes/manager.php
index b8517576..cc781854 100644
--- a/includes/manager.php
+++ b/includes/manager.php
@@ -17,7 +17,7 @@ final class Manager {
public static function get_module_list(): array {
return [
'Legacy',
- 'Settings'
+ 'Settings',
];
}
diff --git a/modules/settings/assets/js/hooks/use-auth.js b/modules/settings/assets/js/hooks/use-auth.js
index 22ae0650..4ce59147 100644
--- a/modules/settings/assets/js/hooks/use-auth.js
+++ b/modules/settings/assets/js/hooks/use-auth.js
@@ -1,6 +1,5 @@
import API from '../api';
import { UPGRADE_LINK } from '../constants';
-import { usePluginSettingsContext } from '../context/plugin-settings-context';
const useAuth = () => {
const { subscriptionId } = 123;
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 00000000..6f980a24
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,23044 @@
+{
+ "name": "pojo-accessibility",
+ "version": "2.1.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "pojo-accessibility",
+ "version": "2.1.0",
+ "dependencies": {
+ "@elementor/icons": "^1.17.0",
+ "@elementor/ui": "^1.21.2",
+ "@wordpress/api-fetch": "^7.10.0",
+ "@wordpress/core-data": "^7.10.0",
+ "@wordpress/data": "^10.10.0",
+ "@wordpress/date": "^5.10.0",
+ "@wordpress/element": "^6.10.0",
+ "@wordpress/i18n": "^5.10.0",
+ "@wordpress/url": "^4.10.0"
+ },
+ "devDependencies": {
+ "@eslint/js": "^9.13.0",
+ "@wordpress/dom-ready": "^4.10.0",
+ "@wordpress/env": "^10.10.0",
+ "@wordpress/eslint-plugin": "^21.3.0",
+ "@wordpress/scripts": "^30.3.0",
+ "eslint": "^8.57.1",
+ "eslint-plugin-babel": "^5.3.1",
+ "eslint-plugin-import": "^2.31.0",
+ "eslint-plugin-jsx-a11y": "^6.10.1",
+ "eslint-plugin-react": "^7.37.1",
+ "husky": "^9.1.6"
+ }
+ },
+ "node_modules/@ampproject/remapping": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz",
+ "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.24"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@ariakit/core": {
+ "version": "0.4.12",
+ "resolved": "https://registry.npmjs.org/@ariakit/core/-/core-0.4.12.tgz",
+ "integrity": "sha512-+NNpy88tdP/w9mOBPuDrMTbtapPbo/8yVIzpQB7TAmN0sPh/Cq3nU1f2KCTCIujPmwRvAcMSW9UHOlFmbKEPOA=="
+ },
+ "node_modules/@ariakit/react": {
+ "version": "0.4.13",
+ "resolved": "https://registry.npmjs.org/@ariakit/react/-/react-0.4.13.tgz",
+ "integrity": "sha512-pTGYgoqCojfyt2xNJ5VQhejxXwwtcP7VDDqcnnVChv7TA2TWWyYerJ5m4oxViI1pgeNqnHZwKlQ79ZipF7W2kQ==",
+ "dependencies": {
+ "@ariakit/react-core": "0.4.13"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/ariakit"
+ },
+ "peerDependencies": {
+ "react": "^17.0.0 || ^18.0.0 || ^19.0.0",
+ "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0"
+ }
+ },
+ "node_modules/@ariakit/react-core": {
+ "version": "0.4.13",
+ "resolved": "https://registry.npmjs.org/@ariakit/react-core/-/react-core-0.4.13.tgz",
+ "integrity": "sha512-iIjQeupP9d0pOubOzX4a0UPXbhXbp0ZCduDpkv7+u/pYP/utk/YRECD0M/QpZr6YSeltmDiNxKjdyK8r9Yhv4Q==",
+ "dependencies": {
+ "@ariakit/core": "0.4.12",
+ "@floating-ui/dom": "^1.0.0",
+ "use-sync-external-store": "^1.2.0"
+ },
+ "peerDependencies": {
+ "react": "^17.0.0 || ^18.0.0 || ^19.0.0",
+ "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0"
+ }
+ },
+ "node_modules/@babel/code-frame": {
+ "version": "7.26.2",
+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz",
+ "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==",
+ "dependencies": {
+ "@babel/helper-validator-identifier": "^7.25.9",
+ "js-tokens": "^4.0.0",
+ "picocolors": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/compat-data": {
+ "version": "7.26.2",
+ "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.2.tgz",
+ "integrity": "sha512-Z0WgzSEa+aUcdiJuCIqgujCshpMWgUpgOxXotrYPSA53hA3qopNaqcJpyr0hVb1FeWdnqFA35/fUtXgBK8srQg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/core": {
+ "version": "7.26.0",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.26.0.tgz",
+ "integrity": "sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==",
+ "dev": true,
+ "dependencies": {
+ "@ampproject/remapping": "^2.2.0",
+ "@babel/code-frame": "^7.26.0",
+ "@babel/generator": "^7.26.0",
+ "@babel/helper-compilation-targets": "^7.25.9",
+ "@babel/helper-module-transforms": "^7.26.0",
+ "@babel/helpers": "^7.26.0",
+ "@babel/parser": "^7.26.0",
+ "@babel/template": "^7.25.9",
+ "@babel/traverse": "^7.25.9",
+ "@babel/types": "^7.26.0",
+ "convert-source-map": "^2.0.0",
+ "debug": "^4.1.0",
+ "gensync": "^1.0.0-beta.2",
+ "json5": "^2.2.3",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/babel"
+ }
+ },
+ "node_modules/@babel/eslint-parser": {
+ "version": "7.25.7",
+ "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.25.7.tgz",
+ "integrity": "sha512-B+BO9x86VYsQHimucBAL1fxTJKF4wyKY6ZVzee9QgzdZOUfs3BaR6AQrgoGrRI+7IFS1wUz/VyQ+SoBcSpdPbw==",
+ "dev": true,
+ "dependencies": {
+ "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1",
+ "eslint-visitor-keys": "^2.1.0",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": "^10.13.0 || ^12.13.0 || >=14.0.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.11.0",
+ "eslint": "^7.5.0 || ^8.0.0 || ^9.0.0"
+ }
+ },
+ "node_modules/@babel/generator": {
+ "version": "7.26.2",
+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.2.tgz",
+ "integrity": "sha512-zevQbhbau95nkoxSq3f/DC/SC+EEOUZd3DYqfSkMhY2/wfSeaHV1Ew4vk8e+x8lja31IbyuUa2uQ3JONqKbysw==",
+ "dependencies": {
+ "@babel/parser": "^7.26.2",
+ "@babel/types": "^7.26.0",
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.25",
+ "jsesc": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-annotate-as-pure": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz",
+ "integrity": "sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.25.9.tgz",
+ "integrity": "sha512-C47lC7LIDCnz0h4vai/tpNOI95tCd5ZT3iBt/DBH5lXKHZsyNQv18yf1wIIg2ntiQNgmAvA+DgZ82iW8Qdym8g==",
+ "dev": true,
+ "dependencies": {
+ "@babel/traverse": "^7.25.9",
+ "@babel/types": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-compilation-targets": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz",
+ "integrity": "sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/compat-data": "^7.25.9",
+ "@babel/helper-validator-option": "^7.25.9",
+ "browserslist": "^4.24.0",
+ "lru-cache": "^5.1.1",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-create-class-features-plugin": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.9.tgz",
+ "integrity": "sha512-UTZQMvt0d/rSz6KI+qdu7GQze5TIajwTS++GUozlw8VBJDEOAqSXwm1WvmYEZwqdqSGQshRocPDqrt4HBZB3fQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.25.9",
+ "@babel/helper-member-expression-to-functions": "^7.25.9",
+ "@babel/helper-optimise-call-expression": "^7.25.9",
+ "@babel/helper-replace-supers": "^7.25.9",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9",
+ "@babel/traverse": "^7.25.9",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-create-regexp-features-plugin": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.9.tgz",
+ "integrity": "sha512-ORPNZ3h6ZRkOyAa/SaHU+XsLZr0UQzRwuDQ0cczIA17nAzZ+85G5cVkOJIj7QavLZGSe8QXUmNFxSZzjcZF9bw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.25.9",
+ "regexpu-core": "^6.1.1",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-define-polyfill-provider": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.3.tgz",
+ "integrity": "sha512-HK7Bi+Hj6H+VTHA3ZvBis7V/6hu9QuTrnMXNybfUf2iiuU/N97I8VjB+KbhFF8Rld/Lx5MzoCwPCpPjfK+n8Cg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-compilation-targets": "^7.22.6",
+ "@babel/helper-plugin-utils": "^7.22.5",
+ "debug": "^4.1.1",
+ "lodash.debounce": "^4.0.8",
+ "resolve": "^1.14.2"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/@babel/helper-member-expression-to-functions": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz",
+ "integrity": "sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/traverse": "^7.25.9",
+ "@babel/types": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-imports": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz",
+ "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==",
+ "dependencies": {
+ "@babel/traverse": "^7.25.9",
+ "@babel/types": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-module-transforms": {
+ "version": "7.26.0",
+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz",
+ "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.25.9",
+ "@babel/helper-validator-identifier": "^7.25.9",
+ "@babel/traverse": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-optimise-call-expression": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz",
+ "integrity": "sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-plugin-utils": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz",
+ "integrity": "sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-remap-async-to-generator": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.9.tgz",
+ "integrity": "sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.25.9",
+ "@babel/helper-wrap-function": "^7.25.9",
+ "@babel/traverse": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-replace-supers": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.9.tgz",
+ "integrity": "sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-member-expression-to-functions": "^7.25.9",
+ "@babel/helper-optimise-call-expression": "^7.25.9",
+ "@babel/traverse": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/helper-simple-access": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.25.9.tgz",
+ "integrity": "sha512-c6WHXuiaRsJTyHYLJV75t9IqsmTbItYfdj99PnzYGQZkYKvan5/2jKJ7gu31J3/BJ/A18grImSPModuyG/Eo0Q==",
+ "dev": true,
+ "dependencies": {
+ "@babel/traverse": "^7.25.9",
+ "@babel/types": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-skip-transparent-expression-wrappers": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz",
+ "integrity": "sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/traverse": "^7.25.9",
+ "@babel/types": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-string-parser": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz",
+ "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-identifier": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz",
+ "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-validator-option": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz",
+ "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helper-wrap-function": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.9.tgz",
+ "integrity": "sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g==",
+ "dev": true,
+ "dependencies": {
+ "@babel/template": "^7.25.9",
+ "@babel/traverse": "^7.25.9",
+ "@babel/types": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/helpers": {
+ "version": "7.26.0",
+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz",
+ "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/template": "^7.25.9",
+ "@babel/types": "^7.26.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/parser": {
+ "version": "7.26.2",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.2.tgz",
+ "integrity": "sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==",
+ "dependencies": {
+ "@babel/types": "^7.26.0"
+ },
+ "bin": {
+ "parser": "bin/babel-parser.js"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.9.tgz",
+ "integrity": "sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/traverse": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.9.tgz",
+ "integrity": "sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.9.tgz",
+ "integrity": "sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.9.tgz",
+ "integrity": "sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9",
+ "@babel/plugin-transform-optional-chaining": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.13.0"
+ }
+ },
+ "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.9.tgz",
+ "integrity": "sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/traverse": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-proposal-private-property-in-object": {
+ "version": "7.21.0-placeholder-for-preset-env.2",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz",
+ "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-async-generators": {
+ "version": "7.8.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz",
+ "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-bigint": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz",
+ "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-class-properties": {
+ "version": "7.12.13",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz",
+ "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.12.13"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-class-static-block": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz",
+ "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-dynamic-import": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz",
+ "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-export-namespace-from": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz",
+ "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.3"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-import-assertions": {
+ "version": "7.26.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.26.0.tgz",
+ "integrity": "sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-import-attributes": {
+ "version": "7.26.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz",
+ "integrity": "sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-import-meta": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz",
+ "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-json-strings": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz",
+ "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-jsx": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.25.9.tgz",
+ "integrity": "sha512-ld6oezHQMZsZfp6pWtbjaNDF2tiiCYYDqQszHt5VV437lewP9aSi2Of99CK0D0XB21k7FLgnLcmQKyKzynfeAA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-logical-assignment-operators": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz",
+ "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz",
+ "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-numeric-separator": {
+ "version": "7.10.4",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz",
+ "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.10.4"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-object-rest-spread": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz",
+ "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-optional-catch-binding": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz",
+ "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-optional-chaining": {
+ "version": "7.8.3",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz",
+ "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.8.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-private-property-in-object": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz",
+ "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-top-level-await": {
+ "version": "7.14.5",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz",
+ "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.14.5"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-typescript": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.25.9.tgz",
+ "integrity": "sha512-hjMgRy5hb8uJJjUcdWunWVcoi9bGpJp8p5Ol1229PoN6aytsLwNMgmdftO23wnCLMfVmTwZDWMPNq/D1SY60JQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-syntax-unicode-sets-regex": {
+ "version": "7.18.6",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz",
+ "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.18.6",
+ "@babel/helper-plugin-utils": "^7.18.6"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-arrow-functions": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.9.tgz",
+ "integrity": "sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-async-generator-functions": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.9.tgz",
+ "integrity": "sha512-RXV6QAzTBbhDMO9fWwOmwwTuYaiPbggWQ9INdZqAYeSHyG7FzQ+nOZaUUjNwKv9pV3aE4WFqFm1Hnbci5tBCAw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-remap-async-to-generator": "^7.25.9",
+ "@babel/traverse": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-async-to-generator": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.9.tgz",
+ "integrity": "sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-remap-async-to-generator": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-block-scoped-functions": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.25.9.tgz",
+ "integrity": "sha512-toHc9fzab0ZfenFpsyYinOX0J/5dgJVA2fm64xPewu7CoYHWEivIWKxkK2rMi4r3yQqLnVmheMXRdG+k239CgA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-block-scoping": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.9.tgz",
+ "integrity": "sha512-1F05O7AYjymAtqbsFETboN1NvBdcnzMerO+zlMyJBEz6WkMdejvGWw9p05iTSjC85RLlBseHHQpYaM4gzJkBGg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-class-properties": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.9.tgz",
+ "integrity": "sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-class-static-block": {
+ "version": "7.26.0",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.26.0.tgz",
+ "integrity": "sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.12.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-classes": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.9.tgz",
+ "integrity": "sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.25.9",
+ "@babel/helper-compilation-targets": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-replace-supers": "^7.25.9",
+ "@babel/traverse": "^7.25.9",
+ "globals": "^11.1.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-computed-properties": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.9.tgz",
+ "integrity": "sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/template": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-destructuring": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.9.tgz",
+ "integrity": "sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-dotall-regex": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.9.tgz",
+ "integrity": "sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-duplicate-keys": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.9.tgz",
+ "integrity": "sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.9.tgz",
+ "integrity": "sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-dynamic-import": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.9.tgz",
+ "integrity": "sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-exponentiation-operator": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.25.9.tgz",
+ "integrity": "sha512-KRhdhlVk2nObA5AYa7QMgTMTVJdfHprfpAk4DjZVtllqRg9qarilstTKEhpVjyt+Npi8ThRyiV8176Am3CodPA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-builder-binary-assignment-operator-visitor": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-export-namespace-from": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.9.tgz",
+ "integrity": "sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-for-of": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.25.9.tgz",
+ "integrity": "sha512-LqHxduHoaGELJl2uhImHwRQudhCM50pT46rIBNvtT/Oql3nqiS3wOwP+5ten7NpYSXrrVLgtZU3DZmPtWZo16A==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-function-name": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.9.tgz",
+ "integrity": "sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-compilation-targets": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/traverse": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-json-strings": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.9.tgz",
+ "integrity": "sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-literals": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.9.tgz",
+ "integrity": "sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-logical-assignment-operators": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.9.tgz",
+ "integrity": "sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-member-expression-literals": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.9.tgz",
+ "integrity": "sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-modules-amd": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.9.tgz",
+ "integrity": "sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-module-transforms": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-modules-commonjs": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.25.9.tgz",
+ "integrity": "sha512-dwh2Ol1jWwL2MgkCzUSOvfmKElqQcuswAZypBSUsScMXvgdT8Ekq5YA6TtqpTVWH+4903NmboMuH1o9i8Rxlyg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-module-transforms": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-simple-access": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-modules-systemjs": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.9.tgz",
+ "integrity": "sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-module-transforms": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-validator-identifier": "^7.25.9",
+ "@babel/traverse": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-modules-umd": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.9.tgz",
+ "integrity": "sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-module-transforms": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-named-capturing-groups-regex": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.9.tgz",
+ "integrity": "sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-new-target": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.9.tgz",
+ "integrity": "sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-nullish-coalescing-operator": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.25.9.tgz",
+ "integrity": "sha512-ENfftpLZw5EItALAD4WsY/KUWvhUlZndm5GC7G3evUsVeSJB6p0pBeLQUnRnBCBx7zV0RKQjR9kCuwrsIrjWog==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-numeric-separator": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.9.tgz",
+ "integrity": "sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-object-rest-spread": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.9.tgz",
+ "integrity": "sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-compilation-targets": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/plugin-transform-parameters": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-object-super": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.9.tgz",
+ "integrity": "sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-replace-supers": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-optional-catch-binding": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.9.tgz",
+ "integrity": "sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-optional-chaining": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.9.tgz",
+ "integrity": "sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-parameters": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.9.tgz",
+ "integrity": "sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-private-methods": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.9.tgz",
+ "integrity": "sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-create-class-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-private-property-in-object": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.9.tgz",
+ "integrity": "sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.25.9",
+ "@babel/helper-create-class-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-property-literals": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.9.tgz",
+ "integrity": "sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-constant-elements": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.25.9.tgz",
+ "integrity": "sha512-Ncw2JFsJVuvfRsa2lSHiC55kETQVLSnsYGQ1JDDwkUeWGTL/8Tom8aLTnlqgoeuopWrbbGndrc9AlLYrIosrow==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-display-name": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.25.9.tgz",
+ "integrity": "sha512-KJfMlYIUxQB1CJfO3e0+h0ZHWOTLCPP115Awhaz8U0Zpq36Gl/cXlpoyMRnUWlhNUBAzldnCiAZNvCDj7CrKxQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-jsx": {
+ "version": "7.25.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.7.tgz",
+ "integrity": "sha512-vILAg5nwGlR9EXE8JIOX4NHXd49lrYbN8hnjffDtoULwpL9hUx/N55nqh2qd0q6FyNDfjl9V79ecKGvFbcSA0Q==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.25.7",
+ "@babel/helper-module-imports": "^7.25.7",
+ "@babel/helper-plugin-utils": "^7.25.7",
+ "@babel/plugin-syntax-jsx": "^7.25.7",
+ "@babel/types": "^7.25.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-jsx-development": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.25.9.tgz",
+ "integrity": "sha512-9mj6rm7XVYs4mdLIpbZnHOYdpW42uoiBCTVowg7sP1thUOiANgMb4UtpRivR0pp5iL+ocvUv7X4mZgFRpJEzGw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/plugin-transform-react-jsx": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-jsx-development/node_modules/@babel/plugin-transform-react-jsx": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.9.tgz",
+ "integrity": "sha512-s5XwpQYCqGerXl+Pu6VDL3x0j2d82eiV77UJ8a2mDHAW7j9SWRqQ2y1fNo1Z74CdcYipl5Z41zvjj4Nfzq36rw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.25.9",
+ "@babel/helper-module-imports": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/plugin-syntax-jsx": "^7.25.9",
+ "@babel/types": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-react-pure-annotations": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.25.9.tgz",
+ "integrity": "sha512-KQ/Takk3T8Qzj5TppkS1be588lkbTp5uj7w6a0LeQaTMSckU/wK0oJ/pih+T690tkgI5jfmg2TqDJvd41Sj1Cg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-regenerator": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.25.9.tgz",
+ "integrity": "sha512-vwDcDNsgMPDGP0nMqzahDWE5/MLcX8sv96+wfX7as7LoF/kr97Bo/7fI00lXY4wUXYfVmwIIyG80fGZ1uvt2qg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "regenerator-transform": "^0.15.2"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-reserved-words": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.9.tgz",
+ "integrity": "sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-runtime": {
+ "version": "7.25.7",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.25.7.tgz",
+ "integrity": "sha512-Y9p487tyTzB0yDYQOtWnC+9HGOuogtP3/wNpun1xJXEEvI6vip59BSBTsHnekZLqxmPcgsrAKt46HAAb//xGhg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.25.7",
+ "@babel/helper-plugin-utils": "^7.25.7",
+ "babel-plugin-polyfill-corejs2": "^0.4.10",
+ "babel-plugin-polyfill-corejs3": "^0.10.6",
+ "babel-plugin-polyfill-regenerator": "^0.6.1",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-shorthand-properties": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.9.tgz",
+ "integrity": "sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-spread": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.9.tgz",
+ "integrity": "sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-sticky-regex": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.9.tgz",
+ "integrity": "sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-template-literals": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.25.9.tgz",
+ "integrity": "sha512-o97AE4syN71M/lxrCtQByzphAdlYluKPDBzDVzMmfCobUjjhAryZV0AIpRPrxN0eAkxXO6ZLEScmt+PNhj2OTw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-typeof-symbol": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.25.9.tgz",
+ "integrity": "sha512-v61XqUMiueJROUv66BVIOi0Fv/CUuZuZMl5NkRoCVxLAnMexZ0A3kMe7vvZ0nulxMuMp0Mk6S5hNh48yki08ZA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-typescript": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.25.9.tgz",
+ "integrity": "sha512-7PbZQZP50tzv2KGGnhh82GSyMB01yKY9scIjf1a+GfZCtInOWqUH5+1EBU4t9fyR5Oykkkc9vFTs4OHrhHXljQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.25.9",
+ "@babel/helper-create-class-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9",
+ "@babel/plugin-syntax-typescript": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-unicode-escapes": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.9.tgz",
+ "integrity": "sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-unicode-property-regex": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.25.9.tgz",
+ "integrity": "sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-unicode-regex": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.9.tgz",
+ "integrity": "sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/plugin-transform-unicode-sets-regex": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.9.tgz",
+ "integrity": "sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-create-regexp-features-plugin": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/@babel/preset-env": {
+ "version": "7.25.7",
+ "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.25.7.tgz",
+ "integrity": "sha512-Gibz4OUdyNqqLj+7OAvBZxOD7CklCtMA5/j0JgUEwOnaRULsPDXmic2iKxL2DX2vQduPR5wH2hjZas/Vr/Oc0g==",
+ "dev": true,
+ "dependencies": {
+ "@babel/compat-data": "^7.25.7",
+ "@babel/helper-compilation-targets": "^7.25.7",
+ "@babel/helper-plugin-utils": "^7.25.7",
+ "@babel/helper-validator-option": "^7.25.7",
+ "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.7",
+ "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.7",
+ "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.7",
+ "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.25.7",
+ "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.7",
+ "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2",
+ "@babel/plugin-syntax-async-generators": "^7.8.4",
+ "@babel/plugin-syntax-class-properties": "^7.12.13",
+ "@babel/plugin-syntax-class-static-block": "^7.14.5",
+ "@babel/plugin-syntax-dynamic-import": "^7.8.3",
+ "@babel/plugin-syntax-export-namespace-from": "^7.8.3",
+ "@babel/plugin-syntax-import-assertions": "^7.25.7",
+ "@babel/plugin-syntax-import-attributes": "^7.25.7",
+ "@babel/plugin-syntax-import-meta": "^7.10.4",
+ "@babel/plugin-syntax-json-strings": "^7.8.3",
+ "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4",
+ "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3",
+ "@babel/plugin-syntax-numeric-separator": "^7.10.4",
+ "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
+ "@babel/plugin-syntax-optional-catch-binding": "^7.8.3",
+ "@babel/plugin-syntax-optional-chaining": "^7.8.3",
+ "@babel/plugin-syntax-private-property-in-object": "^7.14.5",
+ "@babel/plugin-syntax-top-level-await": "^7.14.5",
+ "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6",
+ "@babel/plugin-transform-arrow-functions": "^7.25.7",
+ "@babel/plugin-transform-async-generator-functions": "^7.25.7",
+ "@babel/plugin-transform-async-to-generator": "^7.25.7",
+ "@babel/plugin-transform-block-scoped-functions": "^7.25.7",
+ "@babel/plugin-transform-block-scoping": "^7.25.7",
+ "@babel/plugin-transform-class-properties": "^7.25.7",
+ "@babel/plugin-transform-class-static-block": "^7.25.7",
+ "@babel/plugin-transform-classes": "^7.25.7",
+ "@babel/plugin-transform-computed-properties": "^7.25.7",
+ "@babel/plugin-transform-destructuring": "^7.25.7",
+ "@babel/plugin-transform-dotall-regex": "^7.25.7",
+ "@babel/plugin-transform-duplicate-keys": "^7.25.7",
+ "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.7",
+ "@babel/plugin-transform-dynamic-import": "^7.25.7",
+ "@babel/plugin-transform-exponentiation-operator": "^7.25.7",
+ "@babel/plugin-transform-export-namespace-from": "^7.25.7",
+ "@babel/plugin-transform-for-of": "^7.25.7",
+ "@babel/plugin-transform-function-name": "^7.25.7",
+ "@babel/plugin-transform-json-strings": "^7.25.7",
+ "@babel/plugin-transform-literals": "^7.25.7",
+ "@babel/plugin-transform-logical-assignment-operators": "^7.25.7",
+ "@babel/plugin-transform-member-expression-literals": "^7.25.7",
+ "@babel/plugin-transform-modules-amd": "^7.25.7",
+ "@babel/plugin-transform-modules-commonjs": "^7.25.7",
+ "@babel/plugin-transform-modules-systemjs": "^7.25.7",
+ "@babel/plugin-transform-modules-umd": "^7.25.7",
+ "@babel/plugin-transform-named-capturing-groups-regex": "^7.25.7",
+ "@babel/plugin-transform-new-target": "^7.25.7",
+ "@babel/plugin-transform-nullish-coalescing-operator": "^7.25.7",
+ "@babel/plugin-transform-numeric-separator": "^7.25.7",
+ "@babel/plugin-transform-object-rest-spread": "^7.25.7",
+ "@babel/plugin-transform-object-super": "^7.25.7",
+ "@babel/plugin-transform-optional-catch-binding": "^7.25.7",
+ "@babel/plugin-transform-optional-chaining": "^7.25.7",
+ "@babel/plugin-transform-parameters": "^7.25.7",
+ "@babel/plugin-transform-private-methods": "^7.25.7",
+ "@babel/plugin-transform-private-property-in-object": "^7.25.7",
+ "@babel/plugin-transform-property-literals": "^7.25.7",
+ "@babel/plugin-transform-regenerator": "^7.25.7",
+ "@babel/plugin-transform-reserved-words": "^7.25.7",
+ "@babel/plugin-transform-shorthand-properties": "^7.25.7",
+ "@babel/plugin-transform-spread": "^7.25.7",
+ "@babel/plugin-transform-sticky-regex": "^7.25.7",
+ "@babel/plugin-transform-template-literals": "^7.25.7",
+ "@babel/plugin-transform-typeof-symbol": "^7.25.7",
+ "@babel/plugin-transform-unicode-escapes": "^7.25.7",
+ "@babel/plugin-transform-unicode-property-regex": "^7.25.7",
+ "@babel/plugin-transform-unicode-regex": "^7.25.7",
+ "@babel/plugin-transform-unicode-sets-regex": "^7.25.7",
+ "@babel/preset-modules": "0.1.6-no-external-plugins",
+ "babel-plugin-polyfill-corejs2": "^0.4.10",
+ "babel-plugin-polyfill-corejs3": "^0.10.6",
+ "babel-plugin-polyfill-regenerator": "^0.6.1",
+ "core-js-compat": "^3.38.1",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/preset-modules": {
+ "version": "0.1.6-no-external-plugins",
+ "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz",
+ "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.0.0",
+ "@babel/types": "^7.4.4",
+ "esutils": "^2.0.2"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/@babel/preset-react": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.25.9.tgz",
+ "integrity": "sha512-D3to0uSPiWE7rBrdIICCd0tJSIGpLaaGptna2+w7Pft5xMqLpA1sz99DK5TZ1TjGbdQ/VI1eCSZ06dv3lT4JOw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/helper-validator-option": "^7.25.9",
+ "@babel/plugin-transform-react-display-name": "^7.25.9",
+ "@babel/plugin-transform-react-jsx": "^7.25.9",
+ "@babel/plugin-transform-react-jsx-development": "^7.25.9",
+ "@babel/plugin-transform-react-pure-annotations": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/preset-react/node_modules/@babel/plugin-transform-react-jsx": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.9.tgz",
+ "integrity": "sha512-s5XwpQYCqGerXl+Pu6VDL3x0j2d82eiV77UJ8a2mDHAW7j9SWRqQ2y1fNo1Z74CdcYipl5Z41zvjj4Nfzq36rw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-annotate-as-pure": "^7.25.9",
+ "@babel/helper-module-imports": "^7.25.9",
+ "@babel/helper-plugin-utils": "^7.25.9",
+ "@babel/plugin-syntax-jsx": "^7.25.9",
+ "@babel/types": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/preset-typescript": {
+ "version": "7.25.7",
+ "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.25.7.tgz",
+ "integrity": "sha512-rkkpaXJZOFN45Fb+Gki0c+KMIglk4+zZXOoMJuyEK8y8Kkc8Jd3BDmP7qPsz0zQMJj+UD7EprF+AqAXcILnexw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.25.7",
+ "@babel/helper-validator-option": "^7.25.7",
+ "@babel/plugin-syntax-jsx": "^7.25.7",
+ "@babel/plugin-transform-modules-commonjs": "^7.25.7",
+ "@babel/plugin-transform-typescript": "^7.25.7"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@babel/runtime": {
+ "version": "7.26.0",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.0.tgz",
+ "integrity": "sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==",
+ "dependencies": {
+ "regenerator-runtime": "^0.14.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/template": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz",
+ "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==",
+ "dependencies": {
+ "@babel/code-frame": "^7.25.9",
+ "@babel/parser": "^7.25.9",
+ "@babel/types": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/traverse": {
+ "version": "7.25.9",
+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.9.tgz",
+ "integrity": "sha512-ZCuvfwOwlz/bawvAuvcj8rrithP2/N55Tzz342AkTvq4qaWbGfmCk/tKhNaV2cthijKrPAA8SRJV5WWe7IBMJw==",
+ "dependencies": {
+ "@babel/code-frame": "^7.25.9",
+ "@babel/generator": "^7.25.9",
+ "@babel/parser": "^7.25.9",
+ "@babel/template": "^7.25.9",
+ "@babel/types": "^7.25.9",
+ "debug": "^4.3.1",
+ "globals": "^11.1.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@babel/types": {
+ "version": "7.26.0",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.0.tgz",
+ "integrity": "sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==",
+ "dependencies": {
+ "@babel/helper-string-parser": "^7.25.9",
+ "@babel/helper-validator-identifier": "^7.25.9"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@bcoe/v8-coverage": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz",
+ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==",
+ "dev": true
+ },
+ "node_modules/@csstools/css-parser-algorithms": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.4.tgz",
+ "integrity": "sha512-Up7rBoV77rv29d3uKHUIVubz1BTcgyUK72IvCQAbfbMv584xHcGKCKbWh7i8hPrRJ7qU4Y8IO3IY9m+iTB7P3A==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "@csstools/css-tokenizer": "^3.0.3"
+ }
+ },
+ "node_modules/@csstools/css-tokenizer": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.3.tgz",
+ "integrity": "sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@csstools/media-query-list-parser": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-3.0.1.tgz",
+ "integrity": "sha512-HNo8gGD02kHmcbX6PvCoUuOQvn4szyB9ca63vZHKX5A81QytgDG4oxG4IaEfHTlEZSZ6MjPEMWIVU+zF2PZcgw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "@csstools/css-parser-algorithms": "^3.0.1",
+ "@csstools/css-tokenizer": "^3.0.1"
+ }
+ },
+ "node_modules/@csstools/selector-specificity": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-4.0.0.tgz",
+ "integrity": "sha512-189nelqtPd8++phaHNwYovKZI0FOzH1vQEE3QhHHkNIGrg5fSs9CbYP3RvfEH5geztnIA9Jwq91wyOIwAW5JIQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss-selector-parser": "^6.1.0"
+ }
+ },
+ "node_modules/@discoveryjs/json-ext": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz",
+ "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==",
+ "dev": true,
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/@dual-bundle/import-meta-resolve": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/@dual-bundle/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz",
+ "integrity": "sha512-+nxncfwHM5SgAtrVzgpzJOI1ol0PkumhVo469KCf9lUi21IGcY90G98VuHm9VRrUypmAzawAHO9bs6hqeADaVg==",
+ "dev": true,
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/@elementor/icons": {
+ "version": "1.18.1",
+ "resolved": "https://registry.npmjs.org/@elementor/icons/-/icons-1.18.1.tgz",
+ "integrity": "sha512-/69Adp/Q0ebKQOnNKekzX3ym7CQNotBq4JXO+pqtUXbqwbL0O7k56aR81yZSVns1TMOip5+Qxbgxemth0k0FlQ==",
+ "peerDependencies": {
+ "@elementor/ui": "^1.4.61",
+ "react": "^17.0.0 || ^18.0.0"
+ }
+ },
+ "node_modules/@elementor/ui": {
+ "version": "1.21.7",
+ "resolved": "https://registry.npmjs.org/@elementor/ui/-/ui-1.21.7.tgz",
+ "integrity": "sha512-bY9GxS8/ZKafAX3yzCGgWmsuHxsl2N5IUITkG8BjazdS4ujXVpFJ/1JY7yZG3mxPcsIrk2cYn5pl0tHwVgG+6Q==",
+ "dependencies": {
+ "@emotion/cache": "11.13.0",
+ "@emotion/react": "11.13.0",
+ "@emotion/styled": "11.13.0",
+ "@mui/material": "5.15.17",
+ "@mui/x-date-pickers": "6.18.1",
+ "clsx": "2.1.0",
+ "colord": "2.9.3",
+ "dayjs": "1.11.10",
+ "material-ui-popup-state": "5.0.11",
+ "react-colorful": "5.6.1",
+ "stylis": "4.1.3",
+ "stylis-plugin-rtl": "2.1.1"
+ },
+ "peerDependencies": {
+ "react": "^17.0.0 || ^18.0.0",
+ "react-dom": "^17.0.0 || ^18.0.0"
+ }
+ },
+ "node_modules/@emotion/babel-plugin": {
+ "version": "11.12.0",
+ "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.12.0.tgz",
+ "integrity": "sha512-y2WQb+oP8Jqvvclh8Q55gLUyb7UFvgv7eJfsj7td5TToBrIUtPay2kMrZi4xjq9qw2vD0ZR5fSho0yqoFgX7Rw==",
+ "dependencies": {
+ "@babel/helper-module-imports": "^7.16.7",
+ "@babel/runtime": "^7.18.3",
+ "@emotion/hash": "^0.9.2",
+ "@emotion/memoize": "^0.9.0",
+ "@emotion/serialize": "^1.2.0",
+ "babel-plugin-macros": "^3.1.0",
+ "convert-source-map": "^1.5.0",
+ "escape-string-regexp": "^4.0.0",
+ "find-root": "^1.1.0",
+ "source-map": "^0.5.7",
+ "stylis": "4.2.0"
+ }
+ },
+ "node_modules/@emotion/babel-plugin/node_modules/convert-source-map": {
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz",
+ "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A=="
+ },
+ "node_modules/@emotion/babel-plugin/node_modules/stylis": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz",
+ "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw=="
+ },
+ "node_modules/@emotion/cache": {
+ "version": "11.13.0",
+ "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.13.0.tgz",
+ "integrity": "sha512-hPV345J/tH0Cwk2wnU/3PBzORQ9HeX+kQSbwI+jslzpRCHE6fSGTohswksA/Ensr8znPzwfzKZCmAM9Lmlhp7g==",
+ "dependencies": {
+ "@emotion/memoize": "^0.9.0",
+ "@emotion/sheet": "^1.4.0",
+ "@emotion/utils": "^1.4.0",
+ "@emotion/weak-memoize": "^0.4.0",
+ "stylis": "4.2.0"
+ }
+ },
+ "node_modules/@emotion/cache/node_modules/stylis": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz",
+ "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw=="
+ },
+ "node_modules/@emotion/css": {
+ "version": "11.13.4",
+ "resolved": "https://registry.npmjs.org/@emotion/css/-/css-11.13.4.tgz",
+ "integrity": "sha512-CthbOD5EBw+iN0rfM96Tuv5kaZN4nxPyYDvGUs0bc7wZBBiU/0mse+l+0O9RshW2d+v5HH1cme+BAbLJ/3Folw==",
+ "dependencies": {
+ "@emotion/babel-plugin": "^11.12.0",
+ "@emotion/cache": "^11.13.0",
+ "@emotion/serialize": "^1.3.0",
+ "@emotion/sheet": "^1.4.0",
+ "@emotion/utils": "^1.4.0"
+ }
+ },
+ "node_modules/@emotion/hash": {
+ "version": "0.9.2",
+ "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz",
+ "integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g=="
+ },
+ "node_modules/@emotion/is-prop-valid": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.3.1.tgz",
+ "integrity": "sha512-/ACwoqx7XQi9knQs/G0qKvv5teDMhD7bXYns9N/wM8ah8iNb8jZ2uNO0YOgiq2o2poIvVtJS2YALasQuMSQ7Kw==",
+ "dependencies": {
+ "@emotion/memoize": "^0.9.0"
+ }
+ },
+ "node_modules/@emotion/memoize": {
+ "version": "0.9.0",
+ "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz",
+ "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ=="
+ },
+ "node_modules/@emotion/react": {
+ "version": "11.13.0",
+ "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.13.0.tgz",
+ "integrity": "sha512-WkL+bw1REC2VNV1goQyfxjx1GYJkcc23CRQkXX+vZNLINyfI7o+uUn/rTGPt/xJ3bJHd5GcljgnxHf4wRw5VWQ==",
+ "dependencies": {
+ "@babel/runtime": "^7.18.3",
+ "@emotion/babel-plugin": "^11.12.0",
+ "@emotion/cache": "^11.13.0",
+ "@emotion/serialize": "^1.3.0",
+ "@emotion/use-insertion-effect-with-fallbacks": "^1.1.0",
+ "@emotion/utils": "^1.4.0",
+ "@emotion/weak-memoize": "^0.4.0",
+ "hoist-non-react-statics": "^3.3.1"
+ },
+ "peerDependencies": {
+ "react": ">=16.8.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@emotion/serialize": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.2.tgz",
+ "integrity": "sha512-grVnMvVPK9yUVE6rkKfAJlYZgo0cu3l9iMC77V7DW6E1DUIrU68pSEXRmFZFOFB1QFo57TncmOcvcbMDWsL4yA==",
+ "dependencies": {
+ "@emotion/hash": "^0.9.2",
+ "@emotion/memoize": "^0.9.0",
+ "@emotion/unitless": "^0.10.0",
+ "@emotion/utils": "^1.4.1",
+ "csstype": "^3.0.2"
+ }
+ },
+ "node_modules/@emotion/sheet": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz",
+ "integrity": "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg=="
+ },
+ "node_modules/@emotion/styled": {
+ "version": "11.13.0",
+ "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.13.0.tgz",
+ "integrity": "sha512-tkzkY7nQhW/zC4hztlwucpT8QEZ6eUzpXDRhww/Eej4tFfO0FxQYWRyg/c5CCXa4d/f174kqeXYjuQRnhzf6dA==",
+ "dependencies": {
+ "@babel/runtime": "^7.18.3",
+ "@emotion/babel-plugin": "^11.12.0",
+ "@emotion/is-prop-valid": "^1.3.0",
+ "@emotion/serialize": "^1.3.0",
+ "@emotion/use-insertion-effect-with-fallbacks": "^1.1.0",
+ "@emotion/utils": "^1.4.0"
+ },
+ "peerDependencies": {
+ "@emotion/react": "^11.0.0-rc.0",
+ "react": ">=16.8.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@emotion/unitless": {
+ "version": "0.10.0",
+ "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.10.0.tgz",
+ "integrity": "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg=="
+ },
+ "node_modules/@emotion/use-insertion-effect-with-fallbacks": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.1.0.tgz",
+ "integrity": "sha512-+wBOcIV5snwGgI2ya3u99D7/FJquOIniQT1IKyDsBmEgwvpxMNeS65Oib7OnE2d2aY+3BU4OiH+0Wchf8yk3Hw==",
+ "peerDependencies": {
+ "react": ">=16.8.0"
+ }
+ },
+ "node_modules/@emotion/utils": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.4.1.tgz",
+ "integrity": "sha512-BymCXzCG3r72VKJxaYVwOXATqXIZ85cuvg0YOUDxMGNrKc1DJRZk8MgV5wyXRyEayIMd4FuXJIUgTBXvDNW5cA=="
+ },
+ "node_modules/@emotion/weak-memoize": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz",
+ "integrity": "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg=="
+ },
+ "node_modules/@es-joy/jsdoccomment": {
+ "version": "0.41.0",
+ "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.41.0.tgz",
+ "integrity": "sha512-aKUhyn1QI5Ksbqcr3fFJj16p99QdjUxXAEuFst1Z47DRyoiMwivIH9MV/ARcJOCXVjPfjITciej8ZD2O/6qUmw==",
+ "dev": true,
+ "dependencies": {
+ "comment-parser": "1.4.1",
+ "esquery": "^1.5.0",
+ "jsdoc-type-pratt-parser": "~4.0.0"
+ },
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/@eslint-community/eslint-utils": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.1.tgz",
+ "integrity": "sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==",
+ "dev": true,
+ "dependencies": {
+ "eslint-visitor-keys": "^3.4.3"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
+ }
+ },
+ "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
+ "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
+ "dev": true,
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/@eslint-community/regexpp": {
+ "version": "4.12.1",
+ "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz",
+ "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==",
+ "dev": true,
+ "engines": {
+ "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
+ }
+ },
+ "node_modules/@eslint/eslintrc": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz",
+ "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==",
+ "dev": true,
+ "dependencies": {
+ "ajv": "^6.12.4",
+ "debug": "^4.3.2",
+ "espree": "^9.6.0",
+ "globals": "^13.19.0",
+ "ignore": "^5.2.0",
+ "import-fresh": "^3.2.1",
+ "js-yaml": "^4.1.0",
+ "minimatch": "^3.1.2",
+ "strip-json-comments": "^3.1.1"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/@eslint/eslintrc/node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true
+ },
+ "node_modules/@eslint/eslintrc/node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/@eslint/eslintrc/node_modules/globals": {
+ "version": "13.24.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz",
+ "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
+ "dev": true,
+ "dependencies": {
+ "type-fest": "^0.20.2"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@eslint/eslintrc/node_modules/js-yaml": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "dev": true,
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/@eslint/eslintrc/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/@eslint/eslintrc/node_modules/type-fest": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@eslint/js": {
+ "version": "9.14.0",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.14.0.tgz",
+ "integrity": "sha512-pFoEtFWCPyDOl+C6Ift+wC7Ro89otjigCf5vcuWqWgqNSQbRrpjSvdeE6ofLz4dHmyxD5f7gIdGT4+p36L6Twg==",
+ "dev": true,
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@floating-ui/core": {
+ "version": "1.6.8",
+ "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.8.tgz",
+ "integrity": "sha512-7XJ9cPU+yI2QeLS+FCSlqNFZJq8arvswefkZrYI1yQBbftw6FyrZOxYSh+9S7z7TpeWlRt9zJ5IhM1WIL334jA==",
+ "dependencies": {
+ "@floating-ui/utils": "^0.2.8"
+ }
+ },
+ "node_modules/@floating-ui/dom": {
+ "version": "1.6.12",
+ "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.12.tgz",
+ "integrity": "sha512-NP83c0HjokcGVEMeoStg317VD9W7eDlGK7457dMBANbKA6GJZdc7rjujdgqzTaz93jkGgc5P/jeWbaCHnMNc+w==",
+ "dependencies": {
+ "@floating-ui/core": "^1.6.0",
+ "@floating-ui/utils": "^0.2.8"
+ }
+ },
+ "node_modules/@floating-ui/react-dom": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.1.2.tgz",
+ "integrity": "sha512-06okr5cgPzMNBy+Ycse2A6udMi4bqwW/zgBF/rwjcNqWkyr82Mcg8b0vjX8OJpZFy/FKjJmw6wV7t44kK6kW7A==",
+ "dependencies": {
+ "@floating-ui/dom": "^1.0.0"
+ },
+ "peerDependencies": {
+ "react": ">=16.8.0",
+ "react-dom": ">=16.8.0"
+ }
+ },
+ "node_modules/@floating-ui/utils": {
+ "version": "0.2.8",
+ "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.8.tgz",
+ "integrity": "sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig=="
+ },
+ "node_modules/@hapi/hoek": {
+ "version": "9.3.0",
+ "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz",
+ "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==",
+ "dev": true
+ },
+ "node_modules/@hapi/topo": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz",
+ "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==",
+ "dev": true,
+ "dependencies": {
+ "@hapi/hoek": "^9.0.0"
+ }
+ },
+ "node_modules/@humanwhocodes/config-array": {
+ "version": "0.13.0",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz",
+ "integrity": "sha512-DZLEEqFWQFiyK6h5YIeynKx7JlvCYWL0cImfSRXZ9l4Sg2efkFGTuFf6vzXjK1cq6IYkU+Eg/JizXw+TD2vRNw==",
+ "deprecated": "Use @eslint/config-array instead",
+ "dev": true,
+ "dependencies": {
+ "@humanwhocodes/object-schema": "^2.0.3",
+ "debug": "^4.3.1",
+ "minimatch": "^3.0.5"
+ },
+ "engines": {
+ "node": ">=10.10.0"
+ }
+ },
+ "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/@humanwhocodes/config-array/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/@humanwhocodes/module-importer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz",
+ "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==",
+ "dev": true,
+ "engines": {
+ "node": ">=12.22"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
+ }
+ },
+ "node_modules/@humanwhocodes/object-schema": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz",
+ "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==",
+ "deprecated": "Use @eslint/object-schema instead",
+ "dev": true
+ },
+ "node_modules/@istanbuljs/load-nyc-config": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz",
+ "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==",
+ "dev": true,
+ "dependencies": {
+ "camelcase": "^5.3.1",
+ "find-up": "^4.1.0",
+ "get-package-type": "^0.1.0",
+ "js-yaml": "^3.13.1",
+ "resolve-from": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@istanbuljs/load-nyc-config/node_modules/camelcase": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/@istanbuljs/schema": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz",
+ "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/@jest/console": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/@jest/console/-/console-29.7.0.tgz",
+ "integrity": "sha512-5Ni4CU7XHQi32IJ398EEP4RrB8eV09sXP2ROqD4bksHrnTree52PsxvX8tpL8LvTZ3pFzXyPbNQReSN41CAhOg==",
+ "dev": true,
+ "dependencies": {
+ "@jest/types": "^29.6.3",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "jest-message-util": "^29.7.0",
+ "jest-util": "^29.7.0",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@jest/core": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/@jest/core/-/core-29.7.0.tgz",
+ "integrity": "sha512-n7aeXWKMnGtDA48y8TLWJPJmLmmZ642Ceo78cYWEpiD7FzDgmNDV/GCVRorPABdXLJZ/9wzzgZAlHjXjxDHGsg==",
+ "dev": true,
+ "dependencies": {
+ "@jest/console": "^29.7.0",
+ "@jest/reporters": "^29.7.0",
+ "@jest/test-result": "^29.7.0",
+ "@jest/transform": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "@types/node": "*",
+ "ansi-escapes": "^4.2.1",
+ "chalk": "^4.0.0",
+ "ci-info": "^3.2.0",
+ "exit": "^0.1.2",
+ "graceful-fs": "^4.2.9",
+ "jest-changed-files": "^29.7.0",
+ "jest-config": "^29.7.0",
+ "jest-haste-map": "^29.7.0",
+ "jest-message-util": "^29.7.0",
+ "jest-regex-util": "^29.6.3",
+ "jest-resolve": "^29.7.0",
+ "jest-resolve-dependencies": "^29.7.0",
+ "jest-runner": "^29.7.0",
+ "jest-runtime": "^29.7.0",
+ "jest-snapshot": "^29.7.0",
+ "jest-util": "^29.7.0",
+ "jest-validate": "^29.7.0",
+ "jest-watcher": "^29.7.0",
+ "micromatch": "^4.0.4",
+ "pretty-format": "^29.7.0",
+ "slash": "^3.0.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ },
+ "peerDependencies": {
+ "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
+ },
+ "peerDependenciesMeta": {
+ "node-notifier": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@jest/environment": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-29.7.0.tgz",
+ "integrity": "sha512-aQIfHDq33ExsN4jP1NWGXhxgQ/wixs60gDiKO+XVMd8Mn0NWPWgc34ZQDTb2jKaUWQ7MuwoitXAsN2XVXNMpAw==",
+ "dev": true,
+ "dependencies": {
+ "@jest/fake-timers": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "@types/node": "*",
+ "jest-mock": "^29.7.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@jest/expect": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-29.7.0.tgz",
+ "integrity": "sha512-8uMeAMycttpva3P1lBHB8VciS9V0XAr3GymPpipdyQXbBcuhkLQOSe8E/p92RyAdToS6ZD1tFkX+CkhoECE0dQ==",
+ "dev": true,
+ "dependencies": {
+ "expect": "^29.7.0",
+ "jest-snapshot": "^29.7.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@jest/expect-utils": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.7.0.tgz",
+ "integrity": "sha512-GlsNBWiFQFCVi9QVSx7f5AgMeLxe9YCCs5PuP2O2LdjDAA8Jh9eX7lA1Jq/xdXw3Wb3hyvlFNfZIfcRetSzYcA==",
+ "dev": true,
+ "dependencies": {
+ "jest-get-type": "^29.6.3"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@jest/fake-timers": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.7.0.tgz",
+ "integrity": "sha512-q4DH1Ha4TTFPdxLsqDXK1d3+ioSL7yL5oCMJZgDYm6i+6CygW5E5xVr/D1HdsGxjt1ZWSfUAs9OxSB/BNelWrQ==",
+ "dev": true,
+ "dependencies": {
+ "@jest/types": "^29.6.3",
+ "@sinonjs/fake-timers": "^10.0.2",
+ "@types/node": "*",
+ "jest-message-util": "^29.7.0",
+ "jest-mock": "^29.7.0",
+ "jest-util": "^29.7.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@jest/globals": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-29.7.0.tgz",
+ "integrity": "sha512-mpiz3dutLbkW2MNFubUGUEVLkTGiqW6yLVTA+JbP6fI6J5iL9Y0Nlg8k95pcF8ctKwCS7WVxteBs29hhfAotzQ==",
+ "dev": true,
+ "dependencies": {
+ "@jest/environment": "^29.7.0",
+ "@jest/expect": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "jest-mock": "^29.7.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@jest/reporters": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-29.7.0.tgz",
+ "integrity": "sha512-DApq0KJbJOEzAFYjHADNNxAE3KbhxQB1y5Kplb5Waqw6zVbuWatSnMjE5gs8FUgEPmNsnZA3NCWl9NG0ia04Pg==",
+ "dev": true,
+ "dependencies": {
+ "@bcoe/v8-coverage": "^0.2.3",
+ "@jest/console": "^29.7.0",
+ "@jest/test-result": "^29.7.0",
+ "@jest/transform": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "@jridgewell/trace-mapping": "^0.3.18",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "collect-v8-coverage": "^1.0.0",
+ "exit": "^0.1.2",
+ "glob": "^7.1.3",
+ "graceful-fs": "^4.2.9",
+ "istanbul-lib-coverage": "^3.0.0",
+ "istanbul-lib-instrument": "^6.0.0",
+ "istanbul-lib-report": "^3.0.0",
+ "istanbul-lib-source-maps": "^4.0.0",
+ "istanbul-reports": "^3.1.3",
+ "jest-message-util": "^29.7.0",
+ "jest-util": "^29.7.0",
+ "jest-worker": "^29.7.0",
+ "slash": "^3.0.0",
+ "string-length": "^4.0.1",
+ "strip-ansi": "^6.0.0",
+ "v8-to-istanbul": "^9.0.1"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ },
+ "peerDependencies": {
+ "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
+ },
+ "peerDependenciesMeta": {
+ "node-notifier": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@jest/reporters/node_modules/istanbul-lib-instrument": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz",
+ "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==",
+ "dev": true,
+ "dependencies": {
+ "@babel/core": "^7.23.9",
+ "@babel/parser": "^7.23.9",
+ "@istanbuljs/schema": "^0.1.3",
+ "istanbul-lib-coverage": "^3.2.0",
+ "semver": "^7.5.4"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@jest/reporters/node_modules/semver": {
+ "version": "7.6.3",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
+ "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@jest/schemas": {
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz",
+ "integrity": "sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==",
+ "dev": true,
+ "dependencies": {
+ "@sinclair/typebox": "^0.27.8"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@jest/source-map": {
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz",
+ "integrity": "sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/trace-mapping": "^0.3.18",
+ "callsites": "^3.0.0",
+ "graceful-fs": "^4.2.9"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@jest/test-result": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-29.7.0.tgz",
+ "integrity": "sha512-Fdx+tv6x1zlkJPcWXmMDAG2HBnaR9XPSd5aDWQVsfrZmLVT3lU1cwyxLgRmXR9yrq4NBoEm9BMsfgFzTQAbJYA==",
+ "dev": true,
+ "dependencies": {
+ "@jest/console": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "collect-v8-coverage": "^1.0.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@jest/test-sequencer": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.7.0.tgz",
+ "integrity": "sha512-GQwJ5WZVrKnOJuiYiAF52UNUJXgTZx1NHjFSEB0qEMmSZKAkdMoIzw/Cj6x6NF4AvV23AUqDpFzQkN/eYCYTxw==",
+ "dev": true,
+ "dependencies": {
+ "@jest/test-result": "^29.7.0",
+ "graceful-fs": "^4.2.9",
+ "jest-haste-map": "^29.7.0",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@jest/transform": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-29.7.0.tgz",
+ "integrity": "sha512-ok/BTPFzFKVMwO5eOHRrvnBVHdRy9IrsrW1GpMaQ9MCnilNLXQKmAX8s1YXDFaai9xJpac2ySzV0YeRRECr2Vw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/core": "^7.11.6",
+ "@jest/types": "^29.6.3",
+ "@jridgewell/trace-mapping": "^0.3.18",
+ "babel-plugin-istanbul": "^6.1.1",
+ "chalk": "^4.0.0",
+ "convert-source-map": "^2.0.0",
+ "fast-json-stable-stringify": "^2.1.0",
+ "graceful-fs": "^4.2.9",
+ "jest-haste-map": "^29.7.0",
+ "jest-regex-util": "^29.6.3",
+ "jest-util": "^29.7.0",
+ "micromatch": "^4.0.4",
+ "pirates": "^4.0.4",
+ "slash": "^3.0.0",
+ "write-file-atomic": "^4.0.2"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@jest/types": {
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz",
+ "integrity": "sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw==",
+ "dev": true,
+ "dependencies": {
+ "@jest/schemas": "^29.6.3",
+ "@types/istanbul-lib-coverage": "^2.0.0",
+ "@types/istanbul-reports": "^3.0.0",
+ "@types/node": "*",
+ "@types/yargs": "^17.0.8",
+ "chalk": "^4.0.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/@jridgewell/gen-mapping": {
+ "version": "0.3.5",
+ "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz",
+ "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==",
+ "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",
+ "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
+ "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/set-array": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",
+ "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/@jridgewell/source-map": {
+ "version": "0.3.6",
+ "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz",
+ "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/gen-mapping": "^0.3.5",
+ "@jridgewell/trace-mapping": "^0.3.25"
+ }
+ },
+ "node_modules/@jridgewell/sourcemap-codec": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz",
+ "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ=="
+ },
+ "node_modules/@jridgewell/trace-mapping": {
+ "version": "0.3.25",
+ "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
+ "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
+ "dependencies": {
+ "@jridgewell/resolve-uri": "^3.1.0",
+ "@jridgewell/sourcemap-codec": "^1.4.14"
+ }
+ },
+ "node_modules/@kwsites/file-exists": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@kwsites/file-exists/-/file-exists-1.1.1.tgz",
+ "integrity": "sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==",
+ "dev": true,
+ "dependencies": {
+ "debug": "^4.1.1"
+ }
+ },
+ "node_modules/@kwsites/promise-deferred": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@kwsites/promise-deferred/-/promise-deferred-1.1.1.tgz",
+ "integrity": "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==",
+ "dev": true
+ },
+ "node_modules/@leichtgewicht/ip-codec": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.5.tgz",
+ "integrity": "sha512-Vo+PSpZG2/fmgmiNzYK9qWRh8h/CHrwD0mo1h1DzL4yzHNSfWYujGTYsWGreD000gcgmZ7K4Ys6Tx9TxtsKdDw==",
+ "dev": true
+ },
+ "node_modules/@mui/base": {
+ "version": "5.0.0-beta.40",
+ "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.40.tgz",
+ "integrity": "sha512-I/lGHztkCzvwlXpjD2+SNmvNQvB4227xBXhISPjEaJUXGImOQ9f3D2Yj/T3KasSI/h0MLWy74X0J6clhPmsRbQ==",
+ "dependencies": {
+ "@babel/runtime": "^7.23.9",
+ "@floating-ui/react-dom": "^2.0.8",
+ "@mui/types": "^7.2.14",
+ "@mui/utils": "^5.15.14",
+ "@popperjs/core": "^2.11.8",
+ "clsx": "^2.1.0",
+ "prop-types": "^15.8.1"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/mui-org"
+ },
+ "peerDependencies": {
+ "@types/react": "^17.0.0 || ^18.0.0",
+ "react": "^17.0.0 || ^18.0.0",
+ "react-dom": "^17.0.0 || ^18.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@mui/core-downloads-tracker": {
+ "version": "5.16.7",
+ "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.16.7.tgz",
+ "integrity": "sha512-RtsCt4Geed2/v74sbihWzzRs+HsIQCfclHeORh5Ynu2fS4icIKozcSubwuG7vtzq2uW3fOR1zITSP84TNt2GoQ==",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/mui-org"
+ }
+ },
+ "node_modules/@mui/material": {
+ "version": "5.15.17",
+ "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.15.17.tgz",
+ "integrity": "sha512-ru/MLvTkCh0AZXmqwIpqGTOoVBS/sX48zArXq/DvktxXZx4fskiRA2PEc7Rk5ZlFiZhKh4moL4an+l8zZwq49Q==",
+ "dependencies": {
+ "@babel/runtime": "^7.23.9",
+ "@mui/base": "5.0.0-beta.40",
+ "@mui/core-downloads-tracker": "^5.15.17",
+ "@mui/system": "^5.15.15",
+ "@mui/types": "^7.2.14",
+ "@mui/utils": "^5.15.14",
+ "@types/react-transition-group": "^4.4.10",
+ "clsx": "^2.1.0",
+ "csstype": "^3.1.3",
+ "prop-types": "^15.8.1",
+ "react-is": "^18.2.0",
+ "react-transition-group": "^4.4.5"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/mui-org"
+ },
+ "peerDependencies": {
+ "@emotion/react": "^11.5.0",
+ "@emotion/styled": "^11.3.0",
+ "@types/react": "^17.0.0 || ^18.0.0",
+ "react": "^17.0.0 || ^18.0.0",
+ "react-dom": "^17.0.0 || ^18.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@emotion/react": {
+ "optional": true
+ },
+ "@emotion/styled": {
+ "optional": true
+ },
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@mui/private-theming": {
+ "version": "5.16.6",
+ "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.16.6.tgz",
+ "integrity": "sha512-rAk+Rh8Clg7Cd7shZhyt2HGTTE5wYKNSJ5sspf28Fqm/PZ69Er9o6KX25g03/FG2dfpg5GCwZh/xOojiTfm3hw==",
+ "dependencies": {
+ "@babel/runtime": "^7.23.9",
+ "@mui/utils": "^5.16.6",
+ "prop-types": "^15.8.1"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/mui-org"
+ },
+ "peerDependencies": {
+ "@types/react": "^17.0.0 || ^18.0.0",
+ "react": "^17.0.0 || ^18.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@mui/styled-engine": {
+ "version": "5.16.6",
+ "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.16.6.tgz",
+ "integrity": "sha512-zaThmS67ZmtHSWToTiHslbI8jwrmITcN93LQaR2lKArbvS7Z3iLkwRoiikNWutx9MBs8Q6okKvbZq1RQYB3v7g==",
+ "dependencies": {
+ "@babel/runtime": "^7.23.9",
+ "@emotion/cache": "^11.11.0",
+ "csstype": "^3.1.3",
+ "prop-types": "^15.8.1"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/mui-org"
+ },
+ "peerDependencies": {
+ "@emotion/react": "^11.4.1",
+ "@emotion/styled": "^11.3.0",
+ "react": "^17.0.0 || ^18.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@emotion/react": {
+ "optional": true
+ },
+ "@emotion/styled": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@mui/system": {
+ "version": "5.16.7",
+ "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.16.7.tgz",
+ "integrity": "sha512-Jncvs/r/d/itkxh7O7opOunTqbbSSzMTHzZkNLM+FjAOg+cYAZHrPDlYe1ZGKUYORwwb2XexlWnpZp0kZ4AHuA==",
+ "dependencies": {
+ "@babel/runtime": "^7.23.9",
+ "@mui/private-theming": "^5.16.6",
+ "@mui/styled-engine": "^5.16.6",
+ "@mui/types": "^7.2.15",
+ "@mui/utils": "^5.16.6",
+ "clsx": "^2.1.0",
+ "csstype": "^3.1.3",
+ "prop-types": "^15.8.1"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/mui-org"
+ },
+ "peerDependencies": {
+ "@emotion/react": "^11.5.0",
+ "@emotion/styled": "^11.3.0",
+ "@types/react": "^17.0.0 || ^18.0.0",
+ "react": "^17.0.0 || ^18.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@emotion/react": {
+ "optional": true
+ },
+ "@emotion/styled": {
+ "optional": true
+ },
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@mui/types": {
+ "version": "7.2.19",
+ "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.19.tgz",
+ "integrity": "sha512-6XpZEM/Q3epK9RN8ENoXuygnqUQxE+siN/6rGRi2iwJPgBUR25mphYQ9ZI87plGh58YoZ5pp40bFvKYOCDJ3tA==",
+ "peerDependencies": {
+ "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@mui/utils": {
+ "version": "5.16.6",
+ "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.16.6.tgz",
+ "integrity": "sha512-tWiQqlhxAt3KENNiSRL+DIn9H5xNVK6Jjf70x3PnfQPz1MPBdh7yyIcAyVBT9xiw7hP3SomRhPR7hzBMBCjqEA==",
+ "dependencies": {
+ "@babel/runtime": "^7.23.9",
+ "@mui/types": "^7.2.15",
+ "@types/prop-types": "^15.7.12",
+ "clsx": "^2.1.1",
+ "prop-types": "^15.8.1",
+ "react-is": "^18.3.1"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/mui-org"
+ },
+ "peerDependencies": {
+ "@types/react": "^17.0.0 || ^18.0.0",
+ "react": "^17.0.0 || ^18.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@mui/utils/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/@mui/x-date-pickers": {
+ "version": "6.18.1",
+ "resolved": "https://registry.npmjs.org/@mui/x-date-pickers/-/x-date-pickers-6.18.1.tgz",
+ "integrity": "sha512-22gWCzejBGG4Kycpk/yYhzV6Pj/xVBvaz5A1rQmCD/0DCXTDJvXPG8qvzrNlp1wj8q+rAQO82e/+conUGgYgYg==",
+ "dependencies": {
+ "@babel/runtime": "^7.23.2",
+ "@mui/base": "^5.0.0-beta.22",
+ "@mui/utils": "^5.14.16",
+ "@types/react-transition-group": "^4.4.8",
+ "clsx": "^2.0.0",
+ "prop-types": "^15.8.1",
+ "react-transition-group": "^4.4.5"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/mui"
+ },
+ "peerDependencies": {
+ "@emotion/react": "^11.9.0",
+ "@emotion/styled": "^11.8.1",
+ "@mui/material": "^5.8.6",
+ "@mui/system": "^5.8.0",
+ "date-fns": "^2.25.0",
+ "date-fns-jalali": "^2.13.0-0",
+ "dayjs": "^1.10.7",
+ "luxon": "^3.0.2",
+ "moment": "^2.29.4",
+ "moment-hijri": "^2.1.2",
+ "moment-jalaali": "^0.7.4 || ^0.8.0 || ^0.9.0 || ^0.10.0",
+ "react": "^17.0.0 || ^18.0.0",
+ "react-dom": "^17.0.0 || ^18.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@emotion/react": {
+ "optional": true
+ },
+ "@emotion/styled": {
+ "optional": true
+ },
+ "date-fns": {
+ "optional": true
+ },
+ "date-fns-jalali": {
+ "optional": true
+ },
+ "dayjs": {
+ "optional": true
+ },
+ "luxon": {
+ "optional": true
+ },
+ "moment": {
+ "optional": true
+ },
+ "moment-hijri": {
+ "optional": true
+ },
+ "moment-jalaali": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@nicolo-ribaudo/eslint-scope-5-internals": {
+ "version": "5.1.1-v1",
+ "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz",
+ "integrity": "sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==",
+ "dev": true,
+ "dependencies": {
+ "eslint-scope": "5.1.1"
+ }
+ },
+ "node_modules/@nodelib/fs.scandir": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
+ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
+ "dev": true,
+ "dependencies": {
+ "@nodelib/fs.stat": "2.0.5",
+ "run-parallel": "^1.1.9"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.stat": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
+ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
+ "dev": true,
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.walk": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
+ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
+ "dev": true,
+ "dependencies": {
+ "@nodelib/fs.scandir": "2.1.5",
+ "fastq": "^1.6.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@parcel/watcher": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.0.tgz",
+ "integrity": "sha512-i0GV1yJnm2n3Yq1qw6QrUrd/LI9bE8WEBOTtOkpCXHHdyN3TAGgqAK/DAT05z4fq2x04cARXt2pDmjWjL92iTQ==",
+ "dev": true,
+ "hasInstallScript": true,
+ "optional": true,
+ "dependencies": {
+ "detect-libc": "^1.0.3",
+ "is-glob": "^4.0.3",
+ "micromatch": "^4.0.5",
+ "node-addon-api": "^7.0.0"
+ },
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ },
+ "optionalDependencies": {
+ "@parcel/watcher-android-arm64": "2.5.0",
+ "@parcel/watcher-darwin-arm64": "2.5.0",
+ "@parcel/watcher-darwin-x64": "2.5.0",
+ "@parcel/watcher-freebsd-x64": "2.5.0",
+ "@parcel/watcher-linux-arm-glibc": "2.5.0",
+ "@parcel/watcher-linux-arm-musl": "2.5.0",
+ "@parcel/watcher-linux-arm64-glibc": "2.5.0",
+ "@parcel/watcher-linux-arm64-musl": "2.5.0",
+ "@parcel/watcher-linux-x64-glibc": "2.5.0",
+ "@parcel/watcher-linux-x64-musl": "2.5.0",
+ "@parcel/watcher-win32-arm64": "2.5.0",
+ "@parcel/watcher-win32-ia32": "2.5.0",
+ "@parcel/watcher-win32-x64": "2.5.0"
+ }
+ },
+ "node_modules/@parcel/watcher-android-arm64": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.0.tgz",
+ "integrity": "sha512-qlX4eS28bUcQCdribHkg/herLe+0A9RyYC+mm2PXpncit8z5b3nSqGVzMNR3CmtAOgRutiZ02eIJJgP/b1iEFQ==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "android"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-darwin-arm64": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.0.tgz",
+ "integrity": "sha512-hyZ3TANnzGfLpRA2s/4U1kbw2ZI4qGxaRJbBH2DCSREFfubMswheh8TeiC1sGZ3z2jUf3s37P0BBlrD3sjVTUw==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-darwin-x64": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.0.tgz",
+ "integrity": "sha512-9rhlwd78saKf18fT869/poydQK8YqlU26TMiNg7AIu7eBp9adqbJZqmdFOsbZ5cnLp5XvRo9wcFmNHgHdWaGYA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-freebsd-x64": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.0.tgz",
+ "integrity": "sha512-syvfhZzyM8kErg3VF0xpV8dixJ+RzbUaaGaeb7uDuz0D3FK97/mZ5AJQ3XNnDsXX7KkFNtyQyFrXZzQIcN49Tw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "freebsd"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-linux-arm-glibc": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.0.tgz",
+ "integrity": "sha512-0VQY1K35DQET3dVYWpOaPFecqOT9dbuCfzjxoQyif1Wc574t3kOSkKevULddcR9znz1TcklCE7Ht6NIxjvTqLA==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-linux-arm-musl": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.0.tgz",
+ "integrity": "sha512-6uHywSIzz8+vi2lAzFeltnYbdHsDm3iIB57d4g5oaB9vKwjb6N6dRIgZMujw4nm5r6v9/BQH0noq6DzHrqr2pA==",
+ "cpu": [
+ "arm"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-linux-arm64-glibc": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.0.tgz",
+ "integrity": "sha512-BfNjXwZKxBy4WibDb/LDCriWSKLz+jJRL3cM/DllnHH5QUyoiUNEp3GmL80ZqxeumoADfCCP19+qiYiC8gUBjA==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-linux-arm64-musl": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.0.tgz",
+ "integrity": "sha512-S1qARKOphxfiBEkwLUbHjCY9BWPdWnW9j7f7Hb2jPplu8UZ3nes7zpPOW9bkLbHRvWM0WDTsjdOTUgW0xLBN1Q==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-linux-x64-glibc": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.0.tgz",
+ "integrity": "sha512-d9AOkusyXARkFD66S6zlGXyzx5RvY+chTP9Jp0ypSTC9d4lzyRs9ovGf/80VCxjKddcUvnsGwCHWuF2EoPgWjw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-linux-x64-musl": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.0.tgz",
+ "integrity": "sha512-iqOC+GoTDoFyk/VYSFHwjHhYrk8bljW6zOhPuhi5t9ulqiYq1togGJB5e3PwYVFFfeVgc6pbz3JdQyDoBszVaA==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "linux"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-win32-arm64": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.0.tgz",
+ "integrity": "sha512-twtft1d+JRNkM5YbmexfcH/N4znDtjgysFaV9zvZmmJezQsKpkfLYJ+JFV3uygugK6AtIM2oADPkB2AdhBrNig==",
+ "cpu": [
+ "arm64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-win32-ia32": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.0.tgz",
+ "integrity": "sha512-+rgpsNRKwo8A53elqbbHXdOMtY/tAtTzManTWShB5Kk54N8Q9mzNWV7tV+IbGueCbcj826MfWGU3mprWtuf1TA==",
+ "cpu": [
+ "ia32"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@parcel/watcher-win32-x64": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.0.tgz",
+ "integrity": "sha512-lPrxve92zEHdgeff3aiu4gDOIt4u7sJYha6wbdEZDCDUhtjTsOMiaJzG5lMY4GkWH8p0fMmO2Ppq5G5XXG+DQw==",
+ "cpu": [
+ "x64"
+ ],
+ "dev": true,
+ "optional": true,
+ "os": [
+ "win32"
+ ],
+ "engines": {
+ "node": ">= 10.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/parcel"
+ }
+ },
+ "node_modules/@pkgr/core": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz",
+ "integrity": "sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA==",
+ "dev": true,
+ "engines": {
+ "node": "^12.20.0 || ^14.18.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/unts"
+ }
+ },
+ "node_modules/@playwright/test": {
+ "version": "1.48.2",
+ "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.48.2.tgz",
+ "integrity": "sha512-54w1xCWfXuax7dz4W2M9uw0gDyh+ti/0K/MxcCUxChFh37kkdxPdfZDw5QBbuPUJHr1CiHJ1hXgSs+GgeQc5Zw==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "playwright": "1.48.2"
+ },
+ "bin": {
+ "playwright": "cli.js"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@pmmmwh/react-refresh-webpack-plugin": {
+ "version": "0.5.15",
+ "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.15.tgz",
+ "integrity": "sha512-LFWllMA55pzB9D34w/wXUCf8+c+IYKuJDgxiZ3qMhl64KRMBHYM1I3VdGaD2BV5FNPV2/S2596bppxHbv2ZydQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-html": "^0.0.9",
+ "core-js-pure": "^3.23.3",
+ "error-stack-parser": "^2.0.6",
+ "html-entities": "^2.1.0",
+ "loader-utils": "^2.0.4",
+ "schema-utils": "^4.2.0",
+ "source-map": "^0.7.3"
+ },
+ "engines": {
+ "node": ">= 10.13"
+ },
+ "peerDependencies": {
+ "@types/webpack": "4.x || 5.x",
+ "react-refresh": ">=0.10.0 <1.0.0",
+ "sockjs-client": "^1.4.0",
+ "type-fest": ">=0.17.0 <5.0.0",
+ "webpack": ">=4.43.0 <6.0.0",
+ "webpack-dev-server": "3.x || 4.x || 5.x",
+ "webpack-hot-middleware": "2.x",
+ "webpack-plugin-serve": "0.x || 1.x"
+ },
+ "peerDependenciesMeta": {
+ "@types/webpack": {
+ "optional": true
+ },
+ "sockjs-client": {
+ "optional": true
+ },
+ "type-fest": {
+ "optional": true
+ },
+ "webpack-dev-server": {
+ "optional": true
+ },
+ "webpack-hot-middleware": {
+ "optional": true
+ },
+ "webpack-plugin-serve": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@pmmmwh/react-refresh-webpack-plugin/node_modules/source-map": {
+ "version": "0.7.4",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz",
+ "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@polka/url": {
+ "version": "1.0.0-next.28",
+ "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.28.tgz",
+ "integrity": "sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==",
+ "dev": true
+ },
+ "node_modules/@popperjs/core": {
+ "version": "2.11.8",
+ "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz",
+ "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==",
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/popperjs"
+ }
+ },
+ "node_modules/@puppeteer/browsers": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.4.1.tgz",
+ "integrity": "sha512-0kdAbmic3J09I6dT8e9vE2JOCSt13wHCW5x/ly8TSt2bDtuIWe2TgLZZDHdcziw9AVCzflMAXCrVyRIhIs44Ng==",
+ "dev": true,
+ "dependencies": {
+ "debug": "^4.3.7",
+ "extract-zip": "^2.0.1",
+ "progress": "^2.0.3",
+ "proxy-agent": "^6.4.0",
+ "semver": "^7.6.3",
+ "tar-fs": "^3.0.6",
+ "unbzip2-stream": "^1.4.3",
+ "yargs": "^17.7.2"
+ },
+ "bin": {
+ "browsers": "lib/cjs/main-cli.js"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@puppeteer/browsers/node_modules/extract-zip": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz",
+ "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==",
+ "dev": true,
+ "dependencies": {
+ "debug": "^4.1.1",
+ "get-stream": "^5.1.0",
+ "yauzl": "^2.10.0"
+ },
+ "bin": {
+ "extract-zip": "cli.js"
+ },
+ "engines": {
+ "node": ">= 10.17.0"
+ },
+ "optionalDependencies": {
+ "@types/yauzl": "^2.9.1"
+ }
+ },
+ "node_modules/@puppeteer/browsers/node_modules/semver": {
+ "version": "7.6.3",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
+ "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@radix-ui/primitive": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.1.0.tgz",
+ "integrity": "sha512-4Z8dn6Upk0qk4P74xBhZ6Hd/w0mPEzOOLxy4xiPXOXqjF7jZS0VAKk7/x/H6FyY2zCkYJqePf1G5KmkmNJ4RBA=="
+ },
+ "node_modules/@radix-ui/react-compose-refs": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.1.0.tgz",
+ "integrity": "sha512-b4inOtiaOnYf9KWyO3jAeeCG6FeyfY6ldiEPanbUjWd+xIk5wZeHa8yVwmrJ2vderhu/BQvzCrJI0lHd+wIiqw==",
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-context": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.1.1.tgz",
+ "integrity": "sha512-UASk9zi+crv9WteK/NU4PLvOoL3OuE6BWVKNF6hPRBtYBDXQ2u5iu3O59zUlJiTVvkyuycnqrztsHVJwcK9K+Q==",
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-dialog": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-dialog/-/react-dialog-1.1.2.tgz",
+ "integrity": "sha512-Yj4dZtqa2o+kG61fzB0H2qUvmwBA2oyQroGLyNtBj1beo1khoQ3q1a2AO8rrQYjd8256CO9+N8L9tvsS+bnIyA==",
+ "dependencies": {
+ "@radix-ui/primitive": "1.1.0",
+ "@radix-ui/react-compose-refs": "1.1.0",
+ "@radix-ui/react-context": "1.1.1",
+ "@radix-ui/react-dismissable-layer": "1.1.1",
+ "@radix-ui/react-focus-guards": "1.1.1",
+ "@radix-ui/react-focus-scope": "1.1.0",
+ "@radix-ui/react-id": "1.1.0",
+ "@radix-ui/react-portal": "1.1.2",
+ "@radix-ui/react-presence": "1.1.1",
+ "@radix-ui/react-primitive": "2.0.0",
+ "@radix-ui/react-slot": "1.1.0",
+ "@radix-ui/react-use-controllable-state": "1.1.0",
+ "aria-hidden": "^1.1.1",
+ "react-remove-scroll": "2.6.0"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-dismissable-layer": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.1.1.tgz",
+ "integrity": "sha512-QSxg29lfr/xcev6kSz7MAlmDnzbP1eI/Dwn3Tp1ip0KT5CUELsxkekFEMVBEoykI3oV39hKT4TKZzBNMbcTZYQ==",
+ "dependencies": {
+ "@radix-ui/primitive": "1.1.0",
+ "@radix-ui/react-compose-refs": "1.1.0",
+ "@radix-ui/react-primitive": "2.0.0",
+ "@radix-ui/react-use-callback-ref": "1.1.0",
+ "@radix-ui/react-use-escape-keydown": "1.1.0"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-focus-guards": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.1.1.tgz",
+ "integrity": "sha512-pSIwfrT1a6sIoDASCSpFwOasEwKTZWDw/iBdtnqKO7v6FeOzYJ7U53cPzYFVR3geGGXgVHaH+CdngrrAzqUGxg==",
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-focus-scope": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.1.0.tgz",
+ "integrity": "sha512-200UD8zylvEyL8Bx+z76RJnASR2gRMuxlgFCPAe/Q/679a/r0eK3MBVYMb7vZODZcffZBdob1EGnky78xmVvcA==",
+ "dependencies": {
+ "@radix-ui/react-compose-refs": "1.1.0",
+ "@radix-ui/react-primitive": "2.0.0",
+ "@radix-ui/react-use-callback-ref": "1.1.0"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-id": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.1.0.tgz",
+ "integrity": "sha512-EJUrI8yYh7WOjNOqpoJaf1jlFIH2LvtgAl+YcFqNCa+4hj64ZXmPkAKOFs/ukjz3byN6bdb/AVUqHkI8/uWWMA==",
+ "dependencies": {
+ "@radix-ui/react-use-layout-effect": "1.1.0"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-portal": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.1.2.tgz",
+ "integrity": "sha512-WeDYLGPxJb/5EGBoedyJbT0MpoULmwnIPMJMSldkuiMsBAv7N1cRdsTWZWht9vpPOiN3qyiGAtbK2is47/uMFg==",
+ "dependencies": {
+ "@radix-ui/react-primitive": "2.0.0",
+ "@radix-ui/react-use-layout-effect": "1.1.0"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-presence": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.1.1.tgz",
+ "integrity": "sha512-IeFXVi4YS1K0wVZzXNrbaaUvIJ3qdY+/Ih4eHFhWA9SwGR9UDX7Ck8abvL57C4cv3wwMvUE0OG69Qc3NCcTe/A==",
+ "dependencies": {
+ "@radix-ui/react-compose-refs": "1.1.0",
+ "@radix-ui/react-use-layout-effect": "1.1.0"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-primitive": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-2.0.0.tgz",
+ "integrity": "sha512-ZSpFm0/uHa8zTvKBDjLFWLo8dkr4MBsiDLz0g3gMUwqgLHz9rTaRRGYDgvZPtBJgYCBKXkS9fzmoySgr8CO6Cw==",
+ "dependencies": {
+ "@radix-ui/react-slot": "1.1.0"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "@types/react-dom": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc",
+ "react-dom": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ },
+ "@types/react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-slot": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.1.0.tgz",
+ "integrity": "sha512-FUCf5XMfmW4dtYl69pdS4DbxKy8nj4M7SafBgPllysxmdachynNflAdp/gCsnYWNDnge6tI9onzMp5ARYc1KNw==",
+ "dependencies": {
+ "@radix-ui/react-compose-refs": "1.1.0"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-use-callback-ref": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.1.0.tgz",
+ "integrity": "sha512-CasTfvsy+frcFkbXtSJ2Zu9JHpN8TYKxkgJGWbjiZhFivxaeW7rMeZt7QELGVLaYVfFMsKHjb7Ak0nMEe+2Vfw==",
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-use-controllable-state": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.1.0.tgz",
+ "integrity": "sha512-MtfMVJiSr2NjzS0Aa90NPTnvTSg6C/JLCV7ma0W6+OMV78vd8OyRpID+Ng9LxzsPbLeuBnWBA1Nq30AtBIDChw==",
+ "dependencies": {
+ "@radix-ui/react-use-callback-ref": "1.1.0"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-use-escape-keydown": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.1.0.tgz",
+ "integrity": "sha512-L7vwWlR1kTTQ3oh7g1O0CBF3YCyyTj8NmhLR+phShpyA50HCfBFKVJTpshm9PzLiKmehsrQzTYTpX9HvmC9rhw==",
+ "dependencies": {
+ "@radix-ui/react-use-callback-ref": "1.1.0"
+ },
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@radix-ui/react-use-layout-effect": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.1.0.tgz",
+ "integrity": "sha512-+FPE0rOdziWSrH9athwI1R0HDVbWlEhd+FR+aSDk4uWGmSJ9Z54sdZVDQPZAinJhJXwfT+qnj969mCsT2gfm5w==",
+ "peerDependencies": {
+ "@types/react": "*",
+ "react": "^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@react-spring/animated": {
+ "version": "9.7.5",
+ "resolved": "https://registry.npmjs.org/@react-spring/animated/-/animated-9.7.5.tgz",
+ "integrity": "sha512-Tqrwz7pIlsSDITzxoLS3n/v/YCUHQdOIKtOJf4yL6kYVSDTSmVK1LI1Q3M/uu2Sx4X3pIWF3xLUhlsA6SPNTNg==",
+ "dependencies": {
+ "@react-spring/shared": "~9.7.5",
+ "@react-spring/types": "~9.7.5"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
+ }
+ },
+ "node_modules/@react-spring/core": {
+ "version": "9.7.5",
+ "resolved": "https://registry.npmjs.org/@react-spring/core/-/core-9.7.5.tgz",
+ "integrity": "sha512-rmEqcxRcu7dWh7MnCcMXLvrf6/SDlSokLaLTxiPlAYi11nN3B5oiCUAblO72o+9z/87j2uzxa2Inm8UbLjXA+w==",
+ "dependencies": {
+ "@react-spring/animated": "~9.7.5",
+ "@react-spring/shared": "~9.7.5",
+ "@react-spring/types": "~9.7.5"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/react-spring/donate"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
+ }
+ },
+ "node_modules/@react-spring/rafz": {
+ "version": "9.7.5",
+ "resolved": "https://registry.npmjs.org/@react-spring/rafz/-/rafz-9.7.5.tgz",
+ "integrity": "sha512-5ZenDQMC48wjUzPAm1EtwQ5Ot3bLIAwwqP2w2owG5KoNdNHpEJV263nGhCeKKmuA3vG2zLLOdu3or6kuDjA6Aw=="
+ },
+ "node_modules/@react-spring/shared": {
+ "version": "9.7.5",
+ "resolved": "https://registry.npmjs.org/@react-spring/shared/-/shared-9.7.5.tgz",
+ "integrity": "sha512-wdtoJrhUeeyD/PP/zo+np2s1Z820Ohr/BbuVYv+3dVLW7WctoiN7std8rISoYoHpUXtbkpesSKuPIw/6U1w1Pw==",
+ "dependencies": {
+ "@react-spring/rafz": "~9.7.5",
+ "@react-spring/types": "~9.7.5"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
+ }
+ },
+ "node_modules/@react-spring/types": {
+ "version": "9.7.5",
+ "resolved": "https://registry.npmjs.org/@react-spring/types/-/types-9.7.5.tgz",
+ "integrity": "sha512-HVj7LrZ4ReHWBimBvu2SKND3cDVUPWKLqRTmWe/fNY6o1owGOX0cAHbdPDTMelgBlVbrTKrre6lFkhqGZErK/g=="
+ },
+ "node_modules/@react-spring/web": {
+ "version": "9.7.5",
+ "resolved": "https://registry.npmjs.org/@react-spring/web/-/web-9.7.5.tgz",
+ "integrity": "sha512-lmvqGwpe+CSttsWNZVr+Dg62adtKhauGwLyGE/RRyZ8AAMLgb9x3NDMA5RMElXo+IMyTkPp7nxTB8ZQlmhb6JQ==",
+ "dependencies": {
+ "@react-spring/animated": "~9.7.5",
+ "@react-spring/core": "~9.7.5",
+ "@react-spring/shared": "~9.7.5",
+ "@react-spring/types": "~9.7.5"
+ },
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0",
+ "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0"
+ }
+ },
+ "node_modules/@rtsao/scc": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz",
+ "integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==",
+ "dev": true
+ },
+ "node_modules/@sentry/core": {
+ "version": "6.19.7",
+ "resolved": "https://registry.npmjs.org/@sentry/core/-/core-6.19.7.tgz",
+ "integrity": "sha512-tOfZ/umqB2AcHPGbIrsFLcvApdTm9ggpi/kQZFkej7kMphjT+SGBiQfYtjyg9jcRW+ilAR4JXC9BGKsdEQ+8Vw==",
+ "dev": true,
+ "dependencies": {
+ "@sentry/hub": "6.19.7",
+ "@sentry/minimal": "6.19.7",
+ "@sentry/types": "6.19.7",
+ "@sentry/utils": "6.19.7",
+ "tslib": "^1.9.3"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/@sentry/core/node_modules/tslib": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+ "dev": true
+ },
+ "node_modules/@sentry/hub": {
+ "version": "6.19.7",
+ "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-6.19.7.tgz",
+ "integrity": "sha512-y3OtbYFAqKHCWezF0EGGr5lcyI2KbaXW2Ik7Xp8Mu9TxbSTuwTe4rTntwg8ngPjUQU3SUHzgjqVB8qjiGqFXCA==",
+ "dev": true,
+ "dependencies": {
+ "@sentry/types": "6.19.7",
+ "@sentry/utils": "6.19.7",
+ "tslib": "^1.9.3"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/@sentry/hub/node_modules/tslib": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+ "dev": true
+ },
+ "node_modules/@sentry/minimal": {
+ "version": "6.19.7",
+ "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-6.19.7.tgz",
+ "integrity": "sha512-wcYmSJOdvk6VAPx8IcmZgN08XTXRwRtB1aOLZm+MVHjIZIhHoBGZJYTVQS/BWjldsamj2cX3YGbGXNunaCfYJQ==",
+ "dev": true,
+ "dependencies": {
+ "@sentry/hub": "6.19.7",
+ "@sentry/types": "6.19.7",
+ "tslib": "^1.9.3"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/@sentry/minimal/node_modules/tslib": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+ "dev": true
+ },
+ "node_modules/@sentry/node": {
+ "version": "6.19.7",
+ "resolved": "https://registry.npmjs.org/@sentry/node/-/node-6.19.7.tgz",
+ "integrity": "sha512-gtmRC4dAXKODMpHXKfrkfvyBL3cI8y64vEi3fDD046uqYcrWdgoQsffuBbxMAizc6Ez1ia+f0Flue6p15Qaltg==",
+ "dev": true,
+ "dependencies": {
+ "@sentry/core": "6.19.7",
+ "@sentry/hub": "6.19.7",
+ "@sentry/types": "6.19.7",
+ "@sentry/utils": "6.19.7",
+ "cookie": "^0.4.1",
+ "https-proxy-agent": "^5.0.0",
+ "lru_map": "^0.3.3",
+ "tslib": "^1.9.3"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/@sentry/node/node_modules/tslib": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+ "dev": true
+ },
+ "node_modules/@sentry/types": {
+ "version": "6.19.7",
+ "resolved": "https://registry.npmjs.org/@sentry/types/-/types-6.19.7.tgz",
+ "integrity": "sha512-jH84pDYE+hHIbVnab3Hr+ZXr1v8QABfhx39KknxqKWr2l0oEItzepV0URvbEhB446lk/S/59230dlUUIBGsXbg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/@sentry/utils": {
+ "version": "6.19.7",
+ "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-6.19.7.tgz",
+ "integrity": "sha512-z95ECmE3i9pbWoXQrD/7PgkBAzJYR+iXtPuTkpBjDKs86O3mT+PXOT3BAn79w2wkn7/i3vOGD2xVr1uiMl26dA==",
+ "dev": true,
+ "dependencies": {
+ "@sentry/types": "6.19.7",
+ "tslib": "^1.9.3"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/@sentry/utils/node_modules/tslib": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+ "dev": true
+ },
+ "node_modules/@sideway/address": {
+ "version": "4.1.5",
+ "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz",
+ "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==",
+ "dev": true,
+ "dependencies": {
+ "@hapi/hoek": "^9.0.0"
+ }
+ },
+ "node_modules/@sideway/formula": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz",
+ "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==",
+ "dev": true
+ },
+ "node_modules/@sideway/pinpoint": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz",
+ "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==",
+ "dev": true
+ },
+ "node_modules/@sinclair/typebox": {
+ "version": "0.27.8",
+ "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz",
+ "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==",
+ "dev": true
+ },
+ "node_modules/@sindresorhus/is": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz",
+ "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/is?sponsor=1"
+ }
+ },
+ "node_modules/@sinonjs/commons": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz",
+ "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==",
+ "dev": true,
+ "dependencies": {
+ "type-detect": "4.0.8"
+ }
+ },
+ "node_modules/@sinonjs/fake-timers": {
+ "version": "10.3.0",
+ "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-10.3.0.tgz",
+ "integrity": "sha512-V4BG07kuYSUkTCSBHG8G8TNhM+F19jXFWnQtzj+we8DrkpSBCee9Z3Ms8yiGer/dlmhe35/Xdgyo3/0rQKg7YA==",
+ "dev": true,
+ "dependencies": {
+ "@sinonjs/commons": "^3.0.0"
+ }
+ },
+ "node_modules/@stylistic/stylelint-plugin": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/@stylistic/stylelint-plugin/-/stylelint-plugin-3.1.1.tgz",
+ "integrity": "sha512-XagAHHIa528EvyGybv8EEYGK5zrVW74cHpsjhtovVATbhDRuJYfE+X4HCaAieW9lCkwbX6L+X0I4CiUG3w/hFw==",
+ "dev": true,
+ "dependencies": {
+ "@csstools/css-parser-algorithms": "^3.0.1",
+ "@csstools/css-tokenizer": "^3.0.1",
+ "@csstools/media-query-list-parser": "^3.0.1",
+ "is-plain-object": "^5.0.0",
+ "postcss-selector-parser": "^6.1.2",
+ "postcss-value-parser": "^4.2.0",
+ "style-search": "^0.1.0",
+ "stylelint": "^16.8.2"
+ },
+ "engines": {
+ "node": "^18.12 || >=20.9"
+ },
+ "peerDependencies": {
+ "stylelint": "^16.8.0"
+ }
+ },
+ "node_modules/@svgr/babel-plugin-add-jsx-attribute": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-8.0.0.tgz",
+ "integrity": "sha512-b9MIk7yhdS1pMCZM8VeNfUlSKVRhsHZNMl5O9SfaX0l0t5wjdgu4IDzGB8bpnGBBOjGST3rRFVsaaEtI4W6f7g==",
+ "dev": true,
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@svgr/babel-plugin-remove-jsx-attribute": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-8.0.0.tgz",
+ "integrity": "sha512-BcCkm/STipKvbCl6b7QFrMh/vx00vIP63k2eM66MfHJzPr6O2U0jYEViXkHJWqXqQYjdeA9cuCl5KWmlwjDvbA==",
+ "dev": true,
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-8.0.0.tgz",
+ "integrity": "sha512-5BcGCBfBxB5+XSDSWnhTThfI9jcO5f0Ai2V24gZpG+wXF14BzwxxdDb4g6trdOux0rhibGs385BeFMSmxtS3uA==",
+ "dev": true,
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-8.0.0.tgz",
+ "integrity": "sha512-KVQ+PtIjb1BuYT3ht8M5KbzWBhdAjjUPdlMtpuw/VjT8coTrItWX6Qafl9+ji831JaJcu6PJNKCV0bp01lBNzQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@svgr/babel-plugin-svg-dynamic-title": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-8.0.0.tgz",
+ "integrity": "sha512-omNiKqwjNmOQJ2v6ge4SErBbkooV2aAWwaPFs2vUY7p7GhVkzRkJ00kILXQvRhA6miHnNpXv7MRnnSjdRjK8og==",
+ "dev": true,
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@svgr/babel-plugin-svg-em-dimensions": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-8.0.0.tgz",
+ "integrity": "sha512-mURHYnu6Iw3UBTbhGwE/vsngtCIbHE43xCRK7kCw4t01xyGqb2Pd+WXekRRoFOBIY29ZoOhUCTEweDMdrjfi9g==",
+ "dev": true,
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@svgr/babel-plugin-transform-react-native-svg": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-8.1.0.tgz",
+ "integrity": "sha512-Tx8T58CHo+7nwJ+EhUwx3LfdNSG9R2OKfaIXXs5soiy5HtgoAEkDay9LIimLOcG8dJQH1wPZp/cnAv6S9CrR1Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@svgr/babel-plugin-transform-svg-component": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-8.0.0.tgz",
+ "integrity": "sha512-DFx8xa3cZXTdb/k3kfPeaixecQLgKh5NVBMwD0AQxOzcZawK4oo1Jh9LbrcACUivsCA7TLG8eeWgrDXjTMhRmw==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@svgr/babel-preset": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-8.1.0.tgz",
+ "integrity": "sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug==",
+ "dev": true,
+ "dependencies": {
+ "@svgr/babel-plugin-add-jsx-attribute": "8.0.0",
+ "@svgr/babel-plugin-remove-jsx-attribute": "8.0.0",
+ "@svgr/babel-plugin-remove-jsx-empty-expression": "8.0.0",
+ "@svgr/babel-plugin-replace-jsx-attribute-value": "8.0.0",
+ "@svgr/babel-plugin-svg-dynamic-title": "8.0.0",
+ "@svgr/babel-plugin-svg-em-dimensions": "8.0.0",
+ "@svgr/babel-plugin-transform-react-native-svg": "8.1.0",
+ "@svgr/babel-plugin-transform-svg-component": "8.0.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0-0"
+ }
+ },
+ "node_modules/@svgr/core": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz",
+ "integrity": "sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/core": "^7.21.3",
+ "@svgr/babel-preset": "8.1.0",
+ "camelcase": "^6.2.0",
+ "cosmiconfig": "^8.1.3",
+ "snake-case": "^3.0.4"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ }
+ },
+ "node_modules/@svgr/core/node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true
+ },
+ "node_modules/@svgr/core/node_modules/cosmiconfig": {
+ "version": "8.3.6",
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz",
+ "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==",
+ "dev": true,
+ "dependencies": {
+ "import-fresh": "^3.3.0",
+ "js-yaml": "^4.1.0",
+ "parse-json": "^5.2.0",
+ "path-type": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/d-fischer"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.9.5"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@svgr/core/node_modules/js-yaml": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "dev": true,
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/@svgr/hast-util-to-babel-ast": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-8.0.0.tgz",
+ "integrity": "sha512-EbDKwO9GpfWP4jN9sGdYwPBU0kdomaPIL2Eu4YwmgP+sJeXT+L7bMwJUBnhzfH8Q2qMBqZ4fJwpCyYsAN3mt2Q==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.21.3",
+ "entities": "^4.4.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ }
+ },
+ "node_modules/@svgr/plugin-jsx": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-8.1.0.tgz",
+ "integrity": "sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/core": "^7.21.3",
+ "@svgr/babel-preset": "8.1.0",
+ "@svgr/hast-util-to-babel-ast": "8.0.0",
+ "svg-parser": "^2.0.4"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ },
+ "peerDependencies": {
+ "@svgr/core": "*"
+ }
+ },
+ "node_modules/@svgr/plugin-svgo": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-8.1.0.tgz",
+ "integrity": "sha512-Ywtl837OGO9pTLIN/onoWLmDQ4zFUycI1g76vuKGEz6evR/ZTJlJuz3G/fIkb6OVBJ2g0o6CGJzaEjfmEo3AHA==",
+ "dev": true,
+ "dependencies": {
+ "cosmiconfig": "^8.1.3",
+ "deepmerge": "^4.3.1",
+ "svgo": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ },
+ "peerDependencies": {
+ "@svgr/core": "*"
+ }
+ },
+ "node_modules/@svgr/plugin-svgo/node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true
+ },
+ "node_modules/@svgr/plugin-svgo/node_modules/cosmiconfig": {
+ "version": "8.3.6",
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz",
+ "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==",
+ "dev": true,
+ "dependencies": {
+ "import-fresh": "^3.3.0",
+ "js-yaml": "^4.1.0",
+ "parse-json": "^5.2.0",
+ "path-type": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/d-fischer"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.9.5"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@svgr/plugin-svgo/node_modules/js-yaml": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "dev": true,
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/@svgr/webpack": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-8.1.0.tgz",
+ "integrity": "sha512-LnhVjMWyMQV9ZmeEy26maJk+8HTIbd59cH4F2MJ439k9DqejRisfFNGAPvRYlKETuh9LrImlS8aKsBgKjMA8WA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/core": "^7.21.3",
+ "@babel/plugin-transform-react-constant-elements": "^7.21.3",
+ "@babel/preset-env": "^7.20.2",
+ "@babel/preset-react": "^7.18.6",
+ "@babel/preset-typescript": "^7.21.0",
+ "@svgr/core": "8.1.0",
+ "@svgr/plugin-jsx": "8.1.0",
+ "@svgr/plugin-svgo": "8.1.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/gregberge"
+ }
+ },
+ "node_modules/@szmarczak/http-timer": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz",
+ "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==",
+ "dev": true,
+ "dependencies": {
+ "defer-to-connect": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@tannin/compile": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@tannin/compile/-/compile-1.1.0.tgz",
+ "integrity": "sha512-n8m9eNDfoNZoxdvWiTfW/hSPhehzLJ3zW7f8E7oT6mCROoMNWCB4TYtv041+2FMAxweiE0j7i1jubQU4MEC/Gg==",
+ "dependencies": {
+ "@tannin/evaluate": "^1.2.0",
+ "@tannin/postfix": "^1.1.0"
+ }
+ },
+ "node_modules/@tannin/evaluate": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@tannin/evaluate/-/evaluate-1.2.0.tgz",
+ "integrity": "sha512-3ioXvNowbO/wSrxsDG5DKIMxC81P0QrQTYai8zFNY+umuoHWRPbQ/TuuDEOju9E+jQDXmj6yI5GyejNuh8I+eg=="
+ },
+ "node_modules/@tannin/plural-forms": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@tannin/plural-forms/-/plural-forms-1.1.0.tgz",
+ "integrity": "sha512-xl9R2mDZO/qiHam1AgMnAES6IKIg7OBhcXqy6eDsRCdXuxAFPcjrej9HMjyCLE0DJ/8cHf0i5OQTstuBRhpbHw==",
+ "dependencies": {
+ "@tannin/compile": "^1.1.0"
+ }
+ },
+ "node_modules/@tannin/postfix": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/@tannin/postfix/-/postfix-1.1.0.tgz",
+ "integrity": "sha512-oocsqY7g0cR+Gur5jRQLSrX2OtpMLMse1I10JQBm8CdGMrDkh1Mg2gjsiquMHRtBs4Qwu5wgEp5GgIYHk4SNPw=="
+ },
+ "node_modules/@tootallnate/once": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz",
+ "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==",
+ "dev": true,
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/@tootallnate/quickjs-emscripten": {
+ "version": "0.23.0",
+ "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz",
+ "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==",
+ "dev": true
+ },
+ "node_modules/@trysound/sax": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz",
+ "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/@types/babel__core": {
+ "version": "7.20.5",
+ "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz",
+ "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/parser": "^7.20.7",
+ "@babel/types": "^7.20.7",
+ "@types/babel__generator": "*",
+ "@types/babel__template": "*",
+ "@types/babel__traverse": "*"
+ }
+ },
+ "node_modules/@types/babel__generator": {
+ "version": "7.6.8",
+ "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.8.tgz",
+ "integrity": "sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.0.0"
+ }
+ },
+ "node_modules/@types/babel__template": {
+ "version": "7.4.4",
+ "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz",
+ "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==",
+ "dev": true,
+ "dependencies": {
+ "@babel/parser": "^7.1.0",
+ "@babel/types": "^7.0.0"
+ }
+ },
+ "node_modules/@types/babel__traverse": {
+ "version": "7.20.6",
+ "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.6.tgz",
+ "integrity": "sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/types": "^7.20.7"
+ }
+ },
+ "node_modules/@types/body-parser": {
+ "version": "1.19.5",
+ "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.5.tgz",
+ "integrity": "sha512-fB3Zu92ucau0iQ0JMCFQE7b/dv8Ot07NI3KaZIkIUNXq82k4eBAqUaneXfleGY9JWskeS9y+u0nXMyspcuQrCg==",
+ "dev": true,
+ "dependencies": {
+ "@types/connect": "*",
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/bonjour": {
+ "version": "3.5.13",
+ "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.13.tgz",
+ "integrity": "sha512-z9fJ5Im06zvUL548KvYNecEVlA7cVDkGUi6kZusb04mpyEFKCIZJvloCcmpmLaIahDpOQGHaHmG6imtPMmPXGQ==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/cacheable-request": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.3.tgz",
+ "integrity": "sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==",
+ "dev": true,
+ "dependencies": {
+ "@types/http-cache-semantics": "*",
+ "@types/keyv": "^3.1.4",
+ "@types/node": "*",
+ "@types/responselike": "^1.0.0"
+ }
+ },
+ "node_modules/@types/connect": {
+ "version": "3.4.38",
+ "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz",
+ "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/connect-history-api-fallback": {
+ "version": "1.5.4",
+ "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz",
+ "integrity": "sha512-n6Cr2xS1h4uAulPRdlw6Jl6s1oG8KrVilPN2yUITEs+K48EzMJJ3W1xy8K5eWuFvjp3R74AOIGSmp2UfBJ8HFw==",
+ "dev": true,
+ "dependencies": {
+ "@types/express-serve-static-core": "*",
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/eslint": {
+ "version": "9.6.1",
+ "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz",
+ "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==",
+ "dev": true,
+ "dependencies": {
+ "@types/estree": "*",
+ "@types/json-schema": "*"
+ }
+ },
+ "node_modules/@types/eslint-scope": {
+ "version": "3.7.7",
+ "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz",
+ "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==",
+ "dev": true,
+ "dependencies": {
+ "@types/eslint": "*",
+ "@types/estree": "*"
+ }
+ },
+ "node_modules/@types/estree": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz",
+ "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==",
+ "dev": true
+ },
+ "node_modules/@types/express": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.21.tgz",
+ "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==",
+ "dev": true,
+ "dependencies": {
+ "@types/body-parser": "*",
+ "@types/express-serve-static-core": "^4.17.33",
+ "@types/qs": "*",
+ "@types/serve-static": "*"
+ }
+ },
+ "node_modules/@types/express-serve-static-core": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.1.tgz",
+ "integrity": "sha512-CRICJIl0N5cXDONAdlTv5ShATZ4HEwk6kDDIW2/w9qOWKg+NU/5F8wYRWCrONad0/UKkloNSmmyN/wX4rtpbVA==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "*",
+ "@types/qs": "*",
+ "@types/range-parser": "*",
+ "@types/send": "*"
+ }
+ },
+ "node_modules/@types/express/node_modules/@types/express-serve-static-core": {
+ "version": "4.19.6",
+ "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.6.tgz",
+ "integrity": "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "*",
+ "@types/qs": "*",
+ "@types/range-parser": "*",
+ "@types/send": "*"
+ }
+ },
+ "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==",
+ "dev": true,
+ "dependencies": {
+ "@types/minimatch": "*",
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/graceful-fs": {
+ "version": "4.1.9",
+ "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz",
+ "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/gradient-parser": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/@types/gradient-parser/-/gradient-parser-0.1.3.tgz",
+ "integrity": "sha512-XDbrTSBlQV9nxE1GiDL3FaOPy4G/KaJkhDutBX48Kg8CYZMBARyyDFGCWfWJn4pobmInmwud1xxH7VJMAr0CKQ=="
+ },
+ "node_modules/@types/highlight-words-core": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/@types/highlight-words-core/-/highlight-words-core-1.2.1.tgz",
+ "integrity": "sha512-9VZUA5omXBfn+hDxFjUDu1FOJTBM3LmvqfDey+Z6Aa8B8/JmF5SMj6FBrjfgJ/Q3YXOZd3qyTDfJyMZSs/wCUA=="
+ },
+ "node_modules/@types/http-cache-semantics": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.4.tgz",
+ "integrity": "sha512-1m0bIFVc7eJWyve9S0RnuRgcQqF/Xd5QsUZAZeQFr1Q3/p9JWoQQEqmVy+DPTNpGXwhgIetAoYF8JSc33q29QA==",
+ "dev": true
+ },
+ "node_modules/@types/http-errors": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.4.tgz",
+ "integrity": "sha512-D0CFMMtydbJAegzOyHjtiKPLlvnm3iTZyZRSZoLq2mRhDdmLfIWOCYPfQJ4cu2erKghU++QvjcUjp/5h7hESpA==",
+ "dev": true
+ },
+ "node_modules/@types/http-proxy": {
+ "version": "1.17.15",
+ "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.15.tgz",
+ "integrity": "sha512-25g5atgiVNTIv0LBDTg1H74Hvayx0ajtJPLLcYE3whFv75J0pWNtOBzaXJQgDTmrX1bx5U9YC2w/n65BN1HwRQ==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/istanbul-lib-coverage": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz",
+ "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==",
+ "dev": true
+ },
+ "node_modules/@types/istanbul-lib-report": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz",
+ "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==",
+ "dev": true,
+ "dependencies": {
+ "@types/istanbul-lib-coverage": "*"
+ }
+ },
+ "node_modules/@types/istanbul-reports": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz",
+ "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==",
+ "dev": true,
+ "dependencies": {
+ "@types/istanbul-lib-report": "*"
+ }
+ },
+ "node_modules/@types/jsdom": {
+ "version": "20.0.1",
+ "resolved": "https://registry.npmjs.org/@types/jsdom/-/jsdom-20.0.1.tgz",
+ "integrity": "sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "*",
+ "@types/tough-cookie": "*",
+ "parse5": "^7.0.0"
+ }
+ },
+ "node_modules/@types/json-schema": {
+ "version": "7.0.15",
+ "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
+ "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
+ "dev": true
+ },
+ "node_modules/@types/json5": {
+ "version": "0.0.29",
+ "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz",
+ "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==",
+ "dev": true
+ },
+ "node_modules/@types/keyv": {
+ "version": "3.1.4",
+ "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.4.tgz",
+ "integrity": "sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/mime": {
+ "version": "1.3.5",
+ "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz",
+ "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==",
+ "dev": true
+ },
+ "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==",
+ "dev": true
+ },
+ "node_modules/@types/minimist": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz",
+ "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==",
+ "dev": true
+ },
+ "node_modules/@types/mousetrap": {
+ "version": "1.6.15",
+ "resolved": "https://registry.npmjs.org/@types/mousetrap/-/mousetrap-1.6.15.tgz",
+ "integrity": "sha512-qL0hyIMNPow317QWW/63RvL1x5MVMV+Ru3NaY9f/CuEpCqrmb7WeuK2071ZY5hczOnm38qExWM2i2WtkXLSqFw=="
+ },
+ "node_modules/@types/node": {
+ "version": "22.9.0",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-22.9.0.tgz",
+ "integrity": "sha512-vuyHg81vvWA1Z1ELfvLko2c8f34gyA0zaic0+Rllc5lbCnbSyuvb2Oxpm6TAUAC/2xZN3QGqxBNggD1nNR2AfQ==",
+ "dependencies": {
+ "undici-types": "~6.19.8"
+ }
+ },
+ "node_modules/@types/node-forge": {
+ "version": "1.3.11",
+ "resolved": "https://registry.npmjs.org/@types/node-forge/-/node-forge-1.3.11.tgz",
+ "integrity": "sha512-FQx220y22OKNTqaByeBGqHWYz4cl94tpcxeFdvBo3wjG6XPBuZ0BNgNZRV5J5TFmmcsJ4IzsLkmGRiQbnYsBEQ==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/normalize-package-data": {
+ "version": "2.4.4",
+ "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz",
+ "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==",
+ "dev": true
+ },
+ "node_modules/@types/parse-json": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz",
+ "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw=="
+ },
+ "node_modules/@types/prop-types": {
+ "version": "15.7.13",
+ "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.13.tgz",
+ "integrity": "sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA=="
+ },
+ "node_modules/@types/qs": {
+ "version": "6.9.17",
+ "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.17.tgz",
+ "integrity": "sha512-rX4/bPcfmvxHDv0XjfJELTTr+iB+tn032nPILqHm5wbthUUUuVtNGGqzhya9XUxjTP8Fpr0qYgSZZKxGY++svQ==",
+ "dev": true
+ },
+ "node_modules/@types/range-parser": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz",
+ "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==",
+ "dev": true
+ },
+ "node_modules/@types/react": {
+ "version": "18.3.12",
+ "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.12.tgz",
+ "integrity": "sha512-D2wOSq/d6Agt28q7rSI3jhU7G6aiuzljDGZ2hTZHIkrTLUI+AF3WMeKkEZ9nN2fkBAlcktT6vcZjDFiIhMYEQw==",
+ "dependencies": {
+ "@types/prop-types": "*",
+ "csstype": "^3.0.2"
+ }
+ },
+ "node_modules/@types/react-dom": {
+ "version": "18.3.1",
+ "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.3.1.tgz",
+ "integrity": "sha512-qW1Mfv8taImTthu4KoXgDfLuk4bydU6Q/TkADnDWWHwi4NX4BR+LWfTp2sVmTqRrsHvyDDTelgelxJ+SsejKKQ==",
+ "dependencies": {
+ "@types/react": "*"
+ }
+ },
+ "node_modules/@types/react-transition-group": {
+ "version": "4.4.11",
+ "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.11.tgz",
+ "integrity": "sha512-RM05tAniPZ5DZPzzNFP+DmrcOdD0efDUxMy3145oljWSl3x9ZV5vhme98gTxFrj2lhXvmGNnUiuDyJgY9IKkNA==",
+ "dependencies": {
+ "@types/react": "*"
+ }
+ },
+ "node_modules/@types/responselike": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.3.tgz",
+ "integrity": "sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/retry": {
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz",
+ "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==",
+ "dev": true
+ },
+ "node_modules/@types/semver": {
+ "version": "7.5.8",
+ "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz",
+ "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==",
+ "dev": true
+ },
+ "node_modules/@types/send": {
+ "version": "0.17.4",
+ "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz",
+ "integrity": "sha512-x2EM6TJOybec7c52BX0ZspPodMsQUd5L6PRwOunVyVUhXiBSKf3AezDL8Dgvgt5o0UfKNfuA0eMLr2wLT4AiBA==",
+ "dev": true,
+ "dependencies": {
+ "@types/mime": "^1",
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/serve-index": {
+ "version": "1.9.4",
+ "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.4.tgz",
+ "integrity": "sha512-qLpGZ/c2fhSs5gnYsQxtDEq3Oy8SXPClIXkW5ghvAvsNuVSA8k+gCONcUCS/UjLEYvYps+e8uBtfgXgvhwfNug==",
+ "dev": true,
+ "dependencies": {
+ "@types/express": "*"
+ }
+ },
+ "node_modules/@types/serve-static": {
+ "version": "1.15.7",
+ "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.7.tgz",
+ "integrity": "sha512-W8Ym+h8nhuRwaKPaDw34QUkwsGi6Rc4yYqvKFo5rm2FUEhCFbzVWrxXUxuKK8TASjWsysJY0nsmNCGhCOIsrOw==",
+ "dev": true,
+ "dependencies": {
+ "@types/http-errors": "*",
+ "@types/node": "*",
+ "@types/send": "*"
+ }
+ },
+ "node_modules/@types/simple-peer": {
+ "version": "9.11.8",
+ "resolved": "https://registry.npmjs.org/@types/simple-peer/-/simple-peer-9.11.8.tgz",
+ "integrity": "sha512-rvqefdp2rvIA6wiomMgKWd2UZNPe6LM2EV5AuY3CPQJF+8TbdrL5TjYdMf0VAjGczzlkH4l1NjDkihwbj3Xodw==",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/sockjs": {
+ "version": "0.3.36",
+ "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.36.tgz",
+ "integrity": "sha512-MK9V6NzAS1+Ud7JV9lJLFqW85VbC9dq3LmwZCuBe4wBDgKC0Kj/jd8Xl+nSviU+Qc3+m7umHHyHg//2KSa0a0Q==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/source-list-map": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.6.tgz",
+ "integrity": "sha512-5JcVt1u5HDmlXkwOD2nslZVllBBc7HDuOICfiZah2Z0is8M8g+ddAEawbmd3VjedfDHBzxCaXLs07QEmb7y54g==",
+ "dev": true
+ },
+ "node_modules/@types/stack-utils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz",
+ "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==",
+ "dev": true
+ },
+ "node_modules/@types/tapable": {
+ "version": "1.0.12",
+ "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.12.tgz",
+ "integrity": "sha512-bTHG8fcxEqv1M9+TD14P8ok8hjxoOCkfKc8XXLaaD05kI7ohpeI956jtDOD3XHKBQrlyPughUtzm1jtVhHpA5Q==",
+ "dev": true
+ },
+ "node_modules/@types/tough-cookie": {
+ "version": "4.0.5",
+ "resolved": "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.5.tgz",
+ "integrity": "sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==",
+ "dev": true
+ },
+ "node_modules/@types/uglify-js": {
+ "version": "3.17.5",
+ "resolved": "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.17.5.tgz",
+ "integrity": "sha512-TU+fZFBTBcXj/GpDpDaBmgWk/gn96kMZ+uocaFUlV2f8a6WdMzzI44QBCmGcCiYR0Y6ZlNRiyUyKKt5nl/lbzQ==",
+ "dev": true,
+ "dependencies": {
+ "source-map": "^0.6.1"
+ }
+ },
+ "node_modules/@types/uglify-js/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/@types/webpack": {
+ "version": "4.41.40",
+ "resolved": "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.40.tgz",
+ "integrity": "sha512-u6kMFSBM9HcoTpUXnL6mt2HSzftqb3JgYV6oxIgL2dl6sX6aCa5k6SOkzv5DuZjBTPUE/dJltKtwwuqrkZHpfw==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "*",
+ "@types/tapable": "^1",
+ "@types/uglify-js": "*",
+ "@types/webpack-sources": "*",
+ "anymatch": "^3.0.0",
+ "source-map": "^0.6.0"
+ }
+ },
+ "node_modules/@types/webpack-sources": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-3.2.3.tgz",
+ "integrity": "sha512-4nZOdMwSPHZ4pTEZzSp0AsTM4K7Qmu40UKW4tJDiOVs20UzYF9l+qUe4s0ftfN0pin06n+5cWWDJXH+sbhAiDw==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "*",
+ "@types/source-list-map": "*",
+ "source-map": "^0.7.3"
+ }
+ },
+ "node_modules/@types/webpack-sources/node_modules/source-map": {
+ "version": "0.7.4",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz",
+ "integrity": "sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@types/webpack/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/@types/ws": {
+ "version": "8.5.13",
+ "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.13.tgz",
+ "integrity": "sha512-osM/gWBTPKgHV8XkTunnegTRIsvF6owmf5w+JtAfOw472dptdm0dlGv4xCt6GwQRcC2XVOvvRE/0bAoQcL2QkA==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/yargs": {
+ "version": "17.0.33",
+ "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz",
+ "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==",
+ "dev": true,
+ "dependencies": {
+ "@types/yargs-parser": "*"
+ }
+ },
+ "node_modules/@types/yargs-parser": {
+ "version": "21.0.3",
+ "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz",
+ "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==",
+ "dev": true
+ },
+ "node_modules/@types/yauzl": {
+ "version": "2.10.3",
+ "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz",
+ "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==",
+ "dev": true,
+ "optional": true,
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@typescript-eslint/eslint-plugin": {
+ "version": "6.21.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz",
+ "integrity": "sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA==",
+ "dev": true,
+ "dependencies": {
+ "@eslint-community/regexpp": "^4.5.1",
+ "@typescript-eslint/scope-manager": "6.21.0",
+ "@typescript-eslint/type-utils": "6.21.0",
+ "@typescript-eslint/utils": "6.21.0",
+ "@typescript-eslint/visitor-keys": "6.21.0",
+ "debug": "^4.3.4",
+ "graphemer": "^1.4.0",
+ "ignore": "^5.2.4",
+ "natural-compare": "^1.4.0",
+ "semver": "^7.5.4",
+ "ts-api-utils": "^1.0.1"
+ },
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "@typescript-eslint/parser": "^6.0.0 || ^6.0.0-alpha",
+ "eslint": "^7.0.0 || ^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": {
+ "version": "7.6.3",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
+ "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@typescript-eslint/parser": {
+ "version": "6.21.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz",
+ "integrity": "sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/scope-manager": "6.21.0",
+ "@typescript-eslint/types": "6.21.0",
+ "@typescript-eslint/typescript-estree": "6.21.0",
+ "@typescript-eslint/visitor-keys": "6.21.0",
+ "debug": "^4.3.4"
+ },
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^7.0.0 || ^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/scope-manager": {
+ "version": "6.21.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.21.0.tgz",
+ "integrity": "sha512-OwLUIWZJry80O99zvqXVEioyniJMa+d2GrqpUTqi5/v5D5rOrppJVBPa0yKCblcigC0/aYAzxxqQ1B+DS2RYsg==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "6.21.0",
+ "@typescript-eslint/visitor-keys": "6.21.0"
+ },
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/type-utils": {
+ "version": "6.21.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.21.0.tgz",
+ "integrity": "sha512-rZQI7wHfao8qMX3Rd3xqeYSMCL3SoiSQLBATSiVKARdFGCYSRvmViieZjqc58jKgs8Y8i9YvVVhRbHSTA4VBag==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/typescript-estree": "6.21.0",
+ "@typescript-eslint/utils": "6.21.0",
+ "debug": "^4.3.4",
+ "ts-api-utils": "^1.0.1"
+ },
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^7.0.0 || ^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/types": {
+ "version": "6.21.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.21.0.tgz",
+ "integrity": "sha512-1kFmZ1rOm5epu9NZEZm1kckCDGj5UJEf7P1kliH4LKu/RkwpsfqqGmY2OOcUs18lSlQBKLDYBOGxRVtrMN5lpg==",
+ "dev": true,
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree": {
+ "version": "6.21.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.21.0.tgz",
+ "integrity": "sha512-6npJTkZcO+y2/kr+z0hc4HwNfrrP4kNYh57ek7yCNlrBjWQ1Y0OS7jiZTkgumrvkX5HkEKXFZkkdFNkaW2wmUQ==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "6.21.0",
+ "@typescript-eslint/visitor-keys": "6.21.0",
+ "debug": "^4.3.4",
+ "globby": "^11.1.0",
+ "is-glob": "^4.0.3",
+ "minimatch": "9.0.3",
+ "semver": "^7.5.4",
+ "ts-api-utils": "^1.0.1"
+ },
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": {
+ "version": "7.6.3",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
+ "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@typescript-eslint/utils": {
+ "version": "6.21.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz",
+ "integrity": "sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ==",
+ "dev": true,
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.4.0",
+ "@types/json-schema": "^7.0.12",
+ "@types/semver": "^7.5.0",
+ "@typescript-eslint/scope-manager": "6.21.0",
+ "@typescript-eslint/types": "6.21.0",
+ "@typescript-eslint/typescript-estree": "6.21.0",
+ "semver": "^7.5.4"
+ },
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/@typescript-eslint/utils/node_modules/semver": {
+ "version": "7.6.3",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
+ "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/@typescript-eslint/visitor-keys": {
+ "version": "6.21.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.21.0.tgz",
+ "integrity": "sha512-JJtkDduxLi9bivAB+cYOVMtbkqdPOhZ+ZI5LC47MIRrDV4Yn2o+ZnW10Nkmr28xRpSpdJ6Sm42Hjf2+REYXm0A==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "6.21.0",
+ "eslint-visitor-keys": "^3.4.1"
+ },
+ "engines": {
+ "node": "^16.0.0 || >=18.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
+ "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
+ "dev": true,
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/@ungap/structured-clone": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz",
+ "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==",
+ "dev": true
+ },
+ "node_modules/@use-gesture/core": {
+ "version": "10.3.1",
+ "resolved": "https://registry.npmjs.org/@use-gesture/core/-/core-10.3.1.tgz",
+ "integrity": "sha512-WcINiDt8WjqBdUXye25anHiNxPc0VOrlT8F6LLkU6cycrOGUDyY/yyFmsg3k8i5OLvv25llc0QC45GhR/C8llw=="
+ },
+ "node_modules/@use-gesture/react": {
+ "version": "10.3.1",
+ "resolved": "https://registry.npmjs.org/@use-gesture/react/-/react-10.3.1.tgz",
+ "integrity": "sha512-Yy19y6O2GJq8f7CHf7L0nxL8bf4PZCPaVOCgJrusOeFHY1LvHgYXnmnXg6N5iwAnbgbZCDjo60SiM6IPJi9C5g==",
+ "dependencies": {
+ "@use-gesture/core": "10.3.1"
+ },
+ "peerDependencies": {
+ "react": ">= 16.8.0"
+ }
+ },
+ "node_modules/@webassemblyjs/ast": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz",
+ "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==",
+ "dev": true,
+ "dependencies": {
+ "@webassemblyjs/helper-numbers": "1.13.2",
+ "@webassemblyjs/helper-wasm-bytecode": "1.13.2"
+ }
+ },
+ "node_modules/@webassemblyjs/floating-point-hex-parser": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz",
+ "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==",
+ "dev": true
+ },
+ "node_modules/@webassemblyjs/helper-api-error": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz",
+ "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==",
+ "dev": true
+ },
+ "node_modules/@webassemblyjs/helper-buffer": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz",
+ "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==",
+ "dev": true
+ },
+ "node_modules/@webassemblyjs/helper-numbers": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz",
+ "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==",
+ "dev": true,
+ "dependencies": {
+ "@webassemblyjs/floating-point-hex-parser": "1.13.2",
+ "@webassemblyjs/helper-api-error": "1.13.2",
+ "@xtuc/long": "4.2.2"
+ }
+ },
+ "node_modules/@webassemblyjs/helper-wasm-bytecode": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz",
+ "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==",
+ "dev": true
+ },
+ "node_modules/@webassemblyjs/helper-wasm-section": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz",
+ "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==",
+ "dev": true,
+ "dependencies": {
+ "@webassemblyjs/ast": "1.14.1",
+ "@webassemblyjs/helper-buffer": "1.14.1",
+ "@webassemblyjs/helper-wasm-bytecode": "1.13.2",
+ "@webassemblyjs/wasm-gen": "1.14.1"
+ }
+ },
+ "node_modules/@webassemblyjs/ieee754": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz",
+ "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==",
+ "dev": true,
+ "dependencies": {
+ "@xtuc/ieee754": "^1.2.0"
+ }
+ },
+ "node_modules/@webassemblyjs/leb128": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz",
+ "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==",
+ "dev": true,
+ "dependencies": {
+ "@xtuc/long": "4.2.2"
+ }
+ },
+ "node_modules/@webassemblyjs/utf8": {
+ "version": "1.13.2",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz",
+ "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==",
+ "dev": true
+ },
+ "node_modules/@webassemblyjs/wasm-edit": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz",
+ "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==",
+ "dev": true,
+ "dependencies": {
+ "@webassemblyjs/ast": "1.14.1",
+ "@webassemblyjs/helper-buffer": "1.14.1",
+ "@webassemblyjs/helper-wasm-bytecode": "1.13.2",
+ "@webassemblyjs/helper-wasm-section": "1.14.1",
+ "@webassemblyjs/wasm-gen": "1.14.1",
+ "@webassemblyjs/wasm-opt": "1.14.1",
+ "@webassemblyjs/wasm-parser": "1.14.1",
+ "@webassemblyjs/wast-printer": "1.14.1"
+ }
+ },
+ "node_modules/@webassemblyjs/wasm-gen": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz",
+ "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==",
+ "dev": true,
+ "dependencies": {
+ "@webassemblyjs/ast": "1.14.1",
+ "@webassemblyjs/helper-wasm-bytecode": "1.13.2",
+ "@webassemblyjs/ieee754": "1.13.2",
+ "@webassemblyjs/leb128": "1.13.2",
+ "@webassemblyjs/utf8": "1.13.2"
+ }
+ },
+ "node_modules/@webassemblyjs/wasm-opt": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz",
+ "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==",
+ "dev": true,
+ "dependencies": {
+ "@webassemblyjs/ast": "1.14.1",
+ "@webassemblyjs/helper-buffer": "1.14.1",
+ "@webassemblyjs/wasm-gen": "1.14.1",
+ "@webassemblyjs/wasm-parser": "1.14.1"
+ }
+ },
+ "node_modules/@webassemblyjs/wasm-parser": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz",
+ "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==",
+ "dev": true,
+ "dependencies": {
+ "@webassemblyjs/ast": "1.14.1",
+ "@webassemblyjs/helper-api-error": "1.13.2",
+ "@webassemblyjs/helper-wasm-bytecode": "1.13.2",
+ "@webassemblyjs/ieee754": "1.13.2",
+ "@webassemblyjs/leb128": "1.13.2",
+ "@webassemblyjs/utf8": "1.13.2"
+ }
+ },
+ "node_modules/@webassemblyjs/wast-printer": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz",
+ "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==",
+ "dev": true,
+ "dependencies": {
+ "@webassemblyjs/ast": "1.14.1",
+ "@xtuc/long": "4.2.2"
+ }
+ },
+ "node_modules/@webpack-cli/configtest": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.1.tgz",
+ "integrity": "sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==",
+ "dev": true,
+ "engines": {
+ "node": ">=14.15.0"
+ },
+ "peerDependencies": {
+ "webpack": "5.x.x",
+ "webpack-cli": "5.x.x"
+ }
+ },
+ "node_modules/@webpack-cli/info": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.2.tgz",
+ "integrity": "sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==",
+ "dev": true,
+ "engines": {
+ "node": ">=14.15.0"
+ },
+ "peerDependencies": {
+ "webpack": "5.x.x",
+ "webpack-cli": "5.x.x"
+ }
+ },
+ "node_modules/@webpack-cli/serve": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.5.tgz",
+ "integrity": "sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=14.15.0"
+ },
+ "peerDependencies": {
+ "webpack": "5.x.x",
+ "webpack-cli": "5.x.x"
+ },
+ "peerDependenciesMeta": {
+ "webpack-dev-server": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@wordpress/a11y": {
+ "version": "4.11.0",
+ "resolved": "https://registry.npmjs.org/@wordpress/a11y/-/a11y-4.11.0.tgz",
+ "integrity": "sha512-gUrsmDvxuD8HXYmoND+niJw4Tk0qMDqMsOryzuQEymyO63o89DfoT1NBpJUk8P9P+xSCRHp5EoxaMUQ0Kiz81w==",
+ "dependencies": {
+ "@babel/runtime": "7.25.7",
+ "@wordpress/dom-ready": "*",
+ "@wordpress/i18n": "*"
+ },
+ "engines": {
+ "node": ">=18.12.0",
+ "npm": ">=8.19.2"
+ }
+ },
+ "node_modules/@wordpress/a11y/node_modules/@babel/runtime": {
+ "version": "7.25.7",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz",
+ "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==",
+ "dependencies": {
+ "regenerator-runtime": "^0.14.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@wordpress/api-fetch": {
+ "version": "7.11.0",
+ "resolved": "https://registry.npmjs.org/@wordpress/api-fetch/-/api-fetch-7.11.0.tgz",
+ "integrity": "sha512-JOlkaGIdclT+Pxi+zlkEHYGtS4LLRRsg7soZ2bXXmdo0CBUycdumu0G3AJeK7R8RAVBhfcI4ZjZ5BXeRdOO00A==",
+ "dependencies": {
+ "@babel/runtime": "7.25.7",
+ "@wordpress/i18n": "*",
+ "@wordpress/url": "*"
+ },
+ "engines": {
+ "node": ">=18.12.0",
+ "npm": ">=8.19.2"
+ }
+ },
+ "node_modules/@wordpress/api-fetch/node_modules/@babel/runtime": {
+ "version": "7.25.7",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz",
+ "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==",
+ "dependencies": {
+ "regenerator-runtime": "^0.14.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@wordpress/autop": {
+ "version": "4.11.0",
+ "resolved": "https://registry.npmjs.org/@wordpress/autop/-/autop-4.11.0.tgz",
+ "integrity": "sha512-Nb5SPCVayQoR0Xcgp16aTCvPEpbiPtJoEi4F8RoHFjN0rIShzA8i7ArzGXJy3PMkAozxGK0nF/I77yelF2SDyw==",
+ "dependencies": {
+ "@babel/runtime": "7.25.7"
+ },
+ "engines": {
+ "node": ">=18.12.0",
+ "npm": ">=8.19.2"
+ }
+ },
+ "node_modules/@wordpress/autop/node_modules/@babel/runtime": {
+ "version": "7.25.7",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz",
+ "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==",
+ "dependencies": {
+ "regenerator-runtime": "^0.14.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@wordpress/babel-preset-default": {
+ "version": "8.11.0",
+ "resolved": "https://registry.npmjs.org/@wordpress/babel-preset-default/-/babel-preset-default-8.11.0.tgz",
+ "integrity": "sha512-allmuNraEE8R2hu4GV65GLF4EHAqkPZHTMNZZs7ujBy/JYYmVRYrg5WQOG6W9addQyjo6Ugx9s2R6Vh8fnYv/A==",
+ "dev": true,
+ "dependencies": {
+ "@babel/core": "7.25.7",
+ "@babel/plugin-transform-react-jsx": "7.25.7",
+ "@babel/plugin-transform-runtime": "7.25.7",
+ "@babel/preset-env": "7.25.7",
+ "@babel/preset-typescript": "7.25.7",
+ "@babel/runtime": "7.25.7",
+ "@wordpress/browserslist-config": "*",
+ "@wordpress/warning": "*",
+ "browserslist": "^4.21.10",
+ "core-js": "^3.31.0",
+ "react": "^18.3.0"
+ },
+ "engines": {
+ "node": ">=18.12.0",
+ "npm": ">=8.19.2"
+ }
+ },
+ "node_modules/@wordpress/babel-preset-default/node_modules/@babel/core": {
+ "version": "7.25.7",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.7.tgz",
+ "integrity": "sha512-yJ474Zv3cwiSOO9nXJuqzvwEeM+chDuQ8GJirw+pZ91sCGCyOZ3dJkVE09fTV0VEVzXyLWhh3G/AolYTPX7Mow==",
+ "dev": true,
+ "dependencies": {
+ "@ampproject/remapping": "^2.2.0",
+ "@babel/code-frame": "^7.25.7",
+ "@babel/generator": "^7.25.7",
+ "@babel/helper-compilation-targets": "^7.25.7",
+ "@babel/helper-module-transforms": "^7.25.7",
+ "@babel/helpers": "^7.25.7",
+ "@babel/parser": "^7.25.7",
+ "@babel/template": "^7.25.7",
+ "@babel/traverse": "^7.25.7",
+ "@babel/types": "^7.25.7",
+ "convert-source-map": "^2.0.0",
+ "debug": "^4.1.0",
+ "gensync": "^1.0.0-beta.2",
+ "json5": "^2.2.3",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/babel"
+ }
+ },
+ "node_modules/@wordpress/babel-preset-default/node_modules/@babel/runtime": {
+ "version": "7.25.7",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz",
+ "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==",
+ "dev": true,
+ "dependencies": {
+ "regenerator-runtime": "^0.14.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@wordpress/base-styles": {
+ "version": "5.11.0",
+ "resolved": "https://registry.npmjs.org/@wordpress/base-styles/-/base-styles-5.11.0.tgz",
+ "integrity": "sha512-czK3/eTq/cKUwa8dFNpVdtzlVXbA4fo/b9i+N5fWzwKlZ8jAT/OtdCS+6zTyrv7yVO6R12F4ruXWRXoDKRasIg==",
+ "dev": true,
+ "engines": {
+ "node": ">=18.12.0",
+ "npm": ">=8.19.2"
+ }
+ },
+ "node_modules/@wordpress/blob": {
+ "version": "4.11.0",
+ "resolved": "https://registry.npmjs.org/@wordpress/blob/-/blob-4.11.0.tgz",
+ "integrity": "sha512-WoJL2wmSK8bzx7vz5yFapdISG7JCQOWWn7lRR+x7xKlkgBr9mDx9dmV8Ih0jE/O8JIhe+YDxEjlS7OsIX2s02w==",
+ "dependencies": {
+ "@babel/runtime": "7.25.7"
+ },
+ "engines": {
+ "node": ">=18.12.0",
+ "npm": ">=8.19.2"
+ }
+ },
+ "node_modules/@wordpress/blob/node_modules/@babel/runtime": {
+ "version": "7.25.7",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz",
+ "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==",
+ "dependencies": {
+ "regenerator-runtime": "^0.14.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@wordpress/block-editor": {
+ "version": "14.6.0",
+ "resolved": "https://registry.npmjs.org/@wordpress/block-editor/-/block-editor-14.6.0.tgz",
+ "integrity": "sha512-Pala/+i7izwB7QJbr6tVfg2XR0p6wb2biIoF2DjzNh+draoTjPtxCbZQrOJSd8hfyXQOOQPuLiAGdsq50PEZsA==",
+ "dependencies": {
+ "@babel/runtime": "7.25.7",
+ "@emotion/react": "^11.7.1",
+ "@emotion/styled": "^11.6.0",
+ "@react-spring/web": "^9.4.5",
+ "@wordpress/a11y": "*",
+ "@wordpress/api-fetch": "*",
+ "@wordpress/blob": "*",
+ "@wordpress/block-serialization-default-parser": "*",
+ "@wordpress/blocks": "*",
+ "@wordpress/commands": "*",
+ "@wordpress/components": "*",
+ "@wordpress/compose": "*",
+ "@wordpress/data": "*",
+ "@wordpress/date": "*",
+ "@wordpress/deprecated": "*",
+ "@wordpress/dom": "*",
+ "@wordpress/element": "*",
+ "@wordpress/escape-html": "*",
+ "@wordpress/hooks": "*",
+ "@wordpress/html-entities": "*",
+ "@wordpress/i18n": "*",
+ "@wordpress/icons": "*",
+ "@wordpress/is-shallow-equal": "*",
+ "@wordpress/keyboard-shortcuts": "*",
+ "@wordpress/keycodes": "*",
+ "@wordpress/notices": "*",
+ "@wordpress/preferences": "*",
+ "@wordpress/private-apis": "*",
+ "@wordpress/rich-text": "*",
+ "@wordpress/style-engine": "*",
+ "@wordpress/token-list": "*",
+ "@wordpress/url": "*",
+ "@wordpress/warning": "*",
+ "@wordpress/wordcount": "*",
+ "change-case": "^4.1.2",
+ "clsx": "^2.1.1",
+ "colord": "^2.7.0",
+ "deepmerge": "^4.3.0",
+ "diff": "^4.0.2",
+ "fast-deep-equal": "^3.1.3",
+ "memize": "^2.1.0",
+ "parsel-js": "^1.1.2",
+ "postcss": "^8.4.21",
+ "postcss-prefix-selector": "^1.16.0",
+ "postcss-urlrebase": "^1.4.0",
+ "react-autosize-textarea": "^7.1.0",
+ "react-easy-crop": "^5.0.6",
+ "remove-accents": "^0.5.0"
+ },
+ "engines": {
+ "node": ">=18.12.0",
+ "npm": ">=8.19.2"
+ },
+ "peerDependencies": {
+ "react": "^18.0.0",
+ "react-dom": "^18.0.0"
+ }
+ },
+ "node_modules/@wordpress/block-editor/node_modules/@babel/runtime": {
+ "version": "7.25.7",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz",
+ "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==",
+ "dependencies": {
+ "regenerator-runtime": "^0.14.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@wordpress/block-editor/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/@wordpress/block-serialization-default-parser": {
+ "version": "5.11.0",
+ "resolved": "https://registry.npmjs.org/@wordpress/block-serialization-default-parser/-/block-serialization-default-parser-5.11.0.tgz",
+ "integrity": "sha512-D9pfzKTW+X85ve9Icx/9ugMQioWCT/2FUQ0C3fADN5mzlO40kNRIGDU8jPH7s0HRvQX2or0Uk7k09Mx1NlSvJg==",
+ "dependencies": {
+ "@babel/runtime": "7.25.7"
+ },
+ "engines": {
+ "node": ">=18.12.0",
+ "npm": ">=8.19.2"
+ }
+ },
+ "node_modules/@wordpress/block-serialization-default-parser/node_modules/@babel/runtime": {
+ "version": "7.25.7",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz",
+ "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==",
+ "dependencies": {
+ "regenerator-runtime": "^0.14.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@wordpress/blocks": {
+ "version": "14.0.0",
+ "resolved": "https://registry.npmjs.org/@wordpress/blocks/-/blocks-14.0.0.tgz",
+ "integrity": "sha512-alcZFTdtWSkAwMPXuQXyFQT0BMCNORnVLUQlAuyycC8xZoT5kcpGYffStQGmYgp8EHxyH5ic8K6fZ8TdgvEUFw==",
+ "dependencies": {
+ "@babel/runtime": "7.25.7",
+ "@wordpress/autop": "*",
+ "@wordpress/blob": "*",
+ "@wordpress/block-serialization-default-parser": "*",
+ "@wordpress/data": "*",
+ "@wordpress/deprecated": "*",
+ "@wordpress/dom": "*",
+ "@wordpress/element": "*",
+ "@wordpress/hooks": "*",
+ "@wordpress/html-entities": "*",
+ "@wordpress/i18n": "*",
+ "@wordpress/is-shallow-equal": "*",
+ "@wordpress/private-apis": "*",
+ "@wordpress/rich-text": "*",
+ "@wordpress/shortcode": "*",
+ "@wordpress/warning": "*",
+ "change-case": "^4.1.2",
+ "colord": "^2.7.0",
+ "fast-deep-equal": "^3.1.3",
+ "hpq": "^1.3.0",
+ "is-plain-object": "^5.0.0",
+ "memize": "^2.1.0",
+ "react-is": "^18.3.0",
+ "remove-accents": "^0.5.0",
+ "showdown": "^1.9.1",
+ "simple-html-tokenizer": "^0.5.7",
+ "uuid": "^9.0.1"
+ },
+ "engines": {
+ "node": ">=18.12.0",
+ "npm": ">=8.19.2"
+ },
+ "peerDependencies": {
+ "react": "^18.0.0"
+ }
+ },
+ "node_modules/@wordpress/blocks/node_modules/@babel/runtime": {
+ "version": "7.25.7",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz",
+ "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==",
+ "dependencies": {
+ "regenerator-runtime": "^0.14.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@wordpress/browserslist-config": {
+ "version": "6.11.0",
+ "resolved": "https://registry.npmjs.org/@wordpress/browserslist-config/-/browserslist-config-6.11.0.tgz",
+ "integrity": "sha512-wUDbJ3x7c8iMZLtwo+7VlWZ/vDc47PDW2eSAKW18RrQBSTdaNmWi4qiyFYi7Ye2XkyfUd2gp71MTJjZi6n/V2A==",
+ "dev": true,
+ "engines": {
+ "node": ">=18.12.0",
+ "npm": ">=8.19.2"
+ }
+ },
+ "node_modules/@wordpress/commands": {
+ "version": "1.11.0",
+ "resolved": "https://registry.npmjs.org/@wordpress/commands/-/commands-1.11.0.tgz",
+ "integrity": "sha512-pXC4/xrVjoXFcK0+0aU3Fpyd+/SfF5rQ9PX2q5DIpOC/aSULkC8NdjjIqOgzLlgpEZhkuIvL3r4YzZUgvrV0BQ==",
+ "dependencies": {
+ "@babel/runtime": "7.25.7",
+ "@wordpress/components": "*",
+ "@wordpress/data": "*",
+ "@wordpress/element": "*",
+ "@wordpress/i18n": "*",
+ "@wordpress/icons": "*",
+ "@wordpress/keyboard-shortcuts": "*",
+ "@wordpress/private-apis": "*",
+ "clsx": "^2.1.1",
+ "cmdk": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=18.12.0",
+ "npm": ">=8.19.2"
+ },
+ "peerDependencies": {
+ "react": "^18.0.0",
+ "react-dom": "^18.0.0"
+ }
+ },
+ "node_modules/@wordpress/commands/node_modules/@babel/runtime": {
+ "version": "7.25.7",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz",
+ "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==",
+ "dependencies": {
+ "regenerator-runtime": "^0.14.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@wordpress/commands/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/@wordpress/components": {
+ "version": "28.11.0",
+ "resolved": "https://registry.npmjs.org/@wordpress/components/-/components-28.11.0.tgz",
+ "integrity": "sha512-vDzT1GVaDYhOxjiTkLUA5X/ebatiYBuP2yuynhm+fuWsyoalmlpYfvZAARa/PH+E60C7gpY1CNkU92niJdpr4A==",
+ "dependencies": {
+ "@ariakit/react": "^0.4.10",
+ "@babel/runtime": "7.25.7",
+ "@emotion/cache": "^11.7.1",
+ "@emotion/css": "^11.7.1",
+ "@emotion/react": "^11.7.1",
+ "@emotion/serialize": "^1.0.2",
+ "@emotion/styled": "^11.6.0",
+ "@emotion/utils": "^1.0.0",
+ "@floating-ui/react-dom": "^2.0.8",
+ "@types/gradient-parser": "0.1.3",
+ "@types/highlight-words-core": "1.2.1",
+ "@use-gesture/react": "^10.3.1",
+ "@wordpress/a11y": "*",
+ "@wordpress/compose": "*",
+ "@wordpress/date": "*",
+ "@wordpress/deprecated": "*",
+ "@wordpress/dom": "*",
+ "@wordpress/element": "*",
+ "@wordpress/escape-html": "*",
+ "@wordpress/hooks": "*",
+ "@wordpress/html-entities": "*",
+ "@wordpress/i18n": "*",
+ "@wordpress/icons": "*",
+ "@wordpress/is-shallow-equal": "*",
+ "@wordpress/keycodes": "*",
+ "@wordpress/primitives": "*",
+ "@wordpress/private-apis": "*",
+ "@wordpress/rich-text": "*",
+ "@wordpress/warning": "*",
+ "change-case": "^4.1.2",
+ "clsx": "^2.1.1",
+ "colord": "^2.7.0",
+ "date-fns": "^3.6.0",
+ "deepmerge": "^4.3.0",
+ "fast-deep-equal": "^3.1.3",
+ "framer-motion": "^11.1.9",
+ "gradient-parser": "^0.1.5",
+ "highlight-words-core": "^1.2.2",
+ "is-plain-object": "^5.0.0",
+ "memize": "^2.1.0",
+ "path-to-regexp": "^6.2.1",
+ "re-resizable": "^6.4.0",
+ "react-colorful": "^5.3.1",
+ "remove-accents": "^0.5.0",
+ "uuid": "^9.0.1"
+ },
+ "engines": {
+ "node": ">=18.12.0",
+ "npm": ">=8.19.2"
+ },
+ "peerDependencies": {
+ "react": "^18.0.0",
+ "react-dom": "^18.0.0"
+ }
+ },
+ "node_modules/@wordpress/components/node_modules/@babel/runtime": {
+ "version": "7.25.7",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz",
+ "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==",
+ "dependencies": {
+ "regenerator-runtime": "^0.14.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@wordpress/components/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/@wordpress/components/node_modules/date-fns": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-3.6.0.tgz",
+ "integrity": "sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==",
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/kossnocorp"
+ }
+ },
+ "node_modules/@wordpress/compose": {
+ "version": "7.11.0",
+ "resolved": "https://registry.npmjs.org/@wordpress/compose/-/compose-7.11.0.tgz",
+ "integrity": "sha512-8Gv95+lJza3WiHxvaZgA2nKAlaEJonpFa82jF2c2ecGxHJNJUiF+kwmfr/yJpjVxSvNvHfpZlTuXHDi4hoMfYg==",
+ "dependencies": {
+ "@babel/runtime": "7.25.7",
+ "@types/mousetrap": "^1.6.8",
+ "@wordpress/deprecated": "*",
+ "@wordpress/dom": "*",
+ "@wordpress/element": "*",
+ "@wordpress/is-shallow-equal": "*",
+ "@wordpress/keycodes": "*",
+ "@wordpress/priority-queue": "*",
+ "@wordpress/undo-manager": "*",
+ "change-case": "^4.1.2",
+ "clipboard": "^2.0.11",
+ "mousetrap": "^1.6.5",
+ "use-memo-one": "^1.1.1"
+ },
+ "engines": {
+ "node": ">=18.12.0",
+ "npm": ">=8.19.2"
+ },
+ "peerDependencies": {
+ "react": "^18.0.0"
+ }
+ },
+ "node_modules/@wordpress/compose/node_modules/@babel/runtime": {
+ "version": "7.25.7",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz",
+ "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==",
+ "dependencies": {
+ "regenerator-runtime": "^0.14.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@wordpress/core-data": {
+ "version": "7.11.0",
+ "resolved": "https://registry.npmjs.org/@wordpress/core-data/-/core-data-7.11.0.tgz",
+ "integrity": "sha512-uxkL9h0AGn+MoZMlX0bkt6Kz4SAxEgWtzTrK8+b8XOmb66aHnTu2e7iA2aB5sZqlDuSiEfHfsNP9A6yefwasZw==",
+ "dependencies": {
+ "@babel/runtime": "7.25.7",
+ "@wordpress/api-fetch": "*",
+ "@wordpress/block-editor": "*",
+ "@wordpress/blocks": "*",
+ "@wordpress/compose": "*",
+ "@wordpress/data": "*",
+ "@wordpress/deprecated": "*",
+ "@wordpress/element": "*",
+ "@wordpress/html-entities": "*",
+ "@wordpress/i18n": "*",
+ "@wordpress/is-shallow-equal": "*",
+ "@wordpress/private-apis": "*",
+ "@wordpress/rich-text": "*",
+ "@wordpress/sync": "*",
+ "@wordpress/undo-manager": "*",
+ "@wordpress/url": "*",
+ "@wordpress/warning": "*",
+ "change-case": "^4.1.2",
+ "equivalent-key-map": "^0.2.2",
+ "fast-deep-equal": "^3.1.3",
+ "memize": "^2.1.0",
+ "uuid": "^9.0.1"
+ },
+ "engines": {
+ "node": ">=18.12.0",
+ "npm": ">=8.19.2"
+ },
+ "peerDependencies": {
+ "react": "^18.0.0",
+ "react-dom": "^18.0.0"
+ }
+ },
+ "node_modules/@wordpress/core-data/node_modules/@babel/runtime": {
+ "version": "7.25.7",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz",
+ "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==",
+ "dependencies": {
+ "regenerator-runtime": "^0.14.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@wordpress/data": {
+ "version": "10.11.0",
+ "resolved": "https://registry.npmjs.org/@wordpress/data/-/data-10.11.0.tgz",
+ "integrity": "sha512-2JvezC51tv8zpg1zUo+VNegtTHHKWBNGZ0uRFoeH6riswT4iZMXsZ83vrWZSCR/bY6ilK0kN/UHDvvSRYov2Rw==",
+ "dependencies": {
+ "@babel/runtime": "7.25.7",
+ "@wordpress/compose": "*",
+ "@wordpress/deprecated": "*",
+ "@wordpress/element": "*",
+ "@wordpress/is-shallow-equal": "*",
+ "@wordpress/priority-queue": "*",
+ "@wordpress/private-apis": "*",
+ "@wordpress/redux-routine": "*",
+ "deepmerge": "^4.3.0",
+ "equivalent-key-map": "^0.2.2",
+ "is-plain-object": "^5.0.0",
+ "is-promise": "^4.0.0",
+ "redux": "^4.1.2",
+ "rememo": "^4.0.2",
+ "use-memo-one": "^1.1.1"
+ },
+ "engines": {
+ "node": ">=18.12.0",
+ "npm": ">=8.19.2"
+ },
+ "peerDependencies": {
+ "react": "^18.0.0"
+ }
+ },
+ "node_modules/@wordpress/data/node_modules/@babel/runtime": {
+ "version": "7.25.7",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz",
+ "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==",
+ "dependencies": {
+ "regenerator-runtime": "^0.14.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@wordpress/date": {
+ "version": "5.11.0",
+ "resolved": "https://registry.npmjs.org/@wordpress/date/-/date-5.11.0.tgz",
+ "integrity": "sha512-pDoTw1c3BTtgeG9xfIARTU6iCQ40Sksfaekhwz8EHPa9dgE1BU1ko4nb2VPTck6iQFggwfDlQcbg2Wf/ui8Kcw==",
+ "dependencies": {
+ "@babel/runtime": "7.25.7",
+ "@wordpress/deprecated": "*",
+ "moment": "^2.29.4",
+ "moment-timezone": "^0.5.40"
+ },
+ "engines": {
+ "node": ">=18.12.0",
+ "npm": ">=8.19.2"
+ }
+ },
+ "node_modules/@wordpress/date/node_modules/@babel/runtime": {
+ "version": "7.25.7",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz",
+ "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==",
+ "dependencies": {
+ "regenerator-runtime": "^0.14.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@wordpress/dependency-extraction-webpack-plugin": {
+ "version": "6.11.0",
+ "resolved": "https://registry.npmjs.org/@wordpress/dependency-extraction-webpack-plugin/-/dependency-extraction-webpack-plugin-6.11.0.tgz",
+ "integrity": "sha512-MRMu3f/zG428iXuBBwaZKumonQ6Cxz2KDerQkIYkpXFq7aZK/vZRdTeR/MYXZNABmAV54Ss0xp6QJxOBW/WVbQ==",
+ "dev": true,
+ "dependencies": {
+ "json2php": "^0.0.7"
+ },
+ "engines": {
+ "node": ">=18.12.0",
+ "npm": ">=8.19.2"
+ },
+ "peerDependencies": {
+ "webpack": "^5.0.0"
+ }
+ },
+ "node_modules/@wordpress/dependency-extraction-webpack-plugin/node_modules/json2php": {
+ "version": "0.0.7",
+ "resolved": "https://registry.npmjs.org/json2php/-/json2php-0.0.7.tgz",
+ "integrity": "sha512-dnSoUiLAoVaMXxFsVi4CrPVYMKOuDBXTghXSmMINX44RZ8WM9cXlY7UqrQnlAcODCVO7FV3+8t/5nDKAjimLfg==",
+ "dev": true
+ },
+ "node_modules/@wordpress/deprecated": {
+ "version": "4.11.0",
+ "resolved": "https://registry.npmjs.org/@wordpress/deprecated/-/deprecated-4.11.0.tgz",
+ "integrity": "sha512-CPXMS2IbGonba6Ny3IhzOudZ8QSCQzjg8AaS8dAq6p47AIUNxfj8bef+7C36lJKt9KPDkez7eY5x7UF5CaDkug==",
+ "dependencies": {
+ "@babel/runtime": "7.25.7",
+ "@wordpress/hooks": "*"
+ },
+ "engines": {
+ "node": ">=18.12.0",
+ "npm": ">=8.19.2"
+ }
+ },
+ "node_modules/@wordpress/deprecated/node_modules/@babel/runtime": {
+ "version": "7.25.7",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz",
+ "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==",
+ "dependencies": {
+ "regenerator-runtime": "^0.14.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@wordpress/dom": {
+ "version": "4.11.0",
+ "resolved": "https://registry.npmjs.org/@wordpress/dom/-/dom-4.11.0.tgz",
+ "integrity": "sha512-8u9USBEpGiQvVZeWSY82Ze3Yrwj5JkmmPUF+HfKvqywFlYIZfYLLc5lNrvUCqw7klIje+LO3MnKR3kfRx/uozA==",
+ "dependencies": {
+ "@babel/runtime": "7.25.7",
+ "@wordpress/deprecated": "*"
+ },
+ "engines": {
+ "node": ">=18.12.0",
+ "npm": ">=8.19.2"
+ }
+ },
+ "node_modules/@wordpress/dom-ready": {
+ "version": "4.11.0",
+ "resolved": "https://registry.npmjs.org/@wordpress/dom-ready/-/dom-ready-4.11.0.tgz",
+ "integrity": "sha512-wAqRxFpP19m8KwXzand3BrrqRkU7SXH9/fdk1q/Q+oqoXIrLMDFWsH6xbXgM4q/id2Z4ZMK5dZQ3tYf/0qDpFg==",
+ "dependencies": {
+ "@babel/runtime": "7.25.7"
+ },
+ "engines": {
+ "node": ">=18.12.0",
+ "npm": ">=8.19.2"
+ }
+ },
+ "node_modules/@wordpress/dom-ready/node_modules/@babel/runtime": {
+ "version": "7.25.7",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz",
+ "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==",
+ "dependencies": {
+ "regenerator-runtime": "^0.14.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@wordpress/dom/node_modules/@babel/runtime": {
+ "version": "7.25.7",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz",
+ "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==",
+ "dependencies": {
+ "regenerator-runtime": "^0.14.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@wordpress/e2e-test-utils-playwright": {
+ "version": "1.11.0",
+ "resolved": "https://registry.npmjs.org/@wordpress/e2e-test-utils-playwright/-/e2e-test-utils-playwright-1.11.0.tgz",
+ "integrity": "sha512-0kSY0rOpKirXgXsNJQ/Mj3NLJhmN1lwkECZFF53iYs/kOAXNaVxs6Ys3T8hleoO47/KZLY7AoEJTxKwK0fWixQ==",
+ "dev": true,
+ "dependencies": {
+ "change-case": "^4.1.2",
+ "form-data": "^4.0.0",
+ "get-port": "^5.1.1",
+ "lighthouse": "^10.4.0",
+ "mime": "^3.0.0",
+ "web-vitals": "^4.2.1"
+ },
+ "engines": {
+ "node": ">=18.12.0",
+ "npm": ">=8.19.2"
+ },
+ "peerDependencies": {
+ "@playwright/test": ">=1"
+ }
+ },
+ "node_modules/@wordpress/element": {
+ "version": "6.11.0",
+ "resolved": "https://registry.npmjs.org/@wordpress/element/-/element-6.11.0.tgz",
+ "integrity": "sha512-UvHFYkT+EEaXEyEfw+iqLHRO9OwBjjsUydEMHcqntzkNcsYeAbmaL9V8R9ikXHLe6ftdbkwoXgF85xVPhVsL+Q==",
+ "dependencies": {
+ "@babel/runtime": "7.25.7",
+ "@types/react": "^18.2.79",
+ "@types/react-dom": "^18.2.25",
+ "@wordpress/escape-html": "*",
+ "change-case": "^4.1.2",
+ "is-plain-object": "^5.0.0",
+ "react": "^18.3.0",
+ "react-dom": "^18.3.0"
+ },
+ "engines": {
+ "node": ">=18.12.0",
+ "npm": ">=8.19.2"
+ }
+ },
+ "node_modules/@wordpress/element/node_modules/@babel/runtime": {
+ "version": "7.25.7",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz",
+ "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==",
+ "dependencies": {
+ "regenerator-runtime": "^0.14.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@wordpress/env": {
+ "version": "10.11.0",
+ "resolved": "https://registry.npmjs.org/@wordpress/env/-/env-10.11.0.tgz",
+ "integrity": "sha512-Sd31oiYxy9/pNMfYw7XgtCBoD4PpvcK1UQ/FVFP+DsTTuo55Ma4UAHMKfg2NhnZWqhJTgPC6XXzicGpr/lK4RQ==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^4.0.0",
+ "copy-dir": "^1.3.0",
+ "docker-compose": "^0.24.3",
+ "extract-zip": "^1.6.7",
+ "got": "^11.8.5",
+ "inquirer": "^7.1.0",
+ "js-yaml": "^3.13.1",
+ "ora": "^4.0.2",
+ "rimraf": "^3.0.2",
+ "simple-git": "^3.5.0",
+ "terminal-link": "^2.0.0",
+ "yargs": "^17.3.0"
+ },
+ "bin": {
+ "wp-env": "bin/wp-env"
+ },
+ "engines": {
+ "node": ">=18.12.0",
+ "npm": ">=8.19.2"
+ }
+ },
+ "node_modules/@wordpress/escape-html": {
+ "version": "3.11.0",
+ "resolved": "https://registry.npmjs.org/@wordpress/escape-html/-/escape-html-3.11.0.tgz",
+ "integrity": "sha512-TGiUoUpnPxNKCvpZzskIjtgPH8UhZAYTflbHTaA9IALBc1alq0SDdmMAfQ7qhnKer4CPU9+dSXv79q7olobeLQ==",
+ "dependencies": {
+ "@babel/runtime": "7.25.7"
+ },
+ "engines": {
+ "node": ">=18.12.0",
+ "npm": ">=8.19.2"
+ }
+ },
+ "node_modules/@wordpress/escape-html/node_modules/@babel/runtime": {
+ "version": "7.25.7",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz",
+ "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==",
+ "dependencies": {
+ "regenerator-runtime": "^0.14.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@wordpress/eslint-plugin": {
+ "version": "21.4.0",
+ "resolved": "https://registry.npmjs.org/@wordpress/eslint-plugin/-/eslint-plugin-21.4.0.tgz",
+ "integrity": "sha512-8V/cpGDDTG0loqWUjmz2mqVG55hKYTfSRC43xh2aqRIGyeKfMiqaHxD/BgEi94HFdcAhAX6DYwlPnHR18Dc/tw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/eslint-parser": "7.25.7",
+ "@typescript-eslint/eslint-plugin": "^6.4.1",
+ "@typescript-eslint/parser": "^6.4.1",
+ "@wordpress/babel-preset-default": "*",
+ "@wordpress/prettier-config": "*",
+ "cosmiconfig": "^7.0.0",
+ "eslint-config-prettier": "^8.3.0",
+ "eslint-plugin-import": "^2.25.2",
+ "eslint-plugin-jest": "^27.2.3",
+ "eslint-plugin-jsdoc": "^46.4.6",
+ "eslint-plugin-jsx-a11y": "^6.5.1",
+ "eslint-plugin-playwright": "^0.15.3",
+ "eslint-plugin-prettier": "^5.0.0",
+ "eslint-plugin-react": "^7.27.0",
+ "eslint-plugin-react-hooks": "^4.3.0",
+ "globals": "^13.12.0",
+ "requireindex": "^1.2.0"
+ },
+ "engines": {
+ "node": ">=18.12.0",
+ "npm": ">=8.19.2"
+ },
+ "peerDependencies": {
+ "@babel/core": ">=7",
+ "eslint": ">=8",
+ "prettier": ">=3",
+ "typescript": ">=4"
+ },
+ "peerDependenciesMeta": {
+ "prettier": {
+ "optional": true
+ },
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@wordpress/eslint-plugin/node_modules/globals": {
+ "version": "13.24.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz",
+ "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
+ "dev": true,
+ "dependencies": {
+ "type-fest": "^0.20.2"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@wordpress/eslint-plugin/node_modules/type-fest": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@wordpress/hooks": {
+ "version": "4.11.0",
+ "resolved": "https://registry.npmjs.org/@wordpress/hooks/-/hooks-4.11.0.tgz",
+ "integrity": "sha512-MvsbtOCXKSxJbdgTM5fx8JDbtjA5dlM8GEyr1LEz+1AHwWy5loQx17DEodAkHPu3NCelJ18LSL6AJYJ9simB8g==",
+ "dependencies": {
+ "@babel/runtime": "7.25.7"
+ },
+ "engines": {
+ "node": ">=18.12.0",
+ "npm": ">=8.19.2"
+ }
+ },
+ "node_modules/@wordpress/hooks/node_modules/@babel/runtime": {
+ "version": "7.25.7",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz",
+ "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==",
+ "dependencies": {
+ "regenerator-runtime": "^0.14.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@wordpress/html-entities": {
+ "version": "4.11.0",
+ "resolved": "https://registry.npmjs.org/@wordpress/html-entities/-/html-entities-4.11.0.tgz",
+ "integrity": "sha512-OMpq/oP7CvfMojedgeI9unIAx0wuB8n10JwM72xi0CI/NYuymAcaOoD3OGkmS+4i6IW/geC3AooyWwRduzY85Q==",
+ "dependencies": {
+ "@babel/runtime": "7.25.7"
+ },
+ "engines": {
+ "node": ">=18.12.0",
+ "npm": ">=8.19.2"
+ }
+ },
+ "node_modules/@wordpress/html-entities/node_modules/@babel/runtime": {
+ "version": "7.25.7",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz",
+ "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==",
+ "dependencies": {
+ "regenerator-runtime": "^0.14.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@wordpress/i18n": {
+ "version": "5.11.0",
+ "resolved": "https://registry.npmjs.org/@wordpress/i18n/-/i18n-5.11.0.tgz",
+ "integrity": "sha512-U8CoXAIcmxcOHD1VeGRoo6iLjx71eE4LstQjHjKGT3J4Lz43O8MunT+/cm606FCcQgunPCyaALquD2vSf+JD9w==",
+ "dependencies": {
+ "@babel/runtime": "7.25.7",
+ "@wordpress/hooks": "*",
+ "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": ">=18.12.0",
+ "npm": ">=8.19.2"
+ }
+ },
+ "node_modules/@wordpress/i18n/node_modules/@babel/runtime": {
+ "version": "7.25.7",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz",
+ "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==",
+ "dependencies": {
+ "regenerator-runtime": "^0.14.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@wordpress/icons": {
+ "version": "10.11.0",
+ "resolved": "https://registry.npmjs.org/@wordpress/icons/-/icons-10.11.0.tgz",
+ "integrity": "sha512-RMetpFwUIeh3sVj2+p6+QX5AW8pF7DvQzxH9jUr8YjaF2iLE64vy6m0cZz/X8xkSktHrXMuPJIr7YIVF20TEyw==",
+ "dependencies": {
+ "@babel/runtime": "7.25.7",
+ "@wordpress/element": "*",
+ "@wordpress/primitives": "*"
+ },
+ "engines": {
+ "node": ">=18.12.0",
+ "npm": ">=8.19.2"
+ }
+ },
+ "node_modules/@wordpress/icons/node_modules/@babel/runtime": {
+ "version": "7.25.7",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz",
+ "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==",
+ "dependencies": {
+ "regenerator-runtime": "^0.14.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@wordpress/is-shallow-equal": {
+ "version": "5.11.0",
+ "resolved": "https://registry.npmjs.org/@wordpress/is-shallow-equal/-/is-shallow-equal-5.11.0.tgz",
+ "integrity": "sha512-LWMFSHcsD/FecJytZP3uboNUkVyowUN4HtFz3rJkAjpcvgZV9S++4ALejzN9jegOWfD6KNKAyWc7FyV25WXPYw==",
+ "dependencies": {
+ "@babel/runtime": "7.25.7"
+ },
+ "engines": {
+ "node": ">=18.12.0",
+ "npm": ">=8.19.2"
+ }
+ },
+ "node_modules/@wordpress/is-shallow-equal/node_modules/@babel/runtime": {
+ "version": "7.25.7",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz",
+ "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==",
+ "dependencies": {
+ "regenerator-runtime": "^0.14.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@wordpress/jest-console": {
+ "version": "8.11.0",
+ "resolved": "https://registry.npmjs.org/@wordpress/jest-console/-/jest-console-8.11.0.tgz",
+ "integrity": "sha512-kkeSrY6YThTSgPKMTo5DA98irIjvgIl8V0Bk0x9M2uoDCCYsz3EJFECrvYR31z7K6EeeJVMhdhnNJriK58PP+A==",
+ "dev": true,
+ "dependencies": {
+ "@babel/runtime": "7.25.7",
+ "jest-matcher-utils": "^29.6.2"
+ },
+ "engines": {
+ "node": ">=18.12.0",
+ "npm": ">=8.19.2"
+ },
+ "peerDependencies": {
+ "jest": ">=29"
+ }
+ },
+ "node_modules/@wordpress/jest-console/node_modules/@babel/runtime": {
+ "version": "7.25.7",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz",
+ "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==",
+ "dev": true,
+ "dependencies": {
+ "regenerator-runtime": "^0.14.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@wordpress/jest-preset-default": {
+ "version": "12.11.0",
+ "resolved": "https://registry.npmjs.org/@wordpress/jest-preset-default/-/jest-preset-default-12.11.0.tgz",
+ "integrity": "sha512-yjU6am+emR++CmDb+si3e+5aNwFk2zz1R4ti/Uq/EeRRFfcCxCopMhnd1J7BiU3BJ3Vm7qJlJgYhhJAqm65jVQ==",
+ "dev": true,
+ "dependencies": {
+ "@wordpress/jest-console": "*",
+ "babel-jest": "29.7.0"
+ },
+ "engines": {
+ "node": ">=18.12.0",
+ "npm": ">=8.19.2"
+ },
+ "peerDependencies": {
+ "@babel/core": ">=7",
+ "jest": ">=29"
+ }
+ },
+ "node_modules/@wordpress/keyboard-shortcuts": {
+ "version": "5.11.0",
+ "resolved": "https://registry.npmjs.org/@wordpress/keyboard-shortcuts/-/keyboard-shortcuts-5.11.0.tgz",
+ "integrity": "sha512-W48yh49N7tyy7Wc/yUm8mGG1hYfsmD9P6wOFX6vfte9uqgcCzcKMDwRUaXY4ShJ1KtHn/yiWC3JV66CtRdIbtQ==",
+ "dependencies": {
+ "@babel/runtime": "7.25.7",
+ "@wordpress/data": "*",
+ "@wordpress/element": "*",
+ "@wordpress/keycodes": "*"
+ },
+ "engines": {
+ "node": ">=18.12.0",
+ "npm": ">=8.19.2"
+ },
+ "peerDependencies": {
+ "react": "^18.0.0"
+ }
+ },
+ "node_modules/@wordpress/keyboard-shortcuts/node_modules/@babel/runtime": {
+ "version": "7.25.7",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz",
+ "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==",
+ "dependencies": {
+ "regenerator-runtime": "^0.14.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@wordpress/keycodes": {
+ "version": "4.11.0",
+ "resolved": "https://registry.npmjs.org/@wordpress/keycodes/-/keycodes-4.11.0.tgz",
+ "integrity": "sha512-aI8ftrEU62Y25p4881+d5zglPNOmWJJTokfC0eF4iW6DRnBy/btOMC6zIf+oATjG2pGTyMfHveALJf0YSpdyEw==",
+ "dependencies": {
+ "@babel/runtime": "7.25.7",
+ "@wordpress/i18n": "*"
+ },
+ "engines": {
+ "node": ">=18.12.0",
+ "npm": ">=8.19.2"
+ }
+ },
+ "node_modules/@wordpress/keycodes/node_modules/@babel/runtime": {
+ "version": "7.25.7",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz",
+ "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==",
+ "dependencies": {
+ "regenerator-runtime": "^0.14.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@wordpress/notices": {
+ "version": "5.11.0",
+ "resolved": "https://registry.npmjs.org/@wordpress/notices/-/notices-5.11.0.tgz",
+ "integrity": "sha512-RyTXLU27EcDYYqnjDoGw76H5pg7R9wfjvcadqhCITWTZwKSRfzAs/Cp3qlfZPYAO5IWgpWDEBMkyJv2V2aV5BQ==",
+ "dependencies": {
+ "@babel/runtime": "7.25.7",
+ "@wordpress/a11y": "*",
+ "@wordpress/data": "*"
+ },
+ "engines": {
+ "node": ">=18.12.0",
+ "npm": ">=8.19.2"
+ },
+ "peerDependencies": {
+ "react": "^18.0.0"
+ }
+ },
+ "node_modules/@wordpress/notices/node_modules/@babel/runtime": {
+ "version": "7.25.7",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz",
+ "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==",
+ "dependencies": {
+ "regenerator-runtime": "^0.14.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@wordpress/npm-package-json-lint-config": {
+ "version": "5.11.0",
+ "resolved": "https://registry.npmjs.org/@wordpress/npm-package-json-lint-config/-/npm-package-json-lint-config-5.11.0.tgz",
+ "integrity": "sha512-m65XI5stIUgH/OewrOvBIEYurbm5kSDndieU9t4gWCXXXD5n9RpHOsoex/hsRzZ5ZjTtpgvArJ+dv18+hqIOAw==",
+ "dev": true,
+ "engines": {
+ "node": ">=18.12.0",
+ "npm": ">=8.19.2"
+ },
+ "peerDependencies": {
+ "npm-package-json-lint": ">=6.0.0"
+ }
+ },
+ "node_modules/@wordpress/postcss-plugins-preset": {
+ "version": "5.11.0",
+ "resolved": "https://registry.npmjs.org/@wordpress/postcss-plugins-preset/-/postcss-plugins-preset-5.11.0.tgz",
+ "integrity": "sha512-oVZEfLJSxGGMhQCk9+vghgQjxG8l5KGqFUP2Q/2mosc9D20DvSsT8r280R6uiwaD5KUDuYcpdJlD4eVY6t8AIA==",
+ "dev": true,
+ "dependencies": {
+ "@wordpress/base-styles": "*",
+ "autoprefixer": "^10.2.5"
+ },
+ "engines": {
+ "node": ">=18.12.0",
+ "npm": ">=8.19.2"
+ },
+ "peerDependencies": {
+ "postcss": "^8.0.0"
+ }
+ },
+ "node_modules/@wordpress/preferences": {
+ "version": "4.11.0",
+ "resolved": "https://registry.npmjs.org/@wordpress/preferences/-/preferences-4.11.0.tgz",
+ "integrity": "sha512-oI1Bi8mHDsZsE0c215F+XndEl2224jh72NLxG4DBI6lDEkVWteBsJBZJDS1z8NOUYXoIFrLqgCsFcEoL6CGGng==",
+ "dependencies": {
+ "@babel/runtime": "7.25.7",
+ "@wordpress/a11y": "*",
+ "@wordpress/components": "*",
+ "@wordpress/compose": "*",
+ "@wordpress/data": "*",
+ "@wordpress/deprecated": "*",
+ "@wordpress/element": "*",
+ "@wordpress/i18n": "*",
+ "@wordpress/icons": "*",
+ "@wordpress/private-apis": "*",
+ "clsx": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=18.12.0",
+ "npm": ">=8.19.2"
+ },
+ "peerDependencies": {
+ "react": "^18.0.0",
+ "react-dom": "^18.0.0"
+ }
+ },
+ "node_modules/@wordpress/preferences/node_modules/@babel/runtime": {
+ "version": "7.25.7",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz",
+ "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==",
+ "dependencies": {
+ "regenerator-runtime": "^0.14.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@wordpress/preferences/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/@wordpress/prettier-config": {
+ "version": "4.11.0",
+ "resolved": "https://registry.npmjs.org/@wordpress/prettier-config/-/prettier-config-4.11.0.tgz",
+ "integrity": "sha512-Aoc8+xWOyiXekodjaEjS44z85XK877LzHZqsQuhC0kNgneDLrKkwI5qNgzwzAMbJ9jI58MPqVISCOX0bDLUPbw==",
+ "dev": true,
+ "engines": {
+ "node": ">=18.12.0",
+ "npm": ">=8.19.2"
+ },
+ "peerDependencies": {
+ "prettier": ">=3"
+ }
+ },
+ "node_modules/@wordpress/primitives": {
+ "version": "4.11.0",
+ "resolved": "https://registry.npmjs.org/@wordpress/primitives/-/primitives-4.11.0.tgz",
+ "integrity": "sha512-CoBXbh0mOSxcZtuzL7gK3RVumFx71DXQBfd3IkbRHuuVxa+2hI4KDuFyomSsbjQDshHsfuVrKUvuT3UGt6pdpQ==",
+ "dependencies": {
+ "@babel/runtime": "7.25.7",
+ "@wordpress/element": "*",
+ "clsx": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=18.12.0",
+ "npm": ">=8.19.2"
+ },
+ "peerDependencies": {
+ "react": "^18.0.0"
+ }
+ },
+ "node_modules/@wordpress/primitives/node_modules/@babel/runtime": {
+ "version": "7.25.7",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz",
+ "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==",
+ "dependencies": {
+ "regenerator-runtime": "^0.14.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@wordpress/primitives/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/@wordpress/priority-queue": {
+ "version": "3.11.0",
+ "resolved": "https://registry.npmjs.org/@wordpress/priority-queue/-/priority-queue-3.11.0.tgz",
+ "integrity": "sha512-gllst2BJrDnEeXQYAuDXl31st/rhXcdeHOYt9UgOH1CnzPym3H0cdKR+zp9osGECCWN5pyoFalgckMZ5mPRAGg==",
+ "dependencies": {
+ "@babel/runtime": "7.25.7",
+ "requestidlecallback": "^0.3.0"
+ },
+ "engines": {
+ "node": ">=18.12.0",
+ "npm": ">=8.19.2"
+ }
+ },
+ "node_modules/@wordpress/priority-queue/node_modules/@babel/runtime": {
+ "version": "7.25.7",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz",
+ "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==",
+ "dependencies": {
+ "regenerator-runtime": "^0.14.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@wordpress/private-apis": {
+ "version": "1.11.0",
+ "resolved": "https://registry.npmjs.org/@wordpress/private-apis/-/private-apis-1.11.0.tgz",
+ "integrity": "sha512-ohTXVFf+a5t585qivy1XWfu0JDoloB/t19mJpFAcLGw1zw6wWs4upYyOsiJ8skSL+mbHCWpSWWZjGre/LcD0Ew==",
+ "dependencies": {
+ "@babel/runtime": "7.25.7"
+ },
+ "engines": {
+ "node": ">=18.12.0",
+ "npm": ">=8.19.2"
+ }
+ },
+ "node_modules/@wordpress/private-apis/node_modules/@babel/runtime": {
+ "version": "7.25.7",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz",
+ "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==",
+ "dependencies": {
+ "regenerator-runtime": "^0.14.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@wordpress/redux-routine": {
+ "version": "5.11.0",
+ "resolved": "https://registry.npmjs.org/@wordpress/redux-routine/-/redux-routine-5.11.0.tgz",
+ "integrity": "sha512-RKBRTO+qZLDlh0/H5vDtsHLrBbIDweEhKyexfrm40klDsIzLO7OrW0zeM1wBGfHz3JxPOck859gGBoa7tyJf6A==",
+ "dependencies": {
+ "@babel/runtime": "7.25.7",
+ "is-plain-object": "^5.0.0",
+ "is-promise": "^4.0.0",
+ "rungen": "^0.3.2"
+ },
+ "engines": {
+ "node": ">=18.12.0",
+ "npm": ">=8.19.2"
+ },
+ "peerDependencies": {
+ "redux": ">=4"
+ }
+ },
+ "node_modules/@wordpress/redux-routine/node_modules/@babel/runtime": {
+ "version": "7.25.7",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz",
+ "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==",
+ "dependencies": {
+ "regenerator-runtime": "^0.14.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@wordpress/rich-text": {
+ "version": "7.11.0",
+ "resolved": "https://registry.npmjs.org/@wordpress/rich-text/-/rich-text-7.11.0.tgz",
+ "integrity": "sha512-xrTvJ6H9UOnH+aA4QzeSQKV+rQS9RD87y1XoLZxrynDxLjsNO95PVhopfs0qIGNLr8wFhMtb0LQ+KXkxqA7fDw==",
+ "dependencies": {
+ "@babel/runtime": "7.25.7",
+ "@wordpress/a11y": "*",
+ "@wordpress/compose": "*",
+ "@wordpress/data": "*",
+ "@wordpress/deprecated": "*",
+ "@wordpress/element": "*",
+ "@wordpress/escape-html": "*",
+ "@wordpress/i18n": "*",
+ "@wordpress/keycodes": "*",
+ "memize": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=18.12.0",
+ "npm": ">=8.19.2"
+ },
+ "peerDependencies": {
+ "react": "^18.0.0"
+ }
+ },
+ "node_modules/@wordpress/rich-text/node_modules/@babel/runtime": {
+ "version": "7.25.7",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz",
+ "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==",
+ "dependencies": {
+ "regenerator-runtime": "^0.14.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@wordpress/scripts": {
+ "version": "30.4.0",
+ "resolved": "https://registry.npmjs.org/@wordpress/scripts/-/scripts-30.4.0.tgz",
+ "integrity": "sha512-hAX8XB8hWlxAyktT4KkBpGttRwSynmtkpLvbVKeKnj+BjABFs4TGb/HCF9hFpUK3huCAg8Ft/sjjczW+5tqspQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/core": "7.25.7",
+ "@pmmmwh/react-refresh-webpack-plugin": "^0.5.11",
+ "@svgr/webpack": "^8.0.1",
+ "@wordpress/babel-preset-default": "*",
+ "@wordpress/browserslist-config": "*",
+ "@wordpress/dependency-extraction-webpack-plugin": "*",
+ "@wordpress/e2e-test-utils-playwright": "*",
+ "@wordpress/eslint-plugin": "*",
+ "@wordpress/jest-preset-default": "*",
+ "@wordpress/npm-package-json-lint-config": "*",
+ "@wordpress/postcss-plugins-preset": "*",
+ "@wordpress/prettier-config": "*",
+ "@wordpress/stylelint-config": "*",
+ "adm-zip": "^0.5.9",
+ "babel-jest": "29.7.0",
+ "babel-loader": "9.2.1",
+ "browserslist": "^4.21.10",
+ "chalk": "^4.0.0",
+ "check-node-version": "^4.1.0",
+ "clean-webpack-plugin": "^3.0.0",
+ "copy-webpack-plugin": "^10.2.0",
+ "cross-spawn": "^5.1.0",
+ "css-loader": "^6.2.0",
+ "cssnano": "^6.0.1",
+ "cwd": "^0.10.0",
+ "dir-glob": "^3.0.1",
+ "eslint": "^8.3.0",
+ "expect-puppeteer": "^4.4.0",
+ "fast-glob": "^3.2.7",
+ "filenamify": "^4.2.0",
+ "jest": "^29.6.2",
+ "jest-dev-server": "^9.0.1",
+ "jest-environment-jsdom": "^29.6.2",
+ "jest-environment-node": "^29.6.2",
+ "json2php": "^0.0.9",
+ "markdownlint-cli": "^0.31.1",
+ "merge-deep": "^3.0.3",
+ "mini-css-extract-plugin": "^2.5.1",
+ "minimist": "^1.2.0",
+ "npm-package-json-lint": "^6.4.0",
+ "npm-packlist": "^3.0.0",
+ "postcss": "^8.4.5",
+ "postcss-import": "^16.1.0",
+ "postcss-loader": "^6.2.1",
+ "prettier": "npm:wp-prettier@3.0.3",
+ "puppeteer-core": "^23.1.0",
+ "react-refresh": "^0.14.0",
+ "read-pkg-up": "^7.0.1",
+ "resolve-bin": "^0.4.0",
+ "rtlcss-webpack-plugin": "^4.0.7",
+ "sass": "^1.35.2",
+ "sass-loader": "^12.1.0",
+ "schema-utils": "^4.2.0",
+ "source-map-loader": "^3.0.0",
+ "stylelint": "^16.8.2",
+ "terser-webpack-plugin": "^5.3.10",
+ "url-loader": "^4.1.1",
+ "webpack": "^5.95.0",
+ "webpack-bundle-analyzer": "^4.9.1",
+ "webpack-cli": "^5.1.4",
+ "webpack-dev-server": "^4.15.1"
+ },
+ "bin": {
+ "wp-scripts": "bin/wp-scripts.js"
+ },
+ "engines": {
+ "node": ">=18.12.0",
+ "npm": ">=8.19.2"
+ },
+ "peerDependencies": {
+ "@playwright/test": "^1.48.1",
+ "react": "^18.0.0",
+ "react-dom": "^18.0.0"
+ }
+ },
+ "node_modules/@wordpress/scripts/node_modules/@babel/core": {
+ "version": "7.25.7",
+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.7.tgz",
+ "integrity": "sha512-yJ474Zv3cwiSOO9nXJuqzvwEeM+chDuQ8GJirw+pZ91sCGCyOZ3dJkVE09fTV0VEVzXyLWhh3G/AolYTPX7Mow==",
+ "dev": true,
+ "dependencies": {
+ "@ampproject/remapping": "^2.2.0",
+ "@babel/code-frame": "^7.25.7",
+ "@babel/generator": "^7.25.7",
+ "@babel/helper-compilation-targets": "^7.25.7",
+ "@babel/helper-module-transforms": "^7.25.7",
+ "@babel/helpers": "^7.25.7",
+ "@babel/parser": "^7.25.7",
+ "@babel/template": "^7.25.7",
+ "@babel/traverse": "^7.25.7",
+ "@babel/types": "^7.25.7",
+ "convert-source-map": "^2.0.0",
+ "debug": "^4.1.0",
+ "gensync": "^1.0.0-beta.2",
+ "json5": "^2.2.3",
+ "semver": "^6.3.1"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/babel"
+ }
+ },
+ "node_modules/@wordpress/scripts/node_modules/prettier": {
+ "name": "wp-prettier",
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/wp-prettier/-/wp-prettier-3.0.3.tgz",
+ "integrity": "sha512-X4UlrxDTH8oom9qXlcjnydsjAOD2BmB6yFmvS4Z2zdTzqqpRWb+fbqrH412+l+OUXmbzJlSXjlMFYPgYG12IAA==",
+ "dev": true,
+ "bin": {
+ "prettier": "bin/prettier.cjs"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/prettier/prettier?sponsor=1"
+ }
+ },
+ "node_modules/@wordpress/shortcode": {
+ "version": "4.11.0",
+ "resolved": "https://registry.npmjs.org/@wordpress/shortcode/-/shortcode-4.11.0.tgz",
+ "integrity": "sha512-J2k8SYLR/aziSMilZGa0Plps7utQGXqRB2p/s/e2fj7SpV2p8futJZl0mlejTCBZC3q4izqkKkOItknTRRyu3w==",
+ "dependencies": {
+ "@babel/runtime": "7.25.7",
+ "memize": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=18.12.0",
+ "npm": ">=8.19.2"
+ }
+ },
+ "node_modules/@wordpress/shortcode/node_modules/@babel/runtime": {
+ "version": "7.25.7",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz",
+ "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==",
+ "dependencies": {
+ "regenerator-runtime": "^0.14.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@wordpress/style-engine": {
+ "version": "2.11.0",
+ "resolved": "https://registry.npmjs.org/@wordpress/style-engine/-/style-engine-2.11.0.tgz",
+ "integrity": "sha512-Yb/JhUZq6yetHiqXfPJ4yCZH9Ov4m8JLMEr+p93DbLamaEXbes+ZDm502Dvx1U2jR9bphgqBBvXUHZsbLnN6Mw==",
+ "dependencies": {
+ "@babel/runtime": "7.25.7",
+ "change-case": "^4.1.2"
+ },
+ "engines": {
+ "node": ">=18.12.0",
+ "npm": ">=8.19.2"
+ }
+ },
+ "node_modules/@wordpress/style-engine/node_modules/@babel/runtime": {
+ "version": "7.25.7",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz",
+ "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==",
+ "dependencies": {
+ "regenerator-runtime": "^0.14.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@wordpress/stylelint-config": {
+ "version": "23.3.0",
+ "resolved": "https://registry.npmjs.org/@wordpress/stylelint-config/-/stylelint-config-23.3.0.tgz",
+ "integrity": "sha512-QRNPSgYgAlCC1HuCnGiBIVLlraK0JSYxAbWbNqlubfh8Xu7etUg1LBBY0ZI3wFQ5wwgioOwMDiv6++vqcD71RQ==",
+ "dev": true,
+ "dependencies": {
+ "@stylistic/stylelint-plugin": "^3.0.1",
+ "stylelint-config-recommended": "^14.0.1",
+ "stylelint-config-recommended-scss": "^14.1.0"
+ },
+ "engines": {
+ "node": ">=18.12.0",
+ "npm": ">=8.19.2"
+ },
+ "peerDependencies": {
+ "stylelint": "^16.8.2"
+ }
+ },
+ "node_modules/@wordpress/sync": {
+ "version": "1.11.0",
+ "resolved": "https://registry.npmjs.org/@wordpress/sync/-/sync-1.11.0.tgz",
+ "integrity": "sha512-bC4sbUMEl1M+Htdff25avEiqrMseacW1JD1G6qM4voGcqsoqNuehNjjui+8GfHcD3kdbBd+H24mFBUL3eqeQig==",
+ "dependencies": {
+ "@babel/runtime": "7.25.7",
+ "@types/simple-peer": "^9.11.5",
+ "@wordpress/url": "*",
+ "import-locals": "^2.0.0",
+ "lib0": "^0.2.42",
+ "simple-peer": "^9.11.0",
+ "y-indexeddb": "~9.0.11",
+ "y-protocols": "^1.0.5",
+ "y-webrtc": "~10.2.5",
+ "yjs": "~13.6.6"
+ },
+ "engines": {
+ "node": ">=18.12.0",
+ "npm": ">=8.19.2"
+ }
+ },
+ "node_modules/@wordpress/sync/node_modules/@babel/runtime": {
+ "version": "7.25.7",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz",
+ "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==",
+ "dependencies": {
+ "regenerator-runtime": "^0.14.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@wordpress/token-list": {
+ "version": "3.11.0",
+ "resolved": "https://registry.npmjs.org/@wordpress/token-list/-/token-list-3.11.0.tgz",
+ "integrity": "sha512-W+p9koG9tWQgxhW9rOqBxhMoqy68zu5km+Km49QZrNBhX4/vNu4kEY8pShStaRZCYxsvO4cf6sT7Jibt3c49Dg==",
+ "dependencies": {
+ "@babel/runtime": "7.25.7"
+ },
+ "engines": {
+ "node": ">=18.12.0",
+ "npm": ">=8.19.2"
+ }
+ },
+ "node_modules/@wordpress/token-list/node_modules/@babel/runtime": {
+ "version": "7.25.7",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz",
+ "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==",
+ "dependencies": {
+ "regenerator-runtime": "^0.14.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@wordpress/undo-manager": {
+ "version": "1.11.0",
+ "resolved": "https://registry.npmjs.org/@wordpress/undo-manager/-/undo-manager-1.11.0.tgz",
+ "integrity": "sha512-Z+GlI2e4bMRI0fjqUTFFy8MuGtWgxlc4PcDtN4qJkFVix83TnAJO5DEDo4UlntzPKfj+zv0Ua8HWm4luhvqAkw==",
+ "dependencies": {
+ "@babel/runtime": "7.25.7",
+ "@wordpress/is-shallow-equal": "*"
+ },
+ "engines": {
+ "node": ">=18.12.0",
+ "npm": ">=8.19.2"
+ }
+ },
+ "node_modules/@wordpress/undo-manager/node_modules/@babel/runtime": {
+ "version": "7.25.7",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz",
+ "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==",
+ "dependencies": {
+ "regenerator-runtime": "^0.14.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@wordpress/url": {
+ "version": "4.11.0",
+ "resolved": "https://registry.npmjs.org/@wordpress/url/-/url-4.11.0.tgz",
+ "integrity": "sha512-Q9gyGCxagefDu8MRICYSxl97+UjDTFkaKXpxmD+hxkc95p4QA5C0URQLNZ5e/DSKBIGr0sTQ+ZoloueIu9m82g==",
+ "dependencies": {
+ "@babel/runtime": "7.25.7",
+ "remove-accents": "^0.5.0"
+ },
+ "engines": {
+ "node": ">=18.12.0",
+ "npm": ">=8.19.2"
+ }
+ },
+ "node_modules/@wordpress/url/node_modules/@babel/runtime": {
+ "version": "7.25.7",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz",
+ "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==",
+ "dependencies": {
+ "regenerator-runtime": "^0.14.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@wordpress/warning": {
+ "version": "3.11.0",
+ "resolved": "https://registry.npmjs.org/@wordpress/warning/-/warning-3.11.0.tgz",
+ "integrity": "sha512-tXCsxlMAYXbRCgZmVHsBkoBGnrytZPGGezGXANRTsyJ00QoQJgxvnH6u22Rs/NOIVHQ5o65/9jKC3g0e6qn7PA==",
+ "engines": {
+ "node": ">=18.12.0",
+ "npm": ">=8.19.2"
+ }
+ },
+ "node_modules/@wordpress/wordcount": {
+ "version": "4.11.0",
+ "resolved": "https://registry.npmjs.org/@wordpress/wordcount/-/wordcount-4.11.0.tgz",
+ "integrity": "sha512-7RvPdjkrqmz/055SG/QCGH8UwdMhFz2YoNVPI1vA3iNglNxqwyb2k5ng7g3MJanPZNaUj0kuHknHhiCf/nLVHQ==",
+ "dependencies": {
+ "@babel/runtime": "7.25.7"
+ },
+ "engines": {
+ "node": ">=18.12.0",
+ "npm": ">=8.19.2"
+ }
+ },
+ "node_modules/@wordpress/wordcount/node_modules/@babel/runtime": {
+ "version": "7.25.7",
+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz",
+ "integrity": "sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w==",
+ "dependencies": {
+ "regenerator-runtime": "^0.14.0"
+ },
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/@xtuc/ieee754": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
+ "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==",
+ "dev": true
+ },
+ "node_modules/@xtuc/long": {
+ "version": "4.2.2",
+ "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz",
+ "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==",
+ "dev": true
+ },
+ "node_modules/abab": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz",
+ "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==",
+ "deprecated": "Use your platform's native atob() and btoa() methods instead",
+ "dev": true
+ },
+ "node_modules/accepts": {
+ "version": "1.3.8",
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
+ "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
+ "dev": true,
+ "dependencies": {
+ "mime-types": "~2.1.34",
+ "negotiator": "0.6.3"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/accepts/node_modules/negotiator": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
+ "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/acorn": {
+ "version": "8.14.0",
+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz",
+ "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==",
+ "dev": true,
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/acorn-globals": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-7.0.1.tgz",
+ "integrity": "sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q==",
+ "dev": true,
+ "dependencies": {
+ "acorn": "^8.1.0",
+ "acorn-walk": "^8.0.2"
+ }
+ },
+ "node_modules/acorn-jsx": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz",
+ "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==",
+ "dev": true,
+ "peerDependencies": {
+ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/acorn-walk": {
+ "version": "8.3.4",
+ "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz",
+ "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==",
+ "dev": true,
+ "dependencies": {
+ "acorn": "^8.11.0"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/adm-zip": {
+ "version": "0.5.16",
+ "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.16.tgz",
+ "integrity": "sha512-TGw5yVi4saajsSEgz25grObGHEUaDrniwvA2qwSC060KfqGPdglhvPMA2lPIoxs3PQIItj2iag35fONcQqgUaQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=12.0"
+ }
+ },
+ "node_modules/agent-base": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
+ "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==",
+ "dev": true,
+ "dependencies": {
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 6.0.0"
+ }
+ },
+ "node_modules/ajv": {
+ "version": "6.12.6",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
+ "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
+ "dev": true,
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/ajv-errors": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz",
+ "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==",
+ "dev": true,
+ "peerDependencies": {
+ "ajv": ">=5.0.0"
+ }
+ },
+ "node_modules/ajv-formats": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz",
+ "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==",
+ "dev": true,
+ "dependencies": {
+ "ajv": "^8.0.0"
+ },
+ "peerDependencies": {
+ "ajv": "^8.0.0"
+ },
+ "peerDependenciesMeta": {
+ "ajv": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/ajv-formats/node_modules/ajv": {
+ "version": "8.17.1",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz",
+ "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
+ "dev": true,
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3",
+ "fast-uri": "^3.0.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/ajv-formats/node_modules/json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+ "dev": true
+ },
+ "node_modules/ajv-keywords": {
+ "version": "3.5.2",
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
+ "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
+ "dev": true,
+ "peerDependencies": {
+ "ajv": "^6.9.1"
+ }
+ },
+ "node_modules/ansi-colors": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz",
+ "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/ansi-escapes": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz",
+ "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==",
+ "dev": true,
+ "dependencies": {
+ "type-fest": "^0.21.3"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/ansi-html": {
+ "version": "0.0.9",
+ "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.9.tgz",
+ "integrity": "sha512-ozbS3LuenHVxNRh/wdnN16QapUHzauqSomAl1jwwJRRsGwFwtj644lIhxfWu0Fy0acCij2+AEgHvjscq3dlVXg==",
+ "dev": true,
+ "engines": [
+ "node >= 0.8.0"
+ ],
+ "bin": {
+ "ansi-html": "bin/ansi-html"
+ }
+ },
+ "node_modules/ansi-html-community": {
+ "version": "0.0.8",
+ "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz",
+ "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==",
+ "dev": true,
+ "engines": [
+ "node >= 0.8.0"
+ ],
+ "bin": {
+ "ansi-html": "bin/ansi-html"
+ }
+ },
+ "node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
+ "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/anymatch": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz",
+ "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==",
+ "dev": true,
+ "dependencies": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/are-docs-informative": {
+ "version": "0.0.2",
+ "resolved": "https://registry.npmjs.org/are-docs-informative/-/are-docs-informative-0.0.2.tgz",
+ "integrity": "sha512-ixiS0nLNNG5jNQzgZJNoUpBKdo9yTYZMGJ+QgT2jmjR7G7+QHRCc4v6LQ3NgE7EBJq+o0ams3waJwkrlBom8Ig==",
+ "dev": true,
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/argparse": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
+ "dev": true,
+ "dependencies": {
+ "sprintf-js": "~1.0.2"
+ }
+ },
+ "node_modules/argparse/node_modules/sprintf-js": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
+ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==",
+ "dev": true
+ },
+ "node_modules/aria-hidden": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.4.tgz",
+ "integrity": "sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==",
+ "dependencies": {
+ "tslib": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/aria-query": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.2.tgz",
+ "integrity": "sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/arr-union": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
+ "integrity": "sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/array-buffer-byte-length": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz",
+ "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==",
+ "dev": true,
+ "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-flatten": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
+ "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==",
+ "dev": true
+ },
+ "node_modules/array-includes": {
+ "version": "3.1.8",
+ "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz",
+ "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==",
+ "dev": true,
+ "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",
+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
+ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/array-uniq": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz",
+ "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/array.prototype.findlast": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/array.prototype.findlast/-/array.prototype.findlast-1.2.5.tgz",
+ "integrity": "sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.2",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0",
+ "es-shim-unscopables": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array.prototype.findlastindex": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz",
+ "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==",
+ "dev": true,
+ "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",
+ "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz",
+ "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.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",
+ "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz",
+ "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.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.tosorted": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.4.tgz",
+ "integrity": "sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.3",
+ "es-errors": "^1.3.0",
+ "es-shim-unscopables": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/arraybuffer.prototype.slice": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.3.tgz",
+ "integrity": "sha512-bMxMKAjg13EBSVscxTaYA4mRc5t1UAXa2kXiGTNfZ079HIWXEkKmkgFrh/nJqamaLSrXO5H4WFFkPEaLJWbs3A==",
+ "dev": true,
+ "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/arrify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz",
+ "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ast-types": {
+ "version": "0.13.4",
+ "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz",
+ "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==",
+ "dev": true,
+ "dependencies": {
+ "tslib": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/ast-types-flow": {
+ "version": "0.0.8",
+ "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.8.tgz",
+ "integrity": "sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==",
+ "dev": true
+ },
+ "node_modules/astral-regex": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
+ "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
+ "dev": true
+ },
+ "node_modules/autoprefixer": {
+ "version": "10.4.20",
+ "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz",
+ "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==",
+ "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"
+ }
+ ],
+ "dependencies": {
+ "browserslist": "^4.23.3",
+ "caniuse-lite": "^1.0.30001646",
+ "fraction.js": "^4.3.7",
+ "normalize-range": "^0.1.2",
+ "picocolors": "^1.0.1",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "bin": {
+ "autoprefixer": "bin/autoprefixer"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/autosize": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/autosize/-/autosize-4.0.4.tgz",
+ "integrity": "sha512-5yxLQ22O0fCRGoxGfeLSNt3J8LB1v+umtpMnPW6XjkTWXKoN0AmXAIhelJcDtFT/Y/wYWmfE+oqU10Q0b8FhaQ=="
+ },
+ "node_modules/available-typed-arrays": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz",
+ "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==",
+ "dev": true,
+ "dependencies": {
+ "possible-typed-array-names": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/axe-core": {
+ "version": "4.10.2",
+ "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.2.tgz",
+ "integrity": "sha512-RE3mdQ7P3FRSe7eqCWoeQ/Z9QXrtniSjp1wUjt5nRC3WIpz5rSCve6o3fsZ2aCpJtrZjSZgjwXAoTO5k4tEI0w==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/axios": {
+ "version": "1.7.7",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz",
+ "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==",
+ "dev": true,
+ "dependencies": {
+ "follow-redirects": "^1.15.6",
+ "form-data": "^4.0.0",
+ "proxy-from-env": "^1.1.0"
+ }
+ },
+ "node_modules/axobject-query": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.1.0.tgz",
+ "integrity": "sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/b4a": {
+ "version": "1.6.7",
+ "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz",
+ "integrity": "sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg==",
+ "dev": true
+ },
+ "node_modules/babel-jest": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz",
+ "integrity": "sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg==",
+ "dev": true,
+ "dependencies": {
+ "@jest/transform": "^29.7.0",
+ "@types/babel__core": "^7.1.14",
+ "babel-plugin-istanbul": "^6.1.1",
+ "babel-preset-jest": "^29.6.3",
+ "chalk": "^4.0.0",
+ "graceful-fs": "^4.2.9",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.8.0"
+ }
+ },
+ "node_modules/babel-loader": {
+ "version": "9.2.1",
+ "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.2.1.tgz",
+ "integrity": "sha512-fqe8naHt46e0yIdkjUZYqddSXfej3AHajX+CSO5X7oy0EmPc6o5Xh+RClNoHjnieWz9AW4kZxW9yyFMhVB1QLA==",
+ "dev": true,
+ "dependencies": {
+ "find-cache-dir": "^4.0.0",
+ "schema-utils": "^4.0.0"
+ },
+ "engines": {
+ "node": ">= 14.15.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.12.0",
+ "webpack": ">=5"
+ }
+ },
+ "node_modules/babel-plugin-istanbul": {
+ "version": "6.1.1",
+ "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz",
+ "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-plugin-utils": "^7.0.0",
+ "@istanbuljs/load-nyc-config": "^1.0.0",
+ "@istanbuljs/schema": "^0.1.2",
+ "istanbul-lib-instrument": "^5.0.4",
+ "test-exclude": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/babel-plugin-jest-hoist": {
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-29.6.3.tgz",
+ "integrity": "sha512-ESAc/RJvGTFEzRwOTT4+lNDk/GNHMkKbNzsvT0qKRfDyyYTskxB5rnU2njIDYVxXCBHHEI1c0YwHob3WaYujOg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/template": "^7.3.3",
+ "@babel/types": "^7.3.3",
+ "@types/babel__core": "^7.1.14",
+ "@types/babel__traverse": "^7.0.6"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/babel-plugin-macros": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz",
+ "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==",
+ "dependencies": {
+ "@babel/runtime": "^7.12.5",
+ "cosmiconfig": "^7.0.0",
+ "resolve": "^1.19.0"
+ },
+ "engines": {
+ "node": ">=10",
+ "npm": ">=6"
+ }
+ },
+ "node_modules/babel-plugin-polyfill-corejs2": {
+ "version": "0.4.12",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.12.tgz",
+ "integrity": "sha512-CPWT6BwvhrTO2d8QVorhTCQw9Y43zOu7G9HigcfxvepOU6b8o3tcWad6oVgZIsZCTt42FFv97aA7ZJsbM4+8og==",
+ "dev": true,
+ "dependencies": {
+ "@babel/compat-data": "^7.22.6",
+ "@babel/helper-define-polyfill-provider": "^0.6.3",
+ "semver": "^6.3.1"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/babel-plugin-polyfill-corejs3": {
+ "version": "0.10.6",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz",
+ "integrity": "sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-define-polyfill-provider": "^0.6.2",
+ "core-js-compat": "^3.38.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/babel-plugin-polyfill-regenerator": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.3.tgz",
+ "integrity": "sha512-LiWSbl4CRSIa5x/JAU6jZiG9eit9w6mz+yVMFwDE83LAWvt0AfGBoZ7HS/mkhrKuh2ZlzfVZYKoLjXdqw6Yt7Q==",
+ "dev": true,
+ "dependencies": {
+ "@babel/helper-define-polyfill-provider": "^0.6.3"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0"
+ }
+ },
+ "node_modules/babel-preset-current-node-syntax": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.1.0.tgz",
+ "integrity": "sha512-ldYss8SbBlWva1bs28q78Ju5Zq1F+8BrqBZZ0VFhLBvhh6lCpC2o3gDJi/5DRLs9FgYZCnmPYIVFU4lRXCkyUw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/plugin-syntax-async-generators": "^7.8.4",
+ "@babel/plugin-syntax-bigint": "^7.8.3",
+ "@babel/plugin-syntax-class-properties": "^7.12.13",
+ "@babel/plugin-syntax-class-static-block": "^7.14.5",
+ "@babel/plugin-syntax-import-attributes": "^7.24.7",
+ "@babel/plugin-syntax-import-meta": "^7.10.4",
+ "@babel/plugin-syntax-json-strings": "^7.8.3",
+ "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4",
+ "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3",
+ "@babel/plugin-syntax-numeric-separator": "^7.10.4",
+ "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
+ "@babel/plugin-syntax-optional-catch-binding": "^7.8.3",
+ "@babel/plugin-syntax-optional-chaining": "^7.8.3",
+ "@babel/plugin-syntax-private-property-in-object": "^7.14.5",
+ "@babel/plugin-syntax-top-level-await": "^7.14.5"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/babel-preset-jest": {
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-29.6.3.tgz",
+ "integrity": "sha512-0B3bhxR6snWXJZtR/RliHTDPRgn1sNHOR0yVtq/IiQFyuOVjFS+wuio/R4gSNkyYmKmJB4wGZv2NZanmKmTnNA==",
+ "dev": true,
+ "dependencies": {
+ "babel-plugin-jest-hoist": "^29.6.3",
+ "babel-preset-current-node-syntax": "^1.0.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ },
+ "peerDependencies": {
+ "@babel/core": "^7.0.0"
+ }
+ },
+ "node_modules/babel-runtime": {
+ "version": "6.25.0",
+ "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.25.0.tgz",
+ "integrity": "sha512-zeCYxDePWYAT/DfmQWIHsMSFW2vv45UIwIAMjGvQVsTd47RwsiRH0uK1yzyWZ7LDBKdhnGDPM6NYEO5CZyhPrg==",
+ "dev": true,
+ "dependencies": {
+ "core-js": "^2.4.0",
+ "regenerator-runtime": "^0.10.0"
+ }
+ },
+ "node_modules/babel-runtime/node_modules/core-js": {
+ "version": "2.6.12",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz",
+ "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==",
+ "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.",
+ "dev": true,
+ "hasInstallScript": true
+ },
+ "node_modules/babel-runtime/node_modules/regenerator-runtime": {
+ "version": "0.10.5",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz",
+ "integrity": "sha512-02YopEIhAgiBHWeoTiA8aitHDt8z6w+rQqNuIftlM+ZtvSl/brTouaU7DW6GO/cHtvxJvS4Hwv2ibKdxIRi24w==",
+ "dev": true
+ },
+ "node_modules/balanced-match": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true
+ },
+ "node_modules/bare-events": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.5.0.tgz",
+ "integrity": "sha512-/E8dDe9dsbLyh2qrZ64PEPadOQ0F4gbl1sUJOrmph7xOiIxfY8vwab/4bFLh4Y88/Hk/ujKcrQKc+ps0mv873A==",
+ "dev": true,
+ "optional": true
+ },
+ "node_modules/bare-fs": {
+ "version": "2.3.5",
+ "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-2.3.5.tgz",
+ "integrity": "sha512-SlE9eTxifPDJrT6YgemQ1WGFleevzwY+XAP1Xqgl56HtcrisC2CHCZ2tq6dBpcH2TnNxwUEUGhweo+lrQtYuiw==",
+ "dev": true,
+ "optional": true,
+ "dependencies": {
+ "bare-events": "^2.0.0",
+ "bare-path": "^2.0.0",
+ "bare-stream": "^2.0.0"
+ }
+ },
+ "node_modules/bare-os": {
+ "version": "2.4.4",
+ "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-2.4.4.tgz",
+ "integrity": "sha512-z3UiI2yi1mK0sXeRdc4O1Kk8aOa/e+FNWZcTiPB/dfTWyLypuE99LibgRaQki914Jq//yAWylcAt+mknKdixRQ==",
+ "dev": true,
+ "optional": true
+ },
+ "node_modules/bare-path": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-2.1.3.tgz",
+ "integrity": "sha512-lh/eITfU8hrj9Ru5quUp0Io1kJWIk1bTjzo7JH1P5dWmQ2EL4hFUlfI8FonAhSlgIfhn63p84CDY/x+PisgcXA==",
+ "dev": true,
+ "optional": true,
+ "dependencies": {
+ "bare-os": "^2.1.0"
+ }
+ },
+ "node_modules/bare-stream": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.3.2.tgz",
+ "integrity": "sha512-EFZHSIBkDgSHIwj2l2QZfP4U5OcD4xFAOwhSb/vlr9PIqyGJGvB/nfClJbcnh3EY4jtPE4zsb5ztae96bVF79A==",
+ "dev": true,
+ "optional": true,
+ "dependencies": {
+ "streamx": "^2.20.0"
+ }
+ },
+ "node_modules/base64-js": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
+ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/basic-ftp": {
+ "version": "5.0.5",
+ "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz",
+ "integrity": "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==",
+ "dev": true,
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/batch": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz",
+ "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==",
+ "dev": true
+ },
+ "node_modules/big.js": {
+ "version": "5.2.2",
+ "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz",
+ "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/binary-extensions": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz",
+ "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/body-parser": {
+ "version": "1.20.3",
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz",
+ "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==",
+ "dev": true,
+ "dependencies": {
+ "bytes": "3.1.2",
+ "content-type": "~1.0.5",
+ "debug": "2.6.9",
+ "depd": "2.0.0",
+ "destroy": "1.2.0",
+ "http-errors": "2.0.0",
+ "iconv-lite": "0.4.24",
+ "on-finished": "2.4.1",
+ "qs": "6.13.0",
+ "raw-body": "2.5.2",
+ "type-is": "~1.6.18",
+ "unpipe": "1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8",
+ "npm": "1.2.8000 || >= 1.4.16"
+ }
+ },
+ "node_modules/body-parser/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/body-parser/node_modules/iconv-lite": {
+ "version": "0.4.24",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+ "dev": true,
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/body-parser/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "dev": true
+ },
+ "node_modules/bonjour-service": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.2.1.tgz",
+ "integrity": "sha512-oSzCS2zV14bh2kji6vNe7vrpJYCHGvcZnlffFQ1MEoX/WOeQ/teD8SYWKR942OI3INjq8OMNJlbPK5LLLUxFDw==",
+ "dev": true,
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3",
+ "multicast-dns": "^7.2.5"
+ }
+ },
+ "node_modules/boolbase": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
+ "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==",
+ "dev": true
+ },
+ "node_modules/brace-expansion": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz",
+ "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0"
+ }
+ },
+ "node_modules/braces": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
+ "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
+ "dev": true,
+ "dependencies": {
+ "fill-range": "^7.1.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/browserslist": {
+ "version": "4.24.2",
+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.2.tgz",
+ "integrity": "sha512-ZIc+Q62revdMcqC6aChtW4jz3My3klmCO1fEmINZY/8J3EpBg5/A/D0AKmBveUh6pgoeycoMkVMko84tuYS+Gg==",
+ "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"
+ }
+ ],
+ "dependencies": {
+ "caniuse-lite": "^1.0.30001669",
+ "electron-to-chromium": "^1.5.41",
+ "node-releases": "^2.0.18",
+ "update-browserslist-db": "^1.1.1"
+ },
+ "bin": {
+ "browserslist": "cli.js"
+ },
+ "engines": {
+ "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
+ }
+ },
+ "node_modules/bser": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz",
+ "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==",
+ "dev": true,
+ "dependencies": {
+ "node-int64": "^0.4.0"
+ }
+ },
+ "node_modules/buffer": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz",
+ "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "dependencies": {
+ "base64-js": "^1.3.1",
+ "ieee754": "^1.2.1"
+ }
+ },
+ "node_modules/buffer-crc32": {
+ "version": "0.2.13",
+ "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz",
+ "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/buffer-from": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
+ "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
+ "dev": true
+ },
+ "node_modules/builtin-modules": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz",
+ "integrity": "sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/bytes": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
+ "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/cacheable-lookup": {
+ "version": "5.0.4",
+ "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz",
+ "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10.6.0"
+ }
+ },
+ "node_modules/cacheable-request": {
+ "version": "7.0.4",
+ "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.4.tgz",
+ "integrity": "sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==",
+ "dev": true,
+ "dependencies": {
+ "clone-response": "^1.0.2",
+ "get-stream": "^5.1.0",
+ "http-cache-semantics": "^4.0.0",
+ "keyv": "^4.0.0",
+ "lowercase-keys": "^2.0.0",
+ "normalize-url": "^6.0.1",
+ "responselike": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/call-bind": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz",
+ "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==",
+ "dev": true,
+ "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",
+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
+ "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/camel-case": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz",
+ "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==",
+ "dependencies": {
+ "pascal-case": "^3.1.2",
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/camelcase": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz",
+ "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/camelcase-keys": {
+ "version": "6.2.2",
+ "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz",
+ "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==",
+ "dev": true,
+ "dependencies": {
+ "camelcase": "^5.3.1",
+ "map-obj": "^4.0.0",
+ "quick-lru": "^4.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/camelcase-keys/node_modules/camelcase": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/camelcase-keys/node_modules/quick-lru": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz",
+ "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/caniuse-api": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz",
+ "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==",
+ "dev": true,
+ "dependencies": {
+ "browserslist": "^4.0.0",
+ "caniuse-lite": "^1.0.0",
+ "lodash.memoize": "^4.1.2",
+ "lodash.uniq": "^4.5.0"
+ }
+ },
+ "node_modules/caniuse-lite": {
+ "version": "1.0.30001680",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001680.tgz",
+ "integrity": "sha512-rPQy70G6AGUMnbwS1z6Xg+RkHYPAi18ihs47GH0jcxIG7wArmPgY3XbS2sRdBbxJljp3thdT8BIqv9ccCypiPA==",
+ "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"
+ }
+ ]
+ },
+ "node_modules/capital-case": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/capital-case/-/capital-case-1.0.4.tgz",
+ "integrity": "sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A==",
+ "dependencies": {
+ "no-case": "^3.0.4",
+ "tslib": "^2.0.3",
+ "upper-case-first": "^2.0.2"
+ }
+ },
+ "node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/change-case": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/change-case/-/change-case-4.1.2.tgz",
+ "integrity": "sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A==",
+ "dependencies": {
+ "camel-case": "^4.1.2",
+ "capital-case": "^1.0.4",
+ "constant-case": "^3.0.4",
+ "dot-case": "^3.0.4",
+ "header-case": "^2.0.4",
+ "no-case": "^3.0.4",
+ "param-case": "^3.0.4",
+ "pascal-case": "^3.1.2",
+ "path-case": "^3.0.4",
+ "sentence-case": "^3.0.4",
+ "snake-case": "^3.0.4",
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/char-regex": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz",
+ "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/chardet": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz",
+ "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==",
+ "dev": true
+ },
+ "node_modules/check-node-version": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/check-node-version/-/check-node-version-4.2.1.tgz",
+ "integrity": "sha512-YYmFYHV/X7kSJhuN/QYHUu998n/TRuDe8UenM3+m5NrkiH670lb9ILqHIvBencvJc4SDh+XcbXMR4b+TtubJiw==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^3.0.0",
+ "map-values": "^1.0.1",
+ "minimist": "^1.2.0",
+ "object-filter": "^1.0.2",
+ "run-parallel": "^1.1.4",
+ "semver": "^6.3.0"
+ },
+ "bin": {
+ "check-node-version": "bin.js"
+ },
+ "engines": {
+ "node": ">=8.3.0"
+ }
+ },
+ "node_modules/check-node-version/node_modules/chalk": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
+ "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/chokidar": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.1.tgz",
+ "integrity": "sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==",
+ "dev": true,
+ "dependencies": {
+ "readdirp": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 14.16.0"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/chrome-launcher": {
+ "version": "0.15.2",
+ "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-0.15.2.tgz",
+ "integrity": "sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "*",
+ "escape-string-regexp": "^4.0.0",
+ "is-wsl": "^2.2.0",
+ "lighthouse-logger": "^1.0.0"
+ },
+ "bin": {
+ "print-chrome-path": "bin/print-chrome-path.js"
+ },
+ "engines": {
+ "node": ">=12.13.0"
+ }
+ },
+ "node_modules/chrome-trace-event": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz",
+ "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.0"
+ }
+ },
+ "node_modules/chromium-bidi": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.8.0.tgz",
+ "integrity": "sha512-uJydbGdTw0DEUjhoogGveneJVWX/9YuqkWePzMmkBYwtdAqo5d3J/ovNKFr+/2hWXYmYCr6it8mSSTIj6SS6Ug==",
+ "dev": true,
+ "dependencies": {
+ "mitt": "3.0.1",
+ "urlpattern-polyfill": "10.0.0",
+ "zod": "3.23.8"
+ },
+ "peerDependencies": {
+ "devtools-protocol": "*"
+ }
+ },
+ "node_modules/ci-info": {
+ "version": "3.9.0",
+ "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz",
+ "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/sibiraj-s"
+ }
+ ],
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/cjs-module-lexer": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.4.1.tgz",
+ "integrity": "sha512-cuSVIHi9/9E/+821Qjdvngor+xpnlwnuwIyZOaLmHBVdXL+gP+I6QQB9VkO7RI77YIcTV+S1W9AreJ5eN63JBA==",
+ "dev": true
+ },
+ "node_modules/classnames": {
+ "version": "2.5.1",
+ "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz",
+ "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow=="
+ },
+ "node_modules/clean-webpack-plugin": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/clean-webpack-plugin/-/clean-webpack-plugin-3.0.0.tgz",
+ "integrity": "sha512-MciirUH5r+cYLGCOL5JX/ZLzOZbVr1ot3Fw+KcvbhUb6PM+yycqd9ZhIlcigQ5gl+XhppNmw3bEFuaaMNyLj3A==",
+ "dev": true,
+ "dependencies": {
+ "@types/webpack": "^4.4.31",
+ "del": "^4.1.1"
+ },
+ "engines": {
+ "node": ">=8.9.0"
+ },
+ "peerDependencies": {
+ "webpack": "*"
+ }
+ },
+ "node_modules/cli-cursor": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz",
+ "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==",
+ "dev": true,
+ "dependencies": {
+ "restore-cursor": "^3.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/cli-spinners": {
+ "version": "2.9.2",
+ "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz",
+ "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/cli-width": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz",
+ "integrity": "sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/clipboard": {
+ "version": "2.0.11",
+ "resolved": "https://registry.npmjs.org/clipboard/-/clipboard-2.0.11.tgz",
+ "integrity": "sha512-C+0bbOqkezLIsmWSvlsXS0Q0bmkugu7jcfMIACB+RDEntIzQIkdr148we28AfSloQLRdZlYL/QYyrq05j/3Faw==",
+ "dependencies": {
+ "good-listener": "^1.2.2",
+ "select": "^1.1.2",
+ "tiny-emitter": "^2.0.0"
+ }
+ },
+ "node_modules/cliui": {
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
+ "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==",
+ "dev": true,
+ "dependencies": {
+ "string-width": "^4.2.0",
+ "strip-ansi": "^6.0.1",
+ "wrap-ansi": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/clone": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
+ "integrity": "sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/clone-deep": {
+ "version": "0.2.4",
+ "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-0.2.4.tgz",
+ "integrity": "sha512-we+NuQo2DHhSl+DP6jlUiAhyAjBQrYnpOk15rN6c6JSPScjiCLh8IbSU+VTcph6YS3o7mASE8a0+gbZ7ChLpgg==",
+ "dev": true,
+ "dependencies": {
+ "for-own": "^0.1.3",
+ "is-plain-object": "^2.0.1",
+ "kind-of": "^3.0.2",
+ "lazy-cache": "^1.0.3",
+ "shallow-clone": "^0.1.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/clone-deep/node_modules/is-plain-object": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+ "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+ "dev": true,
+ "dependencies": {
+ "isobject": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/clone-response": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.3.tgz",
+ "integrity": "sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==",
+ "dev": true,
+ "dependencies": {
+ "mimic-response": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/clsx": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.0.tgz",
+ "integrity": "sha512-m3iNNWpd9rl3jvvcBnu70ylMdrXt8Vlq4HYadnU5fwcOtvkSQWPmj7amUcDT2qYI7risszBjI5AUIUox9D16pg==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/cmdk": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/cmdk/-/cmdk-1.0.4.tgz",
+ "integrity": "sha512-AnsjfHyHpQ/EFeAnG216WY7A5LiYCoZzCSygiLvfXC3H3LFGCprErteUcszaVluGOhuOTbJS3jWHrSDYPBBygg==",
+ "dependencies": {
+ "@radix-ui/react-dialog": "^1.1.2",
+ "@radix-ui/react-id": "^1.1.0",
+ "@radix-ui/react-primitive": "^2.0.0",
+ "use-sync-external-store": "^1.2.2"
+ },
+ "peerDependencies": {
+ "react": "^18 || ^19 || ^19.0.0-rc",
+ "react-dom": "^18 || ^19 || ^19.0.0-rc"
+ }
+ },
+ "node_modules/co": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
+ "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==",
+ "dev": true,
+ "engines": {
+ "iojs": ">= 1.0.0",
+ "node": ">= 0.12.0"
+ }
+ },
+ "node_modules/collect-v8-coverage": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz",
+ "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==",
+ "dev": true
+ },
+ "node_modules/color-convert": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
+ "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
+ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+ "dev": true
+ },
+ "node_modules/colord": {
+ "version": "2.9.3",
+ "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz",
+ "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw=="
+ },
+ "node_modules/colorette": {
+ "version": "2.0.20",
+ "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz",
+ "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==",
+ "dev": true
+ },
+ "node_modules/combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "dev": true,
+ "dependencies": {
+ "delayed-stream": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/commander": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz",
+ "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/comment-parser": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.1.tgz",
+ "integrity": "sha512-buhp5kePrmda3vhc5B9t7pUQXAb2Tnd0qgpkIhPhkHXxJpiPJ11H0ZEU0oBpJ2QztSbzG/ZxMj/CHsYJqRHmyg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 12.0.0"
+ }
+ },
+ "node_modules/common-path-prefix": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz",
+ "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==",
+ "dev": true
+ },
+ "node_modules/compressible": {
+ "version": "2.0.18",
+ "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz",
+ "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==",
+ "dev": true,
+ "dependencies": {
+ "mime-db": ">= 1.43.0 < 2"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/compression": {
+ "version": "1.7.5",
+ "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.5.tgz",
+ "integrity": "sha512-bQJ0YRck5ak3LgtnpKkiabX5pNF7tMUh1BSy2ZBOTh0Dim0BUu6aPPwByIns6/A5Prh8PufSPerMDUklpzes2Q==",
+ "dev": true,
+ "dependencies": {
+ "bytes": "3.1.2",
+ "compressible": "~2.0.18",
+ "debug": "2.6.9",
+ "negotiator": "~0.6.4",
+ "on-headers": "~1.0.2",
+ "safe-buffer": "5.2.1",
+ "vary": "~1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/compression/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/compression/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "dev": true
+ },
+ "node_modules/computed-style": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/computed-style/-/computed-style-0.1.4.tgz",
+ "integrity": "sha512-WpAmaKbMNmS3OProfHIdJiNleNJdgUrJfbKArXua28QF7+0CoZjlLn0lp6vlc+dl5r2/X9GQiQRQQU4BzSa69w=="
+ },
+ "node_modules/concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
+ "dev": true
+ },
+ "node_modules/concat-stream": {
+ "version": "1.6.2",
+ "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
+ "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
+ "dev": true,
+ "engines": [
+ "node >= 0.8"
+ ],
+ "dependencies": {
+ "buffer-from": "^1.0.0",
+ "inherits": "^2.0.3",
+ "readable-stream": "^2.2.2",
+ "typedarray": "^0.0.6"
+ }
+ },
+ "node_modules/configstore": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz",
+ "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==",
+ "dev": true,
+ "dependencies": {
+ "dot-prop": "^5.2.0",
+ "graceful-fs": "^4.1.2",
+ "make-dir": "^3.0.0",
+ "unique-string": "^2.0.0",
+ "write-file-atomic": "^3.0.0",
+ "xdg-basedir": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/configstore/node_modules/make-dir": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
+ "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
+ "dev": true,
+ "dependencies": {
+ "semver": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/configstore/node_modules/write-file-atomic": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz",
+ "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==",
+ "dev": true,
+ "dependencies": {
+ "imurmurhash": "^0.1.4",
+ "is-typedarray": "^1.0.0",
+ "signal-exit": "^3.0.2",
+ "typedarray-to-buffer": "^3.1.5"
+ }
+ },
+ "node_modules/connect-history-api-fallback": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz",
+ "integrity": "sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/constant-case": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/constant-case/-/constant-case-3.0.4.tgz",
+ "integrity": "sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ==",
+ "dependencies": {
+ "no-case": "^3.0.4",
+ "tslib": "^2.0.3",
+ "upper-case": "^2.0.2"
+ }
+ },
+ "node_modules/content-disposition": {
+ "version": "0.5.4",
+ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
+ "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
+ "dev": true,
+ "dependencies": {
+ "safe-buffer": "5.2.1"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/content-type": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
+ "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/convert-source-map": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz",
+ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
+ "dev": true
+ },
+ "node_modules/cookie": {
+ "version": "0.4.2",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz",
+ "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/cookie-signature": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
+ "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==",
+ "dev": true
+ },
+ "node_modules/copy-dir": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/copy-dir/-/copy-dir-1.3.0.tgz",
+ "integrity": "sha512-Q4+qBFnN4bwGwvtXXzbp4P/4iNk0MaiGAzvQ8OiMtlLjkIKjmNN689uVzShSM0908q7GoFHXIPx4zi75ocoaHw==",
+ "dev": true
+ },
+ "node_modules/copy-webpack-plugin": {
+ "version": "10.2.4",
+ "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-10.2.4.tgz",
+ "integrity": "sha512-xFVltahqlsRcyyJqQbDY6EYTtyQZF9rf+JPjwHObLdPFMEISqkFkr7mFoVOC6BfYS/dNThyoQKvziugm+OnwBg==",
+ "dev": true,
+ "dependencies": {
+ "fast-glob": "^3.2.7",
+ "glob-parent": "^6.0.1",
+ "globby": "^12.0.2",
+ "normalize-path": "^3.0.0",
+ "schema-utils": "^4.0.0",
+ "serialize-javascript": "^6.0.0"
+ },
+ "engines": {
+ "node": ">= 12.20.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "webpack": "^5.1.0"
+ }
+ },
+ "node_modules/copy-webpack-plugin/node_modules/array-union": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-3.0.1.tgz",
+ "integrity": "sha512-1OvF9IbWwaeiM9VhzYXVQacMibxpXOMYVNIvMtKRyX9SImBXpKcFr8XvFDeEslCyuH/t6KRt7HEO94AlP8Iatw==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/copy-webpack-plugin/node_modules/globby": {
+ "version": "12.2.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-12.2.0.tgz",
+ "integrity": "sha512-wiSuFQLZ+urS9x2gGPl1H5drc5twabmm4m2gTR27XDFyjUHJUNsS8o/2aKyIF6IoBaR630atdher0XJ5g6OMmA==",
+ "dev": true,
+ "dependencies": {
+ "array-union": "^3.0.1",
+ "dir-glob": "^3.0.1",
+ "fast-glob": "^3.2.7",
+ "ignore": "^5.1.9",
+ "merge2": "^1.4.1",
+ "slash": "^4.0.0"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/copy-webpack-plugin/node_modules/slash": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz",
+ "integrity": "sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/core-js": {
+ "version": "3.39.0",
+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.39.0.tgz",
+ "integrity": "sha512-raM0ew0/jJUqkJ0E6e8UDtl+y/7ktFivgWvqw8dNSQeNWoSDLvQ1H/RN3aPXB9tBd4/FhyR4RDPGhsNIMsAn7g==",
+ "dev": true,
+ "hasInstallScript": true,
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/core-js"
+ }
+ },
+ "node_modules/core-js-compat": {
+ "version": "3.39.0",
+ "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.39.0.tgz",
+ "integrity": "sha512-VgEUx3VwlExr5no0tXlBt+silBvhTryPwCXRI2Id1PN8WTKu7MreethvddqOubrYxkFdv/RnYrqlv1sFNAUelw==",
+ "dev": true,
+ "dependencies": {
+ "browserslist": "^4.24.2"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/core-js"
+ }
+ },
+ "node_modules/core-js-pure": {
+ "version": "3.39.0",
+ "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.39.0.tgz",
+ "integrity": "sha512-7fEcWwKI4rJinnK+wLTezeg2smbFFdSBP6E2kQZNbnzM2s1rpKQ6aaRteZSSg7FLU3P0HGGVo/gbpfanU36urg==",
+ "dev": true,
+ "hasInstallScript": true,
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/core-js"
+ }
+ },
+ "node_modules/core-util-is": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
+ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
+ "dev": true
+ },
+ "node_modules/cosmiconfig": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz",
+ "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==",
+ "dependencies": {
+ "@types/parse-json": "^4.0.0",
+ "import-fresh": "^3.2.1",
+ "parse-json": "^5.0.0",
+ "path-type": "^4.0.0",
+ "yaml": "^1.10.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/create-jest": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz",
+ "integrity": "sha512-Adz2bdH0Vq3F53KEMJOoftQFutWCukm6J24wbPWRO4k1kMY7gS7ds/uoJkNuV8wDCtWWnuwGcJwpWcih+zEW1Q==",
+ "dev": true,
+ "dependencies": {
+ "@jest/types": "^29.6.3",
+ "chalk": "^4.0.0",
+ "exit": "^0.1.2",
+ "graceful-fs": "^4.2.9",
+ "jest-config": "^29.7.0",
+ "jest-util": "^29.7.0",
+ "prompts": "^2.0.1"
+ },
+ "bin": {
+ "create-jest": "bin/create-jest.js"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/cross-fetch": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz",
+ "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==",
+ "dev": true,
+ "dependencies": {
+ "node-fetch": "^2.6.12"
+ }
+ },
+ "node_modules/cross-spawn": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
+ "integrity": "sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==",
+ "dev": true,
+ "dependencies": {
+ "lru-cache": "^4.0.1",
+ "shebang-command": "^1.2.0",
+ "which": "^1.2.9"
+ }
+ },
+ "node_modules/cross-spawn/node_modules/lru-cache": {
+ "version": "4.1.5",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz",
+ "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==",
+ "dev": true,
+ "dependencies": {
+ "pseudomap": "^1.0.2",
+ "yallist": "^2.1.2"
+ }
+ },
+ "node_modules/cross-spawn/node_modules/yallist": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
+ "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==",
+ "dev": true
+ },
+ "node_modules/crypto-random-string": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz",
+ "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/csp_evaluator": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/csp_evaluator/-/csp_evaluator-1.1.1.tgz",
+ "integrity": "sha512-N3ASg0C4kNPUaNxt1XAvzHIVuzdtr8KLgfk1O8WDyimp1GisPAHESupArO2ieHk9QWbrJ/WkQODyh21Ps/xhxw==",
+ "dev": true
+ },
+ "node_modules/css-declaration-sorter": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.2.0.tgz",
+ "integrity": "sha512-h70rUM+3PNFuaBDTLe8wF/cdWu+dOZmb7pJt8Z2sedYbAcQVQV/tEchueg3GWxwqS0cxtbxmaHEdkNACqcvsow==",
+ "dev": true,
+ "engines": {
+ "node": "^14 || ^16 || >=18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.0.9"
+ }
+ },
+ "node_modules/css-functions-list": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.3.tgz",
+ "integrity": "sha512-IQOkD3hbR5KrN93MtcYuad6YPuTSUhntLHDuLEbFWE+ff2/XSZNdZG+LcbbIW5AXKg/WFIfYItIzVoHngHXZzA==",
+ "dev": true,
+ "engines": {
+ "node": ">=12 || >=16"
+ }
+ },
+ "node_modules/css-loader": {
+ "version": "6.11.0",
+ "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.11.0.tgz",
+ "integrity": "sha512-CTJ+AEQJjq5NzLga5pE39qdiSV56F8ywCIsqNIRF0r7BDgWsN25aazToqAFg7ZrtA/U016xudB3ffgweORxX7g==",
+ "dev": true,
+ "dependencies": {
+ "icss-utils": "^5.1.0",
+ "postcss": "^8.4.33",
+ "postcss-modules-extract-imports": "^3.1.0",
+ "postcss-modules-local-by-default": "^4.0.5",
+ "postcss-modules-scope": "^3.2.0",
+ "postcss-modules-values": "^4.0.0",
+ "postcss-value-parser": "^4.2.0",
+ "semver": "^7.5.4"
+ },
+ "engines": {
+ "node": ">= 12.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "@rspack/core": "0.x || 1.x",
+ "webpack": "^5.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@rspack/core": {
+ "optional": true
+ },
+ "webpack": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/css-loader/node_modules/semver": {
+ "version": "7.6.3",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
+ "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/css-select": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz",
+ "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==",
+ "dev": true,
+ "dependencies": {
+ "boolbase": "^1.0.0",
+ "css-what": "^6.1.0",
+ "domhandler": "^5.0.2",
+ "domutils": "^3.0.1",
+ "nth-check": "^2.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
+ }
+ },
+ "node_modules/css-tree": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.0.1.tgz",
+ "integrity": "sha512-8Fxxv+tGhORlshCdCwnNJytvlvq46sOLSYEx2ZIGurahWvMucSRnyjPA3AmrMq4VPRYbHVpWj5VkiVasrM2H4Q==",
+ "dev": true,
+ "dependencies": {
+ "mdn-data": "2.12.1",
+ "source-map-js": "^1.0.1"
+ },
+ "engines": {
+ "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0"
+ }
+ },
+ "node_modules/css-what": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz",
+ "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/fb55"
+ }
+ },
+ "node_modules/cssesc": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
+ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
+ "dev": true,
+ "bin": {
+ "cssesc": "bin/cssesc"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/cssjanus": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/cssjanus/-/cssjanus-2.3.0.tgz",
+ "integrity": "sha512-ZZXXn51SnxRxAZ6fdY7mBDPmA4OZd83q/J9Gdqz3YmE9TUq+9tZl+tdOnCi7PpNygI6PEkehj9rgifv5+W8a5A==",
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/cssnano": {
+ "version": "6.1.2",
+ "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-6.1.2.tgz",
+ "integrity": "sha512-rYk5UeX7VAM/u0lNqewCdasdtPK81CgX8wJFLEIXHbV2oldWRgJAsZrdhRXkV1NJzA2g850KiFm9mMU2HxNxMA==",
+ "dev": true,
+ "dependencies": {
+ "cssnano-preset-default": "^6.1.2",
+ "lilconfig": "^3.1.1"
+ },
+ "engines": {
+ "node": "^14 || ^16 || >=18.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/cssnano"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.31"
+ }
+ },
+ "node_modules/cssnano-preset-default": {
+ "version": "6.1.2",
+ "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-6.1.2.tgz",
+ "integrity": "sha512-1C0C+eNaeN8OcHQa193aRgYexyJtU8XwbdieEjClw+J9d94E41LwT6ivKH0WT+fYwYWB0Zp3I3IZ7tI/BbUbrg==",
+ "dev": true,
+ "dependencies": {
+ "browserslist": "^4.23.0",
+ "css-declaration-sorter": "^7.2.0",
+ "cssnano-utils": "^4.0.2",
+ "postcss-calc": "^9.0.1",
+ "postcss-colormin": "^6.1.0",
+ "postcss-convert-values": "^6.1.0",
+ "postcss-discard-comments": "^6.0.2",
+ "postcss-discard-duplicates": "^6.0.3",
+ "postcss-discard-empty": "^6.0.3",
+ "postcss-discard-overridden": "^6.0.2",
+ "postcss-merge-longhand": "^6.0.5",
+ "postcss-merge-rules": "^6.1.1",
+ "postcss-minify-font-values": "^6.1.0",
+ "postcss-minify-gradients": "^6.0.3",
+ "postcss-minify-params": "^6.1.0",
+ "postcss-minify-selectors": "^6.0.4",
+ "postcss-normalize-charset": "^6.0.2",
+ "postcss-normalize-display-values": "^6.0.2",
+ "postcss-normalize-positions": "^6.0.2",
+ "postcss-normalize-repeat-style": "^6.0.2",
+ "postcss-normalize-string": "^6.0.2",
+ "postcss-normalize-timing-functions": "^6.0.2",
+ "postcss-normalize-unicode": "^6.1.0",
+ "postcss-normalize-url": "^6.0.2",
+ "postcss-normalize-whitespace": "^6.0.2",
+ "postcss-ordered-values": "^6.0.2",
+ "postcss-reduce-initial": "^6.1.0",
+ "postcss-reduce-transforms": "^6.0.2",
+ "postcss-svgo": "^6.0.3",
+ "postcss-unique-selectors": "^6.0.4"
+ },
+ "engines": {
+ "node": "^14 || ^16 || >=18.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.31"
+ }
+ },
+ "node_modules/cssnano-utils": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-4.0.2.tgz",
+ "integrity": "sha512-ZR1jHg+wZ8o4c3zqf1SIUSTIvm/9mU343FMR6Obe/unskbvpGhZOo1J6d/r8D1pzkRQYuwbcH3hToOuoA2G7oQ==",
+ "dev": true,
+ "engines": {
+ "node": "^14 || ^16 || >=18.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.31"
+ }
+ },
+ "node_modules/csso": {
+ "version": "5.0.5",
+ "resolved": "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz",
+ "integrity": "sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==",
+ "dev": true,
+ "dependencies": {
+ "css-tree": "~2.2.0"
+ },
+ "engines": {
+ "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0",
+ "npm": ">=7.0.0"
+ }
+ },
+ "node_modules/csso/node_modules/css-tree": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz",
+ "integrity": "sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==",
+ "dev": true,
+ "dependencies": {
+ "mdn-data": "2.0.28",
+ "source-map-js": "^1.0.1"
+ },
+ "engines": {
+ "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0",
+ "npm": ">=7.0.0"
+ }
+ },
+ "node_modules/csso/node_modules/mdn-data": {
+ "version": "2.0.28",
+ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz",
+ "integrity": "sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==",
+ "dev": true
+ },
+ "node_modules/cssom": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz",
+ "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==",
+ "dev": true
+ },
+ "node_modules/cssstyle": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz",
+ "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==",
+ "dev": true,
+ "dependencies": {
+ "cssom": "~0.3.6"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/cssstyle/node_modules/cssom": {
+ "version": "0.3.8",
+ "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz",
+ "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==",
+ "dev": true
+ },
+ "node_modules/csstype": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz",
+ "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="
+ },
+ "node_modules/cwd": {
+ "version": "0.10.0",
+ "resolved": "https://registry.npmjs.org/cwd/-/cwd-0.10.0.tgz",
+ "integrity": "sha512-YGZxdTTL9lmLkCUTpg4j0zQ7IhRB5ZmqNBbGCl3Tg6MP/d5/6sY7L5mmTjzbc6JKgVZYiqTQTNhPFsbXNGlRaA==",
+ "dev": true,
+ "dependencies": {
+ "find-pkg": "^0.1.2",
+ "fs-exists-sync": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=0.8"
+ }
+ },
+ "node_modules/damerau-levenshtein": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz",
+ "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==",
+ "dev": true
+ },
+ "node_modules/data-uri-to-buffer": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz",
+ "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/data-urls": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz",
+ "integrity": "sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ==",
+ "dev": true,
+ "dependencies": {
+ "abab": "^2.0.6",
+ "whatwg-mimetype": "^3.0.0",
+ "whatwg-url": "^11.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/data-view-buffer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz",
+ "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==",
+ "dev": true,
+ "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",
+ "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz",
+ "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==",
+ "dev": true,
+ "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",
+ "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz",
+ "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==",
+ "dev": true,
+ "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/date-fns": {
+ "version": "2.30.0",
+ "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz",
+ "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==",
+ "optional": true,
+ "peer": true,
+ "dependencies": {
+ "@babel/runtime": "^7.21.0"
+ },
+ "engines": {
+ "node": ">=0.11"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/date-fns"
+ }
+ },
+ "node_modules/dayjs": {
+ "version": "1.11.10",
+ "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.10.tgz",
+ "integrity": "sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ=="
+ },
+ "node_modules/debounce": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz",
+ "integrity": "sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==",
+ "dev": true
+ },
+ "node_modules/debug": {
+ "version": "4.3.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz",
+ "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/decamelize": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
+ "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/decamelize-keys": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz",
+ "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==",
+ "dev": true,
+ "dependencies": {
+ "decamelize": "^1.1.0",
+ "map-obj": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/decamelize-keys/node_modules/map-obj": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz",
+ "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/decimal.js": {
+ "version": "10.4.3",
+ "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz",
+ "integrity": "sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==",
+ "dev": true
+ },
+ "node_modules/decompress-response": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz",
+ "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==",
+ "dev": true,
+ "dependencies": {
+ "mimic-response": "^3.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/decompress-response/node_modules/mimic-response": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz",
+ "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/dedent": {
+ "version": "1.5.3",
+ "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.5.3.tgz",
+ "integrity": "sha512-NHQtfOOW68WD8lgypbLA5oT+Bt0xXJhiYvoR6SmmNXZfpzOGXwdKWmcwG8N7PwVVWV3eF/68nmD9BaJSsTBhyQ==",
+ "dev": true,
+ "peerDependencies": {
+ "babel-plugin-macros": "^3.1.0"
+ },
+ "peerDependenciesMeta": {
+ "babel-plugin-macros": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/deep-extend": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz",
+ "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/deep-is": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz",
+ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==",
+ "dev": true
+ },
+ "node_modules/deepmerge": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz",
+ "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/default-gateway": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz",
+ "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==",
+ "dev": true,
+ "dependencies": {
+ "execa": "^5.0.0"
+ },
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/defaults": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz",
+ "integrity": "sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==",
+ "dev": true,
+ "dependencies": {
+ "clone": "^1.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/defer-to-connect": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz",
+ "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/define-data-property": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz",
+ "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==",
+ "dev": true,
+ "dependencies": {
+ "es-define-property": "^1.0.0",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/define-lazy-prop": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz",
+ "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/define-properties": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz",
+ "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==",
+ "dev": true,
+ "dependencies": {
+ "define-data-property": "^1.0.1",
+ "has-property-descriptors": "^1.0.0",
+ "object-keys": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/degenerator": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz",
+ "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==",
+ "dev": true,
+ "dependencies": {
+ "ast-types": "^0.13.4",
+ "escodegen": "^2.1.0",
+ "esprima": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/del": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz",
+ "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==",
+ "dev": true,
+ "dependencies": {
+ "@types/glob": "^7.1.1",
+ "globby": "^6.1.0",
+ "is-path-cwd": "^2.0.0",
+ "is-path-in-cwd": "^2.0.0",
+ "p-map": "^2.0.0",
+ "pify": "^4.0.1",
+ "rimraf": "^2.6.3"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/del/node_modules/array-union": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz",
+ "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==",
+ "dev": true,
+ "dependencies": {
+ "array-uniq": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/del/node_modules/globby": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz",
+ "integrity": "sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==",
+ "dev": true,
+ "dependencies": {
+ "array-union": "^1.0.1",
+ "glob": "^7.0.3",
+ "object-assign": "^4.0.1",
+ "pify": "^2.0.0",
+ "pinkie-promise": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/del/node_modules/globby/node_modules/pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/del/node_modules/rimraf": {
+ "version": "2.7.1",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz",
+ "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==",
+ "deprecated": "Rimraf versions prior to v4 are no longer supported",
+ "dev": true,
+ "dependencies": {
+ "glob": "^7.1.3"
+ },
+ "bin": {
+ "rimraf": "bin.js"
+ }
+ },
+ "node_modules/delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/delegate": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz",
+ "integrity": "sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw=="
+ },
+ "node_modules/depd": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
+ "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/destroy": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
+ "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8",
+ "npm": "1.2.8000 || >= 1.4.16"
+ }
+ },
+ "node_modules/detect-libc": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz",
+ "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==",
+ "dev": true,
+ "optional": true,
+ "bin": {
+ "detect-libc": "bin/detect-libc.js"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/detect-newline": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz",
+ "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/detect-node": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz",
+ "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==",
+ "dev": true
+ },
+ "node_modules/detect-node-es": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/detect-node-es/-/detect-node-es-1.1.0.tgz",
+ "integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ=="
+ },
+ "node_modules/devtools-protocol": {
+ "version": "0.0.1155343",
+ "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1155343.tgz",
+ "integrity": "sha512-oD9vGBV2wTc7fAzAM6KC0chSgs234V8+qDEeK+mcbRj2UvcuA7lgBztGi/opj/iahcXD3BSj8Ymvib628yy9FA==",
+ "dev": true
+ },
+ "node_modules/diff": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
+ "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
+ "engines": {
+ "node": ">=0.3.1"
+ }
+ },
+ "node_modules/diff-sequences": {
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz",
+ "integrity": "sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==",
+ "dev": true,
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/dir-glob": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
+ "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
+ "dev": true,
+ "dependencies": {
+ "path-type": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/dns-packet": {
+ "version": "5.6.1",
+ "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz",
+ "integrity": "sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==",
+ "dev": true,
+ "dependencies": {
+ "@leichtgewicht/ip-codec": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/docker-compose": {
+ "version": "0.24.8",
+ "resolved": "https://registry.npmjs.org/docker-compose/-/docker-compose-0.24.8.tgz",
+ "integrity": "sha512-plizRs/Vf15H+GCVxq2EUvyPK7ei9b/cVesHvjnX4xaXjM9spHe2Ytq0BitndFgvTJ3E3NljPNUEl7BAN43iZw==",
+ "dev": true,
+ "dependencies": {
+ "yaml": "^2.2.2"
+ },
+ "engines": {
+ "node": ">= 6.0.0"
+ }
+ },
+ "node_modules/docker-compose/node_modules/yaml": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.6.0.tgz",
+ "integrity": "sha512-a6ae//JvKDEra2kdi1qzCyrJW/WZCgFi8ydDV+eXExl95t+5R+ijnqHJbz9tmMh8FUjx3iv2fCQ4dclAQlO2UQ==",
+ "dev": true,
+ "bin": {
+ "yaml": "bin.mjs"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/doctrine": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
+ "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
+ "dev": true,
+ "dependencies": {
+ "esutils": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/dom-helpers": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz",
+ "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==",
+ "dependencies": {
+ "@babel/runtime": "^7.8.7",
+ "csstype": "^3.0.2"
+ }
+ },
+ "node_modules/dom-serializer": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz",
+ "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==",
+ "dev": true,
+ "dependencies": {
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.2",
+ "entities": "^4.2.0"
+ },
+ "funding": {
+ "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1"
+ }
+ },
+ "node_modules/domelementtype": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
+ "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fb55"
+ }
+ ]
+ },
+ "node_modules/domexception": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz",
+ "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==",
+ "deprecated": "Use your platform's native DOMException instead",
+ "dev": true,
+ "dependencies": {
+ "webidl-conversions": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/domhandler": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz",
+ "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==",
+ "dev": true,
+ "dependencies": {
+ "domelementtype": "^2.3.0"
+ },
+ "engines": {
+ "node": ">= 4"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domhandler?sponsor=1"
+ }
+ },
+ "node_modules/domutils": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz",
+ "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==",
+ "dev": true,
+ "dependencies": {
+ "dom-serializer": "^2.0.0",
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.3"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/domutils?sponsor=1"
+ }
+ },
+ "node_modules/dot-case": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz",
+ "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==",
+ "dependencies": {
+ "no-case": "^3.0.4",
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/dot-prop": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz",
+ "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==",
+ "dev": true,
+ "dependencies": {
+ "is-obj": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/duplexer": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz",
+ "integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==",
+ "dev": true
+ },
+ "node_modules/ee-first": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
+ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
+ "dev": true
+ },
+ "node_modules/electron-to-chromium": {
+ "version": "1.5.57",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.57.tgz",
+ "integrity": "sha512-xS65H/tqgOwUBa5UmOuNSLuslDo7zho0y/lgQw35pnrqiZh7UOWHCeL/Bt6noJATbA6tpQJGCifsFsIRZj1Fqg==",
+ "dev": true
+ },
+ "node_modules/emittery": {
+ "version": "0.13.1",
+ "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz",
+ "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/emittery?sponsor=1"
+ }
+ },
+ "node_modules/emoji-regex": {
+ "version": "9.2.2",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
+ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
+ "dev": true
+ },
+ "node_modules/emojis-list": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
+ "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==",
+ "dev": true,
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/encodeurl": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
+ "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/encoding": {
+ "version": "0.1.13",
+ "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz",
+ "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==",
+ "dependencies": {
+ "iconv-lite": "^0.6.2"
+ }
+ },
+ "node_modules/end-of-stream": {
+ "version": "1.4.4",
+ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
+ "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
+ "dev": true,
+ "dependencies": {
+ "once": "^1.4.0"
+ }
+ },
+ "node_modules/enhanced-resolve": {
+ "version": "5.17.1",
+ "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz",
+ "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==",
+ "dev": true,
+ "dependencies": {
+ "graceful-fs": "^4.2.4",
+ "tapable": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/enquirer": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz",
+ "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-colors": "^4.1.1",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/entities": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
+ "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/env-paths": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz",
+ "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/envinfo": {
+ "version": "7.14.0",
+ "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.14.0.tgz",
+ "integrity": "sha512-CO40UI41xDQzhLB1hWyqUKgFhs250pNcGbyGKe1l/e4FSaI/+YE4IMG76GDt0In67WLPACIITC+sOi08x4wIvg==",
+ "dev": true,
+ "bin": {
+ "envinfo": "dist/cli.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/equivalent-key-map": {
+ "version": "0.2.2",
+ "resolved": "https://registry.npmjs.org/equivalent-key-map/-/equivalent-key-map-0.2.2.tgz",
+ "integrity": "sha512-xvHeyCDbZzkpN4VHQj/n+j2lOwL0VWszG30X4cOrc9Y7Tuo2qCdZK/0AMod23Z5dCtNUbaju6p0rwOhHUk05ew=="
+ },
+ "node_modules/err-code": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/err-code/-/err-code-3.0.1.tgz",
+ "integrity": "sha512-GiaH0KJUewYok+eeY05IIgjtAe4Yltygk9Wqp1V5yVWLdhf0hYZchRjNIT9bb0mSwRcIusT3cx7PJUf3zEIfUA=="
+ },
+ "node_modules/error-ex": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
+ "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
+ "dependencies": {
+ "is-arrayish": "^0.2.1"
+ }
+ },
+ "node_modules/error-stack-parser": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.1.4.tgz",
+ "integrity": "sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==",
+ "dev": true,
+ "dependencies": {
+ "stackframe": "^1.3.4"
+ }
+ },
+ "node_modules/es-abstract": {
+ "version": "1.23.4",
+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.4.tgz",
+ "integrity": "sha512-HR1gxH5OaiN7XH7uiWH0RLw0RcFySiSoW1ctxmD1ahTw3uGBtkmm/ng0tDU1OtYx5OK6EOL5Y6O21cDflG3Jcg==",
+ "dev": true,
+ "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.4",
+ "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.3",
+ "object-keys": "^1.1.1",
+ "object.assign": "^4.1.5",
+ "regexp.prototype.flags": "^1.5.3",
+ "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",
+ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz",
+ "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==",
+ "dev": true,
+ "dependencies": {
+ "get-intrinsic": "^1.2.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-errors": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-iterator-helpers": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.2.0.tgz",
+ "integrity": "sha512-tpxqxncxnpw3c93u8n3VOzACmRFoVmWJqbWXvX/JfKbkhBw1oslgPrUfeSt2psuqyEJFD6N/9lg5i7bsKpoq+Q==",
+ "dev": true,
+ "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.4",
+ "gopd": "^1.0.1",
+ "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.3",
+ "safe-array-concat": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-module-lexer": {
+ "version": "1.5.4",
+ "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz",
+ "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==",
+ "dev": true
+ },
+ "node_modules/es-object-atoms": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz",
+ "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==",
+ "dev": true,
+ "dependencies": {
+ "es-errors": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-set-tostringtag": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz",
+ "integrity": "sha512-3T8uNMC3OQTHkFUsFq8r/BwAXLHvU/9O9mE0fBc/MY5iq/8H7ncvO947LmYA6ldWw9Uh8Yhf25zu6n7nML5QWQ==",
+ "dev": true,
+ "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",
+ "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz",
+ "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==",
+ "dev": true,
+ "dependencies": {
+ "hasown": "^2.0.0"
+ }
+ },
+ "node_modules/es-to-primitive": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
+ "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
+ "dev": true,
+ "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/escalade": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz",
+ "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/escape-html": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
+ "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
+ "dev": true
+ },
+ "node_modules/escape-string-regexp": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz",
+ "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/escodegen": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz",
+ "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==",
+ "dev": true,
+ "dependencies": {
+ "esprima": "^4.0.1",
+ "estraverse": "^5.2.0",
+ "esutils": "^2.0.2"
+ },
+ "bin": {
+ "escodegen": "bin/escodegen.js",
+ "esgenerate": "bin/esgenerate.js"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "optionalDependencies": {
+ "source-map": "~0.6.1"
+ }
+ },
+ "node_modules/escodegen/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "optional": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/eslint": {
+ "version": "8.57.1",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz",
+ "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==",
+ "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.",
+ "dev": true,
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.2.0",
+ "@eslint-community/regexpp": "^4.6.1",
+ "@eslint/eslintrc": "^2.1.4",
+ "@eslint/js": "8.57.1",
+ "@humanwhocodes/config-array": "^0.13.0",
+ "@humanwhocodes/module-importer": "^1.0.1",
+ "@nodelib/fs.walk": "^1.2.8",
+ "@ungap/structured-clone": "^1.2.0",
+ "ajv": "^6.12.4",
+ "chalk": "^4.0.0",
+ "cross-spawn": "^7.0.2",
+ "debug": "^4.3.2",
+ "doctrine": "^3.0.0",
+ "escape-string-regexp": "^4.0.0",
+ "eslint-scope": "^7.2.2",
+ "eslint-visitor-keys": "^3.4.3",
+ "espree": "^9.6.1",
+ "esquery": "^1.4.2",
+ "esutils": "^2.0.2",
+ "fast-deep-equal": "^3.1.3",
+ "file-entry-cache": "^6.0.1",
+ "find-up": "^5.0.0",
+ "glob-parent": "^6.0.2",
+ "globals": "^13.19.0",
+ "graphemer": "^1.4.0",
+ "ignore": "^5.2.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "is-path-inside": "^3.0.3",
+ "js-yaml": "^4.1.0",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "levn": "^0.4.1",
+ "lodash.merge": "^4.6.2",
+ "minimatch": "^3.1.2",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.3",
+ "strip-ansi": "^6.0.1",
+ "text-table": "^0.2.0"
+ },
+ "bin": {
+ "eslint": "bin/eslint.js"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-config-prettier": {
+ "version": "8.10.0",
+ "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz",
+ "integrity": "sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==",
+ "dev": true,
+ "bin": {
+ "eslint-config-prettier": "bin/cli.js"
+ },
+ "peerDependencies": {
+ "eslint": ">=7.0.0"
+ }
+ },
+ "node_modules/eslint-import-resolver-node": {
+ "version": "0.3.9",
+ "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz",
+ "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==",
+ "dev": true,
+ "dependencies": {
+ "debug": "^3.2.7",
+ "is-core-module": "^2.13.0",
+ "resolve": "^1.22.4"
+ }
+ },
+ "node_modules/eslint-import-resolver-node/node_modules/debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "dev": true,
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/eslint-module-utils": {
+ "version": "2.12.0",
+ "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz",
+ "integrity": "sha512-wALZ0HFoytlyh/1+4wuZ9FJCD/leWHQzzrxJ8+rebyReSLk7LApMyd3WJaLVoN+D5+WIdJyDK1c6JnE65V4Zyg==",
+ "dev": true,
+ "dependencies": {
+ "debug": "^3.2.7"
+ },
+ "engines": {
+ "node": ">=4"
+ },
+ "peerDependenciesMeta": {
+ "eslint": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-module-utils/node_modules/debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "dev": true,
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/eslint-plugin-babel": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-babel/-/eslint-plugin-babel-5.3.1.tgz",
+ "integrity": "sha512-VsQEr6NH3dj664+EyxJwO4FCYm/00JhYb3Sk3ft8o+fpKuIfQ9TaW6uVUfvwMXHcf/lsnRIoyFPsLMyiWCSL/g==",
+ "dev": true,
+ "dependencies": {
+ "eslint-rule-composer": "^0.3.0"
+ },
+ "engines": {
+ "node": ">=4"
+ },
+ "peerDependencies": {
+ "eslint": ">=4.0.0"
+ }
+ },
+ "node_modules/eslint-plugin-import": {
+ "version": "2.31.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz",
+ "integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==",
+ "dev": true,
+ "dependencies": {
+ "@rtsao/scc": "^1.1.0",
+ "array-includes": "^3.1.8",
+ "array.prototype.findlastindex": "^1.2.5",
+ "array.prototype.flat": "^1.3.2",
+ "array.prototype.flatmap": "^1.3.2",
+ "debug": "^3.2.7",
+ "doctrine": "^2.1.0",
+ "eslint-import-resolver-node": "^0.3.9",
+ "eslint-module-utils": "^2.12.0",
+ "hasown": "^2.0.2",
+ "is-core-module": "^2.15.1",
+ "is-glob": "^4.0.3",
+ "minimatch": "^3.1.2",
+ "object.fromentries": "^2.0.8",
+ "object.groupby": "^1.0.3",
+ "object.values": "^1.2.0",
+ "semver": "^6.3.1",
+ "string.prototype.trimend": "^1.0.8",
+ "tsconfig-paths": "^3.15.0"
+ },
+ "engines": {
+ "node": ">=4"
+ },
+ "peerDependencies": {
+ "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9"
+ }
+ },
+ "node_modules/eslint-plugin-import/node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/eslint-plugin-import/node_modules/debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "dev": true,
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/eslint-plugin-import/node_modules/doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "dev": true,
+ "dependencies": {
+ "esutils": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/eslint-plugin-import/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/eslint-plugin-jest": {
+ "version": "27.9.0",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.9.0.tgz",
+ "integrity": "sha512-QIT7FH7fNmd9n4se7FFKHbsLKGQiw885Ds6Y/sxKgCZ6natwCsXdgPOADnYVxN2QrRweF0FZWbJ6S7Rsn7llug==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/utils": "^5.10.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ },
+ "peerDependencies": {
+ "@typescript-eslint/eslint-plugin": "^5.0.0 || ^6.0.0 || ^7.0.0",
+ "eslint": "^7.0.0 || ^8.0.0",
+ "jest": "*"
+ },
+ "peerDependenciesMeta": {
+ "@typescript-eslint/eslint-plugin": {
+ "optional": true
+ },
+ "jest": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/scope-manager": {
+ "version": "5.62.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz",
+ "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "5.62.0",
+ "@typescript-eslint/visitor-keys": "5.62.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/types": {
+ "version": "5.62.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz",
+ "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==",
+ "dev": true,
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/typescript-estree": {
+ "version": "5.62.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.62.0.tgz",
+ "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "5.62.0",
+ "@typescript-eslint/visitor-keys": "5.62.0",
+ "debug": "^4.3.4",
+ "globby": "^11.1.0",
+ "is-glob": "^4.0.3",
+ "semver": "^7.3.7",
+ "tsutils": "^3.21.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/utils": {
+ "version": "5.62.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz",
+ "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==",
+ "dev": true,
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.2.0",
+ "@types/json-schema": "^7.0.9",
+ "@types/semver": "^7.3.12",
+ "@typescript-eslint/scope-manager": "5.62.0",
+ "@typescript-eslint/types": "5.62.0",
+ "@typescript-eslint/typescript-estree": "5.62.0",
+ "eslint-scope": "^5.1.1",
+ "semver": "^7.3.7"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ },
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/eslint-plugin-jest/node_modules/@typescript-eslint/visitor-keys": {
+ "version": "5.62.0",
+ "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz",
+ "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==",
+ "dev": true,
+ "dependencies": {
+ "@typescript-eslint/types": "5.62.0",
+ "eslint-visitor-keys": "^3.3.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/typescript-eslint"
+ }
+ },
+ "node_modules/eslint-plugin-jest/node_modules/eslint-visitor-keys": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
+ "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
+ "dev": true,
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-plugin-jest/node_modules/semver": {
+ "version": "7.6.3",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
+ "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/eslint-plugin-jsdoc": {
+ "version": "46.10.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-46.10.1.tgz",
+ "integrity": "sha512-x8wxIpv00Y50NyweDUpa+58ffgSAI5sqe+zcZh33xphD0AVh+1kqr1ombaTRb7Fhpove1zfUuujlX9DWWBP5ag==",
+ "dev": true,
+ "dependencies": {
+ "@es-joy/jsdoccomment": "~0.41.0",
+ "are-docs-informative": "^0.0.2",
+ "comment-parser": "1.4.1",
+ "debug": "^4.3.4",
+ "escape-string-regexp": "^4.0.0",
+ "esquery": "^1.5.0",
+ "is-builtin-module": "^3.2.1",
+ "semver": "^7.5.4",
+ "spdx-expression-parse": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=16"
+ },
+ "peerDependencies": {
+ "eslint": "^7.0.0 || ^8.0.0 || ^9.0.0"
+ }
+ },
+ "node_modules/eslint-plugin-jsdoc/node_modules/semver": {
+ "version": "7.6.3",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
+ "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/eslint-plugin-jsx-a11y": {
+ "version": "6.10.2",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.10.2.tgz",
+ "integrity": "sha512-scB3nz4WmG75pV8+3eRUQOHZlNSUhFNq37xnpgRkCCELU3XMvXAxLk1eqWWyE22Ki4Q01Fnsw9BA3cJHDPgn2Q==",
+ "dev": true,
+ "dependencies": {
+ "aria-query": "^5.3.2",
+ "array-includes": "^3.1.8",
+ "array.prototype.flatmap": "^1.3.2",
+ "ast-types-flow": "^0.0.8",
+ "axe-core": "^4.10.0",
+ "axobject-query": "^4.1.0",
+ "damerau-levenshtein": "^1.0.8",
+ "emoji-regex": "^9.2.2",
+ "hasown": "^2.0.2",
+ "jsx-ast-utils": "^3.3.5",
+ "language-tags": "^1.0.9",
+ "minimatch": "^3.1.2",
+ "object.fromentries": "^2.0.8",
+ "safe-regex-test": "^1.0.3",
+ "string.prototype.includes": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=4.0"
+ },
+ "peerDependencies": {
+ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9"
+ }
+ },
+ "node_modules/eslint-plugin-jsx-a11y/node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/eslint-plugin-jsx-a11y/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/eslint-plugin-playwright": {
+ "version": "0.15.3",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-playwright/-/eslint-plugin-playwright-0.15.3.tgz",
+ "integrity": "sha512-LQMW5y0DLK5Fnpya7JR1oAYL2/7Y9wDiYw6VZqlKqcRGSgjbVKNqxraphk7ra1U3Bb5EK444xMgUlQPbMg2M1g==",
+ "dev": true,
+ "peerDependencies": {
+ "eslint": ">=7",
+ "eslint-plugin-jest": ">=25"
+ },
+ "peerDependenciesMeta": {
+ "eslint-plugin-jest": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-plugin-prettier": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-5.2.1.tgz",
+ "integrity": "sha512-gH3iR3g4JfF+yYPaJYkN7jEl9QbweL/YfkoRlNnuIEHEz1vHVlCmWOS+eGGiRuzHQXdJFCOTxRgvju9b8VUmrw==",
+ "dev": true,
+ "dependencies": {
+ "prettier-linter-helpers": "^1.0.0",
+ "synckit": "^0.9.1"
+ },
+ "engines": {
+ "node": "^14.18.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint-plugin-prettier"
+ },
+ "peerDependencies": {
+ "@types/eslint": ">=8.0.0",
+ "eslint": ">=8.0.0",
+ "eslint-config-prettier": "*",
+ "prettier": ">=3.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/eslint": {
+ "optional": true
+ },
+ "eslint-config-prettier": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-plugin-react": {
+ "version": "7.37.2",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.37.2.tgz",
+ "integrity": "sha512-EsTAnj9fLVr/GZleBLFbj/sSuXeWmp1eXIN60ceYnZveqEaUCyW4X+Vh4WTdUhCkW4xutXYqTXCUSyqD4rB75w==",
+ "dev": true,
+ "dependencies": {
+ "array-includes": "^3.1.8",
+ "array.prototype.findlast": "^1.2.5",
+ "array.prototype.flatmap": "^1.3.2",
+ "array.prototype.tosorted": "^1.1.4",
+ "doctrine": "^2.1.0",
+ "es-iterator-helpers": "^1.1.0",
+ "estraverse": "^5.3.0",
+ "hasown": "^2.0.2",
+ "jsx-ast-utils": "^2.4.1 || ^3.0.0",
+ "minimatch": "^3.1.2",
+ "object.entries": "^1.1.8",
+ "object.fromentries": "^2.0.8",
+ "object.values": "^1.2.0",
+ "prop-types": "^15.8.1",
+ "resolve": "^2.0.0-next.5",
+ "semver": "^6.3.1",
+ "string.prototype.matchall": "^4.0.11",
+ "string.prototype.repeat": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ },
+ "peerDependencies": {
+ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7"
+ }
+ },
+ "node_modules/eslint-plugin-react-hooks": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.2.tgz",
+ "integrity": "sha512-QzliNJq4GinDBcD8gPB5v0wh6g8q3SUi6EFF0x8N/BL9PoVs0atuGc47ozMRyOWAKdwaZ5OnbOEa3WR+dSGKuQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0"
+ }
+ },
+ "node_modules/eslint-plugin-react/node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/eslint-plugin-react/node_modules/doctrine": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz",
+ "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==",
+ "dev": true,
+ "dependencies": {
+ "esutils": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/eslint-plugin-react/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/eslint-plugin-react/node_modules/resolve": {
+ "version": "2.0.0-next.5",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz",
+ "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==",
+ "dev": true,
+ "dependencies": {
+ "is-core-module": "^2.13.0",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ },
+ "bin": {
+ "resolve": "bin/resolve"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/eslint-rule-composer": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz",
+ "integrity": "sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/eslint-scope": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
+ "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
+ "dev": true,
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^4.1.1"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/eslint-scope/node_modules/estraverse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
+ "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/eslint-visitor-keys": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
+ "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/eslint/node_modules/@eslint/js": {
+ "version": "8.57.1",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.1.tgz",
+ "integrity": "sha512-d9zaMRSTIKDLhctzH12MtXvJKSSUhaHcjV+2Z+GK+EEY7XKpP5yR4x+N3TAcHTcu963nIr+TMcCb4DBCYX1z6Q==",
+ "dev": true,
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ }
+ },
+ "node_modules/eslint/node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true
+ },
+ "node_modules/eslint/node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/eslint/node_modules/cross-spawn": {
+ "version": "7.0.5",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.5.tgz",
+ "integrity": "sha512-ZVJrKKYunU38/76t0RMOulHOnUcbU9GbpWKAOZ0mhjr7CX6FVrH+4FrAapSOekrgFQ3f/8gwMEuIft0aKq6Hug==",
+ "dev": true,
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/eslint/node_modules/eslint-scope": {
+ "version": "7.2.2",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz",
+ "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==",
+ "dev": true,
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint/node_modules/eslint-visitor-keys": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
+ "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
+ "dev": true,
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint/node_modules/find-up": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+ "dev": true,
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint/node_modules/globals": {
+ "version": "13.24.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz",
+ "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
+ "dev": true,
+ "dependencies": {
+ "type-fest": "^0.20.2"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint/node_modules/js-yaml": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "dev": true,
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/eslint/node_modules/locate-path": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "dev": true,
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/eslint/node_modules/p-locate": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+ "dev": true,
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint/node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/eslint/node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/eslint/node_modules/type-fest": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint/node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/espree": {
+ "version": "9.6.1",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz",
+ "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==",
+ "dev": true,
+ "dependencies": {
+ "acorn": "^8.9.0",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^3.4.1"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/espree/node_modules/eslint-visitor-keys": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz",
+ "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==",
+ "dev": true,
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/esprima": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
+ "dev": true,
+ "bin": {
+ "esparse": "bin/esparse.js",
+ "esvalidate": "bin/esvalidate.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/esquery": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz",
+ "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==",
+ "dev": true,
+ "dependencies": {
+ "estraverse": "^5.1.0"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/esrecurse": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
+ "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
+ "dev": true,
+ "dependencies": {
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/estraverse": {
+ "version": "5.3.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz",
+ "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/esutils": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/etag": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
+ "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/eventemitter3": {
+ "version": "4.0.7",
+ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
+ "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==",
+ "dev": true
+ },
+ "node_modules/events": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
+ "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.x"
+ }
+ },
+ "node_modules/execa": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz",
+ "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==",
+ "dev": true,
+ "dependencies": {
+ "cross-spawn": "^7.0.3",
+ "get-stream": "^6.0.0",
+ "human-signals": "^2.1.0",
+ "is-stream": "^2.0.0",
+ "merge-stream": "^2.0.0",
+ "npm-run-path": "^4.0.1",
+ "onetime": "^5.1.2",
+ "signal-exit": "^3.0.3",
+ "strip-final-newline": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/execa?sponsor=1"
+ }
+ },
+ "node_modules/execa/node_modules/cross-spawn": {
+ "version": "7.0.5",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.5.tgz",
+ "integrity": "sha512-ZVJrKKYunU38/76t0RMOulHOnUcbU9GbpWKAOZ0mhjr7CX6FVrH+4FrAapSOekrgFQ3f/8gwMEuIft0aKq6Hug==",
+ "dev": true,
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/execa/node_modules/get-stream": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
+ "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/execa/node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/execa/node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/execa/node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/exit": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz",
+ "integrity": "sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/expand-tilde": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-1.2.2.tgz",
+ "integrity": "sha512-rtmc+cjLZqnu9dSYosX9EWmSJhTwpACgJQTfj4hgg2JjOD/6SIQalZrt4a3aQeh++oNxkazcaxrhPUj6+g5G/Q==",
+ "dev": true,
+ "dependencies": {
+ "os-homedir": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/expect": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/expect/-/expect-29.7.0.tgz",
+ "integrity": "sha512-2Zks0hf1VLFYI1kbh0I5jP3KHHyCHpkfyHBzsSXRFgl/Bg9mWYfMW8oD+PdMPlEwy5HNsR9JutYy6pMeOh61nw==",
+ "dev": true,
+ "dependencies": {
+ "@jest/expect-utils": "^29.7.0",
+ "jest-get-type": "^29.6.3",
+ "jest-matcher-utils": "^29.7.0",
+ "jest-message-util": "^29.7.0",
+ "jest-util": "^29.7.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/expect-puppeteer": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/expect-puppeteer/-/expect-puppeteer-4.4.0.tgz",
+ "integrity": "sha512-6Ey4Xy2xvmuQu7z7YQtMsaMV0EHJRpVxIDOd5GRrm04/I3nkTKIutELfECsLp6le+b3SSa3cXhPiw6PgqzxYWA==",
+ "dev": true
+ },
+ "node_modules/express": {
+ "version": "4.21.1",
+ "resolved": "https://registry.npmjs.org/express/-/express-4.21.1.tgz",
+ "integrity": "sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==",
+ "dev": true,
+ "dependencies": {
+ "accepts": "~1.3.8",
+ "array-flatten": "1.1.1",
+ "body-parser": "1.20.3",
+ "content-disposition": "0.5.4",
+ "content-type": "~1.0.4",
+ "cookie": "0.7.1",
+ "cookie-signature": "1.0.6",
+ "debug": "2.6.9",
+ "depd": "2.0.0",
+ "encodeurl": "~2.0.0",
+ "escape-html": "~1.0.3",
+ "etag": "~1.8.1",
+ "finalhandler": "1.3.1",
+ "fresh": "0.5.2",
+ "http-errors": "2.0.0",
+ "merge-descriptors": "1.0.3",
+ "methods": "~1.1.2",
+ "on-finished": "2.4.1",
+ "parseurl": "~1.3.3",
+ "path-to-regexp": "0.1.10",
+ "proxy-addr": "~2.0.7",
+ "qs": "6.13.0",
+ "range-parser": "~1.2.1",
+ "safe-buffer": "5.2.1",
+ "send": "0.19.0",
+ "serve-static": "1.16.2",
+ "setprototypeof": "1.2.0",
+ "statuses": "2.0.1",
+ "type-is": "~1.6.18",
+ "utils-merge": "1.0.1",
+ "vary": "~1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.10.0"
+ }
+ },
+ "node_modules/express/node_modules/cookie": {
+ "version": "0.7.1",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz",
+ "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/express/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/express/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "dev": true
+ },
+ "node_modules/express/node_modules/path-to-regexp": {
+ "version": "0.1.10",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz",
+ "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==",
+ "dev": true
+ },
+ "node_modules/external-editor": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz",
+ "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==",
+ "dev": true,
+ "dependencies": {
+ "chardet": "^0.7.0",
+ "iconv-lite": "^0.4.24",
+ "tmp": "^0.0.33"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/external-editor/node_modules/iconv-lite": {
+ "version": "0.4.24",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+ "dev": true,
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/extract-zip": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz",
+ "integrity": "sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA==",
+ "dev": true,
+ "dependencies": {
+ "concat-stream": "^1.6.2",
+ "debug": "^2.6.9",
+ "mkdirp": "^0.5.4",
+ "yauzl": "^2.10.0"
+ },
+ "bin": {
+ "extract-zip": "cli.js"
+ }
+ },
+ "node_modules/extract-zip/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/extract-zip/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "dev": true
+ },
+ "node_modules/fast-deep-equal": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
+ "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="
+ },
+ "node_modules/fast-diff": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz",
+ "integrity": "sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==",
+ "dev": true
+ },
+ "node_modules/fast-fifo": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz",
+ "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==",
+ "dev": true
+ },
+ "node_modules/fast-glob": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz",
+ "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==",
+ "dev": true,
+ "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",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
+ "dev": true
+ },
+ "node_modules/fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==",
+ "dev": true
+ },
+ "node_modules/fast-uri": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.3.tgz",
+ "integrity": "sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==",
+ "dev": true
+ },
+ "node_modules/fastest-levenshtein": {
+ "version": "1.0.16",
+ "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz",
+ "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 4.9.1"
+ }
+ },
+ "node_modules/fastq": {
+ "version": "1.17.1",
+ "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz",
+ "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==",
+ "dev": true,
+ "dependencies": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "node_modules/faye-websocket": {
+ "version": "0.11.4",
+ "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz",
+ "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==",
+ "dev": true,
+ "dependencies": {
+ "websocket-driver": ">=0.5.1"
+ },
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/fb-watchman": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz",
+ "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==",
+ "dev": true,
+ "dependencies": {
+ "bser": "2.1.1"
+ }
+ },
+ "node_modules/fd-slicer": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz",
+ "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==",
+ "dev": true,
+ "dependencies": {
+ "pend": "~1.2.0"
+ }
+ },
+ "node_modules/figures": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz",
+ "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==",
+ "dev": true,
+ "dependencies": {
+ "escape-string-regexp": "^1.0.5"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/figures/node_modules/escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/file-entry-cache": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
+ "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
+ "dev": true,
+ "dependencies": {
+ "flat-cache": "^3.0.4"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
+ "node_modules/filename-reserved-regex": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/filename-reserved-regex/-/filename-reserved-regex-2.0.0.tgz",
+ "integrity": "sha512-lc1bnsSr4L4Bdif8Xb/qrtokGbq5zlsms/CYH8PP+WtCkGNF65DPiQY8vG3SakEdRn8Dlnm+gW/qWKKjS5sZzQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/filenamify": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/filenamify/-/filenamify-4.3.0.tgz",
+ "integrity": "sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg==",
+ "dev": true,
+ "dependencies": {
+ "filename-reserved-regex": "^2.0.0",
+ "strip-outer": "^1.0.1",
+ "trim-repeated": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/fill-range": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
+ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
+ "dev": true,
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/finalhandler": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz",
+ "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==",
+ "dev": true,
+ "dependencies": {
+ "debug": "2.6.9",
+ "encodeurl": "~2.0.0",
+ "escape-html": "~1.0.3",
+ "on-finished": "2.4.1",
+ "parseurl": "~1.3.3",
+ "statuses": "2.0.1",
+ "unpipe": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/finalhandler/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/finalhandler/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "dev": true
+ },
+ "node_modules/find-cache-dir": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz",
+ "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==",
+ "dev": true,
+ "dependencies": {
+ "common-path-prefix": "^3.0.0",
+ "pkg-dir": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=14.16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/find-file-up": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/find-file-up/-/find-file-up-0.1.3.tgz",
+ "integrity": "sha512-mBxmNbVyjg1LQIIpgO8hN+ybWBgDQK8qjht+EbrTCGmmPV/sc7RF1i9stPTD6bpvXZywBdrwRYxhSdJv867L6A==",
+ "dev": true,
+ "dependencies": {
+ "fs-exists-sync": "^0.1.0",
+ "resolve-dir": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/find-parent-dir": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/find-parent-dir/-/find-parent-dir-0.3.1.tgz",
+ "integrity": "sha512-o4UcykWV/XN9wm+jMEtWLPlV8RXCZnMhQI6F6OdHeSez7iiJWePw8ijOlskJZMsaQoGR/b7dH6lO02HhaTN7+A==",
+ "dev": true
+ },
+ "node_modules/find-pkg": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/find-pkg/-/find-pkg-0.1.2.tgz",
+ "integrity": "sha512-0rnQWcFwZr7eO0513HahrWafsc3CTFioEB7DRiEYCUM/70QXSY8f3mCST17HXLcPvEhzH/Ty/Bxd72ZZsr/yvw==",
+ "dev": true,
+ "dependencies": {
+ "find-file-up": "^0.1.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/find-process": {
+ "version": "1.4.7",
+ "resolved": "https://registry.npmjs.org/find-process/-/find-process-1.4.7.tgz",
+ "integrity": "sha512-/U4CYp1214Xrp3u3Fqr9yNynUrr5Le4y0SsJh2lMDDSbpwYSz3M2SMWQC+wqcx79cN8PQtHQIL8KnuY9M66fdg==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^4.0.0",
+ "commander": "^5.1.0",
+ "debug": "^4.1.1"
+ },
+ "bin": {
+ "find-process": "bin/find-process.js"
+ }
+ },
+ "node_modules/find-root": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz",
+ "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng=="
+ },
+ "node_modules/find-up": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "dev": true,
+ "dependencies": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/flat": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz",
+ "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==",
+ "dev": true,
+ "bin": {
+ "flat": "cli.js"
+ }
+ },
+ "node_modules/flat-cache": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz",
+ "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==",
+ "dev": true,
+ "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",
+ "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz",
+ "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==",
+ "dev": true
+ },
+ "node_modules/follow-redirects": {
+ "version": "1.15.9",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz",
+ "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/RubenVerborgh"
+ }
+ ],
+ "engines": {
+ "node": ">=4.0"
+ },
+ "peerDependenciesMeta": {
+ "debug": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/for-each": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz",
+ "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==",
+ "dev": true,
+ "dependencies": {
+ "is-callable": "^1.1.3"
+ }
+ },
+ "node_modules/for-in": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
+ "integrity": "sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/for-own": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz",
+ "integrity": "sha512-SKmowqGTJoPzLO1T0BBJpkfp3EMacCMOuH40hOUbrbzElVktk4DioXVM99QkLCyKoiuOmyjgcWMpVz2xjE7LZw==",
+ "dev": true,
+ "dependencies": {
+ "for-in": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/form-data": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz",
+ "integrity": "sha512-tzN8e4TX8+kkxGPK8D5u0FNmjPUjw3lwC9lSLxxoB/+GtsJG91CO8bSWy73APlgAZzZbXEYZJuxjkHH2w+Ezhw==",
+ "dev": true,
+ "dependencies": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "mime-types": "^2.1.12"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/forwarded": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
+ "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/fraction.js": {
+ "version": "4.3.7",
+ "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz",
+ "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==",
+ "dev": true,
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "type": "patreon",
+ "url": "https://github.com/sponsors/rawify"
+ }
+ },
+ "node_modules/framer-motion": {
+ "version": "11.11.13",
+ "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-11.11.13.tgz",
+ "integrity": "sha512-aoEA83gsqRRsnh4TN7S9YNcKVLrg+GtPNnxNMd9bGn23+pLmuKGQeccPnqffEKzlkgmy2MkMo0jRkK41S2LzWw==",
+ "dependencies": {
+ "tslib": "^2.4.0"
+ },
+ "peerDependencies": {
+ "@emotion/is-prop-valid": "*",
+ "react": "^18.0.0",
+ "react-dom": "^18.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@emotion/is-prop-valid": {
+ "optional": true
+ },
+ "react": {
+ "optional": true
+ },
+ "react-dom": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/fresh": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
+ "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/fs-exists-sync": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz",
+ "integrity": "sha512-cR/vflFyPZtrN6b38ZyWxpWdhlXrzZEBawlpBQMq7033xVY7/kg0GDMBK5jg8lDYQckdJ5x/YC88lM3C7VMsLg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/fs-extra": {
+ "version": "11.2.0",
+ "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz",
+ "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==",
+ "dev": true,
+ "dependencies": {
+ "graceful-fs": "^4.2.0",
+ "jsonfile": "^6.0.1",
+ "universalify": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=14.14"
+ }
+ },
+ "node_modules/fs-monkey": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.6.tgz",
+ "integrity": "sha512-b1FMfwetIKymC0eioW7mTywihSQE4oLzQn1dB6rZB5fx/3NpNEdAWeCSMB+60/AeT0TCXsxzAlcYVEFCTAksWg==",
+ "dev": true
+ },
+ "node_modules/fs.realpath": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
+ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==",
+ "dev": true
+ },
+ "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",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/function.prototype.name": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz",
+ "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.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",
+ "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz",
+ "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/gensync": {
+ "version": "1.0.0-beta.2",
+ "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
+ "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
+ "node_modules/get-browser-rtc": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/get-browser-rtc/-/get-browser-rtc-1.1.0.tgz",
+ "integrity": "sha512-MghbMJ61EJrRsDe7w1Bvqt3ZsBuqhce5nrn/XAwgwOXhcsz53/ltdxOse1h/8eKXj5slzxdsz56g5rzOFSGwfQ=="
+ },
+ "node_modules/get-caller-file": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
+ "engines": {
+ "node": "6.* || 8.* || >= 10.*"
+ }
+ },
+ "node_modules/get-intrinsic": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz",
+ "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==",
+ "dev": true,
+ "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-nonce": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz",
+ "integrity": "sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/get-package-type": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz",
+ "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/get-port": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/get-port/-/get-port-5.1.1.tgz",
+ "integrity": "sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/get-stdin": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-9.0.0.tgz",
+ "integrity": "sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/get-stream": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz",
+ "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==",
+ "dev": true,
+ "dependencies": {
+ "pump": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/get-symbol-description": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.2.tgz",
+ "integrity": "sha512-g0QYk1dZBxGwk+Ngc+ltRH2IBp2f7zBkBMBJZCDerh6EhlhSR6+9irMCuT/09zD6qkarHUSn529sK/yL4S27mg==",
+ "dev": true,
+ "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/get-uri": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.3.tgz",
+ "integrity": "sha512-BzUrJBS9EcUb4cFol8r4W3v1cPsSyajLSthNkz5BxbpDcHN5tIrM10E2eNvfnvBn3DaT3DUgx0OpsBKkaOpanw==",
+ "dev": true,
+ "dependencies": {
+ "basic-ftp": "^5.0.2",
+ "data-uri-to-buffer": "^6.0.2",
+ "debug": "^4.3.4",
+ "fs-extra": "^11.2.0"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/gettext-parser": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/gettext-parser/-/gettext-parser-1.4.0.tgz",
+ "integrity": "sha512-sedZYLHlHeBop/gZ1jdg59hlUEcpcZJofLq2JFwJT1zTqAU3l2wFv6IsuwFHGqbiT9DWzMUW4/em2+hspnmMMA==",
+ "dependencies": {
+ "encoding": "^0.1.12",
+ "safe-buffer": "^5.1.1"
+ }
+ },
+ "node_modules/glob": {
+ "version": "7.2.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz",
+ "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==",
+ "deprecated": "Glob versions prior to v9 are no longer supported",
+ "dev": true,
+ "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",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz",
+ "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/glob-to-regexp": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
+ "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==",
+ "dev": true
+ },
+ "node_modules/glob/node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/glob/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/global-modules": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-0.2.3.tgz",
+ "integrity": "sha512-JeXuCbvYzYXcwE6acL9V2bAOeSIGl4dD+iwLY9iUx2VBJJ80R18HCn+JCwHM9Oegdfya3lEkGCdaRkSyc10hDA==",
+ "dev": true,
+ "dependencies": {
+ "global-prefix": "^0.1.4",
+ "is-windows": "^0.2.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/global-prefix": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-0.1.5.tgz",
+ "integrity": "sha512-gOPiyxcD9dJGCEArAhF4Hd0BAqvAe/JzERP7tYumE4yIkmIedPUVXcJFWbV3/p/ovIIvKjkrTk+f1UVkq7vvbw==",
+ "dev": true,
+ "dependencies": {
+ "homedir-polyfill": "^1.0.0",
+ "ini": "^1.3.4",
+ "is-windows": "^0.2.0",
+ "which": "^1.2.12"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/globals": {
+ "version": "11.12.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
+ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/globalthis": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.4.tgz",
+ "integrity": "sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==",
+ "dev": true,
+ "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",
+ "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
+ "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
+ "dev": true,
+ "dependencies": {
+ "array-union": "^2.1.0",
+ "dir-glob": "^3.0.1",
+ "fast-glob": "^3.2.9",
+ "ignore": "^5.2.0",
+ "merge2": "^1.4.1",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/globjoin": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz",
+ "integrity": "sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==",
+ "dev": true
+ },
+ "node_modules/good-listener": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz",
+ "integrity": "sha512-goW1b+d9q/HIwbVYZzZ6SsTr4IgE+WA44A0GmPIQstuOrgsFcT7VEJ48nmr9GaRtNu0XTKacFLGnBPAM6Afouw==",
+ "dependencies": {
+ "delegate": "^3.1.2"
+ }
+ },
+ "node_modules/gopd": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz",
+ "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==",
+ "dev": true,
+ "dependencies": {
+ "get-intrinsic": "^1.1.3"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/got": {
+ "version": "11.8.6",
+ "resolved": "https://registry.npmjs.org/got/-/got-11.8.6.tgz",
+ "integrity": "sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==",
+ "dev": true,
+ "dependencies": {
+ "@sindresorhus/is": "^4.0.0",
+ "@szmarczak/http-timer": "^4.0.5",
+ "@types/cacheable-request": "^6.0.1",
+ "@types/responselike": "^1.0.0",
+ "cacheable-lookup": "^5.0.3",
+ "cacheable-request": "^7.0.2",
+ "decompress-response": "^6.0.0",
+ "http2-wrapper": "^1.0.0-beta.5.2",
+ "lowercase-keys": "^2.0.0",
+ "p-cancelable": "^2.0.0",
+ "responselike": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10.19.0"
+ },
+ "funding": {
+ "url": "https://github.com/sindresorhus/got?sponsor=1"
+ }
+ },
+ "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==",
+ "dev": true
+ },
+ "node_modules/gradient-parser": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/gradient-parser/-/gradient-parser-0.1.5.tgz",
+ "integrity": "sha512-+uPlcVbjrKOnTzvz0MjTj7BfACj8OmxIa1moIjJV7btvhUMSJk0D47RfDCgDrZE3dYMz9Cf5xKJwnrKLjUq0KQ==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/graphemer": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz",
+ "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==",
+ "dev": true
+ },
+ "node_modules/gzip-size": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz",
+ "integrity": "sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q==",
+ "dev": true,
+ "dependencies": {
+ "duplexer": "^0.1.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/handle-thing": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz",
+ "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==",
+ "dev": true
+ },
+ "node_modules/hard-rejection": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz",
+ "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/has-bigints": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz",
+ "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-flag": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
+ "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/has-property-descriptors": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz",
+ "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==",
+ "dev": true,
+ "dependencies": {
+ "es-define-property": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-proto": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz",
+ "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-symbols": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
+ "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-tostringtag": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz",
+ "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==",
+ "dev": true,
+ "dependencies": {
+ "has-symbols": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/hasown": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz",
+ "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==",
+ "dependencies": {
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/header-case": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/header-case/-/header-case-2.0.4.tgz",
+ "integrity": "sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q==",
+ "dependencies": {
+ "capital-case": "^1.0.4",
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/highlight-words-core": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/highlight-words-core/-/highlight-words-core-1.2.3.tgz",
+ "integrity": "sha512-m1O9HW3/GNHxzSIXWw1wCNXXsgLlxrP0OI6+ycGUhiUHkikqW3OrwVHz+lxeNBe5yqLESdIcj8PowHQ2zLvUvQ=="
+ },
+ "node_modules/hoist-non-react-statics": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz",
+ "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==",
+ "dependencies": {
+ "react-is": "^16.7.0"
+ }
+ },
+ "node_modules/hoist-non-react-statics/node_modules/react-is": {
+ "version": "16.13.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
+ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
+ },
+ "node_modules/homedir-polyfill": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz",
+ "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==",
+ "dev": true,
+ "dependencies": {
+ "parse-passwd": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/hosted-git-info": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz",
+ "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==",
+ "dev": true,
+ "dependencies": {
+ "lru-cache": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/hosted-git-info/node_modules/lru-cache": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
+ "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
+ "dev": true,
+ "dependencies": {
+ "yallist": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/hosted-git-info/node_modules/yallist": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
+ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
+ "dev": true
+ },
+ "node_modules/hpack.js": {
+ "version": "2.1.6",
+ "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz",
+ "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==",
+ "dev": true,
+ "dependencies": {
+ "inherits": "^2.0.1",
+ "obuf": "^1.0.0",
+ "readable-stream": "^2.0.1",
+ "wbuf": "^1.1.0"
+ }
+ },
+ "node_modules/hpq": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/hpq/-/hpq-1.4.0.tgz",
+ "integrity": "sha512-ycJQMRaRPBcfnoT1gS5I1XCvbbw9KO94Y0vkwksuOjcJMqNZtb03MF2tCItLI2mQbkZWSSeFinoRDPmjzv4tKg=="
+ },
+ "node_modules/html-encoding-sniffer": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz",
+ "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==",
+ "dev": true,
+ "dependencies": {
+ "whatwg-encoding": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/html-entities": {
+ "version": "2.5.2",
+ "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.5.2.tgz",
+ "integrity": "sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/mdevils"
+ },
+ {
+ "type": "patreon",
+ "url": "https://patreon.com/mdevils"
+ }
+ ]
+ },
+ "node_modules/html-escaper": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz",
+ "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==",
+ "dev": true
+ },
+ "node_modules/html-tags": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz",
+ "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/http-cache-semantics": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz",
+ "integrity": "sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==",
+ "dev": true
+ },
+ "node_modules/http-deceiver": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz",
+ "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==",
+ "dev": true
+ },
+ "node_modules/http-errors": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz",
+ "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==",
+ "dev": true,
+ "dependencies": {
+ "depd": "2.0.0",
+ "inherits": "2.0.4",
+ "setprototypeof": "1.2.0",
+ "statuses": "2.0.1",
+ "toidentifier": "1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/http-link-header": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/http-link-header/-/http-link-header-1.1.3.tgz",
+ "integrity": "sha512-3cZ0SRL8fb9MUlU3mKM61FcQvPfXx2dBrZW3Vbg5CXa8jFlK8OaEpePenLe1oEXQduhz8b0QjsqfS59QP4AJDQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/http-parser-js": {
+ "version": "0.5.8",
+ "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz",
+ "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==",
+ "dev": true
+ },
+ "node_modules/http-proxy": {
+ "version": "1.18.1",
+ "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz",
+ "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==",
+ "dev": true,
+ "dependencies": {
+ "eventemitter3": "^4.0.0",
+ "follow-redirects": "^1.0.0",
+ "requires-port": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/http-proxy-agent": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz",
+ "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==",
+ "dev": true,
+ "dependencies": {
+ "@tootallnate/once": "2",
+ "agent-base": "6",
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/http-proxy-middleware": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.7.tgz",
+ "integrity": "sha512-fgVY8AV7qU7z/MmXJ/rxwbrtQH4jBQ9m7kp3llF0liB7glmFeVZFBepQb32T3y8n8k2+AEYuMPCpinYW+/CuRA==",
+ "dev": true,
+ "dependencies": {
+ "@types/http-proxy": "^1.17.8",
+ "http-proxy": "^1.18.1",
+ "is-glob": "^4.0.1",
+ "is-plain-obj": "^3.0.0",
+ "micromatch": "^4.0.2"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "peerDependencies": {
+ "@types/express": "^4.17.13"
+ },
+ "peerDependenciesMeta": {
+ "@types/express": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/http2-wrapper": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz",
+ "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==",
+ "dev": true,
+ "dependencies": {
+ "quick-lru": "^5.1.1",
+ "resolve-alpn": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=10.19.0"
+ }
+ },
+ "node_modules/https-proxy-agent": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz",
+ "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==",
+ "dev": true,
+ "dependencies": {
+ "agent-base": "6",
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/human-signals": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz",
+ "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
+ "dev": true,
+ "engines": {
+ "node": ">=10.17.0"
+ }
+ },
+ "node_modules/husky": {
+ "version": "9.1.6",
+ "resolved": "https://registry.npmjs.org/husky/-/husky-9.1.6.tgz",
+ "integrity": "sha512-sqbjZKK7kf44hfdE94EoX8MZNk0n7HeW37O4YrVGCF4wzgQjp+akPAkfUK5LZ6KuR/6sqeAVuXHji+RzQgOn5A==",
+ "dev": true,
+ "bin": {
+ "husky": "bin.js"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/typicode"
+ }
+ },
+ "node_modules/iconv-lite": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
+ "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/icss-utils": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz",
+ "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==",
+ "dev": true,
+ "engines": {
+ "node": "^10 || ^12 || >= 14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/ieee754": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
+ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/ignore": {
+ "version": "5.3.2",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz",
+ "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==",
+ "dev": true,
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/ignore-walk": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-4.0.1.tgz",
+ "integrity": "sha512-rzDQLaW4jQbh2YrOFlJdCtX8qgJTehFRYiUB2r1osqTeDzV/3+Jh8fz1oAPzUThf3iku8Ds4IDqawI5d8mUiQw==",
+ "dev": true,
+ "dependencies": {
+ "minimatch": "^3.0.4"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/ignore-walk/node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/ignore-walk/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/image-ssim": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/image-ssim/-/image-ssim-0.2.0.tgz",
+ "integrity": "sha512-W7+sO6/yhxy83L0G7xR8YAc5Z5QFtYEXXRV6EaE8tuYBZJnA3gVgp3q7X7muhLZVodeb9UfvjSbwt9VJwjIYAg==",
+ "dev": true
+ },
+ "node_modules/immutable": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.0.2.tgz",
+ "integrity": "sha512-1NU7hWZDkV7hJ4PJ9dur9gTNQ4ePNPN4k9/0YhwjzykTi/+3Q5pF93YU5QoVj8BuOnhLgaY8gs0U2pj4kSYVcw==",
+ "dev": true
+ },
+ "node_modules/import-fresh": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
+ "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
+ "dependencies": {
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/import-fresh/node_modules/resolve-from": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
+ "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/import-local": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz",
+ "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==",
+ "dev": true,
+ "dependencies": {
+ "pkg-dir": "^4.2.0",
+ "resolve-cwd": "^3.0.0"
+ },
+ "bin": {
+ "import-local-fixture": "fixtures/cli.js"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/import-local/node_modules/pkg-dir": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
+ "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
+ "dev": true,
+ "dependencies": {
+ "find-up": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/import-locals": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/import-locals/-/import-locals-2.0.0.tgz",
+ "integrity": "sha512-1/bPE89IZhyf7dr5Pkz7b4UyVXy5pEt7PTEfye15UEn3AK8+2zwcDCfKk9Pwun4ltfhOSszOrReSsFcDKw/yoA=="
+ },
+ "node_modules/imurmurhash": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
+ "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.19"
+ }
+ },
+ "node_modules/indent-string": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
+ "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/inflight": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
+ "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==",
+ "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.",
+ "dev": true,
+ "dependencies": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
+ },
+ "node_modules/ini": {
+ "version": "1.3.8",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
+ "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
+ "dev": true
+ },
+ "node_modules/inquirer": {
+ "version": "7.3.3",
+ "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz",
+ "integrity": "sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==",
+ "dev": true,
+ "dependencies": {
+ "ansi-escapes": "^4.2.1",
+ "chalk": "^4.1.0",
+ "cli-cursor": "^3.1.0",
+ "cli-width": "^3.0.0",
+ "external-editor": "^3.0.3",
+ "figures": "^3.0.0",
+ "lodash": "^4.17.19",
+ "mute-stream": "0.0.8",
+ "run-async": "^2.4.0",
+ "rxjs": "^6.6.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0",
+ "through": "^2.3.6"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
+ "node_modules/internal-slot": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz",
+ "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==",
+ "dev": true,
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "hasown": "^2.0.0",
+ "side-channel": "^1.0.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/interpret": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz",
+ "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/intl-messageformat": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-4.4.0.tgz",
+ "integrity": "sha512-z+Bj2rS3LZSYU4+sNitdHrwnBhr0wO80ZJSW8EzKDBowwUe3Q/UsvgCGjrwa+HPzoGCLEb9HAjfJgo4j2Sac8w==",
+ "dev": true,
+ "dependencies": {
+ "intl-messageformat-parser": "^1.8.1"
+ }
+ },
+ "node_modules/intl-messageformat-parser": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/intl-messageformat-parser/-/intl-messageformat-parser-1.8.1.tgz",
+ "integrity": "sha512-IMSCKVf0USrM/959vj3xac7s8f87sc+80Y/ipBzdKy4ifBv5Gsj2tZ41EAaURVg01QU71fYr77uA8Meh6kELbg==",
+ "deprecated": "We've written a new parser that's 6x faster and is backwards compatible. Please use @formatjs/icu-messageformat-parser",
+ "dev": true
+ },
+ "node_modules/invariant": {
+ "version": "2.2.4",
+ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
+ "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
+ "dependencies": {
+ "loose-envify": "^1.0.0"
+ }
+ },
+ "node_modules/ip-address": {
+ "version": "9.0.5",
+ "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz",
+ "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==",
+ "dev": true,
+ "dependencies": {
+ "jsbn": "1.1.0",
+ "sprintf-js": "^1.1.3"
+ },
+ "engines": {
+ "node": ">= 12"
+ }
+ },
+ "node_modules/ipaddr.js": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz",
+ "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/irregular-plurals": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-3.5.0.tgz",
+ "integrity": "sha512-1ANGLZ+Nkv1ptFb2pa8oG8Lem4krflKuX/gINiHJHjJUKaJHk/SXk5x6K3J+39/p0h1RQ2saROclJJ+QLvETCQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-array-buffer": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz",
+ "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==",
+ "dev": true,
+ "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-arrayish": {
+ "version": "0.2.1",
+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
+ "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg=="
+ },
+ "node_modules/is-async-function": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz",
+ "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==",
+ "dev": true,
+ "dependencies": {
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-bigint": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz",
+ "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==",
+ "dev": true,
+ "dependencies": {
+ "has-bigints": "^1.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-binary-path": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
+ "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
+ "dev": true,
+ "dependencies": {
+ "binary-extensions": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-boolean-object": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz",
+ "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==",
+ "dev": true,
+ "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-buffer": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
+ "dev": true
+ },
+ "node_modules/is-builtin-module": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz",
+ "integrity": "sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A==",
+ "dev": true,
+ "dependencies": {
+ "builtin-modules": "^3.3.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-callable": {
+ "version": "1.2.7",
+ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz",
+ "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-core-module": {
+ "version": "2.15.1",
+ "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz",
+ "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==",
+ "dependencies": {
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-data-view": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz",
+ "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==",
+ "dev": true,
+ "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",
+ "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz",
+ "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==",
+ "dev": true,
+ "dependencies": {
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-docker": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz",
+ "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==",
+ "dev": true,
+ "bin": {
+ "is-docker": "cli.js"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-extendable": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
+ "integrity": "sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
+ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-finalizationregistry": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz",
+ "integrity": "sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-generator-fn": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz",
+ "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/is-generator-function": {
+ "version": "1.0.10",
+ "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz",
+ "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==",
+ "dev": true,
+ "dependencies": {
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
+ "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
+ "dev": true,
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-interactive": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz",
+ "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-map": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz",
+ "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-negative-zero": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz",
+ "integrity": "sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
+ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/is-number-object": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz",
+ "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==",
+ "dev": true,
+ "dependencies": {
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-obj": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz",
+ "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-path-cwd": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz",
+ "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/is-path-in-cwd": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz",
+ "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==",
+ "dev": true,
+ "dependencies": {
+ "is-path-inside": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/is-path-in-cwd/node_modules/is-path-inside": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz",
+ "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==",
+ "dev": true,
+ "dependencies": {
+ "path-is-inside": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/is-path-inside": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz",
+ "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-plain-obj": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz",
+ "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-plain-object": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
+ "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-potential-custom-element-name": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz",
+ "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==",
+ "dev": true
+ },
+ "node_modules/is-promise": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz",
+ "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ=="
+ },
+ "node_modules/is-regex": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz",
+ "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==",
+ "dev": true,
+ "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",
+ "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz",
+ "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-shared-array-buffer": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz",
+ "integrity": "sha512-nA2hv5XIhLR3uVzDDfCIknerhx8XUKnstuOERPNNIinXG7v9u+ohXF67vxm4TPTEPU6lm61ZkwP3c9PCB97rhg==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.7"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-stream": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
+ "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-string": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz",
+ "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==",
+ "dev": true,
+ "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",
+ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz",
+ "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==",
+ "dev": true,
+ "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",
+ "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.13.tgz",
+ "integrity": "sha512-uZ25/bUAlUY5fR4OKT4rZQEBrzQWYV9ZJYGGsUmEJ6thodVJ1HX64ePQ6Z0qPWP+m+Uq6e9UugrE38jeYsDSMw==",
+ "dev": true,
+ "dependencies": {
+ "which-typed-array": "^1.1.14"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-typedarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
+ "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==",
+ "dev": true
+ },
+ "node_modules/is-unicode-supported": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz",
+ "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/is-weakmap": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz",
+ "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-weakref": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz",
+ "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-weakset": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz",
+ "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "get-intrinsic": "^1.2.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-windows": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-0.2.0.tgz",
+ "integrity": "sha512-n67eJYmXbniZB7RF4I/FTjK1s6RPOCTxhYrVYLRaCt3lF0mpWZPKr3T2LSZAqyjQsxR2qMmGYXXzK0YWwcPM1Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-wsl": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz",
+ "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==",
+ "dev": true,
+ "dependencies": {
+ "is-docker": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/isarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==",
+ "dev": true
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
+ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==",
+ "dev": true
+ },
+ "node_modules/isobject": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
+ "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/isomorphic.js": {
+ "version": "0.2.5",
+ "resolved": "https://registry.npmjs.org/isomorphic.js/-/isomorphic.js-0.2.5.tgz",
+ "integrity": "sha512-PIeMbHqMt4DnUP3MA/Flc0HElYjMXArsw1qwJZcm9sqR8mq3l8NYizFMty0pWwE/tzIGH3EKK5+jes5mAr85yw==",
+ "funding": {
+ "type": "GitHub Sponsors ❤",
+ "url": "https://github.com/sponsors/dmonad"
+ }
+ },
+ "node_modules/istanbul-lib-coverage": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz",
+ "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/istanbul-lib-instrument": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz",
+ "integrity": "sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/core": "^7.12.3",
+ "@babel/parser": "^7.14.7",
+ "@istanbuljs/schema": "^0.1.2",
+ "istanbul-lib-coverage": "^3.2.0",
+ "semver": "^6.3.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/istanbul-lib-report": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz",
+ "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==",
+ "dev": true,
+ "dependencies": {
+ "istanbul-lib-coverage": "^3.0.0",
+ "make-dir": "^4.0.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/istanbul-lib-source-maps": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz",
+ "integrity": "sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==",
+ "dev": true,
+ "dependencies": {
+ "debug": "^4.1.1",
+ "istanbul-lib-coverage": "^3.0.0",
+ "source-map": "^0.6.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/istanbul-lib-source-maps/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/istanbul-reports": {
+ "version": "3.1.7",
+ "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.7.tgz",
+ "integrity": "sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==",
+ "dev": true,
+ "dependencies": {
+ "html-escaper": "^2.0.0",
+ "istanbul-lib-report": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/iterator.prototype": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.3.tgz",
+ "integrity": "sha512-FW5iMbeQ6rBGm/oKgzq2aW4KvAGpxPzYES8N4g4xNXUKpL1mclMvOe+76AcLDTvD+Ze+sOpVhgdAQEKF4L9iGQ==",
+ "dev": true,
+ "dependencies": {
+ "define-properties": "^1.2.1",
+ "get-intrinsic": "^1.2.1",
+ "has-symbols": "^1.0.3",
+ "reflect.getprototypeof": "^1.0.4",
+ "set-function-name": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/jest": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz",
+ "integrity": "sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw==",
+ "dev": true,
+ "dependencies": {
+ "@jest/core": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "import-local": "^3.0.2",
+ "jest-cli": "^29.7.0"
+ },
+ "bin": {
+ "jest": "bin/jest.js"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ },
+ "peerDependencies": {
+ "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
+ },
+ "peerDependenciesMeta": {
+ "node-notifier": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/jest-changed-files": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.7.0.tgz",
+ "integrity": "sha512-fEArFiwf1BpQ+4bXSprcDc3/x4HSzL4al2tozwVpDFpsxALjLYdyiIK4e5Vz66GQJIbXJ82+35PtysofptNX2w==",
+ "dev": true,
+ "dependencies": {
+ "execa": "^5.0.0",
+ "jest-util": "^29.7.0",
+ "p-limit": "^3.1.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-circus": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-29.7.0.tgz",
+ "integrity": "sha512-3E1nCMgipcTkCocFwM90XXQab9bS+GMsjdpmPrlelaxwD93Ad8iVEjX/vvHPdLPnFf+L40u+5+iutRdA1N9myw==",
+ "dev": true,
+ "dependencies": {
+ "@jest/environment": "^29.7.0",
+ "@jest/expect": "^29.7.0",
+ "@jest/test-result": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "co": "^4.6.0",
+ "dedent": "^1.0.0",
+ "is-generator-fn": "^2.0.0",
+ "jest-each": "^29.7.0",
+ "jest-matcher-utils": "^29.7.0",
+ "jest-message-util": "^29.7.0",
+ "jest-runtime": "^29.7.0",
+ "jest-snapshot": "^29.7.0",
+ "jest-util": "^29.7.0",
+ "p-limit": "^3.1.0",
+ "pretty-format": "^29.7.0",
+ "pure-rand": "^6.0.0",
+ "slash": "^3.0.0",
+ "stack-utils": "^2.0.3"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-cli": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-29.7.0.tgz",
+ "integrity": "sha512-OVVobw2IubN/GSYsxETi+gOe7Ka59EFMR/twOU3Jb2GnKKeMGJB5SGUUrEz3SFVmJASUdZUzy83sLNNQ2gZslg==",
+ "dev": true,
+ "dependencies": {
+ "@jest/core": "^29.7.0",
+ "@jest/test-result": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "chalk": "^4.0.0",
+ "create-jest": "^29.7.0",
+ "exit": "^0.1.2",
+ "import-local": "^3.0.2",
+ "jest-config": "^29.7.0",
+ "jest-util": "^29.7.0",
+ "jest-validate": "^29.7.0",
+ "yargs": "^17.3.1"
+ },
+ "bin": {
+ "jest": "bin/jest.js"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ },
+ "peerDependencies": {
+ "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0"
+ },
+ "peerDependenciesMeta": {
+ "node-notifier": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/jest-config": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-29.7.0.tgz",
+ "integrity": "sha512-uXbpfeQ7R6TZBqI3/TxCU4q4ttk3u0PJeC+E0zbfSoSjq6bJ7buBPxzQPL0ifrkY4DNu4JUdk0ImlBUYi840eQ==",
+ "dev": true,
+ "dependencies": {
+ "@babel/core": "^7.11.6",
+ "@jest/test-sequencer": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "babel-jest": "^29.7.0",
+ "chalk": "^4.0.0",
+ "ci-info": "^3.2.0",
+ "deepmerge": "^4.2.2",
+ "glob": "^7.1.3",
+ "graceful-fs": "^4.2.9",
+ "jest-circus": "^29.7.0",
+ "jest-environment-node": "^29.7.0",
+ "jest-get-type": "^29.6.3",
+ "jest-regex-util": "^29.6.3",
+ "jest-resolve": "^29.7.0",
+ "jest-runner": "^29.7.0",
+ "jest-util": "^29.7.0",
+ "jest-validate": "^29.7.0",
+ "micromatch": "^4.0.4",
+ "parse-json": "^5.2.0",
+ "pretty-format": "^29.7.0",
+ "slash": "^3.0.0",
+ "strip-json-comments": "^3.1.1"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ },
+ "peerDependencies": {
+ "@types/node": "*",
+ "ts-node": ">=9.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/node": {
+ "optional": true
+ },
+ "ts-node": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/jest-dev-server": {
+ "version": "9.0.2",
+ "resolved": "https://registry.npmjs.org/jest-dev-server/-/jest-dev-server-9.0.2.tgz",
+ "integrity": "sha512-Zc/JB0IlNNrpXkhBw+h86cGrde/Mey52KvF+FER2eyrtYJTHObOwW7Iarxm3rPyTKby5+3Y2QZtl8pRz/5GCxg==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^4.1.2",
+ "cwd": "^0.10.0",
+ "find-process": "^1.4.7",
+ "prompts": "^2.4.2",
+ "spawnd": "^9.0.2",
+ "tree-kill": "^1.2.2",
+ "wait-on": "^7.2.0"
+ },
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/jest-diff": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-29.7.0.tgz",
+ "integrity": "sha512-LMIgiIrhigmPrs03JHpxUh2yISK3vLFPkAodPeo0+BuF7wA2FoQbkEg1u8gBYBThncu7e1oEDUfIXVuTqLRUjw==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^4.0.0",
+ "diff-sequences": "^29.6.3",
+ "jest-get-type": "^29.6.3",
+ "pretty-format": "^29.7.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-docblock": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.7.0.tgz",
+ "integrity": "sha512-q617Auw3A612guyaFgsbFeYpNP5t2aoUNLwBUbc/0kD1R4t9ixDbyFTHd1nok4epoVFpr7PmeWHrhvuV3XaJ4g==",
+ "dev": true,
+ "dependencies": {
+ "detect-newline": "^3.0.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-each": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-29.7.0.tgz",
+ "integrity": "sha512-gns+Er14+ZrEoC5fhOfYCY1LOHHr0TI+rQUHZS8Ttw2l7gl+80eHc/gFf2Ktkw0+SIACDTeWvpFcv3B04VembQ==",
+ "dev": true,
+ "dependencies": {
+ "@jest/types": "^29.6.3",
+ "chalk": "^4.0.0",
+ "jest-get-type": "^29.6.3",
+ "jest-util": "^29.7.0",
+ "pretty-format": "^29.7.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-environment-jsdom": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-29.7.0.tgz",
+ "integrity": "sha512-k9iQbsf9OyOfdzWH8HDmrRT0gSIcX+FLNW7IQq94tFX0gynPwqDTW0Ho6iMVNjGz/nb+l/vW3dWM2bbLLpkbXA==",
+ "dev": true,
+ "dependencies": {
+ "@jest/environment": "^29.7.0",
+ "@jest/fake-timers": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "@types/jsdom": "^20.0.0",
+ "@types/node": "*",
+ "jest-mock": "^29.7.0",
+ "jest-util": "^29.7.0",
+ "jsdom": "^20.0.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ },
+ "peerDependencies": {
+ "canvas": "^2.5.0"
+ },
+ "peerDependenciesMeta": {
+ "canvas": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/jest-environment-node": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.7.0.tgz",
+ "integrity": "sha512-DOSwCRqXirTOyheM+4d5YZOrWcdu0LNZ87ewUoywbcb2XR4wKgqiG8vNeYwhjFMbEkfju7wx2GYH0P2gevGvFw==",
+ "dev": true,
+ "dependencies": {
+ "@jest/environment": "^29.7.0",
+ "@jest/fake-timers": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "@types/node": "*",
+ "jest-mock": "^29.7.0",
+ "jest-util": "^29.7.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-get-type": {
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz",
+ "integrity": "sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw==",
+ "dev": true,
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-haste-map": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.7.0.tgz",
+ "integrity": "sha512-fP8u2pyfqx0K1rGn1R9pyE0/KTn+G7PxktWidOBTqFPLYX0b9ksaMFkhK5vrS3DVun09pckLdlx90QthlW7AmA==",
+ "dev": true,
+ "dependencies": {
+ "@jest/types": "^29.6.3",
+ "@types/graceful-fs": "^4.1.3",
+ "@types/node": "*",
+ "anymatch": "^3.0.3",
+ "fb-watchman": "^2.0.0",
+ "graceful-fs": "^4.2.9",
+ "jest-regex-util": "^29.6.3",
+ "jest-util": "^29.7.0",
+ "jest-worker": "^29.7.0",
+ "micromatch": "^4.0.4",
+ "walker": "^1.0.8"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ },
+ "optionalDependencies": {
+ "fsevents": "^2.3.2"
+ }
+ },
+ "node_modules/jest-leak-detector": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.7.0.tgz",
+ "integrity": "sha512-kYA8IJcSYtST2BY9I+SMC32nDpBT3J2NvWJx8+JCuCdl/CR1I4EKUJROiP8XtCcxqgTTBGJNdbB1A8XRKbTetw==",
+ "dev": true,
+ "dependencies": {
+ "jest-get-type": "^29.6.3",
+ "pretty-format": "^29.7.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-matcher-utils": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.7.0.tgz",
+ "integrity": "sha512-sBkD+Xi9DtcChsI3L3u0+N0opgPYnCRPtGcQYrgXmR+hmt/fYfWAL0xRXYU8eWOdfuLgBe0YCW3AFtnRLagq/g==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^4.0.0",
+ "jest-diff": "^29.7.0",
+ "jest-get-type": "^29.6.3",
+ "pretty-format": "^29.7.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-message-util": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.7.0.tgz",
+ "integrity": "sha512-GBEV4GRADeP+qtB2+6u61stea8mGcOT4mCtrYISZwfu9/ISHFJ/5zOMXYbpBE9RsS5+Gb63DW4FgmnKJ79Kf6w==",
+ "dev": true,
+ "dependencies": {
+ "@babel/code-frame": "^7.12.13",
+ "@jest/types": "^29.6.3",
+ "@types/stack-utils": "^2.0.0",
+ "chalk": "^4.0.0",
+ "graceful-fs": "^4.2.9",
+ "micromatch": "^4.0.4",
+ "pretty-format": "^29.7.0",
+ "slash": "^3.0.0",
+ "stack-utils": "^2.0.3"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-mock": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-29.7.0.tgz",
+ "integrity": "sha512-ITOMZn+UkYS4ZFh83xYAOzWStloNzJFO2s8DWrE4lhtGD+AorgnbkiKERe4wQVBydIGPx059g6riW5Btp6Llnw==",
+ "dev": true,
+ "dependencies": {
+ "@jest/types": "^29.6.3",
+ "@types/node": "*",
+ "jest-util": "^29.7.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-pnp-resolver": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz",
+ "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ },
+ "peerDependencies": {
+ "jest-resolve": "*"
+ },
+ "peerDependenciesMeta": {
+ "jest-resolve": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/jest-regex-util": {
+ "version": "29.6.3",
+ "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz",
+ "integrity": "sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg==",
+ "dev": true,
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-resolve": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz",
+ "integrity": "sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^4.0.0",
+ "graceful-fs": "^4.2.9",
+ "jest-haste-map": "^29.7.0",
+ "jest-pnp-resolver": "^1.2.2",
+ "jest-util": "^29.7.0",
+ "jest-validate": "^29.7.0",
+ "resolve": "^1.20.0",
+ "resolve.exports": "^2.0.0",
+ "slash": "^3.0.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-resolve-dependencies": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.7.0.tgz",
+ "integrity": "sha512-un0zD/6qxJ+S0et7WxeI3H5XSe9lTBBR7bOHCHXkKR6luG5mwDDlIzVQ0V5cZCuoTgEdcdwzTghYkTWfubi+nA==",
+ "dev": true,
+ "dependencies": {
+ "jest-regex-util": "^29.6.3",
+ "jest-snapshot": "^29.7.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-runner": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-29.7.0.tgz",
+ "integrity": "sha512-fsc4N6cPCAahybGBfTRcq5wFR6fpLznMg47sY5aDpsoejOcVYFb07AHuSnR0liMcPTgBsA3ZJL6kFOjPdoNipQ==",
+ "dev": true,
+ "dependencies": {
+ "@jest/console": "^29.7.0",
+ "@jest/environment": "^29.7.0",
+ "@jest/test-result": "^29.7.0",
+ "@jest/transform": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "emittery": "^0.13.1",
+ "graceful-fs": "^4.2.9",
+ "jest-docblock": "^29.7.0",
+ "jest-environment-node": "^29.7.0",
+ "jest-haste-map": "^29.7.0",
+ "jest-leak-detector": "^29.7.0",
+ "jest-message-util": "^29.7.0",
+ "jest-resolve": "^29.7.0",
+ "jest-runtime": "^29.7.0",
+ "jest-util": "^29.7.0",
+ "jest-watcher": "^29.7.0",
+ "jest-worker": "^29.7.0",
+ "p-limit": "^3.1.0",
+ "source-map-support": "0.5.13"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-runtime": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.7.0.tgz",
+ "integrity": "sha512-gUnLjgwdGqW7B4LvOIkbKs9WGbn+QLqRQQ9juC6HndeDiezIwhDP+mhMwHWCEcfQ5RUXa6OPnFF8BJh5xegwwQ==",
+ "dev": true,
+ "dependencies": {
+ "@jest/environment": "^29.7.0",
+ "@jest/fake-timers": "^29.7.0",
+ "@jest/globals": "^29.7.0",
+ "@jest/source-map": "^29.6.3",
+ "@jest/test-result": "^29.7.0",
+ "@jest/transform": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "cjs-module-lexer": "^1.0.0",
+ "collect-v8-coverage": "^1.0.0",
+ "glob": "^7.1.3",
+ "graceful-fs": "^4.2.9",
+ "jest-haste-map": "^29.7.0",
+ "jest-message-util": "^29.7.0",
+ "jest-mock": "^29.7.0",
+ "jest-regex-util": "^29.6.3",
+ "jest-resolve": "^29.7.0",
+ "jest-snapshot": "^29.7.0",
+ "jest-util": "^29.7.0",
+ "slash": "^3.0.0",
+ "strip-bom": "^4.0.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-snapshot": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.7.0.tgz",
+ "integrity": "sha512-Rm0BMWtxBcioHr1/OX5YCP8Uov4riHvKPknOGs804Zg9JGZgmIBkbtlxJC/7Z4msKYVbIJtfU+tKb8xlYNfdkw==",
+ "dev": true,
+ "dependencies": {
+ "@babel/core": "^7.11.6",
+ "@babel/generator": "^7.7.2",
+ "@babel/plugin-syntax-jsx": "^7.7.2",
+ "@babel/plugin-syntax-typescript": "^7.7.2",
+ "@babel/types": "^7.3.3",
+ "@jest/expect-utils": "^29.7.0",
+ "@jest/transform": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "babel-preset-current-node-syntax": "^1.0.0",
+ "chalk": "^4.0.0",
+ "expect": "^29.7.0",
+ "graceful-fs": "^4.2.9",
+ "jest-diff": "^29.7.0",
+ "jest-get-type": "^29.6.3",
+ "jest-matcher-utils": "^29.7.0",
+ "jest-message-util": "^29.7.0",
+ "jest-util": "^29.7.0",
+ "natural-compare": "^1.4.0",
+ "pretty-format": "^29.7.0",
+ "semver": "^7.5.3"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-snapshot/node_modules/semver": {
+ "version": "7.6.3",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
+ "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/jest-util": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-29.7.0.tgz",
+ "integrity": "sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==",
+ "dev": true,
+ "dependencies": {
+ "@jest/types": "^29.6.3",
+ "@types/node": "*",
+ "chalk": "^4.0.0",
+ "ci-info": "^3.2.0",
+ "graceful-fs": "^4.2.9",
+ "picomatch": "^2.2.3"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-validate": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-29.7.0.tgz",
+ "integrity": "sha512-ZB7wHqaRGVw/9hST/OuFUReG7M8vKeq0/J2egIGLdvjHCmYqGARhzXmtgi+gVeZ5uXFF219aOc3Ls2yLg27tkw==",
+ "dev": true,
+ "dependencies": {
+ "@jest/types": "^29.6.3",
+ "camelcase": "^6.2.0",
+ "chalk": "^4.0.0",
+ "jest-get-type": "^29.6.3",
+ "leven": "^3.1.0",
+ "pretty-format": "^29.7.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-watcher": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.7.0.tgz",
+ "integrity": "sha512-49Fg7WXkU3Vl2h6LbLtMQ/HyB6rXSIX7SqvBLQmssRBGN9I0PNvPmAmCWSOY6SOvrjhI/F7/bGAv9RtnsPA03g==",
+ "dev": true,
+ "dependencies": {
+ "@jest/test-result": "^29.7.0",
+ "@jest/types": "^29.6.3",
+ "@types/node": "*",
+ "ansi-escapes": "^4.2.1",
+ "chalk": "^4.0.0",
+ "emittery": "^0.13.1",
+ "jest-util": "^29.7.0",
+ "string-length": "^4.0.1"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-worker": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-29.7.0.tgz",
+ "integrity": "sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "*",
+ "jest-util": "^29.7.0",
+ "merge-stream": "^2.0.0",
+ "supports-color": "^8.0.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/jest-worker/node_modules/supports-color": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+ "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "node_modules/joi": {
+ "version": "17.13.3",
+ "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.3.tgz",
+ "integrity": "sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==",
+ "dev": true,
+ "dependencies": {
+ "@hapi/hoek": "^9.3.0",
+ "@hapi/topo": "^5.1.0",
+ "@sideway/address": "^4.1.5",
+ "@sideway/formula": "^3.0.1",
+ "@sideway/pinpoint": "^2.0.0"
+ }
+ },
+ "node_modules/jpeg-js": {
+ "version": "0.4.4",
+ "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.4.4.tgz",
+ "integrity": "sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg==",
+ "dev": true
+ },
+ "node_modules/js-library-detector": {
+ "version": "6.7.0",
+ "resolved": "https://registry.npmjs.org/js-library-detector/-/js-library-detector-6.7.0.tgz",
+ "integrity": "sha512-c80Qupofp43y4cJ7+8TTDN/AsDwLi5oOm/plBrWI+iQt485vKXCco+yVmOwEgdo9VOdsYTuV0UlTeetVPTriXA==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/js-tokens": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ=="
+ },
+ "node_modules/js-yaml": {
+ "version": "3.14.1",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
+ "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
+ "dev": true,
+ "dependencies": {
+ "argparse": "^1.0.7",
+ "esprima": "^4.0.0"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/jsbn": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz",
+ "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==",
+ "dev": true
+ },
+ "node_modules/jsdoc-type-pratt-parser": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.0.0.tgz",
+ "integrity": "sha512-YtOli5Cmzy3q4dP26GraSOeAhqecewG04hoO8DY56CH4KJ9Fvv5qKWUCCo3HZob7esJQHCv6/+bnTy72xZZaVQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/jsdom": {
+ "version": "20.0.3",
+ "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-20.0.3.tgz",
+ "integrity": "sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ==",
+ "dev": true,
+ "dependencies": {
+ "abab": "^2.0.6",
+ "acorn": "^8.8.1",
+ "acorn-globals": "^7.0.0",
+ "cssom": "^0.5.0",
+ "cssstyle": "^2.3.0",
+ "data-urls": "^3.0.2",
+ "decimal.js": "^10.4.2",
+ "domexception": "^4.0.0",
+ "escodegen": "^2.0.0",
+ "form-data": "^4.0.0",
+ "html-encoding-sniffer": "^3.0.0",
+ "http-proxy-agent": "^5.0.0",
+ "https-proxy-agent": "^5.0.1",
+ "is-potential-custom-element-name": "^1.0.1",
+ "nwsapi": "^2.2.2",
+ "parse5": "^7.1.1",
+ "saxes": "^6.0.0",
+ "symbol-tree": "^3.2.4",
+ "tough-cookie": "^4.1.2",
+ "w3c-xmlserializer": "^4.0.0",
+ "webidl-conversions": "^7.0.0",
+ "whatwg-encoding": "^2.0.0",
+ "whatwg-mimetype": "^3.0.0",
+ "whatwg-url": "^11.0.0",
+ "ws": "^8.11.0",
+ "xml-name-validator": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "peerDependencies": {
+ "canvas": "^2.5.0"
+ },
+ "peerDependenciesMeta": {
+ "canvas": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/jsesc": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.0.2.tgz",
+ "integrity": "sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==",
+ "bin": {
+ "jsesc": "bin/jsesc"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/json-buffer": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
+ "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
+ "dev": true
+ },
+ "node_modules/json-parse-even-better-errors": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
+ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w=="
+ },
+ "node_modules/json-schema-traverse": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
+ "dev": true
+ },
+ "node_modules/json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
+ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==",
+ "dev": true
+ },
+ "node_modules/json2php": {
+ "version": "0.0.9",
+ "resolved": "https://registry.npmjs.org/json2php/-/json2php-0.0.9.tgz",
+ "integrity": "sha512-fQMYwvPsQt8hxRnCGyg1r2JVi6yL8Um0DIIawiKiMK9yhAAkcRNj5UsBWoaFvFzPpcWbgw9L6wzj+UMYA702Mw==",
+ "dev": true
+ },
+ "node_modules/json5": {
+ "version": "2.2.3",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
+ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
+ "dev": true,
+ "bin": {
+ "json5": "lib/cli.js"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/jsonc-parser": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.0.0.tgz",
+ "integrity": "sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA==",
+ "dev": true
+ },
+ "node_modules/jsonfile": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
+ "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
+ "dev": true,
+ "dependencies": {
+ "universalify": "^2.0.0"
+ },
+ "optionalDependencies": {
+ "graceful-fs": "^4.1.6"
+ }
+ },
+ "node_modules/jsx-ast-utils": {
+ "version": "3.3.5",
+ "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz",
+ "integrity": "sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==",
+ "dev": true,
+ "dependencies": {
+ "array-includes": "^3.1.6",
+ "array.prototype.flat": "^1.3.1",
+ "object.assign": "^4.1.4",
+ "object.values": "^1.1.6"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/keyv": {
+ "version": "4.5.4",
+ "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
+ "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
+ "dev": true,
+ "dependencies": {
+ "json-buffer": "3.0.1"
+ }
+ },
+ "node_modules/kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==",
+ "dev": true,
+ "dependencies": {
+ "is-buffer": "^1.1.5"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/kleur": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz",
+ "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/klona": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz",
+ "integrity": "sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/known-css-properties": {
+ "version": "0.34.0",
+ "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.34.0.tgz",
+ "integrity": "sha512-tBECoUqNFbyAY4RrbqsBQqDFpGXAEbdD5QKr8kACx3+rnArmuuR22nKQWKazvp07N9yjTyDZaw/20UIH8tL9DQ==",
+ "dev": true
+ },
+ "node_modules/language-subtag-registry": {
+ "version": "0.3.23",
+ "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.23.tgz",
+ "integrity": "sha512-0K65Lea881pHotoGEa5gDlMxt3pctLi2RplBb7Ezh4rRdLEOtgi7n4EwK9lamnUCkKBqaeKRVebTq6BAxSkpXQ==",
+ "dev": true
+ },
+ "node_modules/language-tags": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.9.tgz",
+ "integrity": "sha512-MbjN408fEndfiQXbFQ1vnd+1NoLDsnQW41410oQBXiyXDMYH5z505juWa4KUE1LqxRC7DgOgZDbKLxHIwm27hA==",
+ "dev": true,
+ "dependencies": {
+ "language-subtag-registry": "^0.3.20"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/launch-editor": {
+ "version": "2.9.1",
+ "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.9.1.tgz",
+ "integrity": "sha512-Gcnl4Bd+hRO9P9icCP/RVVT2o8SFlPXofuCxvA2SaZuH45whSvf5p8x5oih5ftLiVhEI4sp5xDY+R+b3zJBh5w==",
+ "dev": true,
+ "dependencies": {
+ "picocolors": "^1.0.0",
+ "shell-quote": "^1.8.1"
+ }
+ },
+ "node_modules/lazy-cache": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz",
+ "integrity": "sha512-RE2g0b5VGZsOCFOCgP7omTRYFqydmZkBwl5oNnQ1lDYC57uyO9KqNnNVxT7COSHTxrRCWVcAVOcbjk+tvh/rgQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/leven": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz",
+ "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/levn": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
+ "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
+ "dev": true,
+ "dependencies": {
+ "prelude-ls": "^1.2.1",
+ "type-check": "~0.4.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/lib0": {
+ "version": "0.2.98",
+ "resolved": "https://registry.npmjs.org/lib0/-/lib0-0.2.98.tgz",
+ "integrity": "sha512-XteTiNO0qEXqqweWx+b21p/fBnNHUA1NwAtJNJek1oPrewEZs2uiT4gWivHKr9GqCjDPAhchz0UQO8NwU3bBNA==",
+ "dependencies": {
+ "isomorphic.js": "^0.2.4"
+ },
+ "bin": {
+ "0ecdsa-generate-keypair": "bin/0ecdsa-generate-keypair.js",
+ "0gentesthtml": "bin/gentesthtml.js",
+ "0serve": "bin/0serve.js"
+ },
+ "engines": {
+ "node": ">=16"
+ },
+ "funding": {
+ "type": "GitHub Sponsors ❤",
+ "url": "https://github.com/sponsors/dmonad"
+ }
+ },
+ "node_modules/lighthouse": {
+ "version": "10.4.0",
+ "resolved": "https://registry.npmjs.org/lighthouse/-/lighthouse-10.4.0.tgz",
+ "integrity": "sha512-XQWHEWkJ8YxSPsxttBJORy5+hQrzbvGkYfeP3fJjyYKioWkF2MXfFqNK4ZuV4jL8pBu7Z91qnQP6In0bq1yXww==",
+ "dev": true,
+ "dependencies": {
+ "@sentry/node": "^6.17.4",
+ "axe-core": "4.7.2",
+ "chrome-launcher": "^0.15.2",
+ "configstore": "^5.0.1",
+ "csp_evaluator": "1.1.1",
+ "devtools-protocol": "0.0.1155343",
+ "enquirer": "^2.3.6",
+ "http-link-header": "^1.1.1",
+ "intl-messageformat": "^4.4.0",
+ "jpeg-js": "^0.4.4",
+ "js-library-detector": "^6.6.0",
+ "lighthouse-logger": "^1.4.1",
+ "lighthouse-stack-packs": "1.11.0",
+ "lodash": "^4.17.21",
+ "lookup-closest-locale": "6.2.0",
+ "metaviewport-parser": "0.3.0",
+ "open": "^8.4.0",
+ "parse-cache-control": "1.0.1",
+ "ps-list": "^8.0.0",
+ "puppeteer-core": "^20.8.0",
+ "robots-parser": "^3.0.0",
+ "semver": "^5.3.0",
+ "speedline-core": "^1.4.3",
+ "third-party-web": "^0.23.3",
+ "ws": "^7.0.0",
+ "yargs": "^17.3.1",
+ "yargs-parser": "^21.0.0"
+ },
+ "bin": {
+ "chrome-debug": "core/scripts/manual-chrome-launcher.js",
+ "lighthouse": "cli/index.js",
+ "smokehouse": "cli/test/smokehouse/frontends/smokehouse-bin.js"
+ },
+ "engines": {
+ "node": ">=16.16"
+ }
+ },
+ "node_modules/lighthouse-logger": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/lighthouse-logger/-/lighthouse-logger-1.4.2.tgz",
+ "integrity": "sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==",
+ "dev": true,
+ "dependencies": {
+ "debug": "^2.6.9",
+ "marky": "^1.2.2"
+ }
+ },
+ "node_modules/lighthouse-logger/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/lighthouse-logger/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "dev": true
+ },
+ "node_modules/lighthouse-stack-packs": {
+ "version": "1.11.0",
+ "resolved": "https://registry.npmjs.org/lighthouse-stack-packs/-/lighthouse-stack-packs-1.11.0.tgz",
+ "integrity": "sha512-sRr0z1S/I26VffRLq9KJsKtLk856YrJlNGmcJmbLX8dFn3MuzVPUbstuChEhqnSxZb8TZmVfthuXuwhG9vRoSw==",
+ "dev": true
+ },
+ "node_modules/lighthouse/node_modules/@puppeteer/browsers": {
+ "version": "1.4.6",
+ "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-1.4.6.tgz",
+ "integrity": "sha512-x4BEjr2SjOPowNeiguzjozQbsc6h437ovD/wu+JpaenxVLm3jkgzHY2xOslMTp50HoTvQreMjiexiGQw1sqZlQ==",
+ "dev": true,
+ "dependencies": {
+ "debug": "4.3.4",
+ "extract-zip": "2.0.1",
+ "progress": "2.0.3",
+ "proxy-agent": "6.3.0",
+ "tar-fs": "3.0.4",
+ "unbzip2-stream": "1.4.3",
+ "yargs": "17.7.1"
+ },
+ "bin": {
+ "browsers": "lib/cjs/main-cli.js"
+ },
+ "engines": {
+ "node": ">=16.3.0"
+ },
+ "peerDependencies": {
+ "typescript": ">= 4.7.4"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/lighthouse/node_modules/agent-base": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz",
+ "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==",
+ "dev": true,
+ "dependencies": {
+ "debug": "^4.3.4"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/lighthouse/node_modules/axe-core": {
+ "version": "4.7.2",
+ "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.2.tgz",
+ "integrity": "sha512-zIURGIS1E1Q4pcrMjp+nnEh+16G56eG/MUllJH8yEvw7asDo7Ac9uhC9KIH5jzpITueEZolfYglnCGIuSBz39g==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/lighthouse/node_modules/debug": {
+ "version": "4.3.4",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
+ "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
+ "dev": true,
+ "dependencies": {
+ "ms": "2.1.2"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/lighthouse/node_modules/extract-zip": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz",
+ "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==",
+ "dev": true,
+ "dependencies": {
+ "debug": "^4.1.1",
+ "get-stream": "^5.1.0",
+ "yauzl": "^2.10.0"
+ },
+ "bin": {
+ "extract-zip": "cli.js"
+ },
+ "engines": {
+ "node": ">= 10.17.0"
+ },
+ "optionalDependencies": {
+ "@types/yauzl": "^2.9.1"
+ }
+ },
+ "node_modules/lighthouse/node_modules/http-proxy-agent": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz",
+ "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==",
+ "dev": true,
+ "dependencies": {
+ "agent-base": "^7.1.0",
+ "debug": "^4.3.4"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/lighthouse/node_modules/https-proxy-agent": {
+ "version": "7.0.5",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz",
+ "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==",
+ "dev": true,
+ "dependencies": {
+ "agent-base": "^7.0.2",
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/lighthouse/node_modules/lru-cache": {
+ "version": "7.18.3",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz",
+ "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/lighthouse/node_modules/mitt": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.0.tgz",
+ "integrity": "sha512-7dX2/10ITVyqh4aOSVI9gdape+t9l2/8QxHrFmUXu4EEUpdlxl6RudZUPZoc+zuY2hk1j7XxVroIVIan/pD/SQ==",
+ "dev": true
+ },
+ "node_modules/lighthouse/node_modules/ms": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
+ "dev": true
+ },
+ "node_modules/lighthouse/node_modules/proxy-agent": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.3.0.tgz",
+ "integrity": "sha512-0LdR757eTj/JfuU7TL2YCuAZnxWXu3tkJbg4Oq3geW/qFNT/32T0sp2HnZ9O0lMR4q3vwAt0+xCA8SR0WAD0og==",
+ "dev": true,
+ "dependencies": {
+ "agent-base": "^7.0.2",
+ "debug": "^4.3.4",
+ "http-proxy-agent": "^7.0.0",
+ "https-proxy-agent": "^7.0.0",
+ "lru-cache": "^7.14.1",
+ "pac-proxy-agent": "^7.0.0",
+ "proxy-from-env": "^1.1.0",
+ "socks-proxy-agent": "^8.0.1"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/lighthouse/node_modules/puppeteer-core": {
+ "version": "20.9.0",
+ "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-20.9.0.tgz",
+ "integrity": "sha512-H9fYZQzMTRrkboEfPmf7m3CLDN6JvbxXA3qTtS+dFt27tR+CsFHzPsT6pzp6lYL6bJbAPaR0HaPO6uSi+F94Pg==",
+ "dev": true,
+ "dependencies": {
+ "@puppeteer/browsers": "1.4.6",
+ "chromium-bidi": "0.4.16",
+ "cross-fetch": "4.0.0",
+ "debug": "4.3.4",
+ "devtools-protocol": "0.0.1147663",
+ "ws": "8.13.0"
+ },
+ "engines": {
+ "node": ">=16.3.0"
+ },
+ "peerDependencies": {
+ "typescript": ">= 4.7.4"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/lighthouse/node_modules/puppeteer-core/node_modules/chromium-bidi": {
+ "version": "0.4.16",
+ "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.4.16.tgz",
+ "integrity": "sha512-7ZbXdWERxRxSwo3txsBjjmc/NLxqb1Bk30mRb0BMS4YIaiV6zvKZqL/UAH+DdqcDYayDWk2n/y8klkBDODrPvA==",
+ "dev": true,
+ "dependencies": {
+ "mitt": "3.0.0"
+ },
+ "peerDependencies": {
+ "devtools-protocol": "*"
+ }
+ },
+ "node_modules/lighthouse/node_modules/puppeteer-core/node_modules/devtools-protocol": {
+ "version": "0.0.1147663",
+ "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1147663.tgz",
+ "integrity": "sha512-hyWmRrexdhbZ1tcJUGpO95ivbRhWXz++F4Ko+n21AY5PNln2ovoJw+8ZMNDTtip+CNFQfrtLVh/w4009dXO/eQ==",
+ "dev": true
+ },
+ "node_modules/lighthouse/node_modules/puppeteer-core/node_modules/ws": {
+ "version": "8.13.0",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz",
+ "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10.0.0"
+ },
+ "peerDependencies": {
+ "bufferutil": "^4.0.1",
+ "utf-8-validate": ">=5.0.2"
+ },
+ "peerDependenciesMeta": {
+ "bufferutil": {
+ "optional": true
+ },
+ "utf-8-validate": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/lighthouse/node_modules/semver": {
+ "version": "5.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
+ "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver"
+ }
+ },
+ "node_modules/lighthouse/node_modules/tar-fs": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.4.tgz",
+ "integrity": "sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==",
+ "dev": true,
+ "dependencies": {
+ "mkdirp-classic": "^0.5.2",
+ "pump": "^3.0.0",
+ "tar-stream": "^3.1.5"
+ }
+ },
+ "node_modules/lighthouse/node_modules/ws": {
+ "version": "7.5.10",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz",
+ "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8.3.0"
+ },
+ "peerDependencies": {
+ "bufferutil": "^4.0.1",
+ "utf-8-validate": "^5.0.2"
+ },
+ "peerDependenciesMeta": {
+ "bufferutil": {
+ "optional": true
+ },
+ "utf-8-validate": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/lighthouse/node_modules/yargs": {
+ "version": "17.7.1",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz",
+ "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==",
+ "dev": true,
+ "dependencies": {
+ "cliui": "^8.0.1",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.3",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^21.1.1"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/lilconfig": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz",
+ "integrity": "sha512-eop+wDAvpItUys0FWkHIKeC9ybYrTGbU41U5K7+bttZZeohvnY7M9dZ5kB21GNWiFT2q1OoPTvncPCgSOVO5ow==",
+ "dev": true,
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/antonk52"
+ }
+ },
+ "node_modules/line-height": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/line-height/-/line-height-0.3.1.tgz",
+ "integrity": "sha512-YExecgqPwnp5gplD2+Y8e8A5+jKpr25+DzMbFdI1/1UAr0FJrTFv4VkHLf8/6B590i1wUPJWMKKldkd/bdQ//w==",
+ "dependencies": {
+ "computed-style": "~0.1.3"
+ },
+ "engines": {
+ "node": ">= 4.0.0"
+ }
+ },
+ "node_modules/lines-and-columns": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
+ "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg=="
+ },
+ "node_modules/linkify-it": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz",
+ "integrity": "sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ==",
+ "dev": true,
+ "dependencies": {
+ "uc.micro": "^1.0.1"
+ }
+ },
+ "node_modules/loader-runner": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz",
+ "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6.11.5"
+ }
+ },
+ "node_modules/loader-utils": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz",
+ "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
+ "dev": true,
+ "dependencies": {
+ "big.js": "^5.2.2",
+ "emojis-list": "^3.0.0",
+ "json5": "^2.1.2"
+ },
+ "engines": {
+ "node": ">=8.9.0"
+ }
+ },
+ "node_modules/locate-path": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
+ "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
+ "dev": true,
+ "dependencies": {
+ "p-locate": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/lodash": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
+ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
+ "dev": true
+ },
+ "node_modules/lodash.debounce": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
+ "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==",
+ "dev": true
+ },
+ "node_modules/lodash.memoize": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
+ "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==",
+ "dev": true
+ },
+ "node_modules/lodash.merge": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz",
+ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==",
+ "dev": true
+ },
+ "node_modules/lodash.truncate": {
+ "version": "4.4.2",
+ "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz",
+ "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==",
+ "dev": true
+ },
+ "node_modules/lodash.uniq": {
+ "version": "4.5.0",
+ "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz",
+ "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==",
+ "dev": true
+ },
+ "node_modules/log-symbols": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz",
+ "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^4.1.0",
+ "is-unicode-supported": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/lookup-closest-locale": {
+ "version": "6.2.0",
+ "resolved": "https://registry.npmjs.org/lookup-closest-locale/-/lookup-closest-locale-6.2.0.tgz",
+ "integrity": "sha512-/c2kL+Vnp1jnV6K6RpDTHK3dgg0Tu2VVp+elEiJpjfS1UyY7AjOYHohRug6wT0OpoX2qFgNORndE9RqesfVxWQ==",
+ "dev": true
+ },
+ "node_modules/loose-envify": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
+ "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
+ "dependencies": {
+ "js-tokens": "^3.0.0 || ^4.0.0"
+ },
+ "bin": {
+ "loose-envify": "cli.js"
+ }
+ },
+ "node_modules/lower-case": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz",
+ "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==",
+ "dependencies": {
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/lowercase-keys": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz",
+ "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/lru_map": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz",
+ "integrity": "sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==",
+ "dev": true
+ },
+ "node_modules/lru-cache": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
+ "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==",
+ "dev": true,
+ "dependencies": {
+ "yallist": "^3.0.2"
+ }
+ },
+ "node_modules/make-dir": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz",
+ "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==",
+ "dev": true,
+ "dependencies": {
+ "semver": "^7.5.3"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/make-dir/node_modules/semver": {
+ "version": "7.6.3",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
+ "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/makeerror": {
+ "version": "1.0.12",
+ "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz",
+ "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==",
+ "dev": true,
+ "dependencies": {
+ "tmpl": "1.0.5"
+ }
+ },
+ "node_modules/map-obj": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz",
+ "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/map-values": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/map-values/-/map-values-1.0.1.tgz",
+ "integrity": "sha512-BbShUnr5OartXJe1GeccAWtfro11hhgNJg6G9/UtWKjVGvV5U4C09cg5nk8JUevhXODaXY+hQ3xxMUKSs62ONQ==",
+ "dev": true
+ },
+ "node_modules/markdown-it": {
+ "version": "12.3.2",
+ "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz",
+ "integrity": "sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg==",
+ "dev": true,
+ "dependencies": {
+ "argparse": "^2.0.1",
+ "entities": "~2.1.0",
+ "linkify-it": "^3.0.1",
+ "mdurl": "^1.0.1",
+ "uc.micro": "^1.0.5"
+ },
+ "bin": {
+ "markdown-it": "bin/markdown-it.js"
+ }
+ },
+ "node_modules/markdown-it/node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true
+ },
+ "node_modules/markdown-it/node_modules/entities": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz",
+ "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
+ "node_modules/markdownlint": {
+ "version": "0.25.1",
+ "resolved": "https://registry.npmjs.org/markdownlint/-/markdownlint-0.25.1.tgz",
+ "integrity": "sha512-AG7UkLzNa1fxiOv5B+owPsPhtM4D6DoODhsJgiaNg1xowXovrYgOnLqAgOOFQpWOlHFVQUzjMY5ypNNTeov92g==",
+ "dev": true,
+ "dependencies": {
+ "markdown-it": "12.3.2"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/markdownlint-cli": {
+ "version": "0.31.1",
+ "resolved": "https://registry.npmjs.org/markdownlint-cli/-/markdownlint-cli-0.31.1.tgz",
+ "integrity": "sha512-keIOMwQn+Ch7MoBwA+TdkyVMuxAeZFEGmIIlvwgV0Z1TGS5MxPnRr29XCLhkNzCHU+uNKGjU+VEjLX+Z9kli6g==",
+ "dev": true,
+ "dependencies": {
+ "commander": "~9.0.0",
+ "get-stdin": "~9.0.0",
+ "glob": "~7.2.0",
+ "ignore": "~5.2.0",
+ "js-yaml": "^4.1.0",
+ "jsonc-parser": "~3.0.0",
+ "markdownlint": "~0.25.1",
+ "markdownlint-rule-helpers": "~0.16.0",
+ "minimatch": "~3.0.5",
+ "run-con": "~1.2.10"
+ },
+ "bin": {
+ "markdownlint": "markdownlint.js"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/markdownlint-cli/node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true
+ },
+ "node_modules/markdownlint-cli/node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/markdownlint-cli/node_modules/commander": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-9.0.0.tgz",
+ "integrity": "sha512-JJfP2saEKbQqvW+FI93OYUB4ByV5cizMpFMiiJI8xDbBvQvSkIk0VvQdn1CZ8mqAO8Loq2h0gYTYtDFUZUeERw==",
+ "dev": true,
+ "engines": {
+ "node": "^12.20.0 || >=14"
+ }
+ },
+ "node_modules/markdownlint-cli/node_modules/ignore": {
+ "version": "5.2.4",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz",
+ "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/markdownlint-cli/node_modules/js-yaml": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "dev": true,
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/markdownlint-cli/node_modules/minimatch": {
+ "version": "3.0.8",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz",
+ "integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/markdownlint-rule-helpers": {
+ "version": "0.16.0",
+ "resolved": "https://registry.npmjs.org/markdownlint-rule-helpers/-/markdownlint-rule-helpers-0.16.0.tgz",
+ "integrity": "sha512-oEacRUVeTJ5D5hW1UYd2qExYI0oELdYK72k1TKGvIeYJIbqQWAz476NAc7LNixSySUhcNl++d02DvX0ccDk9/w==",
+ "dev": true
+ },
+ "node_modules/marky": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/marky/-/marky-1.2.5.tgz",
+ "integrity": "sha512-q9JtQJKjpsVxCRVgQ+WapguSbKC3SQ5HEzFGPAJMStgh3QjCawp00UKv3MTTAArTmGmmPUvllHZoNbZ3gs0I+Q==",
+ "dev": true
+ },
+ "node_modules/material-ui-popup-state": {
+ "version": "5.0.11",
+ "resolved": "https://registry.npmjs.org/material-ui-popup-state/-/material-ui-popup-state-5.0.11.tgz",
+ "integrity": "sha512-wakm27MYILS5gdLJNYDUj1rhW4H3akv2WKGNFsoLKzHOl2qMOhhq6p1+UAok4qt9E6U7189zjpRLw6pDwhbvqw==",
+ "dependencies": {
+ "@babel/runtime": "^7.20.6",
+ "@types/prop-types": "^15.7.3",
+ "@types/react": "^18.0.26",
+ "classnames": "^2.2.6",
+ "prop-types": "^15.7.2"
+ },
+ "engines": {
+ "node": ">=16"
+ },
+ "peerDependencies": {
+ "@mui/material": "^5.0.0",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
+ }
+ },
+ "node_modules/mathml-tag-names": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz",
+ "integrity": "sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==",
+ "dev": true,
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/wooorm"
+ }
+ },
+ "node_modules/mdn-data": {
+ "version": "2.12.1",
+ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.1.tgz",
+ "integrity": "sha512-rsfnCbOHjqrhWxwt5/wtSLzpoKTzW7OXdT5lLOIH1OTYhWu9rRJveGq0sKvDZODABH7RX+uoR+DYcpFnq4Tf6Q==",
+ "dev": true
+ },
+ "node_modules/mdurl": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz",
+ "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==",
+ "dev": true
+ },
+ "node_modules/media-typer": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
+ "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/memfs": {
+ "version": "3.5.3",
+ "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz",
+ "integrity": "sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==",
+ "dev": true,
+ "dependencies": {
+ "fs-monkey": "^1.0.4"
+ },
+ "engines": {
+ "node": ">= 4.0.0"
+ }
+ },
+ "node_modules/memize": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/memize/-/memize-2.1.0.tgz",
+ "integrity": "sha512-yywVJy8ctVlN5lNPxsep5urnZ6TTclwPEyigM9M3Bi8vseJBOfqNrGWN/r8NzuIt3PovM323W04blJfGQfQSVg=="
+ },
+ "node_modules/meow": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz",
+ "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==",
+ "dev": true,
+ "dependencies": {
+ "@types/minimist": "^1.2.0",
+ "camelcase-keys": "^6.2.2",
+ "decamelize": "^1.2.0",
+ "decamelize-keys": "^1.1.0",
+ "hard-rejection": "^2.1.0",
+ "minimist-options": "4.1.0",
+ "normalize-package-data": "^3.0.0",
+ "read-pkg-up": "^7.0.1",
+ "redent": "^3.0.0",
+ "trim-newlines": "^3.0.0",
+ "type-fest": "^0.18.0",
+ "yargs-parser": "^20.2.3"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/meow/node_modules/type-fest": {
+ "version": "0.18.1",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz",
+ "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/meow/node_modules/yargs-parser": {
+ "version": "20.2.9",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz",
+ "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/merge-deep": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/merge-deep/-/merge-deep-3.0.3.tgz",
+ "integrity": "sha512-qtmzAS6t6grwEkNrunqTBdn0qKwFgNWvlxUbAV8es9M7Ot1EbyApytCnvE0jALPa46ZpKDUo527kKiaWplmlFA==",
+ "dev": true,
+ "dependencies": {
+ "arr-union": "^3.1.0",
+ "clone-deep": "^0.2.4",
+ "kind-of": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/merge-descriptors": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz",
+ "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/merge-stream": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
+ "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
+ "dev": true
+ },
+ "node_modules/merge2": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
+ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/metaviewport-parser": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/metaviewport-parser/-/metaviewport-parser-0.3.0.tgz",
+ "integrity": "sha512-EoYJ8xfjQ6kpe9VbVHvZTZHiOl4HL1Z18CrZ+qahvLXT7ZO4YTC2JMyt5FaUp9JJp6J4Ybb/z7IsCXZt86/QkQ==",
+ "dev": true
+ },
+ "node_modules/methods": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
+ "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/micromatch": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz",
+ "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==",
+ "dev": true,
+ "dependencies": {
+ "braces": "^3.0.3",
+ "picomatch": "^2.3.1"
+ },
+ "engines": {
+ "node": ">=8.6"
+ }
+ },
+ "node_modules/mime": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz",
+ "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==",
+ "dev": true,
+ "bin": {
+ "mime": "cli.js"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mime-types": {
+ "version": "2.1.35",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "dev": true,
+ "dependencies": {
+ "mime-db": "1.52.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mimic-fn": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
+ "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/mimic-response": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz",
+ "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/min-indent": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz",
+ "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/mini-css-extract-plugin": {
+ "version": "2.9.2",
+ "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.2.tgz",
+ "integrity": "sha512-GJuACcS//jtq4kCtd5ii/M0SZf7OZRH+BxdqXZHaJfb8TJiVl+NgQRPwiYt2EuqeSkNydn/7vP+bcE27C5mb9w==",
+ "dev": true,
+ "dependencies": {
+ "schema-utils": "^4.0.0",
+ "tapable": "^2.2.1"
+ },
+ "engines": {
+ "node": ">= 12.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "webpack": "^5.0.0"
+ }
+ },
+ "node_modules/minimalistic-assert": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
+ "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==",
+ "dev": true
+ },
+ "node_modules/minimatch": {
+ "version": "9.0.3",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz",
+ "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/minimist": {
+ "version": "1.2.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
+ "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/minimist-options": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz",
+ "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==",
+ "dev": true,
+ "dependencies": {
+ "arrify": "^1.0.1",
+ "is-plain-obj": "^1.1.0",
+ "kind-of": "^6.0.3"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/minimist-options/node_modules/is-plain-obj": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
+ "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/minimist-options/node_modules/kind-of": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+ "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/mitt": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz",
+ "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==",
+ "dev": true
+ },
+ "node_modules/mixin-object": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/mixin-object/-/mixin-object-2.0.1.tgz",
+ "integrity": "sha512-ALGF1Jt9ouehcaXaHhn6t1yGWRqGaHkPFndtFVHfZXOvkIZ/yoGaSi0AHVTafb3ZBGg4dr/bDwnaEKqCXzchMA==",
+ "dev": true,
+ "dependencies": {
+ "for-in": "^0.1.3",
+ "is-extendable": "^0.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/mixin-object/node_modules/for-in": {
+ "version": "0.1.8",
+ "resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.8.tgz",
+ "integrity": "sha512-F0to7vbBSHP8E3l6dCjxNOLuSFAACIxFy3UehTUlG7svlXi37HHsDkyVcHo0Pq8QwrE+pXvWSVX3ZT1T9wAZ9g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/mkdirp": {
+ "version": "0.5.6",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
+ "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
+ "dev": true,
+ "dependencies": {
+ "minimist": "^1.2.6"
+ },
+ "bin": {
+ "mkdirp": "bin/cmd.js"
+ }
+ },
+ "node_modules/mkdirp-classic": {
+ "version": "0.5.3",
+ "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz",
+ "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==",
+ "dev": true
+ },
+ "node_modules/moment": {
+ "version": "2.30.1",
+ "resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz",
+ "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==",
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/moment-timezone": {
+ "version": "0.5.46",
+ "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.46.tgz",
+ "integrity": "sha512-ZXm9b36esbe7OmdABqIWJuBBiLLwAjrN7CE+7sYdCCx82Nabt1wHDj8TVseS59QIlfFPbOoiBPm6ca9BioG4hw==",
+ "dependencies": {
+ "moment": "^2.29.4"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/mousetrap": {
+ "version": "1.6.5",
+ "resolved": "https://registry.npmjs.org/mousetrap/-/mousetrap-1.6.5.tgz",
+ "integrity": "sha512-QNo4kEepaIBwiT8CDhP98umTetp+JNfQYBWvC1pc6/OAibuXtRcxZ58Qz8skvEHYvURne/7R8T5VoOI7rDsEUA=="
+ },
+ "node_modules/mrmime": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz",
+ "integrity": "sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/ms": {
+ "version": "2.1.3",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
+ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
+ },
+ "node_modules/multicast-dns": {
+ "version": "7.2.5",
+ "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz",
+ "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==",
+ "dev": true,
+ "dependencies": {
+ "dns-packet": "^5.2.2",
+ "thunky": "^1.0.2"
+ },
+ "bin": {
+ "multicast-dns": "cli.js"
+ }
+ },
+ "node_modules/mute-stream": {
+ "version": "0.0.8",
+ "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz",
+ "integrity": "sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==",
+ "dev": true
+ },
+ "node_modules/nanoid": {
+ "version": "3.3.7",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz",
+ "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
+ "node_modules/natural-compare": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
+ "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==",
+ "dev": true
+ },
+ "node_modules/negotiator": {
+ "version": "0.6.4",
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz",
+ "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/neo-async": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
+ "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
+ "dev": true
+ },
+ "node_modules/netmask": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz",
+ "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4.0"
+ }
+ },
+ "node_modules/no-case": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz",
+ "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==",
+ "dependencies": {
+ "lower-case": "^2.0.2",
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/node-addon-api": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz",
+ "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==",
+ "dev": true,
+ "optional": true
+ },
+ "node_modules/node-fetch": {
+ "version": "2.7.0",
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz",
+ "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==",
+ "dev": true,
+ "dependencies": {
+ "whatwg-url": "^5.0.0"
+ },
+ "engines": {
+ "node": "4.x || >=6.0.0"
+ },
+ "peerDependencies": {
+ "encoding": "^0.1.0"
+ },
+ "peerDependenciesMeta": {
+ "encoding": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/node-fetch/node_modules/tr46": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
+ "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==",
+ "dev": true
+ },
+ "node_modules/node-fetch/node_modules/webidl-conversions": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
+ "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==",
+ "dev": true
+ },
+ "node_modules/node-fetch/node_modules/whatwg-url": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
+ "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
+ "dev": true,
+ "dependencies": {
+ "tr46": "~0.0.3",
+ "webidl-conversions": "^3.0.0"
+ }
+ },
+ "node_modules/node-forge": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz",
+ "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 6.13.0"
+ }
+ },
+ "node_modules/node-int64": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz",
+ "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==",
+ "dev": true
+ },
+ "node_modules/node-releases": {
+ "version": "2.0.18",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz",
+ "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==",
+ "dev": true
+ },
+ "node_modules/normalize-package-data": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz",
+ "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==",
+ "dev": true,
+ "dependencies": {
+ "hosted-git-info": "^4.0.1",
+ "is-core-module": "^2.5.0",
+ "semver": "^7.3.4",
+ "validate-npm-package-license": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/normalize-package-data/node_modules/semver": {
+ "version": "7.6.3",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
+ "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/normalize-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/normalize-range": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz",
+ "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/normalize-url": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz",
+ "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/normalize-wheel": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/normalize-wheel/-/normalize-wheel-1.0.1.tgz",
+ "integrity": "sha512-1OnlAPZ3zgrk8B91HyRj+eVv+kS5u+Z0SCsak6Xil/kmgEia50ga7zfkumayonZrImffAxPU/5WcyGhzetHNPA=="
+ },
+ "node_modules/npm-bundled": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz",
+ "integrity": "sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ==",
+ "dev": true,
+ "dependencies": {
+ "npm-normalize-package-bin": "^1.0.1"
+ }
+ },
+ "node_modules/npm-normalize-package-bin": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz",
+ "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==",
+ "dev": true
+ },
+ "node_modules/npm-package-json-lint": {
+ "version": "6.4.0",
+ "resolved": "https://registry.npmjs.org/npm-package-json-lint/-/npm-package-json-lint-6.4.0.tgz",
+ "integrity": "sha512-cuXAJJB1Rdqz0UO6w524matlBqDBjcNt7Ru+RDIu4y6RI1gVqiWBnylrK8sPRk81gGBA0X8hJbDXolVOoTc+sA==",
+ "dev": true,
+ "dependencies": {
+ "ajv": "^6.12.6",
+ "ajv-errors": "^1.0.1",
+ "chalk": "^4.1.2",
+ "cosmiconfig": "^8.0.0",
+ "debug": "^4.3.4",
+ "globby": "^11.1.0",
+ "ignore": "^5.2.0",
+ "is-plain-obj": "^3.0.0",
+ "jsonc-parser": "^3.2.0",
+ "log-symbols": "^4.1.0",
+ "meow": "^9.0.0",
+ "plur": "^4.0.0",
+ "semver": "^7.3.8",
+ "slash": "^3.0.0",
+ "strip-json-comments": "^3.1.1",
+ "type-fest": "^3.2.0",
+ "validate-npm-package-name": "^5.0.0"
+ },
+ "bin": {
+ "npmPkgJsonLint": "dist/cli.js"
+ },
+ "engines": {
+ "node": ">=14.0.0",
+ "npm": ">=6.0.0"
+ }
+ },
+ "node_modules/npm-package-json-lint/node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true
+ },
+ "node_modules/npm-package-json-lint/node_modules/cosmiconfig": {
+ "version": "8.3.6",
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz",
+ "integrity": "sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA==",
+ "dev": true,
+ "dependencies": {
+ "import-fresh": "^3.3.0",
+ "js-yaml": "^4.1.0",
+ "parse-json": "^5.2.0",
+ "path-type": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/d-fischer"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.9.5"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/npm-package-json-lint/node_modules/js-yaml": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "dev": true,
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/npm-package-json-lint/node_modules/jsonc-parser": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz",
+ "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==",
+ "dev": true
+ },
+ "node_modules/npm-package-json-lint/node_modules/semver": {
+ "version": "7.6.3",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
+ "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/npm-package-json-lint/node_modules/type-fest": {
+ "version": "3.13.1",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz",
+ "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==",
+ "dev": true,
+ "engines": {
+ "node": ">=14.16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/npm-packlist": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-3.0.0.tgz",
+ "integrity": "sha512-L/cbzmutAwII5glUcf2DBRNY/d0TFd4e/FnaZigJV6JD85RHZXJFGwCndjMWiiViiWSsWt3tiOLpI3ByTnIdFQ==",
+ "dev": true,
+ "dependencies": {
+ "glob": "^7.1.6",
+ "ignore-walk": "^4.0.1",
+ "npm-bundled": "^1.1.1",
+ "npm-normalize-package-bin": "^1.0.1"
+ },
+ "bin": {
+ "npm-packlist": "bin/index.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/npm-run-path": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz",
+ "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==",
+ "dev": true,
+ "dependencies": {
+ "path-key": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/nth-check": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz",
+ "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==",
+ "dev": true,
+ "dependencies": {
+ "boolbase": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/nth-check?sponsor=1"
+ }
+ },
+ "node_modules/nwsapi": {
+ "version": "2.2.13",
+ "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.13.tgz",
+ "integrity": "sha512-cTGB9ptp9dY9A5VbMSe7fQBcl/tt22Vcqdq8+eN93rblOuE0aCFu4aZ2vMwct/2t+lFnosm8RkQW1I0Omb1UtQ==",
+ "dev": true
+ },
+ "node_modules/object-assign": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
+ "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/object-filter": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/object-filter/-/object-filter-1.0.2.tgz",
+ "integrity": "sha512-NahvP2vZcy1ZiiYah30CEPw0FpDcSkSePJBMpzl5EQgCmISijiGuJm3SPYp7U+Lf2TljyaIw3E5EgkEx/TNEVA==",
+ "dev": true
+ },
+ "node_modules/object-inspect": {
+ "version": "1.13.3",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz",
+ "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object-keys": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
+ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/object.assign": {
+ "version": "4.1.5",
+ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz",
+ "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==",
+ "dev": true,
+ "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",
+ "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.8.tgz",
+ "integrity": "sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==",
+ "dev": true,
+ "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",
+ "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz",
+ "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.2",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object.groupby": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz",
+ "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/object.values": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz",
+ "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==",
+ "dev": true,
+ "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/obuf": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz",
+ "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==",
+ "dev": true
+ },
+ "node_modules/on-finished": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
+ "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
+ "dev": true,
+ "dependencies": {
+ "ee-first": "1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/on-headers": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz",
+ "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/once": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
+ "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==",
+ "dev": true,
+ "dependencies": {
+ "wrappy": "1"
+ }
+ },
+ "node_modules/onetime": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz",
+ "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==",
+ "dev": true,
+ "dependencies": {
+ "mimic-fn": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/open": {
+ "version": "8.4.2",
+ "resolved": "https://registry.npmjs.org/open/-/open-8.4.2.tgz",
+ "integrity": "sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==",
+ "dev": true,
+ "dependencies": {
+ "define-lazy-prop": "^2.0.0",
+ "is-docker": "^2.1.1",
+ "is-wsl": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/opener": {
+ "version": "1.5.2",
+ "resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz",
+ "integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==",
+ "dev": true,
+ "bin": {
+ "opener": "bin/opener-bin.js"
+ }
+ },
+ "node_modules/optionator": {
+ "version": "0.9.4",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz",
+ "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==",
+ "dev": true,
+ "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/ora": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/ora/-/ora-4.1.1.tgz",
+ "integrity": "sha512-sjYP8QyVWBpBZWD6Vr1M/KwknSw6kJOz41tvGMlwWeClHBtYKTbHMki1PsLZnxKpXMPbTKv9b3pjQu3REib96A==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^3.0.0",
+ "cli-cursor": "^3.1.0",
+ "cli-spinners": "^2.2.0",
+ "is-interactive": "^1.0.0",
+ "log-symbols": "^3.0.0",
+ "mute-stream": "0.0.8",
+ "strip-ansi": "^6.0.0",
+ "wcwidth": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/ora/node_modules/chalk": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz",
+ "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ora/node_modules/color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "dev": true,
+ "dependencies": {
+ "color-name": "1.1.3"
+ }
+ },
+ "node_modules/ora/node_modules/color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
+ "dev": true
+ },
+ "node_modules/ora/node_modules/escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/ora/node_modules/has-flag": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
+ "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/ora/node_modules/log-symbols": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz",
+ "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==",
+ "dev": true,
+ "dependencies": {
+ "chalk": "^2.4.2"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ora/node_modules/log-symbols/node_modules/ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dev": true,
+ "dependencies": {
+ "color-convert": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/ora/node_modules/log-symbols/node_modules/chalk": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^3.2.1",
+ "escape-string-regexp": "^1.0.5",
+ "supports-color": "^5.3.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/ora/node_modules/log-symbols/node_modules/supports-color": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/os-homedir": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
+ "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/os-tmpdir": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
+ "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/p-cancelable": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz",
+ "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/p-limit": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
+ "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
+ "dev": true,
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-locate": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
+ "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
+ "dev": true,
+ "dependencies": {
+ "p-limit": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/p-locate/node_modules/p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "dev": true,
+ "dependencies": {
+ "p-try": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-map": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz",
+ "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/p-retry": {
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz",
+ "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==",
+ "dev": true,
+ "dependencies": {
+ "@types/retry": "0.12.0",
+ "retry": "^0.13.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/p-try": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
+ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/pac-proxy-agent": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.0.2.tgz",
+ "integrity": "sha512-BFi3vZnO9X5Qt6NRz7ZOaPja3ic0PhlsmCRYLOpN11+mWBCR6XJDqW5RF3j8jm4WGGQZtBA+bTfxYzeKW73eHg==",
+ "dev": true,
+ "dependencies": {
+ "@tootallnate/quickjs-emscripten": "^0.23.0",
+ "agent-base": "^7.0.2",
+ "debug": "^4.3.4",
+ "get-uri": "^6.0.1",
+ "http-proxy-agent": "^7.0.0",
+ "https-proxy-agent": "^7.0.5",
+ "pac-resolver": "^7.0.1",
+ "socks-proxy-agent": "^8.0.4"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/pac-proxy-agent/node_modules/agent-base": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz",
+ "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==",
+ "dev": true,
+ "dependencies": {
+ "debug": "^4.3.4"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/pac-proxy-agent/node_modules/http-proxy-agent": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz",
+ "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==",
+ "dev": true,
+ "dependencies": {
+ "agent-base": "^7.1.0",
+ "debug": "^4.3.4"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/pac-proxy-agent/node_modules/https-proxy-agent": {
+ "version": "7.0.5",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz",
+ "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==",
+ "dev": true,
+ "dependencies": {
+ "agent-base": "^7.0.2",
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/pac-resolver": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz",
+ "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==",
+ "dev": true,
+ "dependencies": {
+ "degenerator": "^5.0.0",
+ "netmask": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/param-case": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz",
+ "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==",
+ "dependencies": {
+ "dot-case": "^3.0.4",
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/parent-module": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
+ "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
+ "dependencies": {
+ "callsites": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/parse-cache-control": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz",
+ "integrity": "sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==",
+ "dev": true
+ },
+ "node_modules/parse-json": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
+ "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
+ "dependencies": {
+ "@babel/code-frame": "^7.0.0",
+ "error-ex": "^1.3.1",
+ "json-parse-even-better-errors": "^2.3.0",
+ "lines-and-columns": "^1.1.6"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/parse-passwd": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz",
+ "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/parse5": {
+ "version": "7.2.1",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz",
+ "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==",
+ "dev": true,
+ "dependencies": {
+ "entities": "^4.5.0"
+ },
+ "funding": {
+ "url": "https://github.com/inikulin/parse5?sponsor=1"
+ }
+ },
+ "node_modules/parsel-js": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/parsel-js/-/parsel-js-1.1.2.tgz",
+ "integrity": "sha512-D66DG2nKx4Yoq66TMEyCUHlR2STGqO7vsBrX7tgyS9cfQyO6XD5JyzOiflwmWN6a4wbUAqpmHqmrxlTQVGZcbA=="
+ },
+ "node_modules/parseurl": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
+ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/pascal-case": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz",
+ "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==",
+ "dependencies": {
+ "no-case": "^3.0.4",
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/path-case": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/path-case/-/path-case-3.0.4.tgz",
+ "integrity": "sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg==",
+ "dependencies": {
+ "dot-case": "^3.0.4",
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/path-exists": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
+ "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-is-absolute": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
+ "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/path-is-inside": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz",
+ "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==",
+ "dev": true
+ },
+ "node_modules/path-key": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
+ "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-parse": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
+ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
+ },
+ "node_modules/path-to-regexp": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz",
+ "integrity": "sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ=="
+ },
+ "node_modules/path-type": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
+ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/pend": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
+ "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==",
+ "dev": true
+ },
+ "node_modules/picocolors": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="
+ },
+ "node_modules/picomatch": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
+ "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/pify": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
+ "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/pinkie": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
+ "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/pinkie-promise": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
+ "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==",
+ "dev": true,
+ "dependencies": {
+ "pinkie": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/pirates": {
+ "version": "4.0.6",
+ "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz",
+ "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/pkg-dir": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz",
+ "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==",
+ "dev": true,
+ "dependencies": {
+ "find-up": "^6.3.0"
+ },
+ "engines": {
+ "node": ">=14.16"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/pkg-dir/node_modules/find-up": {
+ "version": "6.3.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz",
+ "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==",
+ "dev": true,
+ "dependencies": {
+ "locate-path": "^7.1.0",
+ "path-exists": "^5.0.0"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/pkg-dir/node_modules/locate-path": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz",
+ "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==",
+ "dev": true,
+ "dependencies": {
+ "p-locate": "^6.0.0"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/pkg-dir/node_modules/p-limit": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz",
+ "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==",
+ "dev": true,
+ "dependencies": {
+ "yocto-queue": "^1.0.0"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/pkg-dir/node_modules/p-locate": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz",
+ "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==",
+ "dev": true,
+ "dependencies": {
+ "p-limit": "^4.0.0"
+ },
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/pkg-dir/node_modules/path-exists": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz",
+ "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==",
+ "dev": true,
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ }
+ },
+ "node_modules/pkg-dir/node_modules/yocto-queue": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz",
+ "integrity": "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==",
+ "dev": true,
+ "engines": {
+ "node": ">=12.20"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/playwright": {
+ "version": "1.48.2",
+ "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.48.2.tgz",
+ "integrity": "sha512-NjYvYgp4BPmiwfe31j4gHLa3J7bD2WiBz8Lk2RoSsmX38SVIARZ18VYjxLjAcDsAhA+F4iSEXTSGgjua0rrlgQ==",
+ "dev": true,
+ "peer": true,
+ "dependencies": {
+ "playwright-core": "1.48.2"
+ },
+ "bin": {
+ "playwright": "cli.js"
+ },
+ "engines": {
+ "node": ">=18"
+ },
+ "optionalDependencies": {
+ "fsevents": "2.3.2"
+ }
+ },
+ "node_modules/playwright-core": {
+ "version": "1.48.2",
+ "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.48.2.tgz",
+ "integrity": "sha512-sjjw+qrLFlriJo64du+EK0kJgZzoQPsabGF4lBvsid+3CNIZIYLgnMj9V6JY5VhM2Peh20DJWIVpVljLLnlawA==",
+ "dev": true,
+ "peer": true,
+ "bin": {
+ "playwright-core": "cli.js"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/playwright/node_modules/fsevents": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
+ "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
+ "dev": true,
+ "hasInstallScript": true,
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "peer": true,
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/plur": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/plur/-/plur-4.0.0.tgz",
+ "integrity": "sha512-4UGewrYgqDFw9vV6zNV+ADmPAUAfJPKtGvb/VdpQAx25X5f3xXdGdyOEVFwkl8Hl/tl7+xbeHqSEM+D5/TirUg==",
+ "dev": true,
+ "dependencies": {
+ "irregular-plurals": "^3.2.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/possible-typed-array-names": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz",
+ "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/postcss": {
+ "version": "8.4.49",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz",
+ "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==",
+ "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"
+ }
+ ],
+ "dependencies": {
+ "nanoid": "^3.3.7",
+ "picocolors": "^1.1.1",
+ "source-map-js": "^1.2.1"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/postcss-calc": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-9.0.1.tgz",
+ "integrity": "sha512-TipgjGyzP5QzEhsOZUaIkeO5mKeMFpebWzRogWG/ysonUlnHcq5aJe0jOjpfzUU8PeSaBQnrE8ehR0QA5vs8PQ==",
+ "dev": true,
+ "dependencies": {
+ "postcss-selector-parser": "^6.0.11",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^14 || ^16 || >=18.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.2.2"
+ }
+ },
+ "node_modules/postcss-colormin": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-6.1.0.tgz",
+ "integrity": "sha512-x9yX7DOxeMAR+BgGVnNSAxmAj98NX/YxEMNFP+SDCEeNLb2r3i6Hh1ksMsnW8Ub5SLCpbescQqn9YEbE9554Sw==",
+ "dev": true,
+ "dependencies": {
+ "browserslist": "^4.23.0",
+ "caniuse-api": "^3.0.0",
+ "colord": "^2.9.3",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^14 || ^16 || >=18.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.31"
+ }
+ },
+ "node_modules/postcss-convert-values": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-6.1.0.tgz",
+ "integrity": "sha512-zx8IwP/ts9WvUM6NkVSkiU902QZL1bwPhaVaLynPtCsOTqp+ZKbNi+s6XJg3rfqpKGA/oc7Oxk5t8pOQJcwl/w==",
+ "dev": true,
+ "dependencies": {
+ "browserslist": "^4.23.0",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^14 || ^16 || >=18.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.31"
+ }
+ },
+ "node_modules/postcss-discard-comments": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-6.0.2.tgz",
+ "integrity": "sha512-65w/uIqhSBBfQmYnG92FO1mWZjJ4GL5b8atm5Yw2UgrwD7HiNiSSNwJor1eCFGzUgYnN/iIknhNRVqjrrpuglw==",
+ "dev": true,
+ "engines": {
+ "node": "^14 || ^16 || >=18.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.31"
+ }
+ },
+ "node_modules/postcss-discard-duplicates": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-6.0.3.tgz",
+ "integrity": "sha512-+JA0DCvc5XvFAxwx6f/e68gQu/7Z9ud584VLmcgto28eB8FqSFZwtrLwB5Kcp70eIoWP/HXqz4wpo8rD8gpsTw==",
+ "dev": true,
+ "engines": {
+ "node": "^14 || ^16 || >=18.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.31"
+ }
+ },
+ "node_modules/postcss-discard-empty": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-6.0.3.tgz",
+ "integrity": "sha512-znyno9cHKQsK6PtxL5D19Fj9uwSzC2mB74cpT66fhgOadEUPyXFkbgwm5tvc3bt3NAy8ltE5MrghxovZRVnOjQ==",
+ "dev": true,
+ "engines": {
+ "node": "^14 || ^16 || >=18.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.31"
+ }
+ },
+ "node_modules/postcss-discard-overridden": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-6.0.2.tgz",
+ "integrity": "sha512-j87xzI4LUggC5zND7KdjsI25APtyMuynXZSujByMaav2roV6OZX+8AaCUcZSWqckZpjAjRyFDdpqybgjFO0HJQ==",
+ "dev": true,
+ "engines": {
+ "node": "^14 || ^16 || >=18.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.31"
+ }
+ },
+ "node_modules/postcss-import": {
+ "version": "16.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-16.1.0.tgz",
+ "integrity": "sha512-7hsAZ4xGXl4MW+OKEWCnF6T5jqBw80/EE9aXg1r2yyn1RsVEU8EtKXbijEODa+rg7iih4bKf7vlvTGYR4CnPNg==",
+ "dev": true,
+ "dependencies": {
+ "postcss-value-parser": "^4.0.0",
+ "read-cache": "^1.0.0",
+ "resolve": "^1.1.7"
+ },
+ "engines": {
+ "node": ">=18.0.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.0.0"
+ }
+ },
+ "node_modules/postcss-loader": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.2.1.tgz",
+ "integrity": "sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==",
+ "dev": true,
+ "dependencies": {
+ "cosmiconfig": "^7.0.0",
+ "klona": "^2.0.5",
+ "semver": "^7.3.5"
+ },
+ "engines": {
+ "node": ">= 12.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "postcss": "^7.0.0 || ^8.0.1",
+ "webpack": "^5.0.0"
+ }
+ },
+ "node_modules/postcss-loader/node_modules/semver": {
+ "version": "7.6.3",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz",
+ "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/postcss-media-query-parser": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz",
+ "integrity": "sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig==",
+ "dev": true
+ },
+ "node_modules/postcss-merge-longhand": {
+ "version": "6.0.5",
+ "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-6.0.5.tgz",
+ "integrity": "sha512-5LOiordeTfi64QhICp07nzzuTDjNSO8g5Ksdibt44d+uvIIAE1oZdRn8y/W5ZtYgRH/lnLDlvi9F8btZcVzu3w==",
+ "dev": true,
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0",
+ "stylehacks": "^6.1.1"
+ },
+ "engines": {
+ "node": "^14 || ^16 || >=18.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.31"
+ }
+ },
+ "node_modules/postcss-merge-rules": {
+ "version": "6.1.1",
+ "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-6.1.1.tgz",
+ "integrity": "sha512-KOdWF0gju31AQPZiD+2Ar9Qjowz1LTChSjFFbS+e2sFgc4uHOp3ZvVX4sNeTlk0w2O31ecFGgrFzhO0RSWbWwQ==",
+ "dev": true,
+ "dependencies": {
+ "browserslist": "^4.23.0",
+ "caniuse-api": "^3.0.0",
+ "cssnano-utils": "^4.0.2",
+ "postcss-selector-parser": "^6.0.16"
+ },
+ "engines": {
+ "node": "^14 || ^16 || >=18.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.31"
+ }
+ },
+ "node_modules/postcss-minify-font-values": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-6.1.0.tgz",
+ "integrity": "sha512-gklfI/n+9rTh8nYaSJXlCo3nOKqMNkxuGpTn/Qm0gstL3ywTr9/WRKznE+oy6fvfolH6dF+QM4nCo8yPLdvGJg==",
+ "dev": true,
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^14 || ^16 || >=18.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.31"
+ }
+ },
+ "node_modules/postcss-minify-gradients": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-6.0.3.tgz",
+ "integrity": "sha512-4KXAHrYlzF0Rr7uc4VrfwDJ2ajrtNEpNEuLxFgwkhFZ56/7gaE4Nr49nLsQDZyUe+ds+kEhf+YAUolJiYXF8+Q==",
+ "dev": true,
+ "dependencies": {
+ "colord": "^2.9.3",
+ "cssnano-utils": "^4.0.2",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^14 || ^16 || >=18.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.31"
+ }
+ },
+ "node_modules/postcss-minify-params": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-6.1.0.tgz",
+ "integrity": "sha512-bmSKnDtyyE8ujHQK0RQJDIKhQ20Jq1LYiez54WiaOoBtcSuflfK3Nm596LvbtlFcpipMjgClQGyGr7GAs+H1uA==",
+ "dev": true,
+ "dependencies": {
+ "browserslist": "^4.23.0",
+ "cssnano-utils": "^4.0.2",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^14 || ^16 || >=18.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.31"
+ }
+ },
+ "node_modules/postcss-minify-selectors": {
+ "version": "6.0.4",
+ "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-6.0.4.tgz",
+ "integrity": "sha512-L8dZSwNLgK7pjTto9PzWRoMbnLq5vsZSTu8+j1P/2GB8qdtGQfn+K1uSvFgYvgh83cbyxT5m43ZZhUMTJDSClQ==",
+ "dev": true,
+ "dependencies": {
+ "postcss-selector-parser": "^6.0.16"
+ },
+ "engines": {
+ "node": "^14 || ^16 || >=18.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.31"
+ }
+ },
+ "node_modules/postcss-modules-extract-imports": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz",
+ "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==",
+ "dev": true,
+ "engines": {
+ "node": "^10 || ^12 || >= 14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/postcss-modules-local-by-default": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.1.0.tgz",
+ "integrity": "sha512-rm0bdSv4jC3BDma3s9H19ZddW0aHX6EoqwDYU2IfZhRN+53QrufTRo2IdkAbRqLx4R2IYbZnbjKKxg4VN5oU9Q==",
+ "dev": true,
+ "dependencies": {
+ "icss-utils": "^5.0.0",
+ "postcss-selector-parser": "^7.0.0",
+ "postcss-value-parser": "^4.1.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >= 14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/postcss-modules-local-by-default/node_modules/postcss-selector-parser": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz",
+ "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==",
+ "dev": true,
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/postcss-modules-scope": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz",
+ "integrity": "sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA==",
+ "dev": true,
+ "dependencies": {
+ "postcss-selector-parser": "^7.0.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >= 14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/postcss-modules-scope/node_modules/postcss-selector-parser": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz",
+ "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==",
+ "dev": true,
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/postcss-modules-values": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz",
+ "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==",
+ "dev": true,
+ "dependencies": {
+ "icss-utils": "^5.0.0"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >= 14"
+ },
+ "peerDependencies": {
+ "postcss": "^8.1.0"
+ }
+ },
+ "node_modules/postcss-normalize-charset": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-6.0.2.tgz",
+ "integrity": "sha512-a8N9czmdnrjPHa3DeFlwqst5eaL5W8jYu3EBbTTkI5FHkfMhFZh1EGbku6jhHhIzTA6tquI2P42NtZ59M/H/kQ==",
+ "dev": true,
+ "engines": {
+ "node": "^14 || ^16 || >=18.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.31"
+ }
+ },
+ "node_modules/postcss-normalize-display-values": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-6.0.2.tgz",
+ "integrity": "sha512-8H04Mxsb82ON/aAkPeq8kcBbAtI5Q2a64X/mnRRfPXBq7XeogoQvReqxEfc0B4WPq1KimjezNC8flUtC3Qz6jg==",
+ "dev": true,
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^14 || ^16 || >=18.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.31"
+ }
+ },
+ "node_modules/postcss-normalize-positions": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-6.0.2.tgz",
+ "integrity": "sha512-/JFzI441OAB9O7VnLA+RtSNZvQ0NCFZDOtp6QPFo1iIyawyXg0YI3CYM9HBy1WvwCRHnPep/BvI1+dGPKoXx/Q==",
+ "dev": true,
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^14 || ^16 || >=18.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.31"
+ }
+ },
+ "node_modules/postcss-normalize-repeat-style": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-6.0.2.tgz",
+ "integrity": "sha512-YdCgsfHkJ2jEXwR4RR3Tm/iOxSfdRt7jplS6XRh9Js9PyCR/aka/FCb6TuHT2U8gQubbm/mPmF6L7FY9d79VwQ==",
+ "dev": true,
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^14 || ^16 || >=18.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.31"
+ }
+ },
+ "node_modules/postcss-normalize-string": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-6.0.2.tgz",
+ "integrity": "sha512-vQZIivlxlfqqMp4L9PZsFE4YUkWniziKjQWUtsxUiVsSSPelQydwS8Wwcuw0+83ZjPWNTl02oxlIvXsmmG+CiQ==",
+ "dev": true,
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^14 || ^16 || >=18.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.31"
+ }
+ },
+ "node_modules/postcss-normalize-timing-functions": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-6.0.2.tgz",
+ "integrity": "sha512-a+YrtMox4TBtId/AEwbA03VcJgtyW4dGBizPl7e88cTFULYsprgHWTbfyjSLyHeBcK/Q9JhXkt2ZXiwaVHoMzA==",
+ "dev": true,
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^14 || ^16 || >=18.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.31"
+ }
+ },
+ "node_modules/postcss-normalize-unicode": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-6.1.0.tgz",
+ "integrity": "sha512-QVC5TQHsVj33otj8/JD869Ndr5Xcc/+fwRh4HAsFsAeygQQXm+0PySrKbr/8tkDKzW+EVT3QkqZMfFrGiossDg==",
+ "dev": true,
+ "dependencies": {
+ "browserslist": "^4.23.0",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^14 || ^16 || >=18.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.31"
+ }
+ },
+ "node_modules/postcss-normalize-url": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-6.0.2.tgz",
+ "integrity": "sha512-kVNcWhCeKAzZ8B4pv/DnrU1wNh458zBNp8dh4y5hhxih5RZQ12QWMuQrDgPRw3LRl8mN9vOVfHl7uhvHYMoXsQ==",
+ "dev": true,
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^14 || ^16 || >=18.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.31"
+ }
+ },
+ "node_modules/postcss-normalize-whitespace": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-6.0.2.tgz",
+ "integrity": "sha512-sXZ2Nj1icbJOKmdjXVT9pnyHQKiSAyuNQHSgRCUgThn2388Y9cGVDR+E9J9iAYbSbLHI+UUwLVl1Wzco/zgv0Q==",
+ "dev": true,
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^14 || ^16 || >=18.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.31"
+ }
+ },
+ "node_modules/postcss-ordered-values": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-6.0.2.tgz",
+ "integrity": "sha512-VRZSOB+JU32RsEAQrO94QPkClGPKJEL/Z9PCBImXMhIeK5KAYo6slP/hBYlLgrCjFxyqvn5VC81tycFEDBLG1Q==",
+ "dev": true,
+ "dependencies": {
+ "cssnano-utils": "^4.0.2",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^14 || ^16 || >=18.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.31"
+ }
+ },
+ "node_modules/postcss-prefix-selector": {
+ "version": "1.16.1",
+ "resolved": "https://registry.npmjs.org/postcss-prefix-selector/-/postcss-prefix-selector-1.16.1.tgz",
+ "integrity": "sha512-Umxu+FvKMwlY6TyDzGFoSUnzW+NOfMBLyC1tAkIjgX+Z/qGspJeRjVC903D7mx7TuBpJlwti2ibXtWuA7fKMeQ==",
+ "peerDependencies": {
+ "postcss": ">4 <9"
+ }
+ },
+ "node_modules/postcss-reduce-initial": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-6.1.0.tgz",
+ "integrity": "sha512-RarLgBK/CrL1qZags04oKbVbrrVK2wcxhvta3GCxrZO4zveibqbRPmm2VI8sSgCXwoUHEliRSbOfpR0b/VIoiw==",
+ "dev": true,
+ "dependencies": {
+ "browserslist": "^4.23.0",
+ "caniuse-api": "^3.0.0"
+ },
+ "engines": {
+ "node": "^14 || ^16 || >=18.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.31"
+ }
+ },
+ "node_modules/postcss-reduce-transforms": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-6.0.2.tgz",
+ "integrity": "sha512-sB+Ya++3Xj1WaT9+5LOOdirAxP7dJZms3GRcYheSPi1PiTMigsxHAdkrbItHxwYHr4kt1zL7mmcHstgMYT+aiA==",
+ "dev": true,
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": "^14 || ^16 || >=18.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.31"
+ }
+ },
+ "node_modules/postcss-resolve-nested-selector": {
+ "version": "0.1.6",
+ "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.6.tgz",
+ "integrity": "sha512-0sglIs9Wmkzbr8lQwEyIzlDOOC9bGmfVKcJTaxv3vMmd3uo4o4DerC3En0bnmgceeql9BfC8hRkp7cg0fjdVqw==",
+ "dev": true
+ },
+ "node_modules/postcss-safe-parser": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-7.0.1.tgz",
+ "integrity": "sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss-safe-parser"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "engines": {
+ "node": ">=18.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.31"
+ }
+ },
+ "node_modules/postcss-scss": {
+ "version": "4.0.9",
+ "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.9.tgz",
+ "integrity": "sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss-scss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "engines": {
+ "node": ">=12.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.29"
+ }
+ },
+ "node_modules/postcss-selector-parser": {
+ "version": "6.1.2",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz",
+ "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==",
+ "dev": true,
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/postcss-svgo": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-6.0.3.tgz",
+ "integrity": "sha512-dlrahRmxP22bX6iKEjOM+c8/1p+81asjKT+V5lrgOH944ryx/OHpclnIbGsKVd3uWOXFLYJwCVf0eEkJGvO96g==",
+ "dev": true,
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0",
+ "svgo": "^3.2.0"
+ },
+ "engines": {
+ "node": "^14 || ^16 || >= 18"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.31"
+ }
+ },
+ "node_modules/postcss-unique-selectors": {
+ "version": "6.0.4",
+ "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-6.0.4.tgz",
+ "integrity": "sha512-K38OCaIrO8+PzpArzkLKB42dSARtC2tmG6PvD4b1o1Q2E9Os8jzfWFfSy/rixsHwohtsDdFtAWGjFVFUdwYaMg==",
+ "dev": true,
+ "dependencies": {
+ "postcss-selector-parser": "^6.0.16"
+ },
+ "engines": {
+ "node": "^14 || ^16 || >=18.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.31"
+ }
+ },
+ "node_modules/postcss-urlrebase": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/postcss-urlrebase/-/postcss-urlrebase-1.4.0.tgz",
+ "integrity": "sha512-rRaxMmWvXrn8Rk1PqsxmaJwldRHsr0WbbASKKCZYxXwotHkM/5X/6IrwaEe8pdzpbNGCEY86yhYMN0MhgOkADA==",
+ "dependencies": {
+ "postcss-value-parser": "^4.2.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.3.0"
+ }
+ },
+ "node_modules/postcss-value-parser": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
+ "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ=="
+ },
+ "node_modules/prelude-ls": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
+ "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/prettier": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz",
+ "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==",
+ "dev": true,
+ "peer": true,
+ "bin": {
+ "prettier": "bin/prettier.cjs"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/prettier/prettier?sponsor=1"
+ }
+ },
+ "node_modules/prettier-linter-helpers": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz",
+ "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==",
+ "dev": true,
+ "dependencies": {
+ "fast-diff": "^1.1.2"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/pretty-format": {
+ "version": "29.7.0",
+ "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-29.7.0.tgz",
+ "integrity": "sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==",
+ "dev": true,
+ "dependencies": {
+ "@jest/schemas": "^29.6.3",
+ "ansi-styles": "^5.0.0",
+ "react-is": "^18.0.0"
+ },
+ "engines": {
+ "node": "^14.15.0 || ^16.10.0 || >=18.0.0"
+ }
+ },
+ "node_modules/pretty-format/node_modules/ansi-styles": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz",
+ "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/process-nextick-args": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
+ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
+ "dev": true
+ },
+ "node_modules/progress": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
+ "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/prompts": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz",
+ "integrity": "sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==",
+ "dev": true,
+ "dependencies": {
+ "kleur": "^3.0.3",
+ "sisteransi": "^1.0.5"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/prop-types": {
+ "version": "15.8.1",
+ "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz",
+ "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==",
+ "dependencies": {
+ "loose-envify": "^1.4.0",
+ "object-assign": "^4.1.1",
+ "react-is": "^16.13.1"
+ }
+ },
+ "node_modules/prop-types/node_modules/react-is": {
+ "version": "16.13.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
+ "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
+ },
+ "node_modules/proxy-addr": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
+ "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
+ "dev": true,
+ "dependencies": {
+ "forwarded": "0.2.0",
+ "ipaddr.js": "1.9.1"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/proxy-addr/node_modules/ipaddr.js": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
+ "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/proxy-agent": {
+ "version": "6.4.0",
+ "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.4.0.tgz",
+ "integrity": "sha512-u0piLU+nCOHMgGjRbimiXmA9kM/L9EHh3zL81xCdp7m+Y2pHIsnmbdDoEDoAz5geaonNR6q6+yOPQs6n4T6sBQ==",
+ "dev": true,
+ "dependencies": {
+ "agent-base": "^7.0.2",
+ "debug": "^4.3.4",
+ "http-proxy-agent": "^7.0.1",
+ "https-proxy-agent": "^7.0.3",
+ "lru-cache": "^7.14.1",
+ "pac-proxy-agent": "^7.0.1",
+ "proxy-from-env": "^1.1.0",
+ "socks-proxy-agent": "^8.0.2"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/proxy-agent/node_modules/agent-base": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz",
+ "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==",
+ "dev": true,
+ "dependencies": {
+ "debug": "^4.3.4"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/proxy-agent/node_modules/http-proxy-agent": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz",
+ "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==",
+ "dev": true,
+ "dependencies": {
+ "agent-base": "^7.1.0",
+ "debug": "^4.3.4"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/proxy-agent/node_modules/https-proxy-agent": {
+ "version": "7.0.5",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz",
+ "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==",
+ "dev": true,
+ "dependencies": {
+ "agent-base": "^7.0.2",
+ "debug": "4"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/proxy-agent/node_modules/lru-cache": {
+ "version": "7.18.3",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz",
+ "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/proxy-from-env": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz",
+ "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
+ "dev": true
+ },
+ "node_modules/ps-list": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/ps-list/-/ps-list-8.1.1.tgz",
+ "integrity": "sha512-OPS9kEJYVmiO48u/B9qneqhkMvgCxT+Tm28VCEJpheTpl8cJ0ffZRRNgS5mrQRTrX5yRTpaJ+hRDeefXYmmorQ==",
+ "dev": true,
+ "engines": {
+ "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/pseudomap": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
+ "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==",
+ "dev": true
+ },
+ "node_modules/psl": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/psl/-/psl-1.10.0.tgz",
+ "integrity": "sha512-KSKHEbjAnpUuAUserOq0FxGXCUrzC3WniuSJhvdbs102rL55266ZcHBqLWOsG30spQMlPdpy7icATiAQehg/iA==",
+ "dev": true,
+ "dependencies": {
+ "punycode": "^2.3.1"
+ }
+ },
+ "node_modules/pump": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.2.tgz",
+ "integrity": "sha512-tUPXtzlGM8FE3P0ZL6DVs/3P58k9nk8/jZeQCurTJylQA8qFYzHFfhBJkuqyE0FifOsQ0uKWekiZ5g8wtr28cw==",
+ "dev": true,
+ "dependencies": {
+ "end-of-stream": "^1.1.0",
+ "once": "^1.3.1"
+ }
+ },
+ "node_modules/punycode": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
+ "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/puppeteer-core": {
+ "version": "23.7.1",
+ "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-23.7.1.tgz",
+ "integrity": "sha512-Om/qCZhd+HLoAr7GltrRAZpS3uOXwHu7tXAoDbNcJADHjG2zeAlDArgyIPXYGG4QB/EQUHk13Q6RklNxGM73Pg==",
+ "dev": true,
+ "dependencies": {
+ "@puppeteer/browsers": "2.4.1",
+ "chromium-bidi": "0.8.0",
+ "debug": "^4.3.7",
+ "devtools-protocol": "0.0.1354347",
+ "typed-query-selector": "^2.12.0",
+ "ws": "^8.18.0"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/puppeteer-core/node_modules/devtools-protocol": {
+ "version": "0.0.1354347",
+ "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1354347.tgz",
+ "integrity": "sha512-BlmkSqV0V84E2WnEnoPnwyix57rQxAM5SKJjf4TbYOCGLAWtz8CDH8RIaGOjPgPCXo2Mce3kxSY497OySidY3Q==",
+ "dev": true
+ },
+ "node_modules/pure-rand": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-6.1.0.tgz",
+ "integrity": "sha512-bVWawvoZoBYpp6yIoQtQXHZjmz35RSVHnUOTefl8Vcjr8snTPY1wnpSPMWekcFwbxI6gtmT7rSYPFvz71ldiOA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/dubzzz"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/fast-check"
+ }
+ ]
+ },
+ "node_modules/qs": {
+ "version": "6.13.0",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz",
+ "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==",
+ "dev": true,
+ "dependencies": {
+ "side-channel": "^1.0.6"
+ },
+ "engines": {
+ "node": ">=0.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/querystringify": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz",
+ "integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==",
+ "dev": true
+ },
+ "node_modules/queue-microtask": {
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
+ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/queue-tick": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz",
+ "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==",
+ "dev": true
+ },
+ "node_modules/quick-lru": {
+ "version": "5.1.1",
+ "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-5.1.1.tgz",
+ "integrity": "sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/randombytes": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
+ "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
+ "dependencies": {
+ "safe-buffer": "^5.1.0"
+ }
+ },
+ "node_modules/range-parser": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
+ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/raw-body": {
+ "version": "2.5.2",
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz",
+ "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==",
+ "dev": true,
+ "dependencies": {
+ "bytes": "3.1.2",
+ "http-errors": "2.0.0",
+ "iconv-lite": "0.4.24",
+ "unpipe": "1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/raw-body/node_modules/iconv-lite": {
+ "version": "0.4.24",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+ "dev": true,
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/re-resizable": {
+ "version": "6.10.1",
+ "resolved": "https://registry.npmjs.org/re-resizable/-/re-resizable-6.10.1.tgz",
+ "integrity": "sha512-m33nSWRH57UZLmep5M/LatkZ2NRqimVD/bOOpvymw5Zf33+eTSEixsUugscOZzAtK0/nx+OSuOf8VbKJx/4ptw==",
+ "peerDependencies": {
+ "react": "^16.13.1 || ^17.0.0 || ^18.0.0",
+ "react-dom": "^16.13.1 || ^17.0.0 || ^18.0.0"
+ }
+ },
+ "node_modules/react": {
+ "version": "18.3.1",
+ "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz",
+ "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==",
+ "dependencies": {
+ "loose-envify": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/react-autosize-textarea": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/react-autosize-textarea/-/react-autosize-textarea-7.1.0.tgz",
+ "integrity": "sha512-BHpjCDkuOlllZn3nLazY2F8oYO1tS2jHnWhcjTWQdcKiiMU6gHLNt/fzmqMSyerR0eTdKtfSIqtSeTtghNwS+g==",
+ "dependencies": {
+ "autosize": "^4.0.2",
+ "line-height": "^0.3.1",
+ "prop-types": "^15.5.6"
+ },
+ "peerDependencies": {
+ "react": "^0.14.0 || ^15.0.0 || ^16.0.0",
+ "react-dom": "^0.14.0 || ^15.0.0 || ^16.0.0"
+ }
+ },
+ "node_modules/react-colorful": {
+ "version": "5.6.1",
+ "resolved": "https://registry.npmjs.org/react-colorful/-/react-colorful-5.6.1.tgz",
+ "integrity": "sha512-1exovf0uGTGyq5mXQT0zgQ80uvj2PCwvF8zY1RN9/vbJVSjSo3fsB/4L3ObbF7u70NduSiK4xu4Y6q1MHoUGEw==",
+ "peerDependencies": {
+ "react": ">=16.8.0",
+ "react-dom": ">=16.8.0"
+ }
+ },
+ "node_modules/react-dom": {
+ "version": "18.3.1",
+ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz",
+ "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==",
+ "dependencies": {
+ "loose-envify": "^1.1.0",
+ "scheduler": "^0.23.2"
+ },
+ "peerDependencies": {
+ "react": "^18.3.1"
+ }
+ },
+ "node_modules/react-easy-crop": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/react-easy-crop/-/react-easy-crop-5.1.0.tgz",
+ "integrity": "sha512-UsYeF/N7zoqtfOSD+2xSt1nRaoBYCI2YLkzmq+hi+aVepS4/bAMhbrLwJtDAP60jsVzWRiQCX7JG+ZtfWcHsiw==",
+ "dependencies": {
+ "normalize-wheel": "^1.0.1",
+ "tslib": "^2.0.1"
+ },
+ "peerDependencies": {
+ "react": ">=16.4.0",
+ "react-dom": ">=16.4.0"
+ }
+ },
+ "node_modules/react-is": {
+ "version": "18.3.1",
+ "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
+ "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg=="
+ },
+ "node_modules/react-refresh": {
+ "version": "0.14.2",
+ "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz",
+ "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/react-remove-scroll": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.6.0.tgz",
+ "integrity": "sha512-I2U4JVEsQenxDAKaVa3VZ/JeJZe0/2DxPWL8Tj8yLKctQJQiZM52pn/GWFpSp8dftjM3pSAHVJZscAnC/y+ySQ==",
+ "dependencies": {
+ "react-remove-scroll-bar": "^2.3.6",
+ "react-style-singleton": "^2.2.1",
+ "tslib": "^2.1.0",
+ "use-callback-ref": "^1.3.0",
+ "use-sidecar": "^1.1.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/react-remove-scroll-bar": {
+ "version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.6.tgz",
+ "integrity": "sha512-DtSYaao4mBmX+HDo5YWYdBWQwYIQQshUV/dVxFxK+KM26Wjwp1gZ6rv6OC3oujI6Bfu6Xyg3TwK533AQutsn/g==",
+ "dependencies": {
+ "react-style-singleton": "^2.2.1",
+ "tslib": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/react-style-singleton": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/react-style-singleton/-/react-style-singleton-2.2.1.tgz",
+ "integrity": "sha512-ZWj0fHEMyWkHzKYUr2Bs/4zU6XLmq9HsgBURm7g5pAVfyn49DgUiNgY2d4lXRlYSiCif9YBGpQleewkcqddc7g==",
+ "dependencies": {
+ "get-nonce": "^1.0.0",
+ "invariant": "^2.2.4",
+ "tslib": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/react-transition-group": {
+ "version": "4.4.5",
+ "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz",
+ "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==",
+ "dependencies": {
+ "@babel/runtime": "^7.5.5",
+ "dom-helpers": "^5.0.1",
+ "loose-envify": "^1.4.0",
+ "prop-types": "^15.6.2"
+ },
+ "peerDependencies": {
+ "react": ">=16.6.0",
+ "react-dom": ">=16.6.0"
+ }
+ },
+ "node_modules/read-cache": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
+ "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==",
+ "dev": true,
+ "dependencies": {
+ "pify": "^2.3.0"
+ }
+ },
+ "node_modules/read-cache/node_modules/pify": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
+ "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/read-pkg": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
+ "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==",
+ "dev": true,
+ "dependencies": {
+ "@types/normalize-package-data": "^2.4.0",
+ "normalize-package-data": "^2.5.0",
+ "parse-json": "^5.0.0",
+ "type-fest": "^0.6.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/read-pkg-up": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz",
+ "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==",
+ "dev": true,
+ "dependencies": {
+ "find-up": "^4.1.0",
+ "read-pkg": "^5.2.0",
+ "type-fest": "^0.8.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/read-pkg-up/node_modules/type-fest": {
+ "version": "0.8.1",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
+ "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/read-pkg/node_modules/hosted-git-info": {
+ "version": "2.8.9",
+ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
+ "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==",
+ "dev": true
+ },
+ "node_modules/read-pkg/node_modules/normalize-package-data": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
+ "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
+ "dev": true,
+ "dependencies": {
+ "hosted-git-info": "^2.1.4",
+ "resolve": "^1.10.0",
+ "semver": "2 || 3 || 4 || 5",
+ "validate-npm-package-license": "^3.0.1"
+ }
+ },
+ "node_modules/read-pkg/node_modules/semver": {
+ "version": "5.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
+ "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver"
+ }
+ },
+ "node_modules/read-pkg/node_modules/type-fest": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz",
+ "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/readable-stream": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz",
+ "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==",
+ "dev": true,
+ "dependencies": {
+ "core-util-is": "~1.0.0",
+ "inherits": "~2.0.3",
+ "isarray": "~1.0.0",
+ "process-nextick-args": "~2.0.0",
+ "safe-buffer": "~5.1.1",
+ "string_decoder": "~1.1.1",
+ "util-deprecate": "~1.0.1"
+ }
+ },
+ "node_modules/readable-stream/node_modules/safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+ "dev": true
+ },
+ "node_modules/readdirp": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.0.2.tgz",
+ "integrity": "sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 14.16.0"
+ },
+ "funding": {
+ "type": "individual",
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/rechoir": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz",
+ "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==",
+ "dev": true,
+ "dependencies": {
+ "resolve": "^1.20.0"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ }
+ },
+ "node_modules/redent": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz",
+ "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==",
+ "dev": true,
+ "dependencies": {
+ "indent-string": "^4.0.0",
+ "strip-indent": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/redux": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/redux/-/redux-4.2.1.tgz",
+ "integrity": "sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w==",
+ "dependencies": {
+ "@babel/runtime": "^7.9.2"
+ }
+ },
+ "node_modules/reflect.getprototypeof": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.6.tgz",
+ "integrity": "sha512-fmfw4XgoDke3kdI6h4xcUz1dG8uaiv5q9gcEwLS4Pnth2kxT+GZ7YehS1JTMGBQmtV7Y4GFGbs2re2NqhdozUg==",
+ "dev": true,
+ "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/regenerate": {
+ "version": "1.4.2",
+ "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz",
+ "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==",
+ "dev": true
+ },
+ "node_modules/regenerate-unicode-properties": {
+ "version": "10.2.0",
+ "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz",
+ "integrity": "sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==",
+ "dev": true,
+ "dependencies": {
+ "regenerate": "^1.4.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/regenerator-runtime": {
+ "version": "0.14.1",
+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
+ "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw=="
+ },
+ "node_modules/regenerator-transform": {
+ "version": "0.15.2",
+ "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz",
+ "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==",
+ "dev": true,
+ "dependencies": {
+ "@babel/runtime": "^7.8.4"
+ }
+ },
+ "node_modules/regexp.prototype.flags": {
+ "version": "1.5.3",
+ "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz",
+ "integrity": "sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-errors": "^1.3.0",
+ "set-function-name": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/regexpu-core": {
+ "version": "6.1.1",
+ "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-6.1.1.tgz",
+ "integrity": "sha512-k67Nb9jvwJcJmVpw0jPttR1/zVfnKf8Km0IPatrU/zJ5XeG3+Slx0xLXs9HByJSzXzrlz5EDvN6yLNMDc2qdnw==",
+ "dev": true,
+ "dependencies": {
+ "regenerate": "^1.4.2",
+ "regenerate-unicode-properties": "^10.2.0",
+ "regjsgen": "^0.8.0",
+ "regjsparser": "^0.11.0",
+ "unicode-match-property-ecmascript": "^2.0.0",
+ "unicode-match-property-value-ecmascript": "^2.1.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/regjsgen": {
+ "version": "0.8.0",
+ "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.8.0.tgz",
+ "integrity": "sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q==",
+ "dev": true
+ },
+ "node_modules/regjsparser": {
+ "version": "0.11.2",
+ "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.11.2.tgz",
+ "integrity": "sha512-3OGZZ4HoLJkkAZx/48mTXJNlmqTGOzc0o9OWQPuWpkOlXXPbyN6OafCcoXUnBqE2D3f/T5L+pWc1kdEmnfnRsA==",
+ "dev": true,
+ "dependencies": {
+ "jsesc": "~3.0.2"
+ },
+ "bin": {
+ "regjsparser": "bin/parser"
+ }
+ },
+ "node_modules/rememo": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/rememo/-/rememo-4.0.2.tgz",
+ "integrity": "sha512-NVfSP9NstE3QPNs/TnegQY0vnJnstKQSpcrsI2kBTB3dB2PkdfKdTa+abbjMIDqpc63fE5LfjLgfMst0ULMFxQ=="
+ },
+ "node_modules/remove-accents": {
+ "version": "0.5.0",
+ "resolved": "https://registry.npmjs.org/remove-accents/-/remove-accents-0.5.0.tgz",
+ "integrity": "sha512-8g3/Otx1eJaVD12e31UbJj1YzdtVvzH85HV7t+9MJYk/u3XmkOUJ5Ys9wQrf9PCPK8+xn4ymzqYCiZl6QWKn+A=="
+ },
+ "node_modules/requestidlecallback": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/requestidlecallback/-/requestidlecallback-0.3.0.tgz",
+ "integrity": "sha512-TWHFkT7S9p7IxLC5A1hYmAYQx2Eb9w1skrXmQ+dS1URyvR8tenMLl4lHbqEOUnpEYxNKpkVMXUgknVpBZWXXfQ=="
+ },
+ "node_modules/require-directory": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
+ "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/require-from-string": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
+ "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/require-main-filename": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
+ "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg=="
+ },
+ "node_modules/requireindex": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/requireindex/-/requireindex-1.2.0.tgz",
+ "integrity": "sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.5"
+ }
+ },
+ "node_modules/requires-port": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
+ "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==",
+ "dev": true
+ },
+ "node_modules/resolve": {
+ "version": "1.22.8",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz",
+ "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==",
+ "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-alpn": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz",
+ "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==",
+ "dev": true
+ },
+ "node_modules/resolve-bin": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/resolve-bin/-/resolve-bin-0.4.3.tgz",
+ "integrity": "sha512-9u8TMpc+SEHXxQXblXHz5yRvRZERkCZimFN9oz85QI3uhkh7nqfjm6OGTLg+8vucpXGcY4jLK6WkylPmt7GSvw==",
+ "dev": true,
+ "dependencies": {
+ "find-parent-dir": "~0.3.0"
+ }
+ },
+ "node_modules/resolve-cwd": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz",
+ "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==",
+ "dev": true,
+ "dependencies": {
+ "resolve-from": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/resolve-dir": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-0.1.1.tgz",
+ "integrity": "sha512-QxMPqI6le2u0dCLyiGzgy92kjkkL6zO0XyvHzjdTNH3zM6e5Hz3BwG6+aEyNgiQ5Xz6PwTwgQEj3U50dByPKIA==",
+ "dev": true,
+ "dependencies": {
+ "expand-tilde": "^1.2.2",
+ "global-modules": "^0.2.3"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/resolve-from": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
+ "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/resolve.exports": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz",
+ "integrity": "sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/responselike": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz",
+ "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==",
+ "dev": true,
+ "dependencies": {
+ "lowercase-keys": "^2.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/restore-cursor": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz",
+ "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==",
+ "dev": true,
+ "dependencies": {
+ "onetime": "^5.1.0",
+ "signal-exit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/retry": {
+ "version": "0.13.1",
+ "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz",
+ "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/reusify": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
+ "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
+ "dev": true,
+ "engines": {
+ "iojs": ">=1.0.0",
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/rimraf": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
+ "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
+ "deprecated": "Rimraf versions prior to v4 are no longer supported",
+ "dev": true,
+ "dependencies": {
+ "glob": "^7.1.3"
+ },
+ "bin": {
+ "rimraf": "bin.js"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/robots-parser": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/robots-parser/-/robots-parser-3.0.1.tgz",
+ "integrity": "sha512-s+pyvQeIKIZ0dx5iJiQk1tPLJAWln39+MI5jtM8wnyws+G5azk+dMnMX0qfbqNetKKNgcWWOdi0sfm+FbQbgdQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/rtlcss": {
+ "version": "3.5.0",
+ "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-3.5.0.tgz",
+ "integrity": "sha512-wzgMaMFHQTnyi9YOwsx9LjOxYXJPzS8sYnFaKm6R5ysvTkwzHiB0vxnbHwchHQT65PTdBjDG21/kQBWI7q9O7A==",
+ "dev": true,
+ "dependencies": {
+ "find-up": "^5.0.0",
+ "picocolors": "^1.0.0",
+ "postcss": "^8.3.11",
+ "strip-json-comments": "^3.1.1"
+ },
+ "bin": {
+ "rtlcss": "bin/rtlcss.js"
+ }
+ },
+ "node_modules/rtlcss-webpack-plugin": {
+ "version": "4.0.7",
+ "resolved": "https://registry.npmjs.org/rtlcss-webpack-plugin/-/rtlcss-webpack-plugin-4.0.7.tgz",
+ "integrity": "sha512-ouSbJtgcLBBQIsMgarxsDnfgRqm/AS4BKls/mz/Xb6HSl+PdEzefTR+Wz5uWQx4odoX0g261Z7yb3QBz0MTm0g==",
+ "dev": true,
+ "dependencies": {
+ "babel-runtime": "~6.25.0",
+ "rtlcss": "^3.5.0"
+ }
+ },
+ "node_modules/rtlcss/node_modules/find-up": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+ "dev": true,
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/rtlcss/node_modules/locate-path": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "dev": true,
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/rtlcss/node_modules/p-locate": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+ "dev": true,
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/run-async": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz",
+ "integrity": "sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/run-con": {
+ "version": "1.2.12",
+ "resolved": "https://registry.npmjs.org/run-con/-/run-con-1.2.12.tgz",
+ "integrity": "sha512-5257ILMYIF4RztL9uoZ7V9Q97zHtNHn5bN3NobeAnzB1P3ASLgg8qocM2u+R18ttp+VEM78N2LK8XcNVtnSRrg==",
+ "dev": true,
+ "dependencies": {
+ "deep-extend": "^0.6.0",
+ "ini": "~3.0.0",
+ "minimist": "^1.2.8",
+ "strip-json-comments": "~3.1.1"
+ },
+ "bin": {
+ "run-con": "cli.js"
+ }
+ },
+ "node_modules/run-con/node_modules/ini": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/ini/-/ini-3.0.1.tgz",
+ "integrity": "sha512-it4HyVAUTKBc6m8e1iXWvXSTdndF7HbdN713+kvLrymxTaU4AUBWrJ4vEooP+V7fexnVD3LKcBshjGGPefSMUQ==",
+ "dev": true,
+ "engines": {
+ "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
+ }
+ },
+ "node_modules/run-parallel": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
+ "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
+ "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"
+ }
+ ],
+ "dependencies": {
+ "queue-microtask": "^1.2.2"
+ }
+ },
+ "node_modules/rungen": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/rungen/-/rungen-0.3.2.tgz",
+ "integrity": "sha512-zWl10xu2D7zoR8zSC2U6bg5bYF6T/Wk7rxwp8IPaJH7f0Ge21G03kNHVgHR7tyVkSSfAOG0Rqf/Cl38JftSmtw=="
+ },
+ "node_modules/rxjs": {
+ "version": "6.6.7",
+ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz",
+ "integrity": "sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==",
+ "dev": true,
+ "dependencies": {
+ "tslib": "^1.9.0"
+ },
+ "engines": {
+ "npm": ">=2.0.0"
+ }
+ },
+ "node_modules/rxjs/node_modules/tslib": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+ "dev": true
+ },
+ "node_modules/safe-array-concat": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.2.tgz",
+ "integrity": "sha512-vj6RsCsWBCf19jIeHEfkRMw8DPiBb+DMXklQ/1SGDHOMlHdPUkZXFQ2YdplS23zESTijAcurb1aSgJA3AgMu1Q==",
+ "dev": true,
+ "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-array-concat/node_modules/isarray": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
+ "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
+ "dev": true
+ },
+ "node_modules/safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ]
+ },
+ "node_modules/safe-regex-test": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.3.tgz",
+ "integrity": "sha512-CdASjNJPvRa7roO6Ra/gLYBTzYzzPyyBXxIMdGW3USQLyjWEls2RgW5UBTXaQVp+OrpeCK3bLem8smtmheoRuw==",
+ "dev": true,
+ "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",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
+ },
+ "node_modules/sass": {
+ "version": "1.80.7",
+ "resolved": "https://registry.npmjs.org/sass/-/sass-1.80.7.tgz",
+ "integrity": "sha512-MVWvN0u5meytrSjsU7AWsbhoXi1sc58zADXFllfZzbsBT1GHjjar6JwBINYPRrkx/zqnQ6uqbQuHgE95O+C+eQ==",
+ "dev": true,
+ "dependencies": {
+ "chokidar": "^4.0.0",
+ "immutable": "^5.0.2",
+ "source-map-js": ">=0.6.2 <2.0.0"
+ },
+ "bin": {
+ "sass": "sass.js"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "optionalDependencies": {
+ "@parcel/watcher": "^2.4.1"
+ }
+ },
+ "node_modules/sass-loader": {
+ "version": "12.6.0",
+ "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.6.0.tgz",
+ "integrity": "sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA==",
+ "dev": true,
+ "dependencies": {
+ "klona": "^2.0.4",
+ "neo-async": "^2.6.2"
+ },
+ "engines": {
+ "node": ">= 12.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "fibers": ">= 3.1.0",
+ "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0",
+ "sass": "^1.3.0",
+ "sass-embedded": "*",
+ "webpack": "^5.0.0"
+ },
+ "peerDependenciesMeta": {
+ "fibers": {
+ "optional": true
+ },
+ "node-sass": {
+ "optional": true
+ },
+ "sass": {
+ "optional": true
+ },
+ "sass-embedded": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/saxes": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz",
+ "integrity": "sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==",
+ "dev": true,
+ "dependencies": {
+ "xmlchars": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=v12.22.7"
+ }
+ },
+ "node_modules/scheduler": {
+ "version": "0.23.2",
+ "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz",
+ "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==",
+ "dependencies": {
+ "loose-envify": "^1.1.0"
+ }
+ },
+ "node_modules/schema-utils": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz",
+ "integrity": "sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw==",
+ "dev": true,
+ "dependencies": {
+ "@types/json-schema": "^7.0.9",
+ "ajv": "^8.9.0",
+ "ajv-formats": "^2.1.1",
+ "ajv-keywords": "^5.1.0"
+ },
+ "engines": {
+ "node": ">= 12.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ }
+ },
+ "node_modules/schema-utils/node_modules/ajv": {
+ "version": "8.17.1",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz",
+ "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
+ "dev": true,
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3",
+ "fast-uri": "^3.0.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/schema-utils/node_modules/ajv-keywords": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz",
+ "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==",
+ "dev": true,
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3"
+ },
+ "peerDependencies": {
+ "ajv": "^8.8.2"
+ }
+ },
+ "node_modules/schema-utils/node_modules/json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+ "dev": true
+ },
+ "node_modules/select": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz",
+ "integrity": "sha512-OwpTSOfy6xSs1+pwcNrv0RBMOzI39Lp3qQKUTPVVPRjCdNa5JH/oPRiqsesIskK8TVgmRiHwO4KXlV2Li9dANA=="
+ },
+ "node_modules/select-hose": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz",
+ "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==",
+ "dev": true
+ },
+ "node_modules/selfsigned": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.4.1.tgz",
+ "integrity": "sha512-th5B4L2U+eGLq1TVh7zNRGBapioSORUeymIydxgFpwww9d2qyKvtuPU2jJuHvYAwwqi2Y596QBL3eEqcPEYL8Q==",
+ "dev": true,
+ "dependencies": {
+ "@types/node-forge": "^1.3.0",
+ "node-forge": "^1"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/semver": {
+ "version": "6.3.1",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
+ "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
+ "dev": true,
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/send": {
+ "version": "0.19.0",
+ "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz",
+ "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==",
+ "dev": true,
+ "dependencies": {
+ "debug": "2.6.9",
+ "depd": "2.0.0",
+ "destroy": "1.2.0",
+ "encodeurl": "~1.0.2",
+ "escape-html": "~1.0.3",
+ "etag": "~1.8.1",
+ "fresh": "0.5.2",
+ "http-errors": "2.0.0",
+ "mime": "1.6.0",
+ "ms": "2.1.3",
+ "on-finished": "2.4.1",
+ "range-parser": "~1.2.1",
+ "statuses": "2.0.1"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/send/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/send/node_modules/debug/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "dev": true
+ },
+ "node_modules/send/node_modules/encodeurl": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
+ "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/send/node_modules/mime": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
+ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
+ "dev": true,
+ "bin": {
+ "mime": "cli.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/sentence-case": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-3.0.4.tgz",
+ "integrity": "sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==",
+ "dependencies": {
+ "no-case": "^3.0.4",
+ "tslib": "^2.0.3",
+ "upper-case-first": "^2.0.2"
+ }
+ },
+ "node_modules/serialize-javascript": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz",
+ "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==",
+ "dev": true,
+ "dependencies": {
+ "randombytes": "^2.1.0"
+ }
+ },
+ "node_modules/serve-index": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz",
+ "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==",
+ "dev": true,
+ "dependencies": {
+ "accepts": "~1.3.4",
+ "batch": "0.6.1",
+ "debug": "2.6.9",
+ "escape-html": "~1.0.3",
+ "http-errors": "~1.6.2",
+ "mime-types": "~2.1.17",
+ "parseurl": "~1.3.2"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/serve-index/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/serve-index/node_modules/depd": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
+ "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/serve-index/node_modules/http-errors": {
+ "version": "1.6.3",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
+ "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==",
+ "dev": true,
+ "dependencies": {
+ "depd": "~1.1.2",
+ "inherits": "2.0.3",
+ "setprototypeof": "1.1.0",
+ "statuses": ">= 1.4.0 < 2"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/serve-index/node_modules/inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==",
+ "dev": true
+ },
+ "node_modules/serve-index/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "dev": true
+ },
+ "node_modules/serve-index/node_modules/setprototypeof": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
+ "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==",
+ "dev": true
+ },
+ "node_modules/serve-index/node_modules/statuses": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
+ "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/serve-static": {
+ "version": "1.16.2",
+ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz",
+ "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==",
+ "dev": true,
+ "dependencies": {
+ "encodeurl": "~2.0.0",
+ "escape-html": "~1.0.3",
+ "parseurl": "~1.3.3",
+ "send": "0.19.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/set-blocking": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
+ "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw=="
+ },
+ "node_modules/set-function-length": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz",
+ "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==",
+ "dev": true,
+ "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",
+ "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz",
+ "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==",
+ "dev": true,
+ "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/setprototypeof": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
+ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
+ "dev": true
+ },
+ "node_modules/shallow-clone": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-0.1.2.tgz",
+ "integrity": "sha512-J1zdXCky5GmNnuauESROVu31MQSnLoYvlyEn6j2Ztk6Q5EHFIhxkMhYcv6vuDzl2XEzoRr856QwzMgWM/TmZgw==",
+ "dev": true,
+ "dependencies": {
+ "is-extendable": "^0.1.1",
+ "kind-of": "^2.0.1",
+ "lazy-cache": "^0.2.3",
+ "mixin-object": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/shallow-clone/node_modules/kind-of": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-2.0.1.tgz",
+ "integrity": "sha512-0u8i1NZ/mg0b+W3MGGw5I7+6Eib2nx72S/QvXa0hYjEkjTknYmEYQJwGu3mLC0BrhtJjtQafTkyRUQ75Kx0LVg==",
+ "dev": true,
+ "dependencies": {
+ "is-buffer": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/shallow-clone/node_modules/lazy-cache": {
+ "version": "0.2.7",
+ "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-0.2.7.tgz",
+ "integrity": "sha512-gkX52wvU/R8DVMMt78ATVPFMJqfW8FPz1GZ1sVHBVQHmu/WvhIWE4cE1GBzhJNFicDeYhnwp6Rl35BcAIM3YOQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/shebang-command": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
+ "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==",
+ "dev": true,
+ "dependencies": {
+ "shebang-regex": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
+ "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/shell-quote": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz",
+ "integrity": "sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/showdown": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/showdown/-/showdown-1.9.1.tgz",
+ "integrity": "sha512-9cGuS382HcvExtf5AHk7Cb4pAeQQ+h0eTr33V1mu+crYWV4KvWAw6el92bDrqGEk5d46Ai/fhbEUwqJ/mTCNEA==",
+ "dependencies": {
+ "yargs": "^14.2"
+ },
+ "bin": {
+ "showdown": "bin/showdown.js"
+ }
+ },
+ "node_modules/showdown/node_modules/ansi-regex": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz",
+ "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/showdown/node_modules/ansi-styles": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
+ "dependencies": {
+ "color-convert": "^1.9.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/showdown/node_modules/camelcase": {
+ "version": "5.3.1",
+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
+ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/showdown/node_modules/cliui": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
+ "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
+ "dependencies": {
+ "string-width": "^3.1.0",
+ "strip-ansi": "^5.2.0",
+ "wrap-ansi": "^5.1.0"
+ }
+ },
+ "node_modules/showdown/node_modules/color-convert": {
+ "version": "1.9.3",
+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
+ "dependencies": {
+ "color-name": "1.1.3"
+ }
+ },
+ "node_modules/showdown/node_modules/color-name": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
+ "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw=="
+ },
+ "node_modules/showdown/node_modules/emoji-regex": {
+ "version": "7.0.3",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
+ "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA=="
+ },
+ "node_modules/showdown/node_modules/find-up": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
+ "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
+ "dependencies": {
+ "locate-path": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/showdown/node_modules/is-fullwidth-code-point": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
+ "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/showdown/node_modules/locate-path": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
+ "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
+ "dependencies": {
+ "p-locate": "^3.0.0",
+ "path-exists": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/showdown/node_modules/p-limit": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
+ "dependencies": {
+ "p-try": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/showdown/node_modules/p-locate": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
+ "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
+ "dependencies": {
+ "p-limit": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/showdown/node_modules/path-exists": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
+ "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/showdown/node_modules/string-width": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
+ "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
+ "dependencies": {
+ "emoji-regex": "^7.0.1",
+ "is-fullwidth-code-point": "^2.0.0",
+ "strip-ansi": "^5.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/showdown/node_modules/strip-ansi": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
+ "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
+ "dependencies": {
+ "ansi-regex": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/showdown/node_modules/wrap-ansi": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
+ "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
+ "dependencies": {
+ "ansi-styles": "^3.2.0",
+ "string-width": "^3.0.0",
+ "strip-ansi": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/showdown/node_modules/y18n": {
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz",
+ "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ=="
+ },
+ "node_modules/showdown/node_modules/yargs": {
+ "version": "14.2.3",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-14.2.3.tgz",
+ "integrity": "sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg==",
+ "dependencies": {
+ "cliui": "^5.0.0",
+ "decamelize": "^1.2.0",
+ "find-up": "^3.0.0",
+ "get-caller-file": "^2.0.1",
+ "require-directory": "^2.1.1",
+ "require-main-filename": "^2.0.0",
+ "set-blocking": "^2.0.0",
+ "string-width": "^3.0.0",
+ "which-module": "^2.0.0",
+ "y18n": "^4.0.0",
+ "yargs-parser": "^15.0.1"
+ }
+ },
+ "node_modules/showdown/node_modules/yargs-parser": {
+ "version": "15.0.3",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.3.tgz",
+ "integrity": "sha512-/MVEVjTXy/cGAjdtQf8dW3V9b97bPN7rNn8ETj6BmAQL7ibC7O1Q9SPJbGjgh3SlwoBNXMzj/ZGIj8mBgl12YA==",
+ "dependencies": {
+ "camelcase": "^5.0.0",
+ "decamelize": "^1.2.0"
+ }
+ },
+ "node_modules/side-channel": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz",
+ "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==",
+ "dev": true,
+ "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": "3.0.7",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz",
+ "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==",
+ "dev": true
+ },
+ "node_modules/simple-git": {
+ "version": "3.27.0",
+ "resolved": "https://registry.npmjs.org/simple-git/-/simple-git-3.27.0.tgz",
+ "integrity": "sha512-ivHoFS9Yi9GY49ogc6/YAi3Fl9ROnF4VyubNylgCkA+RVqLaKWnDSzXOVzya8csELIaWaYNutsEuAhZrtOjozA==",
+ "dev": true,
+ "dependencies": {
+ "@kwsites/file-exists": "^1.1.1",
+ "@kwsites/promise-deferred": "^1.1.1",
+ "debug": "^4.3.5"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/steveukx/git-js?sponsor=1"
+ }
+ },
+ "node_modules/simple-html-tokenizer": {
+ "version": "0.5.11",
+ "resolved": "https://registry.npmjs.org/simple-html-tokenizer/-/simple-html-tokenizer-0.5.11.tgz",
+ "integrity": "sha512-C2WEK/Z3HoSFbYq8tI7ni3eOo/NneSPRoPpcM7WdLjFOArFuyXEjAoCdOC3DgMfRyziZQ1hCNR4mrNdWEvD0og=="
+ },
+ "node_modules/simple-peer": {
+ "version": "9.11.1",
+ "resolved": "https://registry.npmjs.org/simple-peer/-/simple-peer-9.11.1.tgz",
+ "integrity": "sha512-D1SaWpOW8afq1CZGWB8xTfrT3FekjQmPValrqncJMX7QFl8YwhrPTZvMCANLtgBwwdS+7zURyqxDDEmY558tTw==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "dependencies": {
+ "buffer": "^6.0.3",
+ "debug": "^4.3.2",
+ "err-code": "^3.0.1",
+ "get-browser-rtc": "^1.1.0",
+ "queue-microtask": "^1.2.3",
+ "randombytes": "^2.1.0",
+ "readable-stream": "^3.6.0"
+ }
+ },
+ "node_modules/simple-peer/node_modules/readable-stream": {
+ "version": "3.6.2",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
+ "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/sirv": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz",
+ "integrity": "sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==",
+ "dev": true,
+ "dependencies": {
+ "@polka/url": "^1.0.0-next.24",
+ "mrmime": "^2.0.0",
+ "totalist": "^3.0.0"
+ },
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/sisteransi": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz",
+ "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==",
+ "dev": true
+ },
+ "node_modules/slash": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
+ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/slice-ansi": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
+ "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "astral-regex": "^2.0.0",
+ "is-fullwidth-code-point": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/slice-ansi?sponsor=1"
+ }
+ },
+ "node_modules/smart-buffer": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz",
+ "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 6.0.0",
+ "npm": ">= 3.0.0"
+ }
+ },
+ "node_modules/snake-case": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/snake-case/-/snake-case-3.0.4.tgz",
+ "integrity": "sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg==",
+ "dependencies": {
+ "dot-case": "^3.0.4",
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/sockjs": {
+ "version": "0.3.24",
+ "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz",
+ "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==",
+ "dev": true,
+ "dependencies": {
+ "faye-websocket": "^0.11.3",
+ "uuid": "^8.3.2",
+ "websocket-driver": "^0.7.4"
+ }
+ },
+ "node_modules/sockjs/node_modules/uuid": {
+ "version": "8.3.2",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
+ "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
+ "dev": true,
+ "bin": {
+ "uuid": "dist/bin/uuid"
+ }
+ },
+ "node_modules/socks": {
+ "version": "2.8.3",
+ "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz",
+ "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==",
+ "dev": true,
+ "dependencies": {
+ "ip-address": "^9.0.5",
+ "smart-buffer": "^4.2.0"
+ },
+ "engines": {
+ "node": ">= 10.0.0",
+ "npm": ">= 3.0.0"
+ }
+ },
+ "node_modules/socks-proxy-agent": {
+ "version": "8.0.4",
+ "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.4.tgz",
+ "integrity": "sha512-GNAq/eg8Udq2x0eNiFkr9gRg5bA7PXEWagQdeRX4cPSG+X/8V38v637gim9bjFptMk1QWsCTr0ttrJEiXbNnRw==",
+ "dev": true,
+ "dependencies": {
+ "agent-base": "^7.1.1",
+ "debug": "^4.3.4",
+ "socks": "^2.8.3"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/socks-proxy-agent/node_modules/agent-base": {
+ "version": "7.1.1",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz",
+ "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==",
+ "dev": true,
+ "dependencies": {
+ "debug": "^4.3.4"
+ },
+ "engines": {
+ "node": ">= 14"
+ }
+ },
+ "node_modules/source-map": {
+ "version": "0.5.7",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
+ "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/source-map-js": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
+ "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/source-map-loader": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/source-map-loader/-/source-map-loader-3.0.2.tgz",
+ "integrity": "sha512-BokxPoLjyl3iOrgkWaakaxqnelAJSS+0V+De0kKIq6lyWrXuiPgYTGp6z3iHmqljKAaLXwZa+ctD8GccRJeVvg==",
+ "dev": true,
+ "dependencies": {
+ "abab": "^2.0.5",
+ "iconv-lite": "^0.6.3",
+ "source-map-js": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 12.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "webpack": "^5.0.0"
+ }
+ },
+ "node_modules/source-map-support": {
+ "version": "0.5.13",
+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz",
+ "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==",
+ "dev": true,
+ "dependencies": {
+ "buffer-from": "^1.0.0",
+ "source-map": "^0.6.0"
+ }
+ },
+ "node_modules/source-map-support/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/spawnd": {
+ "version": "9.0.2",
+ "resolved": "https://registry.npmjs.org/spawnd/-/spawnd-9.0.2.tgz",
+ "integrity": "sha512-nl8DVHEDQ57IcKakzpjanspVChkMpGLuVwMR/eOn9cXE55Qr6luD2Kn06sA0ootRMdgrU4tInN6lA6ohTNvysw==",
+ "dev": true,
+ "dependencies": {
+ "signal-exit": "^4.1.0",
+ "tree-kill": "^1.2.2"
+ },
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/spawnd/node_modules/signal-exit": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+ "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+ "dev": true,
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/spdx-correct": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz",
+ "integrity": "sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA==",
+ "dev": true,
+ "dependencies": {
+ "spdx-expression-parse": "^3.0.0",
+ "spdx-license-ids": "^3.0.0"
+ }
+ },
+ "node_modules/spdx-correct/node_modules/spdx-expression-parse": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
+ "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
+ "dev": true,
+ "dependencies": {
+ "spdx-exceptions": "^2.1.0",
+ "spdx-license-ids": "^3.0.0"
+ }
+ },
+ "node_modules/spdx-exceptions": {
+ "version": "2.5.0",
+ "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.5.0.tgz",
+ "integrity": "sha512-PiU42r+xO4UbUS1buo3LPJkjlO7430Xn5SVAhdpzzsPHsjbYVflnnFdATgabnLude+Cqu25p6N+g2lw/PFsa4w==",
+ "dev": true
+ },
+ "node_modules/spdx-expression-parse": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-4.0.0.tgz",
+ "integrity": "sha512-Clya5JIij/7C6bRR22+tnGXbc4VKlibKSVj2iHvVeX5iMW7s1SIQlqu699JkODJJIhh/pUu8L0/VLh8xflD+LQ==",
+ "dev": true,
+ "dependencies": {
+ "spdx-exceptions": "^2.1.0",
+ "spdx-license-ids": "^3.0.0"
+ }
+ },
+ "node_modules/spdx-license-ids": {
+ "version": "3.0.20",
+ "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.20.tgz",
+ "integrity": "sha512-jg25NiDV/1fLtSgEgyvVyDunvaNHbuwF9lfNV17gSmPFAlYzdfNBlLtLzXTevwkPj7DhGbmN9VnmJIgLnhvaBw==",
+ "dev": true
+ },
+ "node_modules/spdy": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz",
+ "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==",
+ "dev": true,
+ "dependencies": {
+ "debug": "^4.1.0",
+ "handle-thing": "^2.0.0",
+ "http-deceiver": "^1.2.7",
+ "select-hose": "^2.0.0",
+ "spdy-transport": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/spdy-transport": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz",
+ "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==",
+ "dev": true,
+ "dependencies": {
+ "debug": "^4.1.0",
+ "detect-node": "^2.0.4",
+ "hpack.js": "^2.1.6",
+ "obuf": "^1.1.2",
+ "readable-stream": "^3.0.6",
+ "wbuf": "^1.7.3"
+ }
+ },
+ "node_modules/spdy-transport/node_modules/readable-stream": {
+ "version": "3.6.2",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
+ "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
+ "dev": true,
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/speedline-core": {
+ "version": "1.4.3",
+ "resolved": "https://registry.npmjs.org/speedline-core/-/speedline-core-1.4.3.tgz",
+ "integrity": "sha512-DI7/OuAUD+GMpR6dmu8lliO2Wg5zfeh+/xsdyJZCzd8o5JgFUjCeLsBDuZjIQJdwXS3J0L/uZYrELKYqx+PXog==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "*",
+ "image-ssim": "^0.2.0",
+ "jpeg-js": "^0.4.1"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/sprintf-js": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz",
+ "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA=="
+ },
+ "node_modules/stack-utils": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz",
+ "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==",
+ "dev": true,
+ "dependencies": {
+ "escape-string-regexp": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/stack-utils/node_modules/escape-string-regexp": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz",
+ "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/stackframe": {
+ "version": "1.3.4",
+ "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz",
+ "integrity": "sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==",
+ "dev": true
+ },
+ "node_modules/statuses": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz",
+ "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/streamx": {
+ "version": "2.20.1",
+ "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.20.1.tgz",
+ "integrity": "sha512-uTa0mU6WUC65iUvzKH4X9hEdvSW7rbPxPtwfWiLMSj3qTdQbAiUboZTxauKfpFuGIGa1C2BYijZ7wgdUXICJhA==",
+ "dev": true,
+ "dependencies": {
+ "fast-fifo": "^1.3.2",
+ "queue-tick": "^1.0.1",
+ "text-decoder": "^1.1.0"
+ },
+ "optionalDependencies": {
+ "bare-events": "^2.2.0"
+ }
+ },
+ "node_modules/string_decoder": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "dependencies": {
+ "safe-buffer": "~5.1.0"
+ }
+ },
+ "node_modules/string_decoder/node_modules/safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
+ },
+ "node_modules/string-length": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz",
+ "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==",
+ "dev": true,
+ "dependencies": {
+ "char-regex": "^1.0.2",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/string-width/node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true
+ },
+ "node_modules/string.prototype.includes": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/string.prototype.includes/-/string.prototype.includes-2.0.1.tgz",
+ "integrity": "sha512-o7+c9bW6zpAdJHTtujeePODAhkuicdAryFsfVKwA+wGw89wJ4GTY484WTucM9hLtDEOpOvI+aHnzqnC5lHp4Rg==",
+ "dev": true,
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/string.prototype.matchall": {
+ "version": "4.0.11",
+ "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.11.tgz",
+ "integrity": "sha512-NUdh0aDavY2og7IbBPenWqR9exH+E26Sv8e0/eTe1tltDGZL+GtBkDAnnyBtmekfK6/Dq3MkcGtzXFEd1LQrtg==",
+ "dev": true,
+ "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.repeat": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/string.prototype.repeat/-/string.prototype.repeat-1.0.0.tgz",
+ "integrity": "sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==",
+ "dev": true,
+ "dependencies": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.5"
+ }
+ },
+ "node_modules/string.prototype.trim": {
+ "version": "1.2.9",
+ "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz",
+ "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==",
+ "dev": true,
+ "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",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz",
+ "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==",
+ "dev": true,
+ "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",
+ "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz",
+ "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==",
+ "dev": true,
+ "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",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-bom": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz",
+ "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-final-newline": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz",
+ "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/strip-indent": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz",
+ "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==",
+ "dev": true,
+ "dependencies": {
+ "min-indent": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-json-comments": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
+ "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/strip-outer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz",
+ "integrity": "sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg==",
+ "dev": true,
+ "dependencies": {
+ "escape-string-regexp": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/strip-outer/node_modules/escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/style-search": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz",
+ "integrity": "sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg==",
+ "dev": true
+ },
+ "node_modules/stylehacks": {
+ "version": "6.1.1",
+ "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-6.1.1.tgz",
+ "integrity": "sha512-gSTTEQ670cJNoaeIp9KX6lZmm8LJ3jPB5yJmX8Zq/wQxOsAFXV3qjWzHas3YYk1qesuVIyYWWUpZ0vSE/dTSGg==",
+ "dev": true,
+ "dependencies": {
+ "browserslist": "^4.23.0",
+ "postcss-selector-parser": "^6.0.16"
+ },
+ "engines": {
+ "node": "^14 || ^16 || >=18.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.4.31"
+ }
+ },
+ "node_modules/stylelint": {
+ "version": "16.10.0",
+ "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.10.0.tgz",
+ "integrity": "sha512-z/8X2rZ52dt2c0stVwI9QL2AFJhLhbPkyfpDFcizs200V/g7v+UYY6SNcB9hKOLcDDX/yGLDsY/pX08sLkz9xQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/stylelint"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/stylelint"
+ }
+ ],
+ "dependencies": {
+ "@csstools/css-parser-algorithms": "^3.0.1",
+ "@csstools/css-tokenizer": "^3.0.1",
+ "@csstools/media-query-list-parser": "^3.0.1",
+ "@csstools/selector-specificity": "^4.0.0",
+ "@dual-bundle/import-meta-resolve": "^4.1.0",
+ "balanced-match": "^2.0.0",
+ "colord": "^2.9.3",
+ "cosmiconfig": "^9.0.0",
+ "css-functions-list": "^3.2.3",
+ "css-tree": "^3.0.0",
+ "debug": "^4.3.7",
+ "fast-glob": "^3.3.2",
+ "fastest-levenshtein": "^1.0.16",
+ "file-entry-cache": "^9.1.0",
+ "global-modules": "^2.0.0",
+ "globby": "^11.1.0",
+ "globjoin": "^0.1.4",
+ "html-tags": "^3.3.1",
+ "ignore": "^6.0.2",
+ "imurmurhash": "^0.1.4",
+ "is-plain-object": "^5.0.0",
+ "known-css-properties": "^0.34.0",
+ "mathml-tag-names": "^2.1.3",
+ "meow": "^13.2.0",
+ "micromatch": "^4.0.8",
+ "normalize-path": "^3.0.0",
+ "picocolors": "^1.0.1",
+ "postcss": "^8.4.47",
+ "postcss-resolve-nested-selector": "^0.1.6",
+ "postcss-safe-parser": "^7.0.1",
+ "postcss-selector-parser": "^6.1.2",
+ "postcss-value-parser": "^4.2.0",
+ "resolve-from": "^5.0.0",
+ "string-width": "^4.2.3",
+ "supports-hyperlinks": "^3.1.0",
+ "svg-tags": "^1.0.0",
+ "table": "^6.8.2",
+ "write-file-atomic": "^5.0.1"
+ },
+ "bin": {
+ "stylelint": "bin/stylelint.mjs"
+ },
+ "engines": {
+ "node": ">=18.12.0"
+ }
+ },
+ "node_modules/stylelint-config-recommended": {
+ "version": "14.0.1",
+ "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-14.0.1.tgz",
+ "integrity": "sha512-bLvc1WOz/14aPImu/cufKAZYfXs/A/owZfSMZ4N+16WGXLoX5lOir53M6odBxvhgmgdxCVnNySJmZKx73T93cg==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/stylelint"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/stylelint"
+ }
+ ],
+ "engines": {
+ "node": ">=18.12.0"
+ },
+ "peerDependencies": {
+ "stylelint": "^16.1.0"
+ }
+ },
+ "node_modules/stylelint-config-recommended-scss": {
+ "version": "14.1.0",
+ "resolved": "https://registry.npmjs.org/stylelint-config-recommended-scss/-/stylelint-config-recommended-scss-14.1.0.tgz",
+ "integrity": "sha512-bhaMhh1u5dQqSsf6ri2GVWWQW5iUjBYgcHkh7SgDDn92ijoItC/cfO/W+fpXshgTQWhwFkP1rVcewcv4jaftRg==",
+ "dev": true,
+ "dependencies": {
+ "postcss-scss": "^4.0.9",
+ "stylelint-config-recommended": "^14.0.1",
+ "stylelint-scss": "^6.4.0"
+ },
+ "engines": {
+ "node": ">=18.12.0"
+ },
+ "peerDependencies": {
+ "postcss": "^8.3.3",
+ "stylelint": "^16.6.1"
+ },
+ "peerDependenciesMeta": {
+ "postcss": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/stylelint-scss": {
+ "version": "6.9.0",
+ "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-6.9.0.tgz",
+ "integrity": "sha512-oWOR+g6ccagfrENecImGmorWWjVyWpt2R8bmkhOW8FkNNPGStZPQMqb8QWMW4Lwu9TyPqmyjHkkAsy3weqsnNw==",
+ "dev": true,
+ "dependencies": {
+ "css-tree": "^3.0.1",
+ "is-plain-object": "^5.0.0",
+ "known-css-properties": "^0.35.0",
+ "mdn-data": "^2.12.2",
+ "postcss-media-query-parser": "^0.2.3",
+ "postcss-resolve-nested-selector": "^0.1.6",
+ "postcss-selector-parser": "^6.1.2",
+ "postcss-value-parser": "^4.2.0"
+ },
+ "engines": {
+ "node": ">=18.12.0"
+ },
+ "peerDependencies": {
+ "stylelint": "^16.0.2"
+ }
+ },
+ "node_modules/stylelint-scss/node_modules/known-css-properties": {
+ "version": "0.35.0",
+ "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.35.0.tgz",
+ "integrity": "sha512-a/RAk2BfKk+WFGhhOCAYqSiFLc34k8Mt/6NWRI4joER0EYUzXIcFivjjnoD3+XU1DggLn/tZc3DOAgke7l8a4A==",
+ "dev": true
+ },
+ "node_modules/stylelint-scss/node_modules/mdn-data": {
+ "version": "2.12.2",
+ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz",
+ "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==",
+ "dev": true
+ },
+ "node_modules/stylelint/node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true
+ },
+ "node_modules/stylelint/node_modules/balanced-match": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz",
+ "integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==",
+ "dev": true
+ },
+ "node_modules/stylelint/node_modules/cosmiconfig": {
+ "version": "9.0.0",
+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz",
+ "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==",
+ "dev": true,
+ "dependencies": {
+ "env-paths": "^2.2.1",
+ "import-fresh": "^3.3.0",
+ "js-yaml": "^4.1.0",
+ "parse-json": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/d-fischer"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.9.5"
+ },
+ "peerDependenciesMeta": {
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/stylelint/node_modules/file-entry-cache": {
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-9.1.0.tgz",
+ "integrity": "sha512-/pqPFG+FdxWQj+/WSuzXSDaNzxgTLr/OrR1QuqfEZzDakpdYE70PwUxL7BPUa8hpjbvY1+qvCl8k+8Tq34xJgg==",
+ "dev": true,
+ "dependencies": {
+ "flat-cache": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/stylelint/node_modules/flat-cache": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-5.0.0.tgz",
+ "integrity": "sha512-JrqFmyUl2PnPi1OvLyTVHnQvwQ0S+e6lGSwu8OkAZlSaNIZciTY2H/cOOROxsBA1m/LZNHDsqAgDZt6akWcjsQ==",
+ "dev": true,
+ "dependencies": {
+ "flatted": "^3.3.1",
+ "keyv": "^4.5.4"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/stylelint/node_modules/global-modules": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz",
+ "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==",
+ "dev": true,
+ "dependencies": {
+ "global-prefix": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/stylelint/node_modules/global-prefix": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz",
+ "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==",
+ "dev": true,
+ "dependencies": {
+ "ini": "^1.3.5",
+ "kind-of": "^6.0.2",
+ "which": "^1.3.1"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/stylelint/node_modules/ignore": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/ignore/-/ignore-6.0.2.tgz",
+ "integrity": "sha512-InwqeHHN2XpumIkMvpl/DCJVrAHgCsG5+cn1XlnLWGwtZBm8QJfSusItfrwx81CTp5agNZqpKU2J/ccC5nGT4A==",
+ "dev": true,
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/stylelint/node_modules/js-yaml": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "dev": true,
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/stylelint/node_modules/kind-of": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+ "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/stylelint/node_modules/meow": {
+ "version": "13.2.0",
+ "resolved": "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz",
+ "integrity": "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==",
+ "dev": true,
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/stylelint/node_modules/signal-exit": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+ "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+ "dev": true,
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/stylelint/node_modules/write-file-atomic": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz",
+ "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==",
+ "dev": true,
+ "dependencies": {
+ "imurmurhash": "^0.1.4",
+ "signal-exit": "^4.0.1"
+ },
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/stylis": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.1.3.tgz",
+ "integrity": "sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA=="
+ },
+ "node_modules/stylis-plugin-rtl": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/stylis-plugin-rtl/-/stylis-plugin-rtl-2.1.1.tgz",
+ "integrity": "sha512-q6xIkri6fBufIO/sV55md2CbgS5c6gg9EhSVATtHHCdOnbN/jcI0u3lYhNVeuI65c4lQPo67g8xmq5jrREvzlg==",
+ "dependencies": {
+ "cssjanus": "^2.0.1"
+ },
+ "peerDependencies": {
+ "stylis": "4.x"
+ }
+ },
+ "node_modules/supports-color": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
+ "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/supports-hyperlinks": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.1.0.tgz",
+ "integrity": "sha512-2rn0BZ+/f7puLOHZm1HOJfwBggfaHXUpPUSSG/SWM4TWp5KCfmNYwnC3hruy2rZlMnmWZ+QAGpZfchu3f3695A==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0",
+ "supports-color": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=14.18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/supports-preserve-symlinks-flag": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz",
+ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/svg-parser": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz",
+ "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==",
+ "dev": true
+ },
+ "node_modules/svg-tags": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz",
+ "integrity": "sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA==",
+ "dev": true
+ },
+ "node_modules/svgo": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/svgo/-/svgo-3.3.2.tgz",
+ "integrity": "sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw==",
+ "dev": true,
+ "dependencies": {
+ "@trysound/sax": "0.2.0",
+ "commander": "^7.2.0",
+ "css-select": "^5.1.0",
+ "css-tree": "^2.3.1",
+ "css-what": "^6.1.0",
+ "csso": "^5.0.5",
+ "picocolors": "^1.0.0"
+ },
+ "bin": {
+ "svgo": "bin/svgo"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/svgo"
+ }
+ },
+ "node_modules/svgo/node_modules/commander": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
+ "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/svgo/node_modules/css-tree": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz",
+ "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==",
+ "dev": true,
+ "dependencies": {
+ "mdn-data": "2.0.30",
+ "source-map-js": "^1.0.1"
+ },
+ "engines": {
+ "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0"
+ }
+ },
+ "node_modules/svgo/node_modules/mdn-data": {
+ "version": "2.0.30",
+ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz",
+ "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==",
+ "dev": true
+ },
+ "node_modules/symbol-tree": {
+ "version": "3.2.4",
+ "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz",
+ "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==",
+ "dev": true
+ },
+ "node_modules/synckit": {
+ "version": "0.9.2",
+ "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.9.2.tgz",
+ "integrity": "sha512-vrozgXDQwYO72vHjUb/HnFbQx1exDjoKzqx23aXEg2a9VIg2TSFZ8FmeZpTjUCFMYw7mpX4BE2SFu8wI7asYsw==",
+ "dev": true,
+ "dependencies": {
+ "@pkgr/core": "^0.1.0",
+ "tslib": "^2.6.2"
+ },
+ "engines": {
+ "node": "^14.18.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/unts"
+ }
+ },
+ "node_modules/table": {
+ "version": "6.8.2",
+ "resolved": "https://registry.npmjs.org/table/-/table-6.8.2.tgz",
+ "integrity": "sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==",
+ "dev": true,
+ "dependencies": {
+ "ajv": "^8.0.1",
+ "lodash.truncate": "^4.4.2",
+ "slice-ansi": "^4.0.0",
+ "string-width": "^4.2.3",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/table/node_modules/ajv": {
+ "version": "8.17.1",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz",
+ "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==",
+ "dev": true,
+ "dependencies": {
+ "fast-deep-equal": "^3.1.3",
+ "fast-uri": "^3.0.1",
+ "json-schema-traverse": "^1.0.0",
+ "require-from-string": "^2.0.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/table/node_modules/json-schema-traverse": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
+ "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
+ "dev": true
+ },
+ "node_modules/tannin": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/tannin/-/tannin-1.2.0.tgz",
+ "integrity": "sha512-U7GgX/RcSeUETbV7gYgoz8PD7Ni4y95pgIP/Z6ayI3CfhSujwKEBlGFTCRN+Aqnuyf4AN2yHL+L8x+TCGjb9uA==",
+ "dependencies": {
+ "@tannin/plural-forms": "^1.1.0"
+ }
+ },
+ "node_modules/tapable": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
+ "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/tar-fs": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.6.tgz",
+ "integrity": "sha512-iokBDQQkUyeXhgPYaZxmczGPhnhXZ0CmrqI+MOb/WFGS9DW5wnfrLgtjUJBvz50vQ3qfRwJ62QVoCFu8mPVu5w==",
+ "dev": true,
+ "dependencies": {
+ "pump": "^3.0.0",
+ "tar-stream": "^3.1.5"
+ },
+ "optionalDependencies": {
+ "bare-fs": "^2.1.1",
+ "bare-path": "^2.1.0"
+ }
+ },
+ "node_modules/tar-stream": {
+ "version": "3.1.7",
+ "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz",
+ "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==",
+ "dev": true,
+ "dependencies": {
+ "b4a": "^1.6.4",
+ "fast-fifo": "^1.2.0",
+ "streamx": "^2.15.0"
+ }
+ },
+ "node_modules/terminal-link": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/terminal-link/-/terminal-link-2.1.1.tgz",
+ "integrity": "sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-escapes": "^4.2.1",
+ "supports-hyperlinks": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/terminal-link/node_modules/supports-hyperlinks": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz",
+ "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0",
+ "supports-color": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/terser": {
+ "version": "5.36.0",
+ "resolved": "https://registry.npmjs.org/terser/-/terser-5.36.0.tgz",
+ "integrity": "sha512-IYV9eNMuFAV4THUspIRXkLakHnV6XO7FEdtKjf/mDyrnqUg9LnlOn6/RwRvM9SZjR4GUq8Nk8zj67FzVARr74w==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/source-map": "^0.3.3",
+ "acorn": "^8.8.2",
+ "commander": "^2.20.0",
+ "source-map-support": "~0.5.20"
+ },
+ "bin": {
+ "terser": "bin/terser"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/terser-webpack-plugin": {
+ "version": "5.3.10",
+ "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz",
+ "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/trace-mapping": "^0.3.20",
+ "jest-worker": "^27.4.5",
+ "schema-utils": "^3.1.1",
+ "serialize-javascript": "^6.0.1",
+ "terser": "^5.26.0"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "webpack": "^5.1.0"
+ },
+ "peerDependenciesMeta": {
+ "@swc/core": {
+ "optional": true
+ },
+ "esbuild": {
+ "optional": true
+ },
+ "uglify-js": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/terser-webpack-plugin/node_modules/jest-worker": {
+ "version": "27.5.1",
+ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz",
+ "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==",
+ "dev": true,
+ "dependencies": {
+ "@types/node": "*",
+ "merge-stream": "^2.0.0",
+ "supports-color": "^8.0.0"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ }
+ },
+ "node_modules/terser-webpack-plugin/node_modules/schema-utils": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz",
+ "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==",
+ "dev": true,
+ "dependencies": {
+ "@types/json-schema": "^7.0.8",
+ "ajv": "^6.12.5",
+ "ajv-keywords": "^3.5.2"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ }
+ },
+ "node_modules/terser-webpack-plugin/node_modules/supports-color": {
+ "version": "8.1.1",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
+ "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
+ "dev": true,
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/supports-color?sponsor=1"
+ }
+ },
+ "node_modules/terser/node_modules/commander": {
+ "version": "2.20.3",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
+ "dev": true
+ },
+ "node_modules/terser/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/terser/node_modules/source-map-support": {
+ "version": "0.5.21",
+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
+ "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
+ "dev": true,
+ "dependencies": {
+ "buffer-from": "^1.0.0",
+ "source-map": "^0.6.0"
+ }
+ },
+ "node_modules/test-exclude": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz",
+ "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==",
+ "dev": true,
+ "dependencies": {
+ "@istanbuljs/schema": "^0.1.2",
+ "glob": "^7.1.4",
+ "minimatch": "^3.0.4"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/test-exclude/node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/test-exclude/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/text-decoder": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.1.tgz",
+ "integrity": "sha512-x9v3H/lTKIJKQQe7RPQkLfKAnc9lUTkWDypIQgTzPJAq+5/GCDHonmshfvlsNSj58yyshbIJJDLmU15qNERrXQ==",
+ "dev": true
+ },
+ "node_modules/text-table": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
+ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==",
+ "dev": true
+ },
+ "node_modules/third-party-web": {
+ "version": "0.23.4",
+ "resolved": "https://registry.npmjs.org/third-party-web/-/third-party-web-0.23.4.tgz",
+ "integrity": "sha512-kwYnSZRhEvv0SBW2fp8SBBKRglMoBjV8xz6C31m0ewqOtknB5UL+Ihg+M81hyFY5ldkZuGWPb+e4GVDkzf/gYg==",
+ "dev": true
+ },
+ "node_modules/through": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
+ "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==",
+ "dev": true
+ },
+ "node_modules/thunky": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz",
+ "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==",
+ "dev": true
+ },
+ "node_modules/tiny-emitter": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz",
+ "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q=="
+ },
+ "node_modules/tmp": {
+ "version": "0.0.33",
+ "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
+ "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==",
+ "dev": true,
+ "dependencies": {
+ "os-tmpdir": "~1.0.2"
+ },
+ "engines": {
+ "node": ">=0.6.0"
+ }
+ },
+ "node_modules/tmpl": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz",
+ "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==",
+ "dev": true
+ },
+ "node_modules/to-regex-range": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
+ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
+ "dev": true,
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/toidentifier": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
+ "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.6"
+ }
+ },
+ "node_modules/totalist": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz",
+ "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/tough-cookie": {
+ "version": "4.1.4",
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz",
+ "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==",
+ "dev": true,
+ "dependencies": {
+ "psl": "^1.1.33",
+ "punycode": "^2.1.1",
+ "universalify": "^0.2.0",
+ "url-parse": "^1.5.3"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/tough-cookie/node_modules/universalify": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz",
+ "integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 4.0.0"
+ }
+ },
+ "node_modules/tr46": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz",
+ "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==",
+ "dev": true,
+ "dependencies": {
+ "punycode": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/tree-kill": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz",
+ "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==",
+ "dev": true,
+ "bin": {
+ "tree-kill": "cli.js"
+ }
+ },
+ "node_modules/trim-newlines": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz",
+ "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/trim-repeated": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz",
+ "integrity": "sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg==",
+ "dev": true,
+ "dependencies": {
+ "escape-string-regexp": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/trim-repeated/node_modules/escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/ts-api-utils": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.4.0.tgz",
+ "integrity": "sha512-032cPxaEKwM+GT3vA5JXNzIaizx388rhsSW79vGRNGXfRRAdEAn2mvk36PvK5HnOchyWZ7afLEXqYCvPCrzuzQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=16"
+ },
+ "peerDependencies": {
+ "typescript": ">=4.2.0"
+ }
+ },
+ "node_modules/tsconfig-paths": {
+ "version": "3.15.0",
+ "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.15.0.tgz",
+ "integrity": "sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==",
+ "dev": true,
+ "dependencies": {
+ "@types/json5": "^0.0.29",
+ "json5": "^1.0.2",
+ "minimist": "^1.2.6",
+ "strip-bom": "^3.0.0"
+ }
+ },
+ "node_modules/tsconfig-paths/node_modules/json5": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
+ "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
+ "dev": true,
+ "dependencies": {
+ "minimist": "^1.2.0"
+ },
+ "bin": {
+ "json5": "lib/cli.js"
+ }
+ },
+ "node_modules/tsconfig-paths/node_modules/strip-bom": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
+ "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/tslib": {
+ "version": "2.8.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
+ "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w=="
+ },
+ "node_modules/tsutils": {
+ "version": "3.21.0",
+ "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz",
+ "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==",
+ "dev": true,
+ "dependencies": {
+ "tslib": "^1.8.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ },
+ "peerDependencies": {
+ "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta"
+ }
+ },
+ "node_modules/tsutils/node_modules/tslib": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
+ "dev": true
+ },
+ "node_modules/type-check": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
+ "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
+ "dev": true,
+ "dependencies": {
+ "prelude-ls": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/type-detect": {
+ "version": "4.0.8",
+ "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz",
+ "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/type-fest": {
+ "version": "0.21.3",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz",
+ "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/type-is": {
+ "version": "1.6.18",
+ "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
+ "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
+ "dev": true,
+ "dependencies": {
+ "media-typer": "0.3.0",
+ "mime-types": "~2.1.24"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/typed-array-buffer": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.2.tgz",
+ "integrity": "sha512-gEymJYKZtKXzzBzM4jqa9w6Q1Jjm7x2d+sh19AdsD4wqnMPDYyvwpsIc2Q/835kHuo3BEQ7CjelGhfTsoBb2MQ==",
+ "dev": true,
+ "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",
+ "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.1.tgz",
+ "integrity": "sha512-3iMJ9q0ao7WE9tWcaYKIptkNBuOIcZCCT0d4MRvuuH88fEoEH62IuQe0OtraD3ebQEoTRk8XCBoknUNc1Y67pw==",
+ "dev": true,
+ "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",
+ "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz",
+ "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==",
+ "dev": true,
+ "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",
+ "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz",
+ "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==",
+ "dev": true,
+ "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/typed-query-selector": {
+ "version": "2.12.0",
+ "resolved": "https://registry.npmjs.org/typed-query-selector/-/typed-query-selector-2.12.0.tgz",
+ "integrity": "sha512-SbklCd1F0EiZOyPiW192rrHZzZ5sBijB6xM+cpmrwDqObvdtunOHHIk9fCGsoK5JVIYXoyEp4iEdE3upFH3PAg==",
+ "dev": true
+ },
+ "node_modules/typedarray": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
+ "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==",
+ "dev": true
+ },
+ "node_modules/typedarray-to-buffer": {
+ "version": "3.1.5",
+ "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz",
+ "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==",
+ "dev": true,
+ "dependencies": {
+ "is-typedarray": "^1.0.0"
+ }
+ },
+ "node_modules/typescript": {
+ "version": "5.6.3",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz",
+ "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==",
+ "dev": true,
+ "peer": true,
+ "bin": {
+ "tsc": "bin/tsc",
+ "tsserver": "bin/tsserver"
+ },
+ "engines": {
+ "node": ">=14.17"
+ }
+ },
+ "node_modules/uc.micro": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz",
+ "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==",
+ "dev": true
+ },
+ "node_modules/unbox-primitive": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz",
+ "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==",
+ "dev": true,
+ "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/unbzip2-stream": {
+ "version": "1.4.3",
+ "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz",
+ "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==",
+ "dev": true,
+ "dependencies": {
+ "buffer": "^5.2.1",
+ "through": "^2.3.8"
+ }
+ },
+ "node_modules/unbzip2-stream/node_modules/buffer": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
+ "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
+ "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"
+ }
+ ],
+ "dependencies": {
+ "base64-js": "^1.3.1",
+ "ieee754": "^1.1.13"
+ }
+ },
+ "node_modules/undici-types": {
+ "version": "6.19.8",
+ "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz",
+ "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw=="
+ },
+ "node_modules/unicode-canonical-property-names-ecmascript": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz",
+ "integrity": "sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unicode-match-property-ecmascript": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz",
+ "integrity": "sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==",
+ "dev": true,
+ "dependencies": {
+ "unicode-canonical-property-names-ecmascript": "^2.0.0",
+ "unicode-property-aliases-ecmascript": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unicode-match-property-value-ecmascript": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz",
+ "integrity": "sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unicode-property-aliases-ecmascript": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz",
+ "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==",
+ "dev": true,
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/unique-string": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz",
+ "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==",
+ "dev": true,
+ "dependencies": {
+ "crypto-random-string": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/universalify": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
+ "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 10.0.0"
+ }
+ },
+ "node_modules/unpipe": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
+ "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/update-browserslist-db": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz",
+ "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==",
+ "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"
+ }
+ ],
+ "dependencies": {
+ "escalade": "^3.2.0",
+ "picocolors": "^1.1.0"
+ },
+ "bin": {
+ "update-browserslist-db": "cli.js"
+ },
+ "peerDependencies": {
+ "browserslist": ">= 4.21.0"
+ }
+ },
+ "node_modules/upper-case": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-2.0.2.tgz",
+ "integrity": "sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg==",
+ "dependencies": {
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/upper-case-first": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/upper-case-first/-/upper-case-first-2.0.2.tgz",
+ "integrity": "sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg==",
+ "dependencies": {
+ "tslib": "^2.0.3"
+ }
+ },
+ "node_modules/uri-js": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
+ "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
+ "dev": true,
+ "dependencies": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "node_modules/url-loader": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz",
+ "integrity": "sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==",
+ "dev": true,
+ "dependencies": {
+ "loader-utils": "^2.0.0",
+ "mime-types": "^2.1.27",
+ "schema-utils": "^3.0.0"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "file-loader": "*",
+ "webpack": "^4.0.0 || ^5.0.0"
+ },
+ "peerDependenciesMeta": {
+ "file-loader": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/url-loader/node_modules/schema-utils": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz",
+ "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==",
+ "dev": true,
+ "dependencies": {
+ "@types/json-schema": "^7.0.8",
+ "ajv": "^6.12.5",
+ "ajv-keywords": "^3.5.2"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ }
+ },
+ "node_modules/url-parse": {
+ "version": "1.5.10",
+ "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz",
+ "integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==",
+ "dev": true,
+ "dependencies": {
+ "querystringify": "^2.1.1",
+ "requires-port": "^1.0.0"
+ }
+ },
+ "node_modules/urlpattern-polyfill": {
+ "version": "10.0.0",
+ "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.0.0.tgz",
+ "integrity": "sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==",
+ "dev": true
+ },
+ "node_modules/use-callback-ref": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.2.tgz",
+ "integrity": "sha512-elOQwe6Q8gqZgDA8mrh44qRTQqpIHDcZ3hXTLjBe1i4ph8XpNJnO+aQf3NaG+lriLopI4HMx9VjQLfPQ6vhnoA==",
+ "dependencies": {
+ "tslib": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "@types/react": "^16.8.0 || ^17.0.0 || ^18.0.0",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/use-memo-one": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/use-memo-one/-/use-memo-one-1.1.3.tgz",
+ "integrity": "sha512-g66/K7ZQGYrI6dy8GLpVcMsBp4s17xNkYJVSMvTEevGy3nDxHOfE6z8BVE22+5G5x7t3+bhzrlTDB7ObrEE0cQ==",
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
+ }
+ },
+ "node_modules/use-sidecar": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/use-sidecar/-/use-sidecar-1.1.2.tgz",
+ "integrity": "sha512-epTbsLuzZ7lPClpz2TyryBfztm7m+28DlEv2ZCQ3MDr5ssiwyOwGH/e5F9CkfWjJ1t4clvI58yF822/GUkjjhw==",
+ "dependencies": {
+ "detect-node-es": "^1.1.0",
+ "tslib": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "@types/react": "^16.9.0 || ^17.0.0 || ^18.0.0",
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/use-sync-external-store": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.2.tgz",
+ "integrity": "sha512-PElTlVMwpblvbNqQ82d2n6RjStvdSoNe9FG28kNfz3WiXilJm4DdNkEzRhCZuIDwY8U08WVihhGR5iRqAwfDiw==",
+ "peerDependencies": {
+ "react": "^16.8.0 || ^17.0.0 || ^18.0.0"
+ }
+ },
+ "node_modules/util-deprecate": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
+ },
+ "node_modules/utils-merge": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
+ "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.4.0"
+ }
+ },
+ "node_modules/uuid": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz",
+ "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==",
+ "funding": [
+ "https://github.com/sponsors/broofa",
+ "https://github.com/sponsors/ctavan"
+ ],
+ "bin": {
+ "uuid": "dist/bin/uuid"
+ }
+ },
+ "node_modules/v8-to-istanbul": {
+ "version": "9.3.0",
+ "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz",
+ "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==",
+ "dev": true,
+ "dependencies": {
+ "@jridgewell/trace-mapping": "^0.3.12",
+ "@types/istanbul-lib-coverage": "^2.0.1",
+ "convert-source-map": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10.12.0"
+ }
+ },
+ "node_modules/validate-npm-package-license": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
+ "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
+ "dev": true,
+ "dependencies": {
+ "spdx-correct": "^3.0.0",
+ "spdx-expression-parse": "^3.0.0"
+ }
+ },
+ "node_modules/validate-npm-package-license/node_modules/spdx-expression-parse": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
+ "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
+ "dev": true,
+ "dependencies": {
+ "spdx-exceptions": "^2.1.0",
+ "spdx-license-ids": "^3.0.0"
+ }
+ },
+ "node_modules/validate-npm-package-name": {
+ "version": "5.0.1",
+ "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.1.tgz",
+ "integrity": "sha512-OljLrQ9SQdOUqTaQxqL5dEfZWrXExyyWsozYlAWFawPVNuD83igl7uJD2RTkNMbniIYgt8l81eCJGIdQF7avLQ==",
+ "dev": true,
+ "engines": {
+ "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
+ }
+ },
+ "node_modules/vary": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
+ "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/w3c-xmlserializer": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz",
+ "integrity": "sha512-d+BFHzbiCx6zGfz0HyQ6Rg69w9k19nviJspaj4yNscGjrHu94sVP+aRm75yEbCh+r2/yR+7q6hux9LVtbuTGBw==",
+ "dev": true,
+ "dependencies": {
+ "xml-name-validator": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/wait-on": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-7.2.0.tgz",
+ "integrity": "sha512-wCQcHkRazgjG5XoAq9jbTMLpNIjoSlZslrJ2+N9MxDsGEv1HnFoVjOCexL0ESva7Y9cu350j+DWADdk54s4AFQ==",
+ "dev": true,
+ "dependencies": {
+ "axios": "^1.6.1",
+ "joi": "^17.11.0",
+ "lodash": "^4.17.21",
+ "minimist": "^1.2.8",
+ "rxjs": "^7.8.1"
+ },
+ "bin": {
+ "wait-on": "bin/wait-on"
+ },
+ "engines": {
+ "node": ">=12.0.0"
+ }
+ },
+ "node_modules/wait-on/node_modules/rxjs": {
+ "version": "7.8.1",
+ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz",
+ "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==",
+ "dev": true,
+ "dependencies": {
+ "tslib": "^2.1.0"
+ }
+ },
+ "node_modules/walker": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz",
+ "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==",
+ "dev": true,
+ "dependencies": {
+ "makeerror": "1.0.12"
+ }
+ },
+ "node_modules/watchpack": {
+ "version": "2.4.2",
+ "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz",
+ "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==",
+ "dev": true,
+ "dependencies": {
+ "glob-to-regexp": "^0.4.1",
+ "graceful-fs": "^4.1.2"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/wbuf": {
+ "version": "1.7.3",
+ "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz",
+ "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==",
+ "dev": true,
+ "dependencies": {
+ "minimalistic-assert": "^1.0.0"
+ }
+ },
+ "node_modules/wcwidth": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz",
+ "integrity": "sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==",
+ "dev": true,
+ "dependencies": {
+ "defaults": "^1.0.3"
+ }
+ },
+ "node_modules/web-vitals": {
+ "version": "4.2.4",
+ "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-4.2.4.tgz",
+ "integrity": "sha512-r4DIlprAGwJ7YM11VZp4R884m0Vmgr6EAKe3P+kO0PPj3Unqyvv59rczf6UiGcb9Z8QxZVcqKNwv/g0WNdWwsw==",
+ "dev": true
+ },
+ "node_modules/webidl-conversions": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz",
+ "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/webpack": {
+ "version": "5.96.1",
+ "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.96.1.tgz",
+ "integrity": "sha512-l2LlBSvVZGhL4ZrPwyr8+37AunkcYj5qh8o6u2/2rzoPc8gxFJkLj1WxNgooi9pnoc06jh0BjuXnamM4qlujZA==",
+ "dev": true,
+ "dependencies": {
+ "@types/eslint-scope": "^3.7.7",
+ "@types/estree": "^1.0.6",
+ "@webassemblyjs/ast": "^1.12.1",
+ "@webassemblyjs/wasm-edit": "^1.12.1",
+ "@webassemblyjs/wasm-parser": "^1.12.1",
+ "acorn": "^8.14.0",
+ "browserslist": "^4.24.0",
+ "chrome-trace-event": "^1.0.2",
+ "enhanced-resolve": "^5.17.1",
+ "es-module-lexer": "^1.2.1",
+ "eslint-scope": "5.1.1",
+ "events": "^3.2.0",
+ "glob-to-regexp": "^0.4.1",
+ "graceful-fs": "^4.2.11",
+ "json-parse-even-better-errors": "^2.3.1",
+ "loader-runner": "^4.2.0",
+ "mime-types": "^2.1.27",
+ "neo-async": "^2.6.2",
+ "schema-utils": "^3.2.0",
+ "tapable": "^2.1.1",
+ "terser-webpack-plugin": "^5.3.10",
+ "watchpack": "^2.4.1",
+ "webpack-sources": "^3.2.3"
+ },
+ "bin": {
+ "webpack": "bin/webpack.js"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependenciesMeta": {
+ "webpack-cli": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/webpack-bundle-analyzer": {
+ "version": "4.10.2",
+ "resolved": "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.10.2.tgz",
+ "integrity": "sha512-vJptkMm9pk5si4Bv922ZbKLV8UTT4zib4FPgXMhgzUny0bfDDkLXAVQs3ly3fS4/TN9ROFtb0NFrm04UXFE/Vw==",
+ "dev": true,
+ "dependencies": {
+ "@discoveryjs/json-ext": "0.5.7",
+ "acorn": "^8.0.4",
+ "acorn-walk": "^8.0.0",
+ "commander": "^7.2.0",
+ "debounce": "^1.2.1",
+ "escape-string-regexp": "^4.0.0",
+ "gzip-size": "^6.0.0",
+ "html-escaper": "^2.0.2",
+ "opener": "^1.5.2",
+ "picocolors": "^1.0.0",
+ "sirv": "^2.0.3",
+ "ws": "^7.3.1"
+ },
+ "bin": {
+ "webpack-bundle-analyzer": "lib/bin/analyzer.js"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ }
+ },
+ "node_modules/webpack-bundle-analyzer/node_modules/commander": {
+ "version": "7.2.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz",
+ "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==",
+ "dev": true,
+ "engines": {
+ "node": ">= 10"
+ }
+ },
+ "node_modules/webpack-bundle-analyzer/node_modules/ws": {
+ "version": "7.5.10",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz",
+ "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=8.3.0"
+ },
+ "peerDependencies": {
+ "bufferutil": "^4.0.1",
+ "utf-8-validate": "^5.0.2"
+ },
+ "peerDependenciesMeta": {
+ "bufferutil": {
+ "optional": true
+ },
+ "utf-8-validate": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/webpack-cli": {
+ "version": "5.1.4",
+ "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.4.tgz",
+ "integrity": "sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==",
+ "dev": true,
+ "dependencies": {
+ "@discoveryjs/json-ext": "^0.5.0",
+ "@webpack-cli/configtest": "^2.1.1",
+ "@webpack-cli/info": "^2.0.2",
+ "@webpack-cli/serve": "^2.0.5",
+ "colorette": "^2.0.14",
+ "commander": "^10.0.1",
+ "cross-spawn": "^7.0.3",
+ "envinfo": "^7.7.3",
+ "fastest-levenshtein": "^1.0.12",
+ "import-local": "^3.0.2",
+ "interpret": "^3.1.1",
+ "rechoir": "^0.8.0",
+ "webpack-merge": "^5.7.3"
+ },
+ "bin": {
+ "webpack-cli": "bin/cli.js"
+ },
+ "engines": {
+ "node": ">=14.15.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "webpack": "5.x.x"
+ },
+ "peerDependenciesMeta": {
+ "@webpack-cli/generators": {
+ "optional": true
+ },
+ "webpack-bundle-analyzer": {
+ "optional": true
+ },
+ "webpack-dev-server": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/webpack-cli/node_modules/commander": {
+ "version": "10.0.1",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz",
+ "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==",
+ "dev": true,
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/webpack-cli/node_modules/cross-spawn": {
+ "version": "7.0.5",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.5.tgz",
+ "integrity": "sha512-ZVJrKKYunU38/76t0RMOulHOnUcbU9GbpWKAOZ0mhjr7CX6FVrH+4FrAapSOekrgFQ3f/8gwMEuIft0aKq6Hug==",
+ "dev": true,
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/webpack-cli/node_modules/shebang-command": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
+ "dev": true,
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/webpack-cli/node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/webpack-cli/node_modules/which": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
+ "dev": true,
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/webpack-dev-middleware": {
+ "version": "5.3.4",
+ "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz",
+ "integrity": "sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==",
+ "dev": true,
+ "dependencies": {
+ "colorette": "^2.0.10",
+ "memfs": "^3.4.3",
+ "mime-types": "^2.1.31",
+ "range-parser": "^1.2.1",
+ "schema-utils": "^4.0.0"
+ },
+ "engines": {
+ "node": ">= 12.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "webpack": "^4.0.0 || ^5.0.0"
+ }
+ },
+ "node_modules/webpack-dev-server": {
+ "version": "4.15.2",
+ "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.2.tgz",
+ "integrity": "sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g==",
+ "dev": true,
+ "dependencies": {
+ "@types/bonjour": "^3.5.9",
+ "@types/connect-history-api-fallback": "^1.3.5",
+ "@types/express": "^4.17.13",
+ "@types/serve-index": "^1.9.1",
+ "@types/serve-static": "^1.13.10",
+ "@types/sockjs": "^0.3.33",
+ "@types/ws": "^8.5.5",
+ "ansi-html-community": "^0.0.8",
+ "bonjour-service": "^1.0.11",
+ "chokidar": "^3.5.3",
+ "colorette": "^2.0.10",
+ "compression": "^1.7.4",
+ "connect-history-api-fallback": "^2.0.0",
+ "default-gateway": "^6.0.3",
+ "express": "^4.17.3",
+ "graceful-fs": "^4.2.6",
+ "html-entities": "^2.3.2",
+ "http-proxy-middleware": "^2.0.3",
+ "ipaddr.js": "^2.0.1",
+ "launch-editor": "^2.6.0",
+ "open": "^8.0.9",
+ "p-retry": "^4.5.0",
+ "rimraf": "^3.0.2",
+ "schema-utils": "^4.0.0",
+ "selfsigned": "^2.1.1",
+ "serve-index": "^1.9.1",
+ "sockjs": "^0.3.24",
+ "spdy": "^4.0.2",
+ "webpack-dev-middleware": "^5.3.4",
+ "ws": "^8.13.0"
+ },
+ "bin": {
+ "webpack-dev-server": "bin/webpack-dev-server.js"
+ },
+ "engines": {
+ "node": ">= 12.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ },
+ "peerDependencies": {
+ "webpack": "^4.37.0 || ^5.0.0"
+ },
+ "peerDependenciesMeta": {
+ "webpack": {
+ "optional": true
+ },
+ "webpack-cli": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/webpack-dev-server/node_modules/chokidar": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz",
+ "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==",
+ "dev": true,
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/webpack-dev-server/node_modules/glob-parent": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
+ "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
+ "dev": true,
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/webpack-dev-server/node_modules/readdirp": {
+ "version": "3.6.0",
+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
+ "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
+ "dev": true,
+ "dependencies": {
+ "picomatch": "^2.2.1"
+ },
+ "engines": {
+ "node": ">=8.10.0"
+ }
+ },
+ "node_modules/webpack-merge": {
+ "version": "5.10.0",
+ "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz",
+ "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==",
+ "dev": true,
+ "dependencies": {
+ "clone-deep": "^4.0.1",
+ "flat": "^5.0.2",
+ "wildcard": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=10.0.0"
+ }
+ },
+ "node_modules/webpack-merge/node_modules/clone-deep": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz",
+ "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==",
+ "dev": true,
+ "dependencies": {
+ "is-plain-object": "^2.0.4",
+ "kind-of": "^6.0.2",
+ "shallow-clone": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/webpack-merge/node_modules/is-plain-object": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
+ "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
+ "dev": true,
+ "dependencies": {
+ "isobject": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/webpack-merge/node_modules/kind-of": {
+ "version": "6.0.3",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
+ "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/webpack-merge/node_modules/shallow-clone": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz",
+ "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==",
+ "dev": true,
+ "dependencies": {
+ "kind-of": "^6.0.2"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/webpack-sources": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz",
+ "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==",
+ "dev": true,
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/webpack/node_modules/schema-utils": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz",
+ "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==",
+ "dev": true,
+ "dependencies": {
+ "@types/json-schema": "^7.0.8",
+ "ajv": "^6.12.5",
+ "ajv-keywords": "^3.5.2"
+ },
+ "engines": {
+ "node": ">= 10.13.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/webpack"
+ }
+ },
+ "node_modules/websocket-driver": {
+ "version": "0.7.4",
+ "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz",
+ "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==",
+ "dev": true,
+ "dependencies": {
+ "http-parser-js": ">=0.5.1",
+ "safe-buffer": ">=5.1.0",
+ "websocket-extensions": ">=0.1.1"
+ },
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/websocket-extensions": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz",
+ "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/whatwg-encoding": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz",
+ "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==",
+ "dev": true,
+ "dependencies": {
+ "iconv-lite": "0.6.3"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/whatwg-mimetype": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz",
+ "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/whatwg-url": {
+ "version": "11.0.0",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-11.0.0.tgz",
+ "integrity": "sha512-RKT8HExMpoYx4igMiVMY83lN6UeITKJlBQ+vR/8ZJ8OCdSiN3RwCq+9gH0+Xzj0+5IrM6i4j/6LuvzbZIQgEcQ==",
+ "dev": true,
+ "dependencies": {
+ "tr46": "^3.0.0",
+ "webidl-conversions": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/which": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+ "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+ "dev": true,
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "which": "bin/which"
+ }
+ },
+ "node_modules/which-boxed-primitive": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz",
+ "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==",
+ "dev": true,
+ "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.4",
+ "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.4.tgz",
+ "integrity": "sha512-bppkmBSsHFmIMSl8BO9TbsyzsvGjVoppt8xUiGzwiu/bhDCGxnpOKCxgqj6GuyHE0mINMDecBFPlOm2hzY084w==",
+ "dev": true,
+ "dependencies": {
+ "function.prototype.name": "^1.1.6",
+ "has-tostringtag": "^1.0.2",
+ "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.2",
+ "which-typed-array": "^1.1.15"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/which-builtin-type/node_modules/isarray": {
+ "version": "2.0.5",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
+ "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
+ "dev": true
+ },
+ "node_modules/which-collection": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz",
+ "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==",
+ "dev": true,
+ "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-module": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.1.tgz",
+ "integrity": "sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ=="
+ },
+ "node_modules/which-typed-array": {
+ "version": "1.1.15",
+ "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz",
+ "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==",
+ "dev": true,
+ "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/wildcard": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz",
+ "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==",
+ "dev": true
+ },
+ "node_modules/word-wrap": {
+ "version": "1.2.5",
+ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz",
+ "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/wrap-ansi": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==",
+ "dev": true
+ },
+ "node_modules/write-file-atomic": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz",
+ "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==",
+ "dev": true,
+ "dependencies": {
+ "imurmurhash": "^0.1.4",
+ "signal-exit": "^3.0.7"
+ },
+ "engines": {
+ "node": "^12.13.0 || ^14.15.0 || >=16.0.0"
+ }
+ },
+ "node_modules/ws": {
+ "version": "8.18.0",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz",
+ "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==",
+ "devOptional": true,
+ "engines": {
+ "node": ">=10.0.0"
+ },
+ "peerDependencies": {
+ "bufferutil": "^4.0.1",
+ "utf-8-validate": ">=5.0.2"
+ },
+ "peerDependenciesMeta": {
+ "bufferutil": {
+ "optional": true
+ },
+ "utf-8-validate": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/xdg-basedir": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz",
+ "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/xml-name-validator": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz",
+ "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/xmlchars": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz",
+ "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==",
+ "dev": true
+ },
+ "node_modules/y-indexeddb": {
+ "version": "9.0.12",
+ "resolved": "https://registry.npmjs.org/y-indexeddb/-/y-indexeddb-9.0.12.tgz",
+ "integrity": "sha512-9oCFRSPPzBK7/w5vOkJBaVCQZKHXB/v6SIT+WYhnJxlEC61juqG0hBrAf+y3gmSMLFLwICNH9nQ53uscuse6Hg==",
+ "dependencies": {
+ "lib0": "^0.2.74"
+ },
+ "engines": {
+ "node": ">=16.0.0",
+ "npm": ">=8.0.0"
+ },
+ "funding": {
+ "type": "GitHub Sponsors ❤",
+ "url": "https://github.com/sponsors/dmonad"
+ },
+ "peerDependencies": {
+ "yjs": "^13.0.0"
+ }
+ },
+ "node_modules/y-protocols": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/y-protocols/-/y-protocols-1.0.6.tgz",
+ "integrity": "sha512-vHRF2L6iT3rwj1jub/K5tYcTT/mEYDUppgNPXwp8fmLpui9f7Yeq3OEtTLVF012j39QnV+KEQpNqoN7CWU7Y9Q==",
+ "dependencies": {
+ "lib0": "^0.2.85"
+ },
+ "engines": {
+ "node": ">=16.0.0",
+ "npm": ">=8.0.0"
+ },
+ "funding": {
+ "type": "GitHub Sponsors ❤",
+ "url": "https://github.com/sponsors/dmonad"
+ },
+ "peerDependencies": {
+ "yjs": "^13.0.0"
+ }
+ },
+ "node_modules/y-webrtc": {
+ "version": "10.2.6",
+ "resolved": "https://registry.npmjs.org/y-webrtc/-/y-webrtc-10.2.6.tgz",
+ "integrity": "sha512-1kZ4YYwksFZi8+l8mTebVX9vW6Q5MnqxMkvNU700X5dBE38usurt/JgeXSIQRpK3NwUYYb9y63Jn9FMpMH6/vA==",
+ "dependencies": {
+ "lib0": "^0.2.42",
+ "simple-peer": "^9.11.0",
+ "y-protocols": "^1.0.6"
+ },
+ "bin": {
+ "y-webrtc-signaling": "bin/server.js"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "type": "GitHub Sponsors ❤",
+ "url": "https://github.com/sponsors/dmonad"
+ },
+ "optionalDependencies": {
+ "ws": "^8.14.2"
+ },
+ "peerDependencies": {
+ "yjs": "^13.6.8"
+ }
+ },
+ "node_modules/y18n": {
+ "version": "5.0.8",
+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
+ "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/yallist": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz",
+ "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==",
+ "dev": true
+ },
+ "node_modules/yaml": {
+ "version": "1.10.2",
+ "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz",
+ "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==",
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/yargs": {
+ "version": "17.7.2",
+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz",
+ "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==",
+ "dev": true,
+ "dependencies": {
+ "cliui": "^8.0.1",
+ "escalade": "^3.1.1",
+ "get-caller-file": "^2.0.5",
+ "require-directory": "^2.1.1",
+ "string-width": "^4.2.3",
+ "y18n": "^5.0.5",
+ "yargs-parser": "^21.1.1"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/yargs-parser": {
+ "version": "21.1.1",
+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz",
+ "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/yauzl": {
+ "version": "2.10.0",
+ "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz",
+ "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==",
+ "dev": true,
+ "dependencies": {
+ "buffer-crc32": "~0.2.3",
+ "fd-slicer": "~1.1.0"
+ }
+ },
+ "node_modules/yjs": {
+ "version": "13.6.20",
+ "resolved": "https://registry.npmjs.org/yjs/-/yjs-13.6.20.tgz",
+ "integrity": "sha512-Z2YZI+SYqK7XdWlloI3lhMiKnCdFCVC4PchpdO+mCYwtiTwncjUbnRK9R1JmkNfdmHyDXuWN3ibJAt0wsqTbLQ==",
+ "dependencies": {
+ "lib0": "^0.2.98"
+ },
+ "engines": {
+ "node": ">=16.0.0",
+ "npm": ">=8.0.0"
+ },
+ "funding": {
+ "type": "GitHub Sponsors ❤",
+ "url": "https://github.com/sponsors/dmonad"
+ }
+ },
+ "node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
+ "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/zod": {
+ "version": "3.23.8",
+ "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz",
+ "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==",
+ "dev": true,
+ "funding": {
+ "url": "https://github.com/sponsors/colinhacks"
+ }
+ }
+ }
+}
diff --git a/package.json b/package.json
index 2ed55696..e5a1f257 100644
--- a/package.json
+++ b/package.json
@@ -28,7 +28,8 @@
"eslint-plugin-babel": "^5.3.1",
"eslint-plugin-import": "^2.31.0",
"eslint-plugin-jsx-a11y": "^6.10.1",
- "eslint-plugin-react": "^7.37.1"
+ "eslint-plugin-react": "^7.37.1",
+ "husky": "^9.1.6"
},
"dependencies": {
"@elementor/icons": "^1.17.0",
From 942076b1298b85eba80bb079c3a2a593c4a7b706 Mon Sep 17 00:00:00 2001
From: Nirbhay Singh <121793120+nirbhayel@users.noreply.github.com>
Date: Wed, 13 Nov 2024 16:50:23 +0530
Subject: [PATCH 005/290] Add connect modal (#111)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* Initial refactor commit
* ✅ Added build and tests CI/CD
* update: add src for admin settings
* update: incorrect constant names
* update: namespace
* add: accessibility settings
* update: webpack to output files inside a folder
* update: build output folders
* update: removed commented code
* update: npm scripts
* add: webpack config
* add: hooks
* update: move admin setting to the module folder
* update: assets loading logic
* update: add rule to move jsx props to multiline imporving readability
* add: connect modal
* update: hooks import for better readability
* update: replace functions with hooks
* fix: alignment and style
* update: imports
* update: removed conflicting imports
* fix: add compatibility for mobile devices
---------
Co-authored-by: Ohad
---
.eslintrc | 1 +
modules/settings/assets/js/app.js | 2 +
.../connect-modal/connect-modal-icon.js | 68 +++++++++++++++++++
.../js/components/connect-modal/index.js | 51 ++++++++++++++
.../settings/assets/js/components/index.js | 1 +
modules/settings/assets/js/hooks/index.js | 2 +
modules/settings/assets/js/hooks/use-auth.js | 4 +-
modules/settings/assets/js/hooks/use-modal.js | 3 +-
8 files changed, 127 insertions(+), 5 deletions(-)
create mode 100644 modules/settings/assets/js/components/connect-modal/connect-modal-icon.js
create mode 100644 modules/settings/assets/js/components/connect-modal/index.js
create mode 100644 modules/settings/assets/js/components/index.js
diff --git a/.eslintrc b/.eslintrc
index bd2111c7..0ad9518b 100644
--- a/.eslintrc
+++ b/.eslintrc
@@ -26,6 +26,7 @@
"rules": {
"no-console": "off",
"react-hooks/exhaustive-deps": "off",
+ "react/jsx-max-props-per-line": [1, { "maximum": { "single": 2, "multi": 1 } }],
"strict": [ "error", "global" ],
"curly": "warn",
"import/order": [
diff --git a/modules/settings/assets/js/app.js b/modules/settings/assets/js/app.js
index 35d5bfb3..2ca43d10 100644
--- a/modules/settings/assets/js/app.js
+++ b/modules/settings/assets/js/app.js
@@ -1,11 +1,13 @@
import '../css/style.css';
import DirectionProvider from '@elementor/ui/DirectionProvider';
import { ThemeProvider } from '@elementor/ui/styles';
+import { ConnectModal } from './components';
const App = () => {
return (
+
);
diff --git a/modules/settings/assets/js/components/connect-modal/connect-modal-icon.js b/modules/settings/assets/js/components/connect-modal/connect-modal-icon.js
new file mode 100644
index 00000000..98915a2a
--- /dev/null
+++ b/modules/settings/assets/js/components/connect-modal/connect-modal-icon.js
@@ -0,0 +1,68 @@
+import SvgIcon from '@elementor/ui/SvgIcon';
+
+const ConnectModalIcon = () => {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+};
+
+export default ConnectModalIcon;
diff --git a/modules/settings/assets/js/components/connect-modal/index.js b/modules/settings/assets/js/components/connect-modal/index.js
new file mode 100644
index 00000000..8ea7f9c3
--- /dev/null
+++ b/modules/settings/assets/js/components/connect-modal/index.js
@@ -0,0 +1,51 @@
+import Box from '@elementor/ui/Box';
+import Button from '@elementor/ui/Button';
+import Grid from '@elementor/ui/Grid';
+import Modal from '@elementor/ui/Modal';
+import Typography from '@elementor/ui/Typography';
+import { __ } from '@wordpress/i18n';
+import { useAuth, useModal } from '../../hooks';
+
+function ConnectModal() {
+ const { isOpen } = useModal();
+ const { redirectToConnect } = useAuth();
+
+ return (
+
+
+
+
+ { __( 'Connect plugin on your site!', 'pojo-accessibility' ) }
+
+
+ { __( 'Connect', 'pojo-accessibility' ) }
+
+
+
+ );
+}
+
+export default ConnectModal;
diff --git a/modules/settings/assets/js/components/index.js b/modules/settings/assets/js/components/index.js
new file mode 100644
index 00000000..a07d5cec
--- /dev/null
+++ b/modules/settings/assets/js/components/index.js
@@ -0,0 +1 @@
+export { default as ConnectModal } from './connect-modal';
diff --git a/modules/settings/assets/js/hooks/index.js b/modules/settings/assets/js/hooks/index.js
index e69de29b..0d9d628b 100644
--- a/modules/settings/assets/js/hooks/index.js
+++ b/modules/settings/assets/js/hooks/index.js
@@ -0,0 +1,2 @@
+export { useAuth } from './use-auth';
+export { useModal } from './use-modal';
diff --git a/modules/settings/assets/js/hooks/use-auth.js b/modules/settings/assets/js/hooks/use-auth.js
index 4ce59147..791ec33c 100644
--- a/modules/settings/assets/js/hooks/use-auth.js
+++ b/modules/settings/assets/js/hooks/use-auth.js
@@ -1,7 +1,7 @@
import API from '../api';
import { UPGRADE_LINK } from '../constants';
-const useAuth = () => {
+export const useAuth = () => {
const { subscriptionId } = 123;
const redirectToConnect = async () => {
@@ -28,5 +28,3 @@ const useAuth = () => {
getUpgradeLink,
};
};
-
-export default useAuth;
diff --git a/modules/settings/assets/js/hooks/use-modal.js b/modules/settings/assets/js/hooks/use-modal.js
index 6ae362b5..65c79c13 100644
--- a/modules/settings/assets/js/hooks/use-modal.js
+++ b/modules/settings/assets/js/hooks/use-modal.js
@@ -1,6 +1,6 @@
import { useState } from '@wordpress/element';
-const useModal = ( defaultIsOpen = true ) => {
+export const useModal = ( defaultIsOpen = true ) => {
const [ isOpen, setIsOpen ] = useState( defaultIsOpen );
const open = () => {
@@ -19,4 +19,3 @@ const useModal = ( defaultIsOpen = true ) => {
};
};
-export default useModal;
From 9056e59ea8fd16d96f8ecb1d9420e86a085b060d Mon Sep 17 00:00:00 2001
From: Nirbhay Singh <121793120+nirbhayel@users.noreply.github.com>
Date: Wed, 13 Nov 2024 18:00:35 +0530
Subject: [PATCH 006/290] [APP 705] add connect module, settings and
notification component (#112)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* Initial refactor commit
* ✅ Added build and tests CI/CD
* update: add src for admin settings
* update: incorrect constant names
* update: namespace
* add: accessibility settings
* update: webpack to output files inside a folder
* update: build output folders
* update: removed commented code
* update: npm scripts
* add: webpack config
* add: hooks
* update: move admin setting to the module folder
* update: assets loading logic
* update: add rule to move jsx props to multiline imporving readability
* add: connect modal
* update: hooks import for better readability
* update: replace functions with hooks
* add: connect module
* add: settings and get settings route
* add: hooks and contexts to get settings
* add: hooks
* add: notification component
* add: data api
* add: settings provider and connect settings
* add: husky
* fix: formatting and text-domain
* update: filter names
* fix: hook import
* add: set function for settings
* add: prop-types package
* update: refactor notification component and context
* update: remove filter for authorize url
* update: imports and exports of hooks
* update: plugin settings context filename and relevant imports
---------
Co-authored-by: Ohad
---
includes/manager.php | 1 +
modules/connect/classes/basic-enum.php | 35 ++
modules/connect/classes/config.php | 22 ++
modules/connect/classes/data.php | 357 ++++++++++++++++++
.../classes/exceptions/service-exception.php | 13 +
modules/connect/classes/grant-types.php | 16 +
modules/connect/classes/route-base.php | 43 +++
modules/connect/classes/service.php | 320 ++++++++++++++++
modules/connect/classes/utils.php | 125 ++++++
modules/connect/components/handler.php | 91 +++++
modules/connect/module.php | 62 +++
modules/connect/rest/authorize.php | 78 ++++
.../rest/deactivate-and-disconnect.php | 50 +++
modules/connect/rest/deactivate.php | 42 +++
modules/connect/rest/disconnect.php | 42 +++
modules/connect/rest/reconnect.php | 41 ++
modules/connect/rest/switch-domain.php | 59 +++
modules/settings/assets/js/admin.js | 10 +-
modules/settings/assets/js/app.js | 15 +-
.../settings/assets/js/components/index.js | 1 +
.../js/components/notifications/index.js | 36 ++
.../assets/js/contexts/plugin-settings.js | 40 ++
modules/settings/assets/js/hooks/index.js | 6 +
modules/settings/assets/js/hooks/use-auth.js | 1 +
modules/settings/assets/js/hooks/use-modal.js | 1 -
.../assets/js/hooks/use-notifications.js | 53 +++
.../settings/assets/js/hooks/use-settings.js | 24 ++
.../settings/assets/js/hooks/use-storage.js | 12 +
modules/settings/classes/route-base.php | 39 ++
modules/settings/classes/settings.php | 28 ++
modules/settings/module.php | 21 +-
modules/settings/rest/get-settings.php | 50 +++
package.json | 4 +-
33 files changed, 1730 insertions(+), 8 deletions(-)
create mode 100644 modules/connect/classes/basic-enum.php
create mode 100644 modules/connect/classes/config.php
create mode 100644 modules/connect/classes/data.php
create mode 100644 modules/connect/classes/exceptions/service-exception.php
create mode 100644 modules/connect/classes/grant-types.php
create mode 100644 modules/connect/classes/route-base.php
create mode 100644 modules/connect/classes/service.php
create mode 100644 modules/connect/classes/utils.php
create mode 100644 modules/connect/components/handler.php
create mode 100644 modules/connect/module.php
create mode 100644 modules/connect/rest/authorize.php
create mode 100644 modules/connect/rest/deactivate-and-disconnect.php
create mode 100644 modules/connect/rest/deactivate.php
create mode 100644 modules/connect/rest/disconnect.php
create mode 100644 modules/connect/rest/reconnect.php
create mode 100644 modules/connect/rest/switch-domain.php
create mode 100644 modules/settings/assets/js/components/notifications/index.js
create mode 100644 modules/settings/assets/js/contexts/plugin-settings.js
create mode 100644 modules/settings/assets/js/hooks/use-notifications.js
create mode 100644 modules/settings/assets/js/hooks/use-settings.js
create mode 100644 modules/settings/assets/js/hooks/use-storage.js
create mode 100644 modules/settings/classes/route-base.php
create mode 100644 modules/settings/classes/settings.php
create mode 100644 modules/settings/rest/get-settings.php
diff --git a/includes/manager.php b/includes/manager.php
index cc781854..247b9b20 100644
--- a/includes/manager.php
+++ b/includes/manager.php
@@ -17,6 +17,7 @@ final class Manager {
public static function get_module_list(): array {
return [
'Legacy',
+ 'Connect',
'Settings',
];
}
diff --git a/modules/connect/classes/basic-enum.php b/modules/connect/classes/basic-enum.php
new file mode 100644
index 00000000..bf5c1aa9
--- /dev/null
+++ b/modules/connect/classes/basic-enum.php
@@ -0,0 +1,35 @@
+getConstants();
+ }
+
+ return self::$entries[ $caller ];
+ }
+}
diff --git a/modules/connect/classes/config.php b/modules/connect/classes/config.php
new file mode 100644
index 00000000..e1f565ba
--- /dev/null
+++ b/modules/connect/classes/config.php
@@ -0,0 +1,22 @@
+get_col(
+ $wpdb->prepare(
+ "SELECT option_value
+ FROM $wpdb->options
+ WHERE option_name = %s
+ AND %s = %s
+ LIMIT 1",
+ $option_name,
+ $cache_buster,
+ $cache_buster
+ )
+ );
+ if ( ! empty( $option ) ) {
+ return $option[0];
+ }
+ return $default;
+ }
+
+ /**
+ * insert_option_uniquely
+ *
+ * used to insert option if not there already
+ * direct query to avoid cache and race condition issues
+ *
+ * @param $option_name
+ * @param $option_value
+ *
+ * @return bool
+ */
+ public static function insert_option_uniquely( $option_name, $option_value ): bool {
+ global $wpdb;
+ if ( ! self::is_option_whitelisted_for_direct_access( $option_name ) ) {
+ return false;
+ }
+ $cache_buster = wp_generate_uuid4();
+ $result = $wpdb->query(
+ $wpdb->prepare(
+ "INSERT INTO $wpdb->options (option_name, option_value, autoload)
+ SELECT * FROM (SELECT %s, %s, 'no') AS tmp
+ WHERE NOT EXISTS (
+ SELECT option_name
+ FROM $wpdb->options
+ WHERE option_name = %s
+ AND option_value = %s
+ AND %s = %s
+ ) LIMIT 1",
+ $option_name,
+ $option_value,
+ $option_name,
+ $option_value,
+ $cache_buster,
+ $cache_buster
+ )
+ );
+
+ if ( false === $result || 0 === $result ) {
+ // false means query failed, 0 means no row inserted because it exists
+ return false;
+ }
+
+ return true;
+ }
+
+ /**
+ * is_option_whitelisted_for_direct_access
+ * allowed only list of option names
+ *
+ * @param string $option_name
+ *
+ * @return boolean
+ */
+ public static function is_option_whitelisted_for_direct_access( string $option_name ): bool {
+ $options_whitelist = [
+ Config::APP_NAME . Service::REFRESH_TOKEN_LOCK,
+ ];
+ return in_array( $option_name, $options_whitelist, true );
+ }
+
+ /**
+ * User is subscription owner.
+ *
+ * Check if current user is subscription owner.
+ *
+ * @return boolean
+ */
+ public static function user_is_subscription_owner(): bool {
+ $owner_id = (int) self::get_connect_mode_data( self::OPTION_OWNER_USER_ID, false );
+
+ return get_current_user_id() === $owner_id;
+ }
+
+ /**
+ * clear_session
+ */
+ public static function clear_session( $with_client = false ) {
+ if ( Config::CONNECT_MODE === 'site' ) {
+ if ( $with_client ) {
+ self::delete_option( self::CLIENT_ID );
+ self::delete_option( self::CLIENT_SECRET );
+ }
+ self::delete_option( self::ACCESS_TOKEN );
+ self::delete_option( self::REFRESH_TOKEN );
+ self::delete_option( self::TOKEN_ID );
+ self::delete_option( self::SUBSCRIPTION_ID );
+ self::delete_option( self::OPTION_OWNER_USER_ID );
+ self::delete_option( self::HOME_URL );
+ } else {
+ $user_id = get_current_user_id();
+ if ( $with_client ) {
+ self::delete_user_data( $user_id, self::CLIENT_ID );
+ self::delete_user_data( $user_id, self::CLIENT_SECRET );
+ }
+ self::delete_user_data( $user_id, self::ACCESS_TOKEN );
+ self::delete_user_data( $user_id, self::REFRESH_TOKEN );
+ self::delete_user_data( $user_id, self::TOKEN_ID );
+ self::delete_user_data( $user_id, self::SUBSCRIPTION_ID );
+ self::delete_user_data( $user_id, self::OPTION_OWNER_USER_ID );
+ self::delete_user_data( $user_id, self::HOME_URL );
+ }
+ }
+}
diff --git a/modules/connect/classes/exceptions/service-exception.php b/modules/connect/classes/exceptions/service-exception.php
new file mode 100644
index 00000000..ad0af388
--- /dev/null
+++ b/modules/connect/classes/exceptions/service-exception.php
@@ -0,0 +1,13 @@
+get_path();
+ }
+
+ public function get_path(): string {
+ return $this->path;
+ }
+
+ public function get_name(): string {
+ return '';
+ }
+
+ public function post_permission_callback( \WP_REST_Request $request ): bool {
+ return $this->get_permission_callback( $request );
+ }
+
+ public function get_permission_callback( \WP_REST_Request $request ): bool {
+ $valid = $this->permission_callback( $request );
+
+ return $valid && user_can( $this->current_user_id, 'manage_options' );
+ }
+}
diff --git a/modules/connect/classes/service.php b/modules/connect/classes/service.php
new file mode 100644
index 00000000..88180c45
--- /dev/null
+++ b/modules/connect/classes/service.php
@@ -0,0 +1,320 @@
+ 'POST',
+ 'headers' => [
+ 'Content-Type' => 'application/json',
+ ],
+ 'body' => wp_json_encode([
+ 'redirect_uri' => Utils::get_redirect_uri(),
+ 'app_type' => Config::APP_TYPE,
+ ]),
+ ], 201 );
+
+ $client_id = $client_data['client_id'] ?? null;
+ $client_secret = $client_data['client_secret'] ?? null;
+
+ Data::set_client_id( $client_id );
+ Data::set_client_secret( $client_secret );
+ Data::set_home_url();
+
+ return $client_id;
+ }
+
+ /**
+ * Deactivate license
+ *
+ * @return void
+ * @throws Service_Exception
+ */
+ public static function deactivate_license(): void {
+ $client_id = Data::get_client_id();
+
+ if ( ! $client_id ) {
+ throw new Service_Exception( 'Missing client ID' );
+ }
+
+ $deactivation_url = Utils::get_deactivation_url( $client_id );
+
+ if ( ! $deactivation_url ) {
+ throw new Service_Exception( 'Missing deactivation URL' );
+ }
+
+ $access_token = Data::get_access_token();
+
+ if ( ! $access_token ) {
+ throw new Service_Exception( 'Missing access token' );
+ }
+
+ $refresh_token = Data::get_refresh_token();
+
+ if ( ! $refresh_token ) {
+ throw new Service_Exception( 'Missing refresh token' );
+ }
+
+ self::request($deactivation_url, [
+ 'method' => 'DELETE',
+ 'headers' => [
+ 'Authorization' => "Bearer {$access_token}",
+ ],
+ ], 204);
+
+ self::get_token( 'refresh_token', $refresh_token );
+ }
+
+ /**
+ * disconnect
+ *
+ * @return void
+ * @throws Service_Exception
+ */
+ public static function disconnect(): void {
+ $sessions_url = Utils::get_sessions_url();
+
+ if ( ! $sessions_url ) {
+ throw new Service_Exception( 'Missing sessions URL' );
+ }
+
+ $access_token = Data::get_access_token();
+
+ if ( ! $access_token ) {
+ throw new Service_Exception( 'Missing access token' );
+ }
+
+ self::request( $sessions_url, [
+ 'method' => 'DELETE',
+ 'headers' => [
+ 'Content-Type' => 'application/json',
+ 'Authorization' => "Bearer {$access_token}",
+ ],
+ ], 204 );
+
+ Data::clear_session();
+ }
+
+ /**
+ * disconnect
+ *
+ * @return void
+ * @throws Service_Exception
+ */
+ public static function reconnect(): void {
+ $sessions_url = Utils::get_sessions_url();
+
+ if ( ! $sessions_url ) {
+ throw new Service_Exception( 'Missing sessions URL' );
+ }
+
+ Data::clear_session();
+ }
+
+ /**
+ * Get token & optionally save to user
+ *
+ * @param string $grant_type
+ *
+ * @param string|null $credential
+ * @param bool|null $update
+ *
+ * @return array
+ * @throws Service_Exception
+ */
+ public static function get_token( string $grant_type, ?string $credential = null, ?bool $update = true ): array {
+ $token_url = Utils::get_token_url();
+
+ if ( ! $token_url ) {
+ throw new Service_Exception( 'Missing token URL' );
+ }
+
+ $client_id = Data::get_client_id();
+ $client_secret = Data::get_client_secret();
+
+ if ( empty( $client_id ) || empty( $client_secret ) ) {
+ throw new Service_Exception( 'Missing client ID or secret' );
+ }
+
+ $body = [
+ 'grant_type' => $grant_type,
+ 'redirect_uri' => Utils::get_redirect_uri(),
+ ];
+
+ switch ( $grant_type ) {
+ case GrantTypes::AUTHORIZATION_CODE:
+ $body['code'] = $credential;
+ break;
+ case GrantTypes::REFRESH_TOKEN:
+ $body[ GrantTypes::REFRESH_TOKEN ] = $credential;
+ break;
+ case GrantTypes::CLIENT_CREDENTIALS:
+ $body['redirect_uri'] = Utils::get_redirect_uri( Data::get_home_url() );
+
+ break;
+ default:
+ throw new Service_Exception( 'Invalid grant type' );
+ }
+
+ $data = self::request( $token_url, [
+ 'method' => 'POST',
+ 'headers' => [
+ 'x-elementor-apps' => Config::APP_NAME,
+ 'Authorization' => 'Basic ' . base64_encode( "{$client_id}:{$client_secret}" ), // phpcs:ignore WordPress.PHP.DiscouragedPHPFunctions.obfuscation_base64_encode
+ ],
+ 'body' => $body,
+ ] );
+
+ if ( $update ) {
+ Data::set_connect_mode_data( Data::TOKEN_ID, $data['id_token'] ?? null );
+ Data::set_connect_mode_data( Data::ACCESS_TOKEN, $data['access_token'] ?? null );
+ Data::set_connect_mode_data( Data::REFRESH_TOKEN, $data['refresh_token'] ?? null );
+ Data::set_connect_mode_data( Data::OPTION_OWNER_USER_ID, get_current_user_id() ?? null );
+ }
+
+ return $data;
+ }
+
+ public static function jwt_decode( $payload ): string {
+ static $jwks = null;
+
+ $jwks_url = Utils::get_jwks_url();
+ if ( ! $jwks_url ) {
+ return __( 'Missing JWKS URL', 'pojo-accessibility' );
+ }
+
+ if ( ! $jwks ) {
+ $jwks = self::request($jwks_url, [
+ 'method' => 'GET',
+ ]);
+ }
+ if ( ! class_exists( 'JWT' ) ) {
+ require_once EA11Y_PATH . 'vendor/autoload.php';
+ if ( ! class_exists( 'JWT' ) ) {
+ return __( 'JWT class not found', 'pojo-accessibility' );
+ }
+ }
+
+ try {
+ $decoded = \Firebase\JWT\JWT::decode( $payload, \Firebase\JWT\JWK::parseKeySet( $jwks ) );
+ return wp_json_encode( $decoded, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES );
+ } catch ( \Throwable $th ) {
+ if ( $th instanceof \Firebase\JWT\ExpiredException ) {
+ self::get_token( GrantTypes::REFRESH_TOKEN, Data::get_refresh_token() );
+ return self::jwt_decode( $payload );
+ }
+ return $th->getMessage();
+ }
+ }
+
+ /**
+ * @param string $url
+ * @param array $args
+ * @param int $valid_response_code
+ *
+ * @return array|null
+ * @throws Service_Exception
+ */
+ public static function request( string $url, array $args, int $valid_response_code = 200 ): ?array {
+ $args['timeout'] = 30;
+
+ $response = wp_remote_request( $url, $args );
+
+ if ( is_wp_error( $response ) ) {
+ Logger::error( $response->get_error_message() );
+
+ throw new Service_Exception( esc_html( $response->get_error_message() ) );
+ }
+
+ if ( wp_remote_retrieve_response_code( $response ) !== $valid_response_code ) {
+ Logger::error( 'Invalid status code ' . wp_remote_retrieve_response_code( $response ) );
+
+ throw new Service_Exception( esc_html( wp_remote_retrieve_body( $response ) ) );
+ }
+
+ return json_decode( wp_remote_retrieve_body( $response ), true );
+ }
+
+ /**
+ * @throws Service_Exception
+ */
+ public static function refresh_token() {
+ $lock_key = Config::APP_NAME . self::REFRESH_TOKEN_LOCK;
+ $last_token = Data::fetch_option( $lock_key, '' );
+
+ $current_refresh_token = Data::get_refresh_token();
+
+ if ( ! empty( $last_token ) && $last_token === $current_refresh_token ) {
+ sleep( 1 );
+ return;
+ }
+
+ delete_option( $lock_key );
+ $locked = Data::insert_option_uniquely( $lock_key, $current_refresh_token );
+ if ( ! $locked ) {
+ sleep( 1 );
+ return;
+ }
+
+ self::get_token( GrantTypes::REFRESH_TOKEN, $current_refresh_token );
+ }
+
+ /**
+ * @throws Service_Exception
+ */
+ public static function update_redirect_uri(): void {
+ $client_id = Data::get_client_id();
+
+ if ( ! $client_id ) {
+ throw new Service_Exception( 'Missing client ID' );
+ }
+
+ $client_patch_url = Utils::get_clients_patch_url( $client_id );
+
+ [ 'access_token' => $access_token ] = self::get_token(
+ GrantTypes::CLIENT_CREDENTIALS,
+ null,
+ false
+ );
+
+ self::request( $client_patch_url, [
+ 'method' => 'PATCH',
+ 'headers' => [
+ 'Content-Type' => 'application/json',
+ 'Authorization' => "Bearer {$access_token}",
+ ],
+ 'body' => wp_json_encode( [
+ 'redirect_uri' => Utils::get_redirect_uri(),
+ ] ),
+ ] );
+
+ self::refresh_token();
+
+ Data::set_home_url();
+ }
+}
diff --git a/modules/connect/classes/utils.php b/modules/connect/classes/utils.php
new file mode 100644
index 00000000..9edfc198
--- /dev/null
+++ b/modules/connect/classes/utils.php
@@ -0,0 +1,125 @@
+ $client_id,
+ 'redirect_uri' => rawurlencode( self::get_redirect_uri() ),
+ 'response_type' => 'code',
+ 'scope' => Config::SCOPES,
+ 'state' => wp_create_nonce( Config::STATE_NONCE ),
+ ], self::get_auth_url() );
+ }
+
+ /**
+ * get_deactivation_url
+ * @param string $client_id
+ *
+ * @return string
+ */
+ public static function get_deactivation_url( string $client_id ): string {
+ return self::get_base_url() . "/api/v1/clients/{$client_id}/activation";
+ }
+
+ public static function get_jwks_url(): string {
+ return self::get_base_url() . '/v1/.well-known/jwks.json';
+ }
+
+ /**
+ * get_sessions_url
+ * @return string
+ */
+ public static function get_sessions_url(): string {
+ return self::get_base_url() . '/api/v1/session';
+ }
+
+ public static function get_token_url(): string {
+ return self::get_base_url() . '/api/v1/oauth2/token';
+ }
+
+ /**
+ * Get clients URL
+ *
+ * @param string $client_id
+ *
+ * @return string
+ */
+ public static function get_clients_patch_url( string $client_id ): string {
+ return Utils::get_base_url() . "/api/v1/clients/{$client_id}";
+ }
+
+ /**
+ * get_base_url
+ * @return string
+ */
+ public static function get_base_url(): string {
+ return apply_filters( 'ea11y_connect_get_base_url', Config::BASE_URL );
+ }
+
+ /**
+ * is_valid_home_url
+ * @return bool
+ */
+ public static function is_valid_home_url(): bool {
+ static $valid = null;
+
+ if ( null === $valid ) {
+ if ( empty( Data::get_home_url() ) ) {
+ $valid = true;
+ } else {
+ $valid = Data::get_home_url() === home_url();
+ }
+ }
+
+ return $valid;
+ }
+}
diff --git a/modules/connect/components/handler.php b/modules/connect/components/handler.php
new file mode 100644
index 00000000..5eee71d2
--- /dev/null
+++ b/modules/connect/components/handler.php
@@ -0,0 +1,91 @@
+should_handle_auth_code() ) {
+ return;
+ }
+
+ $code = sanitize_text_field( $_GET['code'] );
+ $state = sanitize_text_field( $_GET['state'] );
+
+ // Check if the state is valid
+ $this->validate_nonce( $state );
+
+ try {
+ // Exchange the code for an access token and store it
+ Service::get_token( GrantTypes::AUTHORIZATION_CODE, $code ); // Makes sure we won't stick in the mismatch limbo
+
+ Data::set_home_url();
+
+ do_action( 'on_connect_' . Config::APP_PREFIX . '_connected' ); // Redirect to the redirect URI
+ } catch ( Throwable $t ) {
+ Logger::error( 'Unable to handle auth code: ' . $t->getMessage() );
+ }
+
+ wp_redirect( Utils::get_redirect_uri() );
+
+ exit;
+ }
+
+ /**
+ * Handler constructor.
+ */
+ public function __construct() {
+ add_action( 'admin_init', [ $this, 'handle_auth_code' ] );
+ }
+}
diff --git a/modules/connect/module.php b/modules/connect/module.php
new file mode 100644
index 00000000..3c38df37
--- /dev/null
+++ b/modules/connect/module.php
@@ -0,0 +1,62 @@
+register_components();
+ $this->register_routes();
+ }
+}
+
diff --git a/modules/connect/rest/authorize.php b/modules/connect/rest/authorize.php
new file mode 100644
index 00000000..32b68998
--- /dev/null
+++ b/modules/connect/rest/authorize.php
@@ -0,0 +1,78 @@
+verify_nonce_and_capability(
+ $request->get_param( self::NONCE_NAME ),
+ self::NONCE_NAME
+ );
+
+ if ( Connect::is_connected() && Utils::is_valid_home_url() ) {
+ return $this->respond_error_json( [
+ 'message' => esc_html__( 'You are already connected', 'pojo-accessibility' ),
+ 'code' => 'forbidden',
+ ] );
+ }
+
+ try {
+ $client_id = Data::get_client_id();
+
+ if ( ! $client_id ) {
+ $client_id = Service::register_client();
+ }
+
+ if ( ! Utils::is_valid_home_url() ) {
+ if ( $request->get_param( 'update_redirect_uri' ) ) {
+ Service::update_redirect_uri();
+ } else {
+ return $this->respond_error_json( [
+ 'message' => esc_html__( 'Connected domain mismatch', 'pojo-accessibility' ),
+ 'code' => 'forbidden',
+ ] );
+ }
+ }
+
+ $authorize_url = Utils::get_authorize_url( $client_id );
+
+ $authorize_url = apply_filters( 'ea11y_connect_authorize_url', $authorize_url );
+
+ return $this->respond_success_json( $authorize_url );
+ } catch ( Throwable $t ) {
+ return $this->respond_error_json( [
+ 'message' => $t->getMessage(),
+ 'code' => 'internal_server_error',
+ ] );
+ }
+ }
+}
diff --git a/modules/connect/rest/deactivate-and-disconnect.php b/modules/connect/rest/deactivate-and-disconnect.php
new file mode 100644
index 00000000..4b7dc87c
--- /dev/null
+++ b/modules/connect/rest/deactivate-and-disconnect.php
@@ -0,0 +1,50 @@
+get_param( 'clear_session' ) ) {
+ Data::clear_session( true );
+ return $this->respond_success_json();
+ }
+
+ Service::deactivate_license();
+ Service::disconnect();
+
+ return $this->respond_success_json();
+ } catch ( Throwable $t ) {
+ return $this->respond_error_json( [
+ 'message' => $t->getMessage(),
+ 'code' => 'internal_server_error',
+ ] );
+ }
+ }
+}
diff --git a/modules/connect/rest/deactivate.php b/modules/connect/rest/deactivate.php
new file mode 100644
index 00000000..01c9aecc
--- /dev/null
+++ b/modules/connect/rest/deactivate.php
@@ -0,0 +1,42 @@
+respond_success_json();
+ } catch ( Throwable $t ) {
+ return $this->respond_error_json( [
+ 'message' => $t->getMessage(),
+ 'code' => 'internal_server_error',
+ ] );
+ }
+ }
+}
diff --git a/modules/connect/rest/disconnect.php b/modules/connect/rest/disconnect.php
new file mode 100644
index 00000000..303c4779
--- /dev/null
+++ b/modules/connect/rest/disconnect.php
@@ -0,0 +1,42 @@
+respond_success_json();
+ } catch ( Throwable $t ) {
+ return $this->respond_error_json( [
+ 'message' => $t->getMessage(),
+ 'code' => 'internal_server_error',
+ ] );
+ }
+ }
+}
diff --git a/modules/connect/rest/reconnect.php b/modules/connect/rest/reconnect.php
new file mode 100644
index 00000000..0c43431b
--- /dev/null
+++ b/modules/connect/rest/reconnect.php
@@ -0,0 +1,41 @@
+respond_success_json();
+ } catch ( Throwable $t ) {
+ return $this->respond_error_json( [
+ 'message' => $t->getMessage(),
+ 'code' => 'internal_server_error',
+ ] );
+ }
+ }
+}
diff --git a/modules/connect/rest/switch-domain.php b/modules/connect/rest/switch-domain.php
new file mode 100644
index 00000000..d4b54c0c
--- /dev/null
+++ b/modules/connect/rest/switch-domain.php
@@ -0,0 +1,59 @@
+verify_nonce_and_capability(
+ $request->get_param( self::NONCE_NAME ),
+ self::NONCE_NAME
+ );
+
+ try {
+ $client_id = Data::get_client_id();
+
+ if ( ! $client_id ) {
+ return $this->respond_error_json( [
+ 'message' => __( 'Client ID not found', 'pojo-accessibility' ),
+ 'code' => 'ignore_error',
+ ] );
+ }
+
+ Service::update_redirect_uri();
+
+ return $this->respond_success_json( [ 'message' => __( 'Domain updated!', 'pojo-accessibility' ) ] );
+ } catch ( Throwable $t ) {
+ return $this->respond_error_json( [
+ 'message' => $t->getMessage(),
+ 'code' => 'internal_server_error',
+ ] );
+ }
+ }
+}
diff --git a/modules/settings/assets/js/admin.js b/modules/settings/assets/js/admin.js
index 4e51e3ad..a40129e3 100644
--- a/modules/settings/assets/js/admin.js
+++ b/modules/settings/assets/js/admin.js
@@ -2,6 +2,8 @@ import { ThemeProvider } from '@elementor/ui/styles';
import { StrictMode, Fragment, createRoot } from '@wordpress/element';
import App from './app';
import AdminTopBar from './components/admin-top-bar';
+import { PluginSettingsProvider } from './contexts/plugin-settings';
+import { SettingsProvider, NotificationsProvider } from './hooks';
const rootNode = document.getElementById( 'ea11y-app' );
const topBarNode = document.getElementById( 'ea11y-app-top-bar' );
@@ -21,6 +23,12 @@ topBar.render(
root.render(
-
+
+
+
+
+
+
+
,
);
diff --git a/modules/settings/assets/js/app.js b/modules/settings/assets/js/app.js
index 2ca43d10..83ba765d 100644
--- a/modules/settings/assets/js/app.js
+++ b/modules/settings/assets/js/app.js
@@ -1,13 +1,22 @@
import '../css/style.css';
import DirectionProvider from '@elementor/ui/DirectionProvider';
import { ThemeProvider } from '@elementor/ui/styles';
-import { ConnectModal } from './components';
+import { ConnectModal, Notifications } from './components';
+import { usePluginSettingsContext } from './contexts/plugin-settings';
+import { useNotificationSettings } from './hooks';
const App = () => {
+ const { isConnected } = usePluginSettingsContext();
+ const {
+ notificationMessage,
+ notificationType,
+ } = useNotificationSettings();
+
return (
-
+
-
+ { ! isConnected && }
+
);
diff --git a/modules/settings/assets/js/components/index.js b/modules/settings/assets/js/components/index.js
index a07d5cec..ef0c0495 100644
--- a/modules/settings/assets/js/components/index.js
+++ b/modules/settings/assets/js/components/index.js
@@ -1 +1,2 @@
export { default as ConnectModal } from './connect-modal';
+export { default as Notifications } from './notifications';
diff --git a/modules/settings/assets/js/components/notifications/index.js b/modules/settings/assets/js/components/notifications/index.js
new file mode 100644
index 00000000..367ee784
--- /dev/null
+++ b/modules/settings/assets/js/components/notifications/index.js
@@ -0,0 +1,36 @@
+import Alert from '@elementor/ui/Alert';
+import Snackbar from '@elementor/ui/Snackbar';
+import { useNotificationSettings } from '../../hooks';
+
+const Notifications = ( { type, message } ) => {
+ const {
+ showNotification,
+ setShowNotification,
+ setNotificationMessage,
+ setNotificationType,
+ } = useNotificationSettings();
+
+ const closeNotification = () => {
+ setShowNotification( ! showNotification );
+ setNotificationMessage( '' );
+ setNotificationType( '' );
+ };
+
+ return (
+
+ setShowNotification( ! showNotification ) }
+ severity={ type }
+ variant="filled" >
+ { message }
+
+
+ );
+};
+
+export default Notifications;
diff --git a/modules/settings/assets/js/contexts/plugin-settings.js b/modules/settings/assets/js/contexts/plugin-settings.js
new file mode 100644
index 00000000..54d028f9
--- /dev/null
+++ b/modules/settings/assets/js/contexts/plugin-settings.js
@@ -0,0 +1,40 @@
+import { createContext, useCallback, useContext, useEffect, useState } from '@wordpress/element';
+import { __ } from '@wordpress/i18n';
+import API from '../api';
+import { useToastNotification } from '../hooks';
+
+const PluginSettingsContext = createContext( {} );
+
+export const PluginSettingsProvider = ( { children } ) => {
+ const { error } = useToastNotification();
+ const [ pluginSettings, setPluginSettings ] = useState();
+ const [ loaded, setLoaded ] = useState( false );
+
+ const refreshPluginSettings = useCallback( () => {
+ API.getPluginSettings().then( ( settings ) => {
+ if ( 'isConnected' in settings ) {
+ settings.isConnected = Boolean( settings.isConnected );
+ }
+
+ setPluginSettings( settings );
+ setLoaded( true );
+ } ).catch( () => {
+ error( __( 'An error occurred.', 'pojo-accessibility' ) );
+ setLoaded( true );
+ } );
+ }, [] );
+
+ useEffect( () => {
+ refreshPluginSettings();
+ }, [ refreshPluginSettings ] );
+
+ return (
+
+ { children }
+
+ );
+};
+
+export const usePluginSettingsContext = () => {
+ return useContext( PluginSettingsContext );
+};
diff --git a/modules/settings/assets/js/hooks/index.js b/modules/settings/assets/js/hooks/index.js
index 0d9d628b..1ae75e25 100644
--- a/modules/settings/assets/js/hooks/index.js
+++ b/modules/settings/assets/js/hooks/index.js
@@ -1,2 +1,8 @@
export { useAuth } from './use-auth';
export { useModal } from './use-modal';
+export { useSettings } from './use-settings';
+export { SettingsProvider } from './use-settings';
+export { useStorage } from './use-storage';
+export { useToastNotification } from './use-notifications';
+export { NotificationsProvider } from './use-notifications';
+export { useNotificationSettings } from './use-notifications';
diff --git a/modules/settings/assets/js/hooks/use-auth.js b/modules/settings/assets/js/hooks/use-auth.js
index 791ec33c..65c0fc55 100644
--- a/modules/settings/assets/js/hooks/use-auth.js
+++ b/modules/settings/assets/js/hooks/use-auth.js
@@ -1,5 +1,6 @@
import API from '../api';
import { UPGRADE_LINK } from '../constants';
+import { usePluginSettingsContext } from '../contexts/plugin-settings';
export const useAuth = () => {
const { subscriptionId } = 123;
diff --git a/modules/settings/assets/js/hooks/use-modal.js b/modules/settings/assets/js/hooks/use-modal.js
index 65c79c13..19aaaaf1 100644
--- a/modules/settings/assets/js/hooks/use-modal.js
+++ b/modules/settings/assets/js/hooks/use-modal.js
@@ -18,4 +18,3 @@ export const useModal = ( defaultIsOpen = true ) => {
close,
};
};
-
diff --git a/modules/settings/assets/js/hooks/use-notifications.js b/modules/settings/assets/js/hooks/use-notifications.js
new file mode 100644
index 00000000..0ea75585
--- /dev/null
+++ b/modules/settings/assets/js/hooks/use-notifications.js
@@ -0,0 +1,53 @@
+import { useState, createContext, useContext } from '@wordpress/element';
+
+const NotificationsContext = createContext( undefined );
+
+export function useNotificationSettings() {
+ return useContext( NotificationsContext );
+}
+
+export const NotificationsProvider = ( { children } ) => {
+ const [ showNotification, setShowNotification ] = useState( false );
+ const [ notificationMessage, setNotificationMessage ] = useState( '' );
+ const [ notificationType, setNotificationType ] = useState( '' );
+
+ return (
+
+ { children }
+
+ );
+};
+
+export const useToastNotification = () => {
+ const {
+ setNotificationMessage,
+ setNotificationType,
+ setShowNotification,
+ } = useContext( NotificationsContext );
+
+ const error = ( message ) => {
+ setNotificationMessage( message );
+ setNotificationType( 'error' );
+ setShowNotification( true );
+ };
+
+ const success = ( message ) => {
+ setNotificationMessage( message );
+ setNotificationType( 'success' );
+ setShowNotification( true );
+ };
+
+ return {
+ success,
+ error,
+ };
+};
diff --git a/modules/settings/assets/js/hooks/use-settings.js b/modules/settings/assets/js/hooks/use-settings.js
new file mode 100644
index 00000000..69d5a774
--- /dev/null
+++ b/modules/settings/assets/js/hooks/use-settings.js
@@ -0,0 +1,24 @@
+import { useState, createContext, useContext } from '@wordpress/element';
+
+/**
+ * Context Component.
+ */
+const SettingsContext = createContext( null );
+
+export function useSettings() {
+ return useContext( SettingsContext );
+}
+
+export const SettingsProvider = ( { children } ) => {
+ const [ test, setTest ] = useState( 'Test' );
+ return (
+
+ { children }
+
+ );
+};
diff --git a/modules/settings/assets/js/hooks/use-storage.js b/modules/settings/assets/js/hooks/use-storage.js
new file mode 100644
index 00000000..23775120
--- /dev/null
+++ b/modules/settings/assets/js/hooks/use-storage.js
@@ -0,0 +1,12 @@
+import { store as coreDataStore } from '@wordpress/core-data';
+import { dispatch } from '@wordpress/data';
+
+export const useStorage = () => {
+ const save = async ( data ) => {
+ return await dispatch( coreDataStore ).saveEntityRecord( 'root', 'site', data );
+ };
+
+ return {
+ save,
+ };
+};
diff --git a/modules/settings/classes/route-base.php b/modules/settings/classes/route-base.php
new file mode 100644
index 00000000..907a3409
--- /dev/null
+++ b/modules/settings/classes/route-base.php
@@ -0,0 +1,39 @@
+get_path();
+ }
+
+ public function get_path(): string {
+ return $this->path;
+ }
+
+ public function get_name(): string {
+ return '';
+ }
+
+ public function get_permission_callback( \WP_REST_Request $request ): bool {
+ $valid = $this->permission_callback( $request );
+
+ return $valid && user_can( $this->current_user_id, 'manage_options' );
+ }
+}
diff --git a/modules/settings/classes/settings.php b/modules/settings/classes/settings.php
new file mode 100644
index 00000000..1ef1d258
--- /dev/null
+++ b/modules/settings/classes/settings.php
@@ -0,0 +1,28 @@
+ Connect::is_connected(),
+ ];
+ }
/**
* Module constructor.
*/
public function __construct() {
+ $this->register_routes();
$this->register_components();
add_action( 'admin_menu', [ $this, 'register_page' ] );
add_action( 'in_admin_header', [ $this, 'render_top_bar' ] );
diff --git a/modules/settings/rest/get-settings.php b/modules/settings/rest/get-settings.php
new file mode 100644
index 00000000..4cdd5815
--- /dev/null
+++ b/modules/settings/rest/get-settings.php
@@ -0,0 +1,50 @@
+verify_capability();
+
+ if ( $error ) {
+ return $error;
+ }
+
+ $data = Settings::get_plugin_settings();
+
+ return $this->respond_success_json( $data );
+
+ } catch ( Throwable $t ) {
+ return $this->respond_error_json( [
+ 'message' => $t->getMessage(),
+ 'code' => 'internal_server_error',
+ ] );
+ }
+ }
+}
diff --git a/package.json b/package.json
index e5a1f257..db245eec 100644
--- a/package.json
+++ b/package.json
@@ -40,6 +40,8 @@
"@wordpress/date": "^5.10.0",
"@wordpress/element": "^6.10.0",
"@wordpress/i18n": "^5.10.0",
- "@wordpress/url": "^4.10.0"
+ "@wordpress/url": "^4.10.0",
+ "husky": "^9.1.6",
+ "prop-types": "^15.8.1"
}
}
From cf77dbeed3053222c7f4dc9fc8ed2f2aae6cb695 Mon Sep 17 00:00:00 2001
From: Nirbhay Singh <121793120+nirbhayel@users.noreply.github.com>
Date: Wed, 20 Nov 2024 14:41:10 +0530
Subject: [PATCH 007/290] [APP 707] general setting components (#113)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* Initial refactor commit
* ✅ Added build and tests CI/CD
* update: add src for admin settings
* update: incorrect constant names
* update: namespace
* add: accessibility settings
* update: webpack to output files inside a folder
* update: build output folders
* update: removed commented code
* update: npm scripts
* add: webpack config
* add: hooks
* update: move admin setting to the module folder
* update: assets loading logic
* update: add rule to move jsx props to multiline imporving readability
* add: connect modal
* update: hooks import for better readability
* update: replace functions with hooks
* add: connect module
* add: settings and get settings route
* add: hooks and contexts to get settings
* add: hooks
* add: notification component
* add: data api
* add: settings provider and connect settings
* add: husky
* add: icon size control
* fix: icon size control labels
* add: icon select component
* add: color picker component
* add: accessibility icons
* add: icon export
* update: add icons to the component
* fix: styling for the icon select control
* update: color picker with react-colorful component
* update: icon size component with live icon design
* fix: styling of radio boxes
* add: icon design settings layout
* add: position settings layout
* add: layout exports
* add: alignment matrix and position control components
* add: position settings & position settings for mobile layout
* fix: formatting and text-domain
* update: filter names
* fix: hook import
* add: set function for settings
* add: prop-types package
* update: refactor notification component and context
* update: remove filter for authorize url
* Update modules/settings/assets/js/components/color-picker/style.css
Co-authored-by: Raz Ohad
* update: color picker class name
---------
Co-authored-by: Ohad
Co-authored-by: Raz Ohad
---
.../js/components/admin-top-bar/index.js | 12 +-
.../alignment-matrix-control/index.js | 66 ++++++
.../js/components/color-picker/index.js | 51 +++++
.../js/components/color-picker/style.css | 29 +++
.../connect-modal/connect-modal-icon.js | 197 +++++++++++++++---
.../assets/js/components/icon-select/index.js | 70 +++++++
.../assets/js/components/icon-size/index.js | 69 ++++++
.../settings/assets/js/components/index.js | 5 +
.../js/components/position-control/index.js | 128 ++++++++++++
.../js/contexts/plugin-settings-context.js | 40 ++++
modules/settings/assets/js/hooks/use-auth.js | 1 -
.../assets/js/icons/accessibility-controls.js | 25 +++
.../assets/js/icons/accessibility-eye.js | 34 +++
.../assets/js/icons/accessibility-person.js | 25 +++
.../assets/js/icons/accessibility-text.js | 36 ++++
.../assets/js/icons/elementor-logo.js | 3 +-
modules/settings/assets/js/icons/index.js | 5 +
.../assets/js/layouts/icon-design-settings.js | 33 +++
modules/settings/assets/js/layouts/index.js | 3 +
.../js/layouts/position-settings-desktop.js | 39 ++++
.../assets/js/layouts/position-settings.js | 70 +++++++
package.json | 1 +
22 files changed, 905 insertions(+), 37 deletions(-)
create mode 100644 modules/settings/assets/js/components/alignment-matrix-control/index.js
create mode 100644 modules/settings/assets/js/components/color-picker/index.js
create mode 100644 modules/settings/assets/js/components/color-picker/style.css
create mode 100644 modules/settings/assets/js/components/icon-select/index.js
create mode 100644 modules/settings/assets/js/components/icon-size/index.js
create mode 100644 modules/settings/assets/js/components/position-control/index.js
create mode 100644 modules/settings/assets/js/contexts/plugin-settings-context.js
create mode 100644 modules/settings/assets/js/icons/accessibility-controls.js
create mode 100644 modules/settings/assets/js/icons/accessibility-eye.js
create mode 100644 modules/settings/assets/js/icons/accessibility-person.js
create mode 100644 modules/settings/assets/js/icons/accessibility-text.js
create mode 100644 modules/settings/assets/js/icons/index.js
create mode 100644 modules/settings/assets/js/layouts/icon-design-settings.js
create mode 100644 modules/settings/assets/js/layouts/index.js
create mode 100644 modules/settings/assets/js/layouts/position-settings-desktop.js
create mode 100644 modules/settings/assets/js/layouts/position-settings.js
diff --git a/modules/settings/assets/js/components/admin-top-bar/index.js b/modules/settings/assets/js/components/admin-top-bar/index.js
index b789079b..6df38d63 100644
--- a/modules/settings/assets/js/components/admin-top-bar/index.js
+++ b/modules/settings/assets/js/components/admin-top-bar/index.js
@@ -10,9 +10,15 @@ import ElementorLogo from '../../icons/elementor-logo';
const AdminTopBar = () => {
return (
-
-
-
+
+
+
{ __( 'Accessibility', 'pojo-accessibility' ) }
diff --git a/modules/settings/assets/js/components/alignment-matrix-control/index.js b/modules/settings/assets/js/components/alignment-matrix-control/index.js
new file mode 100644
index 00000000..0040c618
--- /dev/null
+++ b/modules/settings/assets/js/components/alignment-matrix-control/index.js
@@ -0,0 +1,66 @@
+import Box from '@elementor/ui/Box';
+import FormControl from '@elementor/ui/FormControl';
+import FormControlLabel from '@elementor/ui/FormControlLabel';
+import FormLabel from '@elementor/ui/FormLabel';
+import Radio from '@elementor/ui/Radio';
+import RadioGroup from '@elementor/ui/RadioGroup';
+import Typography from '@elementor/ui/Typography';
+import { useState } from '@wordpress/element';
+import { __ } from '@wordpress/i18n';
+
+const AlignmentMatrixControl = () => {
+ const [ selectedValue, setSelectedValue ] = useState( 'center-right' );
+
+ const handleChange = ( event ) => {
+ setSelectedValue( event.target.value );
+ };
+
+ const options = [
+ { value: 'top-left', label: __( 'Top Left', 'pojo-accessibility' ) },
+ { value: 'top-right', label: __( 'Top Right', 'pojo-accessibility' ) },
+ { value: 'center-left', label: __( 'Center Left', 'pojo-accessibility' ) },
+ { value: 'center-right', label: __( 'Center Right', 'pojo-accessibility' ) },
+ { value: 'bottom-left', label: __( 'Bottom Left', 'pojo-accessibility' ) },
+ { value: 'bottom-right', label: __( 'Bottom Right', 'pojo-accessibility' ) },
+ ];
+
+ return (
+
+
+
+ { __( 'Default Position', 'pojo-accessibility' ) }
+
+
+
+
+ { options.map( ( option, i ) => } /> ) }
+
+
+
+ );
+};
+
+export default AlignmentMatrixControl;
diff --git a/modules/settings/assets/js/components/color-picker/index.js b/modules/settings/assets/js/components/color-picker/index.js
new file mode 100644
index 00000000..5e3222cf
--- /dev/null
+++ b/modules/settings/assets/js/components/color-picker/index.js
@@ -0,0 +1,51 @@
+import Box from '@elementor/ui/Box';
+import FormControl from '@elementor/ui/FormControl';
+import FormLabel from '@elementor/ui/FormLabel';
+import Grid from '@elementor/ui/Grid';
+import Typography from '@elementor/ui/Typography';
+import { HexColorPicker, HexColorInput } from 'react-colorful';
+import { useState } from '@wordpress/element';
+import { __ } from '@wordpress/i18n';
+import './style.css';
+
+const ColorPicker = () => {
+ const [ color, setColor ] = useState( '#2563eb' );
+
+ return (
+
+
+
+ { __( 'Color', 'pojo-accessibility' ) }
+
+
+
+
+
+
+
+
+
+
+ );
+};
+
+export default ColorPicker;
diff --git a/modules/settings/assets/js/components/color-picker/style.css b/modules/settings/assets/js/components/color-picker/style.css
new file mode 100644
index 00000000..3025ab64
--- /dev/null
+++ b/modules/settings/assets/js/components/color-picker/style.css
@@ -0,0 +1,29 @@
+.widget-settings-color-picker.react-colorful {
+ min-width: 460px;
+ }
+.widget-settings-color-picker .react-colorful__saturation {
+border-radius: 0;
+border-bottom: none;
+}
+
+.widget-settings-color-picker .react-colorful__hue {
+order: 0;
+}
+
+.widget-settings-color-picker .react-colorful__hue,
+.widget-settings-color-picker .react-colorful__alpha {
+height: 14px;
+border-radius: 100px;
+margin-top: 10px;
+}
+
+.widget-settings-color-picker .react-colorful__pointer {
+width: 18px;
+height: 18px;
+}
+
+.widget-settings-color-picker .react-colorful__hue-pointer,
+.widget-settings-color-picker .react-colorful__alpha-pointer {
+width: 18px;
+height: 18px;
+}
diff --git a/modules/settings/assets/js/components/connect-modal/connect-modal-icon.js b/modules/settings/assets/js/components/connect-modal/connect-modal-icon.js
index 98915a2a..ef488b89 100644
--- a/modules/settings/assets/js/components/connect-modal/connect-modal-icon.js
+++ b/modules/settings/assets/js/components/connect-modal/connect-modal-icon.js
@@ -10,56 +10,189 @@ const ConnectModalIcon = () => {
>
-
+
-
+
-
-
-
-
-
+
+
+
+
+
-
-
-
+
+
+
-
-
-
-
+
+
+
+
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
-
+
-
+
-
+
-
+
-
+
);
diff --git a/modules/settings/assets/js/components/icon-select/index.js b/modules/settings/assets/js/components/icon-select/index.js
new file mode 100644
index 00000000..e5d1efd2
--- /dev/null
+++ b/modules/settings/assets/js/components/icon-select/index.js
@@ -0,0 +1,70 @@
+import FormControl from '@elementor/ui/FormControl';
+import FormLabel from '@elementor/ui/FormLabel';
+import Paper from '@elementor/ui/Paper';
+import Radio from '@elementor/ui/Radio';
+import RadioGroup from '@elementor/ui/RadioGroup';
+import Typography from '@elementor/ui/Typography';
+import { useState } from '@wordpress/element';
+import { __ } from '@wordpress/i18n';
+import { AccessibilityControlsIcon, AccessibilityEyeIcon, AccessibilityPersonIcon, AccessibilityTextIcon } from '../../icons';
+
+const IconSelect = ( props ) => {
+ const [ selectedValue, setSelectedValue ] = useState( 'person' );
+ const optionStyle = { color: 'info.main', fontSize: 44 };
+
+ const options = [
+ { value: 'person', icon: , label: __( 'Accessibility Person Icon', 'pojo-accessibility' ) },
+ { value: 'eye', icon: , label: __( 'Accessibility Eye Icon', 'pojo-accessibility' ) },
+ { value: 'text', icon: , label: __( 'Accessibility Text Badge Icon', 'pojo-accessibility' ) },
+ { value: 'controls', icon: , label: __( 'Accessibility Controls Slider Icon', 'pojo-accessibility' ) },
+ ];
+
+ return (
+
+
+
+ { __( 'Icon', 'pojo-accessibility' ) }
+
+
+
+ { options.map( ( option ) => (
+ setSelectedValue( option.value ) }
+ sx={ {
+ borderRadius: 'md',
+ boxShadow: 'sm',
+ display: 'flex',
+ flexDirection: 'column',
+ flexGrow: 1,
+ alignItems: 'center',
+ justifyContent: 'center',
+ gap: 1.5,
+ p: 2,
+ minWidth: 100,
+ minHeight: 100,
+ borderColor: selectedValue === option.value ? 'info.main' : 'divider',
+ borderWidth: selectedValue === option.value ? 2 : 1,
+ cursor: 'pointer',
+ } }
+ >{ option.icon }
+
+
+ ) ) }
+
+
+ );
+};
+
+export default IconSelect;
diff --git a/modules/settings/assets/js/components/icon-size/index.js b/modules/settings/assets/js/components/icon-size/index.js
new file mode 100644
index 00000000..f8114d59
--- /dev/null
+++ b/modules/settings/assets/js/components/icon-size/index.js
@@ -0,0 +1,69 @@
+import FormControl from '@elementor/ui/FormControl';
+import FormLabel from '@elementor/ui/FormLabel';
+import Paper from '@elementor/ui/Paper';
+import Radio from '@elementor/ui/Radio';
+import RadioGroup from '@elementor/ui/RadioGroup';
+import Typography from '@elementor/ui/Typography';
+import { useState } from '@wordpress/element';
+import { __ } from '@wordpress/i18n';
+import { AccessibilityEyeIcon, AccessibilityPersonIcon, AccessibilityTextIcon } from '../../icons';
+
+const IconSize = ( props ) => {
+ const [ selectedValue, setSelectedValue ] = useState( 'medium' );
+ const optionStyle = { color: 'info.main', fontSize: 44 };
+
+ const options = [
+ { value: 'small', icon: , label: __( 'Accessibility Person Icon', 'pojo-accessibility' ) },
+ { value: 'medium', icon: , label: __( 'Accessibility Eye Icon', 'pojo-accessibility' ) },
+ { value: 'large', icon: , label: __( 'Accessibility Text Badge Icon', 'pojo-accessibility' ) },
+ ];
+
+ return (
+
+
+
+ { __( 'Size', 'pojo-accessibility' ) }
+
+
+
+ { options.map( ( option ) => (
+ setSelectedValue( option.value ) }
+ sx={ {
+ borderRadius: 'md',
+ boxShadow: 'sm',
+ display: 'flex',
+ flexDirection: 'column',
+ alignItems: 'center',
+ justifyContent: 'center',
+ flexGrow: 1,
+ gap: 1.5,
+ p: 2,
+ minWidth: 100,
+ minHeight: 100,
+ borderColor: selectedValue === option.value ? 'info.main' : 'divider',
+ borderWidth: selectedValue === option.value ? 2 : 1,
+ cursor: 'pointer',
+ } }
+ >{ option.icon }
+
+
+ ) ) }
+
+
+ );
+};
+
+export default IconSize;
diff --git a/modules/settings/assets/js/components/index.js b/modules/settings/assets/js/components/index.js
index ef0c0495..b85ca7c8 100644
--- a/modules/settings/assets/js/components/index.js
+++ b/modules/settings/assets/js/components/index.js
@@ -1,2 +1,7 @@
export { default as ConnectModal } from './connect-modal';
export { default as Notifications } from './notifications';
+export { default as IconSize } from './icon-size';
+export { default as IconSelect } from './icon-select';
+export { default as ColorPicker } from './color-picker';
+export { default as AlignmentMatrixControl } from './alignment-matrix-control';
+export { default as PositionControl } from './position-control';
diff --git a/modules/settings/assets/js/components/position-control/index.js b/modules/settings/assets/js/components/position-control/index.js
new file mode 100644
index 00000000..88c2372d
--- /dev/null
+++ b/modules/settings/assets/js/components/position-control/index.js
@@ -0,0 +1,128 @@
+import Box from '@elementor/ui/Box';
+import Button from '@elementor/ui/Button';
+import InputAdornment from '@elementor/ui/InputAdornment';
+import Menu from '@elementor/ui/Menu';
+import MenuItem from '@elementor/ui/MenuItem';
+import Select from '@elementor/ui/Select';
+import TextField from '@elementor/ui/TextField';
+import { styled } from '@elementor/ui/styles';
+import { usePopupState, bindTrigger, bindMenu } from '@elementor/ui/usePopupState';
+import { useState } from '@wordpress/element';
+import { __ } from '@wordpress/i18n';
+
+const units = [ 'PX', 'REM', 'EM' ];
+
+const horizontalOptions = [
+ { value: 'to-left', label: __( 'To the left', 'pojo-accessibility' ) },
+ { value: 'to-right', label: __( 'To the right', 'pojo-accessibility' ) },
+];
+
+const verticalOptions = [
+ { value: 'higher', label: __( 'Higher', 'pojo-accessibility' ) },
+ { value: 'lower', label: __( 'Lower', 'pojo-accessibility' ) },
+];
+
+// Customization for the WP admin global CSS.
+const StyledTextField = styled( TextField )( () => ( {
+ width: '200px',
+ '.wp-admin & .MuiInputBase-input, & .MuiInputBase-input:focus': {
+ backgroundColor: 'initial',
+ boxShadow: 'none',
+ border: 0,
+ color: 'inherit',
+ outline: 0,
+ padding: '16.5px 14px 16.5px 14px',
+ '&.MuiInputBase-inputSizeSmall': {
+ padding: '8.5px 14px 8.5px 14px',
+ },
+ height: '56px',
+ },
+} ) );
+
+const PositionControl = ( { type, disabled }, props ) => {
+ const [ unitsIndex, setUnitsIndex ] = useState( 0 );
+ const popupState = usePopupState( {
+ variant: 'popover',
+ popupId: 'textfield-inner-selection',
+ } );
+
+ const handleMenuItemClick = ( index ) => {
+ setUnitsIndex( index );
+ popupState.close();
+ };
+
+ const [ position, setPosition ] = useState( 10 );
+ const handlePositionChange = ( event ) => setPosition( event.target.value );
+
+ return (
+
+
+
+ { units[ unitsIndex ] }
+
+
+
+ { units.map( ( unit, index ) => (
+ handleMenuItemClick( index ) }>
+ { unit }
+
+ ) ) }
+
+
+ ),
+ } }
+ />
+
+ {
+ type === 'horizontal' ? horizontalOptions.map( ( option ) => (
+
+ { option.label }
+
+ ) ) : verticalOptions.map( ( option ) => (
+
+ { option.label }
+
+ ) )
+ }
+
+
+ );
+};
+
+export default PositionControl;
diff --git a/modules/settings/assets/js/contexts/plugin-settings-context.js b/modules/settings/assets/js/contexts/plugin-settings-context.js
new file mode 100644
index 00000000..54d028f9
--- /dev/null
+++ b/modules/settings/assets/js/contexts/plugin-settings-context.js
@@ -0,0 +1,40 @@
+import { createContext, useCallback, useContext, useEffect, useState } from '@wordpress/element';
+import { __ } from '@wordpress/i18n';
+import API from '../api';
+import { useToastNotification } from '../hooks';
+
+const PluginSettingsContext = createContext( {} );
+
+export const PluginSettingsProvider = ( { children } ) => {
+ const { error } = useToastNotification();
+ const [ pluginSettings, setPluginSettings ] = useState();
+ const [ loaded, setLoaded ] = useState( false );
+
+ const refreshPluginSettings = useCallback( () => {
+ API.getPluginSettings().then( ( settings ) => {
+ if ( 'isConnected' in settings ) {
+ settings.isConnected = Boolean( settings.isConnected );
+ }
+
+ setPluginSettings( settings );
+ setLoaded( true );
+ } ).catch( () => {
+ error( __( 'An error occurred.', 'pojo-accessibility' ) );
+ setLoaded( true );
+ } );
+ }, [] );
+
+ useEffect( () => {
+ refreshPluginSettings();
+ }, [ refreshPluginSettings ] );
+
+ return (
+
+ { children }
+
+ );
+};
+
+export const usePluginSettingsContext = () => {
+ return useContext( PluginSettingsContext );
+};
diff --git a/modules/settings/assets/js/hooks/use-auth.js b/modules/settings/assets/js/hooks/use-auth.js
index 65c0fc55..791ec33c 100644
--- a/modules/settings/assets/js/hooks/use-auth.js
+++ b/modules/settings/assets/js/hooks/use-auth.js
@@ -1,6 +1,5 @@
import API from '../api';
import { UPGRADE_LINK } from '../constants';
-import { usePluginSettingsContext } from '../contexts/plugin-settings';
export const useAuth = () => {
const { subscriptionId } = 123;
diff --git a/modules/settings/assets/js/icons/accessibility-controls.js b/modules/settings/assets/js/icons/accessibility-controls.js
new file mode 100644
index 00000000..7299b452
--- /dev/null
+++ b/modules/settings/assets/js/icons/accessibility-controls.js
@@ -0,0 +1,25 @@
+import SvgIcon from '@elementor/ui/SvgIcon';
+
+function AccessibilityControlsIcon( props ) {
+ return (
+
+
+
+
+
+ );
+}
+
+export default AccessibilityControlsIcon;
diff --git a/modules/settings/assets/js/icons/accessibility-eye.js b/modules/settings/assets/js/icons/accessibility-eye.js
new file mode 100644
index 00000000..58a66d94
--- /dev/null
+++ b/modules/settings/assets/js/icons/accessibility-eye.js
@@ -0,0 +1,34 @@
+import SvgIcon from '@elementor/ui/SvgIcon';
+
+function AccessibilityEyeIcon( props ) {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
+
+export default AccessibilityEyeIcon;
diff --git a/modules/settings/assets/js/icons/accessibility-person.js b/modules/settings/assets/js/icons/accessibility-person.js
new file mode 100644
index 00000000..2aec5ccd
--- /dev/null
+++ b/modules/settings/assets/js/icons/accessibility-person.js
@@ -0,0 +1,25 @@
+import SvgIcon from '@elementor/ui/SvgIcon';
+
+function AccessibilityPersonIcon( props ) {
+ return (
+
+
+
+
+
+ );
+}
+
+export default AccessibilityPersonIcon;
diff --git a/modules/settings/assets/js/icons/accessibility-text.js b/modules/settings/assets/js/icons/accessibility-text.js
new file mode 100644
index 00000000..40c869d8
--- /dev/null
+++ b/modules/settings/assets/js/icons/accessibility-text.js
@@ -0,0 +1,36 @@
+import SvgIcon from '@elementor/ui/SvgIcon';
+
+function AccessibilityTextIcon( props ) {
+ return (
+
+
+
+
+
+
+ );
+}
+
+export default AccessibilityTextIcon;
diff --git a/modules/settings/assets/js/icons/elementor-logo.js b/modules/settings/assets/js/icons/elementor-logo.js
index cc62ff43..a9a65218 100644
--- a/modules/settings/assets/js/icons/elementor-logo.js
+++ b/modules/settings/assets/js/icons/elementor-logo.js
@@ -4,7 +4,8 @@ const ElementorLogo = ( { size } ) => {
return (
-
diff --git a/modules/settings/assets/js/icons/index.js b/modules/settings/assets/js/icons/index.js
new file mode 100644
index 00000000..fead74c0
--- /dev/null
+++ b/modules/settings/assets/js/icons/index.js
@@ -0,0 +1,5 @@
+export { default as ElementorLogo } from './elementor-logo';
+export { default as AccessibilityPersonIcon } from './accessibility-person';
+export { default as AccessibilityEyeIcon } from './accessibility-eye';
+export { default as AccessibilityTextIcon } from './accessibility-text';
+export { default as AccessibilityControlsIcon } from './accessibility-controls';
diff --git a/modules/settings/assets/js/layouts/icon-design-settings.js b/modules/settings/assets/js/layouts/icon-design-settings.js
new file mode 100644
index 00000000..d0be5427
--- /dev/null
+++ b/modules/settings/assets/js/layouts/icon-design-settings.js
@@ -0,0 +1,33 @@
+import Box from '@elementor/ui/Box';
+import Grid from '@elementor/ui/Grid';
+import Typography from '@elementor/ui/Typography';
+import { __ } from '@wordpress/i18n';
+import { ColorPicker, IconSelect, IconSize } from '../components';
+
+const IconDesignSettings = () => {
+ return (
+
+
+ { __( 'Design', 'pojo-accessibility' ) }
+ { __( 'Customize the design of the button that visitors use to open the widget.', 'pojo-accessibility' ) }
+
+
+
+
+
+
+
+
+
+
+
+ );
+};
+
+export default IconDesignSettings;
diff --git a/modules/settings/assets/js/layouts/index.js b/modules/settings/assets/js/layouts/index.js
new file mode 100644
index 00000000..94895503
--- /dev/null
+++ b/modules/settings/assets/js/layouts/index.js
@@ -0,0 +1,3 @@
+export { default as IconDesignSettings } from './icon-design-settings';
+export { default as PositionSettings } from './position-settings';
+export { default as PositionSettingsDesktop } from './position-settings-desktop';
diff --git a/modules/settings/assets/js/layouts/position-settings-desktop.js b/modules/settings/assets/js/layouts/position-settings-desktop.js
new file mode 100644
index 00000000..ab129bae
--- /dev/null
+++ b/modules/settings/assets/js/layouts/position-settings-desktop.js
@@ -0,0 +1,39 @@
+import Box from '@elementor/ui/Box';
+import FormControlLabel from '@elementor/ui/FormControlLabel';
+import Switch from '@elementor/ui/Switch';
+import Typography from '@elementor/ui/Typography';
+import { useState } from '@wordpress/element';
+import { __ } from '@wordpress/i18n';
+import { AlignmentMatrixControl, PositionControl } from '../components';
+
+const PositionSettingsDesktop = () => {
+ const [ hiddenOnDesktop, setHiddenOnDesktop ] = useState( false );
+ const [ disableExactPosition, setDisableExactPosition ] = useState( true );
+ return (
+ <>
+ { __( 'Hide on desktop', 'pojo-accessibility' ) } }
+ labelPlacement="start"
+ control={ }
+ sx={ { marginLeft: 0, marginBottom: 3 } }
+ onChange={ () => setHiddenOnDesktop( ! hiddenOnDesktop ) } />
+ { ! hiddenOnDesktop &&
+
+
+
+ { __( 'Exact position', 'pojo-accessibility' ) } }
+ labelPlacement="start"
+ control={ }
+ sx={ { marginLeft: 0 } }
+ onChange={ () => setDisableExactPosition( ! disableExactPosition ) } />
+
+
+
+
+ }
+ >
+ );
+};
+
+export default PositionSettingsDesktop;
diff --git a/modules/settings/assets/js/layouts/position-settings.js b/modules/settings/assets/js/layouts/position-settings.js
new file mode 100644
index 00000000..8574cbe1
--- /dev/null
+++ b/modules/settings/assets/js/layouts/position-settings.js
@@ -0,0 +1,70 @@
+import { DesktopIcon, MobileIcon } from '@elementor/icons';
+import Box from '@elementor/ui/Box';
+import Grid from '@elementor/ui/Grid';
+import Tab from '@elementor/ui/Tab';
+import TabPanel from '@elementor/ui/TabPanel';
+import Tabs from '@elementor/ui/Tabs';
+import Typography from '@elementor/ui/Typography';
+import useTabs from '@elementor/ui/useTabs';
+import { useState } from '@wordpress/element';
+import { __ } from '@wordpress/i18n';
+import { PositionSettingsDesktop } from '../layouts';
+
+const TABS = {
+ one: 'one',
+ two: 'two',
+};
+
+const PositionSettings = () => {
+ const [ currentTab, setCurrentTab ] = useState( TABS.one );
+ const { getTabProps } = useTabs( currentTab );
+
+ const changeTab = ( tab ) => () => {
+ setCurrentTab( tab );
+ };
+
+ return (
+
+
+ { __( 'Position', 'pojo-accessibility' ) }
+ { __( 'Set where the widget appears on your site. This applies to all pages.', 'pojo-accessibility' ) }
+
+
+
+ }
+ iconPosition="start"
+ onClick={ changeTab( TABS.one ) }
+ />
+ }
+ iconPosition="start"
+ onClick={ changeTab( TABS.two ) }
+ />
+
+
+
+ { currentTab === TABS.one ? (
+
+
+
+ ) : (
+
+
+ ) }
+
+ );
+};
+
+export default PositionSettings;
diff --git a/package.json b/package.json
index db245eec..5d8b204e 100644
--- a/package.json
+++ b/package.json
@@ -42,6 +42,7 @@
"@wordpress/i18n": "^5.10.0",
"@wordpress/url": "^4.10.0",
"husky": "^9.1.6",
+ "react-colorful": "^5.6.1",
"prop-types": "^15.8.1"
}
}
From 0c63bac47bcdf71ec77ba5669ae45bf071bd7c7b Mon Sep 17 00:00:00 2001
From: Nirbhay Singh <121793120+nirbhayel@users.noreply.github.com>
Date: Wed, 27 Nov 2024 15:01:52 +0530
Subject: [PATCH 008/290] [App 780] Navigation Sidebar (#115)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* Initial refactor commit
* ✅ Added build and tests CI/CD
* update: add src for admin settings
* update: incorrect constant names
* update: namespace
* add: accessibility settings
* update: webpack to output files inside a folder
* update: build output folders
* update: removed commented code
* update: npm scripts
* add: webpack config
* add: hooks
* update: move admin setting to the module folder
* update: assets loading logic
* update: add rule to move jsx props to multiline imporving readability
* add: connect modal
* update: hooks import for better readability
* update: replace functions with hooks
* add: connect module
* add: settings and get settings route
* add: hooks and contexts to get settings
* add: hooks
* add: notification component
* add: data api
* add: settings provider and connect settings
* add: husky
* fix: formatting and text-domain
* update: filter names
* fix: hook import
* add: set function for settings
* add: prop-types package
* update: refactor notification component and context
* update: remove filter for authorize url
* update: imports and exports of hooks
* update: plugin settings context filename and relevant imports
* update: icons and icon imports
* add: sidebar(wip)
* update: fix width of connect screen on mobile
* update: sidebar layout
* add: credit card and user arrow icons
* update: hidden wpfooter and fixed sidebar height
* update: sidebar layout
* add: basic page layouts
* update: sidebar layout
* add: sidebar menu, sidebar app bar and my account menu components
* update: add sidebar and menu settings
* update: add page layouts
* update: admin top bar
* add: bottom bar
* add: bottom bar and top bar
* add: bottom bar and top bar
* update: page content styling
* fix: styling
* fix: styling
* update: text domain
* update: added translations
* fix: admin top bar layout
* update: exports of icons
* update: exports of components
* add: aliases for imports and fix exports
* fix: height and styling of the layout
* fix: unhide wp footer
* update: keep widget menu open on page load (default)
* update: linter rules to move first prop to new line
* update: linter rules to move first prop to new line
---------
Co-authored-by: Ohad
---
.eslintrc | 16 ++-
modules/settings/assets/css/style.css | 15 +--
modules/settings/assets/js/admin.js | 12 +-
modules/settings/assets/js/app.js | 29 ++++-
.../js/components/admin-top-bar/index.js | 34 ++----
.../alignment-matrix-control/index.js | 6 +-
.../assets/js/components/bottom-bar/index.js | 18 +++
.../js/components/color-picker/index.js | 9 +-
.../connect-modal/connect-modal-icon.js | 96 ++++++++++-----
.../js/components/connect-modal/index.js | 11 +-
.../assets/js/components/icon-select/index.js | 28 +++--
.../assets/js/components/icon-size/index.js | 2 +-
.../settings/assets/js/components/index.js | 6 +
.../js/components/my-account-menu/index.js | 77 ++++++++++++
.../js/components/notifications/index.js | 5 +-
.../js/components/position-control/index.js | 3 +-
.../js/components/sidebar-app-bar/index.js | 35 ++++++
.../js/components/sidebar-menu/index.js | 70 +++++++++++
.../assets/js/components/sidebar-menu/menu.js | 30 +++++
.../settings/assets/js/hooks/use-settings.js | 9 +-
.../assets/js/icons/accessibility-controls.js | 6 +-
.../assets/js/icons/accessibility-eye.js | 9 +-
.../assets/js/icons/accessibility-person.js | 6 +-
.../assets/js/icons/accessibility-text.js | 9 +-
.../settings/assets/js/icons/credit-card.js | 18 +++
.../assets/js/icons/elementor-logo.js | 3 +-
modules/settings/assets/js/icons/index.js | 4 +
.../js/icons/square-rounded-chevrons-left.js | 18 +++
.../settings/assets/js/icons/user-arrow.js | 23 ++++
modules/settings/assets/js/icons/widget.js | 35 ++++++
.../assets/js/layouts/icon-design-settings.js | 11 +-
.../js/layouts/position-settings-desktop.js | 11 +-
.../assets/js/layouts/position-settings.js | 5 +-
modules/settings/assets/js/layouts/sidebar.js | 32 +++++
.../js/pages/accessibility-statement.js | 5 +
.../settings/assets/js/pages/icon-settings.js | 5 +
modules/settings/assets/js/pages/index.js | 3 +
modules/settings/assets/js/pages/menu.js | 5 +
package-lock.json | 111 +++++++++++++++++-
package.json | 5 +-
webpack.config.js | 10 ++
41 files changed, 720 insertions(+), 125 deletions(-)
create mode 100644 modules/settings/assets/js/components/bottom-bar/index.js
create mode 100644 modules/settings/assets/js/components/my-account-menu/index.js
create mode 100644 modules/settings/assets/js/components/sidebar-app-bar/index.js
create mode 100644 modules/settings/assets/js/components/sidebar-menu/index.js
create mode 100644 modules/settings/assets/js/components/sidebar-menu/menu.js
create mode 100644 modules/settings/assets/js/icons/credit-card.js
create mode 100644 modules/settings/assets/js/icons/square-rounded-chevrons-left.js
create mode 100644 modules/settings/assets/js/icons/user-arrow.js
create mode 100644 modules/settings/assets/js/icons/widget.js
create mode 100644 modules/settings/assets/js/layouts/sidebar.js
create mode 100644 modules/settings/assets/js/pages/accessibility-statement.js
create mode 100644 modules/settings/assets/js/pages/icon-settings.js
create mode 100644 modules/settings/assets/js/pages/index.js
create mode 100644 modules/settings/assets/js/pages/menu.js
diff --git a/.eslintrc b/.eslintrc
index 0ad9518b..e17cfe0b 100644
--- a/.eslintrc
+++ b/.eslintrc
@@ -9,6 +9,16 @@
"babel",
"react"
],
+ "settings": {
+ "import/resolver": {
+ "node": {
+ "paths": ["node_modules"]
+ },
+ "webpack": {
+ "config": "webpack.config.js"
+ }
+ }
+ },
"env": {
"browser": true,
"node": true,
@@ -27,6 +37,7 @@
"no-console": "off",
"react-hooks/exhaustive-deps": "off",
"react/jsx-max-props-per-line": [1, { "maximum": { "single": 2, "multi": 1 } }],
+ "react/jsx-first-prop-new-line": ["error", "multiline"],
"strict": [ "error", "global" ],
"curly": "warn",
"import/order": [
@@ -47,7 +58,10 @@
"caseInsensitive": false
}
}
- ]
+ ],
+ "import/newline-after-import": ["error", {
+ "count": 1
+ }]
},
"parser": "@babel/eslint-parser"
}
diff --git a/modules/settings/assets/css/style.css b/modules/settings/assets/css/style.css
index 72965c8e..8fa3d9b6 100644
--- a/modules/settings/assets/css/style.css
+++ b/modules/settings/assets/css/style.css
@@ -1,6 +1,7 @@
body {
background: #fff;
}
+
.wrap {
margin-top: 0;
}
@@ -8,21 +9,13 @@ body {
html:not([dir='rtl']) #ea11y-app {
margin-left: -20px;
background: white;
+ height: calc(100vh - 32px);
}
html[dir='rtl'] #ea11y-app {
margin-right: -20px;
background: white;
-}
-
-html:not([dir='rtl']) #ea11y-app-top-bar {
- margin-left: -20px;
- margin-bottom: 20px;
-}
-
-html[dir='rtl'] #ea11y-app-top-bar {
- margin-right: -20px;
- margin-bottom: 20px;
+ height: calc(100vh - 32px);
}
#ea11y-app * {
@@ -34,4 +27,4 @@ html[dir='rtl'] #ea11y-app-top-bar {
padding: 8px 12px;
box-shadow: none;
border-color: rgba(12, 13, 14, 0.23);
-}
\ No newline at end of file
+}
diff --git a/modules/settings/assets/js/admin.js b/modules/settings/assets/js/admin.js
index a40129e3..c3b25101 100644
--- a/modules/settings/assets/js/admin.js
+++ b/modules/settings/assets/js/admin.js
@@ -1,25 +1,15 @@
-import { ThemeProvider } from '@elementor/ui/styles';
+import { SettingsProvider, NotificationsProvider } from '@ea11y/hooks';
import { StrictMode, Fragment, createRoot } from '@wordpress/element';
import App from './app';
-import AdminTopBar from './components/admin-top-bar';
import { PluginSettingsProvider } from './contexts/plugin-settings';
-import { SettingsProvider, NotificationsProvider } from './hooks';
const rootNode = document.getElementById( 'ea11y-app' );
-const topBarNode = document.getElementById( 'ea11y-app-top-bar' );
// Can't use the settings hook in the global scope so accessing directly
const isDevelopment = window?.ea11ySettingsData?.isDevelopment;
const AppWrapper = Boolean( isDevelopment ) ? StrictMode : Fragment;
const root = createRoot( rootNode );
-const topBar = createRoot( topBarNode );
-
-topBar.render(
-
-
- ,
-);
root.render(
diff --git a/modules/settings/assets/js/app.js b/modules/settings/assets/js/app.js
index 83ba765d..1a10f881 100644
--- a/modules/settings/assets/js/app.js
+++ b/modules/settings/assets/js/app.js
@@ -1,9 +1,12 @@
import '../css/style.css';
+import Box from '@elementor/ui/Box';
import DirectionProvider from '@elementor/ui/DirectionProvider';
+import Grid from '@elementor/ui/Grid';
import { ThemeProvider } from '@elementor/ui/styles';
-import { ConnectModal, Notifications } from './components';
+import { ConnectModal, Notifications, MenuItems, AdminTopBar, BottomBar } from '@ea11y/components';
+import { useNotificationSettings, useSettings } from '@ea11y/hooks';
import { usePluginSettingsContext } from './contexts/plugin-settings';
-import { useNotificationSettings } from './hooks';
+import { Sidebar } from './layouts/sidebar';
const App = () => {
const { isConnected } = usePluginSettingsContext();
@@ -11,11 +14,33 @@ const App = () => {
notificationMessage,
notificationType,
} = useNotificationSettings();
+ const { selectedMenu } = useSettings();
+ // Accessing the selected menu item
+ const selectedParent = MenuItems[ selectedMenu.parent ];
+ const selectedChild = selectedMenu.child ? selectedParent.children[ selectedMenu.child ] : null;
return (
{ ! isConnected && }
+
+
+
+
+
+ { selectedChild ? selectedChild.page : selectedParent?.page }
+
+
+
+
diff --git a/modules/settings/assets/js/components/admin-top-bar/index.js b/modules/settings/assets/js/components/admin-top-bar/index.js
index 6df38d63..ec97e36f 100644
--- a/modules/settings/assets/js/components/admin-top-bar/index.js
+++ b/modules/settings/assets/js/components/admin-top-bar/index.js
@@ -1,31 +1,25 @@
import HelpIcon from '@elementor/icons/HelpIcon';
import AppBar from '@elementor/ui/AppBar';
-import Grid from '@elementor/ui/Grid';
import Link from '@elementor/ui/Link';
import Toolbar from '@elementor/ui/Toolbar';
-import Typography from '@elementor/ui/Typography';
import { __ } from '@wordpress/i18n';
import { HELP_LINK } from '../../constants';
-import ElementorLogo from '../../icons/elementor-logo';
-const AdminTopBar = () => {
+export const AdminTopBar = () => {
+ const toolBarStyle = {
+ justifyContent: 'end',
+ alignItems: 'center',
+ backgroundColor: 'background.default',
+ gap: '10px',
+ borderBottom: '1px solid rgba(0, 0, 0, 0.12)' };
return (
-
-
+
-
-
-
- { __( 'Accessibility', 'pojo-accessibility' ) }
-
-
-
- {
);
};
-
-export default AdminTopBar;
diff --git a/modules/settings/assets/js/components/alignment-matrix-control/index.js b/modules/settings/assets/js/components/alignment-matrix-control/index.js
index 0040c618..9153498d 100644
--- a/modules/settings/assets/js/components/alignment-matrix-control/index.js
+++ b/modules/settings/assets/js/components/alignment-matrix-control/index.js
@@ -31,7 +31,8 @@ const AlignmentMatrixControl = () => {
{ __( 'Default Position', 'pojo-accessibility' ) }
- {
width: '100px',
} }
>
- { options.map( ( option, i ) => } /> ) }
diff --git a/modules/settings/assets/js/components/bottom-bar/index.js b/modules/settings/assets/js/components/bottom-bar/index.js
new file mode 100644
index 00000000..5ecc9ec6
--- /dev/null
+++ b/modules/settings/assets/js/components/bottom-bar/index.js
@@ -0,0 +1,18 @@
+import Box from '@elementor/ui/Box';
+import Button from '@elementor/ui/Button';
+import { __ } from '@wordpress/i18n';
+
+export const BottomBar = () => {
+ return (
+
+
+ { __( 'Save Changes', 'pojo-accessibility' ) }
+
+
+ );
+};
diff --git a/modules/settings/assets/js/components/color-picker/index.js b/modules/settings/assets/js/components/color-picker/index.js
index 5e3222cf..a3cf6cab 100644
--- a/modules/settings/assets/js/components/color-picker/index.js
+++ b/modules/settings/assets/js/components/color-picker/index.js
@@ -18,7 +18,8 @@ const ColorPicker = () => {
{ __( 'Color', 'pojo-accessibility' ) }
- {
className="widget-settings-color-picker"
/>
-
- {
>
- {
-
-
-
-
-
-
-
-
-
-
-
-
- {
strokeLinejoin="round" />
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/modules/settings/assets/js/components/connect-modal/index.js b/modules/settings/assets/js/components/connect-modal/index.js
index 8ea7f9c3..51ea0df4 100644
--- a/modules/settings/assets/js/components/connect-modal/index.js
+++ b/modules/settings/assets/js/components/connect-modal/index.js
@@ -3,8 +3,8 @@ import Button from '@elementor/ui/Button';
import Grid from '@elementor/ui/Grid';
import Modal from '@elementor/ui/Modal';
import Typography from '@elementor/ui/Typography';
+import { useAuth, useModal } from '@ea11y/hooks';
import { __ } from '@wordpress/i18n';
-import { useAuth, useModal } from '../../hooks';
function ConnectModal() {
const { isOpen } = useModal();
@@ -12,7 +12,8 @@ function ConnectModal() {
return (
-
-
{ __( 'Connect plugin on your site!', 'pojo-accessibility' ) }
-
diff --git a/modules/settings/assets/js/components/icon-select/index.js b/modules/settings/assets/js/components/icon-select/index.js
index e5d1efd2..e85c88fd 100644
--- a/modules/settings/assets/js/components/icon-select/index.js
+++ b/modules/settings/assets/js/components/icon-select/index.js
@@ -4,19 +4,29 @@ import Paper from '@elementor/ui/Paper';
import Radio from '@elementor/ui/Radio';
import RadioGroup from '@elementor/ui/RadioGroup';
import Typography from '@elementor/ui/Typography';
+import { AccessibilityControlsIcon, AccessibilityEyeIcon, AccessibilityPersonIcon, AccessibilityTextIcon } from '@ea11y/icons';
import { useState } from '@wordpress/element';
import { __ } from '@wordpress/i18n';
-import { AccessibilityControlsIcon, AccessibilityEyeIcon, AccessibilityPersonIcon, AccessibilityTextIcon } from '../../icons';
const IconSelect = ( props ) => {
const [ selectedValue, setSelectedValue ] = useState( 'person' );
- const optionStyle = { color: 'info.main', fontSize: 44 };
+ const optionStyle = {
+ color: 'info.main', fontSize: 44,
+ };
const options = [
- { value: 'person', icon: , label: __( 'Accessibility Person Icon', 'pojo-accessibility' ) },
- { value: 'eye', icon: , label: __( 'Accessibility Eye Icon', 'pojo-accessibility' ) },
- { value: 'text', icon: , label: __( 'Accessibility Text Badge Icon', 'pojo-accessibility' ) },
- { value: 'controls', icon: , label: __( 'Accessibility Controls Slider Icon', 'pojo-accessibility' ) },
+ {
+ value: 'person', icon: , label: __( 'Accessibility Person Icon', 'pojo-accessibility' ),
+ },
+ {
+ value: 'eye', icon: , label: __( 'Accessibility Eye Icon', 'pojo-accessibility' ),
+ },
+ {
+ value: 'text', icon: , label: __( 'Accessibility Text Badge Icon', 'pojo-accessibility' ),
+ },
+ {
+ value: 'controls', icon: , label: __( 'Accessibility Controls Slider Icon', 'pojo-accessibility' ),
+ },
];
return (
@@ -59,7 +69,11 @@ const IconSelect = ( props ) => {
cursor: 'pointer',
} }
>{ option.icon }
-
+
) ) }
diff --git a/modules/settings/assets/js/components/icon-size/index.js b/modules/settings/assets/js/components/icon-size/index.js
index f8114d59..7f041a8f 100644
--- a/modules/settings/assets/js/components/icon-size/index.js
+++ b/modules/settings/assets/js/components/icon-size/index.js
@@ -4,9 +4,9 @@ import Paper from '@elementor/ui/Paper';
import Radio from '@elementor/ui/Radio';
import RadioGroup from '@elementor/ui/RadioGroup';
import Typography from '@elementor/ui/Typography';
+import { AccessibilityEyeIcon, AccessibilityPersonIcon, AccessibilityTextIcon } from '@ea11y/icons';
import { useState } from '@wordpress/element';
import { __ } from '@wordpress/i18n';
-import { AccessibilityEyeIcon, AccessibilityPersonIcon, AccessibilityTextIcon } from '../../icons';
const IconSize = ( props ) => {
const [ selectedValue, setSelectedValue ] = useState( 'medium' );
diff --git a/modules/settings/assets/js/components/index.js b/modules/settings/assets/js/components/index.js
index b85ca7c8..455679ae 100644
--- a/modules/settings/assets/js/components/index.js
+++ b/modules/settings/assets/js/components/index.js
@@ -1,5 +1,11 @@
export { default as ConnectModal } from './connect-modal';
export { default as Notifications } from './notifications';
+export { default as MyAccountMenu } from './my-account-menu';
+export { default as SidebarAppBar } from './sidebar-app-bar';
+export { default as SidebarMenu } from './sidebar-menu';
+export { MenuItems } from '../components/sidebar-menu/menu';
+export { AdminTopBar } from './admin-top-bar';
+export { BottomBar } from './bottom-bar';
export { default as IconSize } from './icon-size';
export { default as IconSelect } from './icon-select';
export { default as ColorPicker } from './color-picker';
diff --git a/modules/settings/assets/js/components/my-account-menu/index.js b/modules/settings/assets/js/components/my-account-menu/index.js
new file mode 100644
index 00000000..d35b0a14
--- /dev/null
+++ b/modules/settings/assets/js/components/my-account-menu/index.js
@@ -0,0 +1,77 @@
+import { ChevronDownIcon, UserIcon } from '@elementor/icons';
+import Avatar from '@elementor/ui/Avatar';
+import Box from '@elementor/ui/Box';
+import List from '@elementor/ui/List';
+import ListItemButton from '@elementor/ui/ListItemButton';
+import ListItemIcon from '@elementor/ui/ListItemIcon';
+import ListItemText from '@elementor/ui/ListItemText';
+import Menu from '@elementor/ui/Menu';
+import MenuItem from '@elementor/ui/MenuItem';
+import Typography from '@elementor/ui/Typography';
+import { bindMenu, bindTrigger, usePopupState } from '@elementor/ui/usePopupState';
+import { useSettings } from '@ea11y/hooks';
+import {
+ CreditCardIcon,
+ UserArrowIcon,
+} from '@ea11y/icons';
+import { __ } from '@wordpress/i18n';
+
+const MyAccountMenu = () => {
+ const { openSidebar } = useSettings();
+ const accountMenuState = usePopupState( { variant: 'popover', popupId: 'myAccountMenu' } );
+ return (
+ <>
+
+
+
+
+
+
+
+
+
+
+
+
+
+ JB
+
+ Jack Baueuer
+ jack@bauer.com
+
+
+
+
+
+ { __( 'Switch account', 'pojo-accessibility' ) }
+
+
+
+
+
+ { __( 'Billing', 'pojo-accessibility' ) }
+
+
+
+ >
+ );
+};
+
+export default MyAccountMenu;
diff --git a/modules/settings/assets/js/components/notifications/index.js b/modules/settings/assets/js/components/notifications/index.js
index 367ee784..28a60244 100644
--- a/modules/settings/assets/js/components/notifications/index.js
+++ b/modules/settings/assets/js/components/notifications/index.js
@@ -1,6 +1,6 @@
import Alert from '@elementor/ui/Alert';
import Snackbar from '@elementor/ui/Snackbar';
-import { useNotificationSettings } from '../../hooks';
+import { useNotificationSettings } from '@ea11y/hooks';
const Notifications = ( { type, message } ) => {
const {
@@ -24,7 +24,8 @@ const Notifications = ( { type, message } ) => {
anchorOrigin={ { vertical: 'bottom', horizontal: 'right' } }
sx={ { zIndex: 99999 } }
>
- setShowNotification( ! showNotification ) }
+ setShowNotification( ! showNotification ) }
severity={ type }
variant="filled" >
{ message }
diff --git a/modules/settings/assets/js/components/position-control/index.js b/modules/settings/assets/js/components/position-control/index.js
index 88c2372d..fcba18bb 100644
--- a/modules/settings/assets/js/components/position-control/index.js
+++ b/modules/settings/assets/js/components/position-control/index.js
@@ -55,7 +55,8 @@ const PositionControl = ( { type, disabled }, props ) => {
const handlePositionChange = ( event ) => setPosition( event.target.value );
return (
-
{
+ const { openSidebar, setOpenSidebar } = useSettings();
+
+ return (
+
+
+
+
+ { __( 'Accessibility', 'pojo-accessibility' ) }
+
+
+ setOpenSidebar( ! openSidebar ) }>
+
+
+
+ );
+};
+
+export default SidebarAppBar;
diff --git a/modules/settings/assets/js/components/sidebar-menu/index.js b/modules/settings/assets/js/components/sidebar-menu/index.js
new file mode 100644
index 00000000..a2d1129c
--- /dev/null
+++ b/modules/settings/assets/js/components/sidebar-menu/index.js
@@ -0,0 +1,70 @@
+import { ChevronDownIcon } from '@elementor/icons';
+import List from '@elementor/ui/List';
+import ListItem from '@elementor/ui/ListItem';
+import ListItemButton from '@elementor/ui/ListItemButton';
+import ListItemIcon from '@elementor/ui/ListItemIcon';
+import ListItemText from '@elementor/ui/ListItemText';
+import { useSettings } from '@ea11y/hooks';
+import { useState } from '@wordpress/element';
+import { MenuItems } from './menu';
+
+const SidebarMenu = () => {
+ const { openSidebar, selectedMenu, setSelectedMenu } = useSettings();
+ const [ expandedItems, setExpandedItems ] = useState( { widget: true } );
+
+ const handleSelectedMenu = ( parentKey, childKey ) => {
+ if ( childKey ) {
+ setSelectedMenu( { parent: parentKey, child: childKey } );
+ } else {
+ setSelectedMenu( { parent: parentKey, child: null } );
+ }
+ };
+
+ const handleToggleItem = ( itemName ) => {
+ setExpandedItems( ( prev ) => ( {
+ ...prev,
+ [ itemName ]: ! prev[ itemName ], // Toggle the expanded state for the clicked item
+ } ) );
+ };
+ return (
+ { Object.entries( MenuItems ).map( ( [ key, item ] ) => (
+ <>
+
+ item.children ? handleToggleItem( key ) : handleSelectedMenu( key ) }
+ sx={ { justifyContent: 'center' } }
+ selected={ key === selectedMenu.parent && ( ! selectedMenu.child || ! openSidebar ) }
+ >
+ { item.icon }
+
+ { item.children && (
+
+
+
+ ) }
+
+
+ { item.children && expandedItems[ key ] && (
+
+ { Object.entries( item.children ).map( ( [ childKey, child ] ) => (
+
+ handleSelectedMenu( key, childKey ) }>
+
+
+
+ ) ) }
+
+ ) }
+ >
+ ) ) }
+
);
+};
+
+export default SidebarMenu;
diff --git a/modules/settings/assets/js/components/sidebar-menu/menu.js b/modules/settings/assets/js/components/sidebar-menu/menu.js
new file mode 100644
index 00000000..9f82b18f
--- /dev/null
+++ b/modules/settings/assets/js/components/sidebar-menu/menu.js
@@ -0,0 +1,30 @@
+import { PagesIcon } from '@elementor/icons';
+import { WidgetIcon } from '@ea11y/icons';
+import { __ } from '@wordpress/i18n';
+import { AccessibilityStatement, Menu, IconSettings } from '../../pages';
+
+export const MenuItems = {
+ widget: {
+ name: __( 'Widget', 'pojo-accessibility' ),
+ key: 'widget',
+ icon: ,
+ children: {
+ iconSettings: {
+ name: __( 'Icon Settings', 'pojo-accessibility' ),
+ key: 'icon-settings',
+ page: ,
+ },
+ menu: {
+ name: __( 'Menu', 'pojo-accessibility' ),
+ key: 'menu',
+ page: ,
+ },
+ },
+ },
+ accessibilityStatement: {
+ name: __( 'Accessibility Statement', 'pojo-accessibility' ),
+ key: 'accessibility-statement',
+ page: ,
+ icon: ,
+ },
+};
diff --git a/modules/settings/assets/js/hooks/use-settings.js b/modules/settings/assets/js/hooks/use-settings.js
index 69d5a774..7c58be86 100644
--- a/modules/settings/assets/js/hooks/use-settings.js
+++ b/modules/settings/assets/js/hooks/use-settings.js
@@ -10,12 +10,15 @@ export function useSettings() {
}
export const SettingsProvider = ( { children } ) => {
- const [ test, setTest ] = useState( 'Test' );
+ const [ openSidebar, setOpenSidebar ] = useState( true );
+ const [ selectedMenu, setSelectedMenu ] = useState( { parent: 'widget', child: 'iconSettings' } );
return (
{ children }
diff --git a/modules/settings/assets/js/icons/accessibility-controls.js b/modules/settings/assets/js/icons/accessibility-controls.js
index 7299b452..6aa3b140 100644
--- a/modules/settings/assets/js/icons/accessibility-controls.js
+++ b/modules/settings/assets/js/icons/accessibility-controls.js
@@ -9,10 +9,12 @@ function AccessibilityControlsIcon( props ) {
sx={ { marginRight: 1 } }
{ ...props }
>
-
-
-
-
-
diff --git a/modules/settings/assets/js/icons/accessibility-person.js b/modules/settings/assets/js/icons/accessibility-person.js
index 2aec5ccd..051c77e7 100644
--- a/modules/settings/assets/js/icons/accessibility-person.js
+++ b/modules/settings/assets/js/icons/accessibility-person.js
@@ -9,11 +9,13 @@ function AccessibilityPersonIcon( props ) {
sx={ { marginRight: 1 } }
{ ...props }
>
-
-
-
-
- {
+ return (
+
+
+
+
+ );
+};
+
+export default CreditCardIcon;
diff --git a/modules/settings/assets/js/icons/elementor-logo.js b/modules/settings/assets/js/icons/elementor-logo.js
index a9a65218..5f3ad308 100644
--- a/modules/settings/assets/js/icons/elementor-logo.js
+++ b/modules/settings/assets/js/icons/elementor-logo.js
@@ -4,7 +4,8 @@ const ElementorLogo = ( { size } ) => {
return (
-
diff --git a/modules/settings/assets/js/icons/index.js b/modules/settings/assets/js/icons/index.js
index fead74c0..27fefa68 100644
--- a/modules/settings/assets/js/icons/index.js
+++ b/modules/settings/assets/js/icons/index.js
@@ -1,4 +1,8 @@
export { default as ElementorLogo } from './elementor-logo';
+export { default as SquareRoundedChevronsLeft } from './square-rounded-chevrons-left';
+export { default as WidgetIcon } from './widget';
+export { default as UserArrowIcon } from './user-arrow';
+export { default as CreditCardIcon } from './credit-card';
export { default as AccessibilityPersonIcon } from './accessibility-person';
export { default as AccessibilityEyeIcon } from './accessibility-eye';
export { default as AccessibilityTextIcon } from './accessibility-text';
diff --git a/modules/settings/assets/js/icons/square-rounded-chevrons-left.js b/modules/settings/assets/js/icons/square-rounded-chevrons-left.js
new file mode 100644
index 00000000..a753c862
--- /dev/null
+++ b/modules/settings/assets/js/icons/square-rounded-chevrons-left.js
@@ -0,0 +1,18 @@
+import SvgIcon from '@elementor/ui/SvgIcon';
+
+const SquareRoundedChevronsLeft = ( props, { size } ) => {
+ return (
+
+
+
+ );
+};
+
+export default SquareRoundedChevronsLeft;
diff --git a/modules/settings/assets/js/icons/user-arrow.js b/modules/settings/assets/js/icons/user-arrow.js
new file mode 100644
index 00000000..2adbdbe6
--- /dev/null
+++ b/modules/settings/assets/js/icons/user-arrow.js
@@ -0,0 +1,23 @@
+import SvgIcon from '@elementor/ui/SvgIcon';
+
+const UserArrowIcon = ( props, { size } ) => {
+ return (
+
+
+
+
+
+ );
+};
+
+export default UserArrowIcon;
diff --git a/modules/settings/assets/js/icons/widget.js b/modules/settings/assets/js/icons/widget.js
new file mode 100644
index 00000000..c7c84e4a
--- /dev/null
+++ b/modules/settings/assets/js/icons/widget.js
@@ -0,0 +1,35 @@
+import SvgIcon from '@elementor/ui/SvgIcon';
+
+const WidgetIcon = ( { size } ) => {
+ return (
+
+
+
+
+
+
+
+ );
+};
+
+export default WidgetIcon;
diff --git a/modules/settings/assets/js/layouts/icon-design-settings.js b/modules/settings/assets/js/layouts/icon-design-settings.js
index d0be5427..3327300e 100644
--- a/modules/settings/assets/js/layouts/icon-design-settings.js
+++ b/modules/settings/assets/js/layouts/icon-design-settings.js
@@ -1,22 +1,25 @@
import Box from '@elementor/ui/Box';
import Grid from '@elementor/ui/Grid';
import Typography from '@elementor/ui/Typography';
+import { ColorPicker, IconSelect, IconSize } from '@ea11y/components';
import { __ } from '@wordpress/i18n';
-import { ColorPicker, IconSelect, IconSize } from '../components';
const IconDesignSettings = () => {
return (
-
{ __( 'Design', 'pojo-accessibility' ) }
{ __( 'Customize the design of the button that visitors use to open the widget.', 'pojo-accessibility' ) }
-
-
diff --git a/modules/settings/assets/js/layouts/position-settings-desktop.js b/modules/settings/assets/js/layouts/position-settings-desktop.js
index ab129bae..66e50126 100644
--- a/modules/settings/assets/js/layouts/position-settings-desktop.js
+++ b/modules/settings/assets/js/layouts/position-settings-desktop.js
@@ -2,27 +2,30 @@ import Box from '@elementor/ui/Box';
import FormControlLabel from '@elementor/ui/FormControlLabel';
import Switch from '@elementor/ui/Switch';
import Typography from '@elementor/ui/Typography';
+import { AlignmentMatrixControl, PositionControl } from '@ea11y/components';
import { useState } from '@wordpress/element';
import { __ } from '@wordpress/i18n';
-import { AlignmentMatrixControl, PositionControl } from '../components';
const PositionSettingsDesktop = () => {
const [ hiddenOnDesktop, setHiddenOnDesktop ] = useState( false );
const [ disableExactPosition, setDisableExactPosition ] = useState( true );
return (
<>
- { __( 'Hide on desktop', 'pojo-accessibility' ) } }
+ { __( 'Hide on desktop', 'pojo-accessibility' ) } }
labelPlacement="start"
control={ }
sx={ { marginLeft: 0, marginBottom: 3 } }
onChange={ () => setHiddenOnDesktop( ! hiddenOnDesktop ) } />
{ ! hiddenOnDesktop &&
-
- { __( 'Exact position', 'pojo-accessibility' ) } }
+ { __( 'Exact position', 'pojo-accessibility' ) } }
labelPlacement="start"
control={ }
sx={ { marginLeft: 0 } }
diff --git a/modules/settings/assets/js/layouts/position-settings.js b/modules/settings/assets/js/layouts/position-settings.js
index 8574cbe1..36399753 100644
--- a/modules/settings/assets/js/layouts/position-settings.js
+++ b/modules/settings/assets/js/layouts/position-settings.js
@@ -6,9 +6,9 @@ import TabPanel from '@elementor/ui/TabPanel';
import Tabs from '@elementor/ui/Tabs';
import Typography from '@elementor/ui/Typography';
import useTabs from '@elementor/ui/useTabs';
+import { PositionSettingsDesktop } from '@ea11y/layouts';
import { useState } from '@wordpress/element';
import { __ } from '@wordpress/i18n';
-import { PositionSettingsDesktop } from '../layouts';
const TABS = {
one: 'one',
@@ -24,7 +24,8 @@ const PositionSettings = () => {
};
return (
-
diff --git a/modules/settings/assets/js/layouts/sidebar.js b/modules/settings/assets/js/layouts/sidebar.js
new file mode 100644
index 00000000..1ff31c39
--- /dev/null
+++ b/modules/settings/assets/js/layouts/sidebar.js
@@ -0,0 +1,32 @@
+import Box from '@elementor/ui/Box';
+import Drawer from '@elementor/ui/Drawer';
+import { MyAccountMenu, SidebarAppBar, SidebarMenu } from '@ea11y/components';
+import { useSettings } from '@ea11y/hooks';
+
+export const Sidebar = () => {
+ const { openSidebar } = useSettings();
+
+ return (
+
+
+
+
+
+
+
+ );
+};
diff --git a/modules/settings/assets/js/pages/accessibility-statement.js b/modules/settings/assets/js/pages/accessibility-statement.js
new file mode 100644
index 00000000..c4a0c857
--- /dev/null
+++ b/modules/settings/assets/js/pages/accessibility-statement.js
@@ -0,0 +1,5 @@
+const AccessibilityStatement = () => {
+ return ( AccessibilityStatement );
+};
+
+export default AccessibilityStatement;
diff --git a/modules/settings/assets/js/pages/icon-settings.js b/modules/settings/assets/js/pages/icon-settings.js
new file mode 100644
index 00000000..bb8bb85f
--- /dev/null
+++ b/modules/settings/assets/js/pages/icon-settings.js
@@ -0,0 +1,5 @@
+const IconSettings = () => {
+ return ( IconSettings );
+};
+
+export default IconSettings;
diff --git a/modules/settings/assets/js/pages/index.js b/modules/settings/assets/js/pages/index.js
new file mode 100644
index 00000000..e2531a2a
--- /dev/null
+++ b/modules/settings/assets/js/pages/index.js
@@ -0,0 +1,3 @@
+export { default as AccessibilityStatement } from './accessibility-statement';
+export { default as IconSettings } from './icon-settings';
+export { default as Menu } from './menu';
diff --git a/modules/settings/assets/js/pages/menu.js b/modules/settings/assets/js/pages/menu.js
new file mode 100644
index 00000000..2b618ce1
--- /dev/null
+++ b/modules/settings/assets/js/pages/menu.js
@@ -0,0 +1,5 @@
+const Menu = () => {
+ return ( Menu );
+};
+
+export default Menu;
diff --git a/package-lock.json b/package-lock.json
index 6f980a24..aee17755 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -16,7 +16,10 @@
"@wordpress/date": "^5.10.0",
"@wordpress/element": "^6.10.0",
"@wordpress/i18n": "^5.10.0",
- "@wordpress/url": "^4.10.0"
+ "@wordpress/url": "^4.10.0",
+ "husky": "^9.1.6",
+ "prop-types": "^15.8.1",
+ "react-colorful": "^5.6.1"
},
"devDependencies": {
"@eslint/js": "^9.13.0",
@@ -25,6 +28,7 @@
"@wordpress/eslint-plugin": "^21.3.0",
"@wordpress/scripts": "^30.3.0",
"eslint": "^8.57.1",
+ "eslint-import-resolver-webpack": "^0.13.9",
"eslint-plugin-babel": "^5.3.1",
"eslint-plugin-import": "^2.31.0",
"eslint-plugin-jsx-a11y": "^6.10.1",
@@ -10782,6 +10786,104 @@
"ms": "^2.1.1"
}
},
+ "node_modules/eslint-import-resolver-webpack": {
+ "version": "0.13.9",
+ "resolved": "https://registry.npmjs.org/eslint-import-resolver-webpack/-/eslint-import-resolver-webpack-0.13.9.tgz",
+ "integrity": "sha512-yGngeefNiHXau2yzKKs2BNON4HLpxBabY40BGL/vUSKZtqzjlVsTTZm57jhHULhm+mJEwKsEIIN3NXup5AiiBQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^3.2.7",
+ "enhanced-resolve": "^0.9.1",
+ "find-root": "^1.1.0",
+ "hasown": "^2.0.0",
+ "interpret": "^1.4.0",
+ "is-core-module": "^2.13.1",
+ "is-regex": "^1.1.4",
+ "lodash": "^4.17.21",
+ "resolve": "^2.0.0-next.5",
+ "semver": "^5.7.2"
+ },
+ "engines": {
+ "node": ">= 6"
+ },
+ "peerDependencies": {
+ "eslint-plugin-import": ">=1.4.0",
+ "webpack": ">=1.11.0"
+ }
+ },
+ "node_modules/eslint-import-resolver-webpack/node_modules/debug": {
+ "version": "3.2.7",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
+ "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/eslint-import-resolver-webpack/node_modules/enhanced-resolve": {
+ "version": "0.9.1",
+ "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-0.9.1.tgz",
+ "integrity": "sha512-kxpoMgrdtkXZ5h0SeraBS1iRntpTpQ3R8ussdb38+UAFnMGX5DDyJXePm+OCHOcoXvHDw7mc2erbJBpDnl7TPw==",
+ "dev": true,
+ "dependencies": {
+ "graceful-fs": "^4.1.2",
+ "memory-fs": "^0.2.0",
+ "tapable": "^0.1.8"
+ },
+ "engines": {
+ "node": ">=0.6"
+ }
+ },
+ "node_modules/eslint-import-resolver-webpack/node_modules/interpret": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz",
+ "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/eslint-import-resolver-webpack/node_modules/resolve": {
+ "version": "2.0.0-next.5",
+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz",
+ "integrity": "sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==",
+ "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-import-resolver-webpack/node_modules/semver": {
+ "version": "5.7.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
+ "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver"
+ }
+ },
+ "node_modules/eslint-import-resolver-webpack/node_modules/tapable": {
+ "version": "0.1.10",
+ "resolved": "https://registry.npmjs.org/tapable/-/tapable-0.1.10.tgz",
+ "integrity": "sha512-jX8Et4hHg57mug1/079yitEKWGB3LCwoxByLsNim89LABq8NqgiX+6iYVOsq0vX8uJHkU+DZ5fnq95f800bEsQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.6"
+ }
+ },
"node_modules/eslint-module-utils": {
"version": "2.12.0",
"resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.12.0.tgz",
@@ -15812,6 +15914,13 @@
"resolved": "https://registry.npmjs.org/memize/-/memize-2.1.0.tgz",
"integrity": "sha512-yywVJy8ctVlN5lNPxsep5urnZ6TTclwPEyigM9M3Bi8vseJBOfqNrGWN/r8NzuIt3PovM323W04blJfGQfQSVg=="
},
+ "node_modules/memory-fs": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/memory-fs/-/memory-fs-0.2.0.tgz",
+ "integrity": "sha512-+y4mDxU4rvXXu5UDSGCGNiesFmwCHuefGMoPCO1WYucNYj7DsLqrFaa2fXVI0H+NNiPTwwzKwspn9yTZqUGqng==",
+ "dev": true,
+ "license": "MIT"
+ },
"node_modules/meow": {
"version": "9.0.0",
"resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz",
diff --git a/package.json b/package.json
index 5d8b204e..e8767b27 100644
--- a/package.json
+++ b/package.json
@@ -25,6 +25,7 @@
"@wordpress/eslint-plugin": "^21.3.0",
"@wordpress/scripts": "^30.3.0",
"eslint": "^8.57.1",
+ "eslint-import-resolver-webpack": "^0.13.9",
"eslint-plugin-babel": "^5.3.1",
"eslint-plugin-import": "^2.31.0",
"eslint-plugin-jsx-a11y": "^6.10.1",
@@ -42,7 +43,7 @@
"@wordpress/i18n": "^5.10.0",
"@wordpress/url": "^4.10.0",
"husky": "^9.1.6",
- "react-colorful": "^5.6.1",
- "prop-types": "^15.8.1"
+ "prop-types": "^15.8.1",
+ "react-colorful": "^5.6.1"
}
}
diff --git a/webpack.config.js b/webpack.config.js
index b40d4aae..ae6ffc06 100644
--- a/webpack.config.js
+++ b/webpack.config.js
@@ -17,4 +17,14 @@ module.exports = {
...defaultConfig.output,
path: path.resolve( process.cwd(), 'assets/build' ),
},
+ resolve: {
+ alias: {
+ '@ea11y/hooks': path.resolve( __dirname, 'modules/settings/assets/js/hooks/' ),
+ '@ea11y/components': path.resolve( __dirname, 'modules/settings/assets/js/components/' ),
+ '@ea11y/icons': path.resolve( __dirname, 'modules/settings/assets/js/icons/' ),
+ '@ea11y/layouts': path.resolve( __dirname, 'modules/settings/assets/js/layouts/' ),
+ '@ea11y/pages': path.resolve( __dirname, 'modules/settings/assets/js/pages/' ),
+ },
+ extensions: [ '.js', '.jsx' ],
+ },
};
From 761d5b8a6345ac40dc03ca0dab3f81348e3fbe7a Mon Sep 17 00:00:00 2001
From: VasylD
Date: Thu, 28 Nov 2024 12:07:16 +0100
Subject: [PATCH 009/290] Fix error on install plugin, add prettier (#116)
---
.eslintrc | 5 +-
.prettierrc | 10 ++
classes/module-base.php | 2 +-
modules/legacy/module.php | 4 +-
modules/settings/assets/js/admin.js | 6 +-
.../assets/js/api/exceptions/APIError.js | 4 +-
modules/settings/assets/js/api/index.js | 82 ++++-----
modules/settings/assets/js/app.js | 34 ++--
.../js/components/admin-top-bar/index.js | 15 +-
.../alignment-matrix-control/index.js | 47 ++---
.../assets/js/components/bottom-bar/index.js | 7 +-
.../js/components/color-picker/index.js | 37 ++--
.../connect-modal/connect-modal-icon.js | 160 ++++++++++++------
.../js/components/connect-modal/index.js | 26 +--
.../assets/js/components/icon-select/index.js | 70 +++++---
.../assets/js/components/icon-size/index.js | 63 ++++---
.../js/components/my-account-menu/index.js | 83 +++++----
.../js/components/notifications/index.js | 27 +--
.../js/components/position-control/index.js | 108 ++++++------
.../js/components/sidebar-app-bar/index.js | 44 ++---
.../js/components/sidebar-menu/index.js | 105 ++++++------
.../assets/js/components/sidebar-menu/menu.js | 8 +-
.../js/contexts/plugin-settings-context.js | 54 +++---
.../assets/js/contexts/plugin-settings.js | 54 +++---
modules/settings/assets/js/hooks/use-auth.js | 6 +-
modules/settings/assets/js/hooks/use-modal.js | 8 +-
.../assets/js/hooks/use-notifications.js | 43 +++--
.../settings/assets/js/hooks/use-settings.js | 19 ++-
.../settings/assets/js/hooks/use-storage.js | 4 +-
.../assets/js/icons/accessibility-controls.js | 15 +-
.../assets/js/icons/accessibility-eye.js | 17 +-
.../assets/js/icons/accessibility-person.js | 19 ++-
.../assets/js/icons/accessibility-text.js | 24 +--
.../settings/assets/js/icons/credit-card.js | 11 +-
.../assets/js/icons/elementor-logo.js | 7 +-
.../js/icons/square-rounded-chevrons-left.js | 12 +-
.../settings/assets/js/icons/user-arrow.js | 14 +-
modules/settings/assets/js/icons/widget.js | 13 +-
.../assets/js/layouts/icon-design-settings.js | 28 ++-
.../js/layouts/position-settings-desktop.js | 46 +++--
.../assets/js/layouts/position-settings.js | 49 +++---
modules/settings/assets/js/layouts/sidebar.js | 8 +-
.../js/pages/accessibility-statement.js | 2 +-
.../settings/assets/js/pages/icon-settings.js | 2 +-
modules/settings/assets/js/pages/menu.js | 2 +-
package-lock.json | 30 +++-
package.json | 6 +-
webpack.config.js | 39 +++--
48 files changed, 843 insertions(+), 636 deletions(-)
create mode 100644 .prettierrc
diff --git a/.eslintrc b/.eslintrc
index e17cfe0b..3f69276d 100644
--- a/.eslintrc
+++ b/.eslintrc
@@ -3,7 +3,8 @@
"plugin:react/recommended",
"plugin:@wordpress/eslint-plugin/recommended-with-formatting",
"plugin:import/recommended",
- "plugin:jsx-a11y/strict"
+ "plugin:jsx-a11y/strict",
+ "plugin:prettier/recommended"
],
"plugins": [
"babel",
@@ -36,8 +37,6 @@
"rules": {
"no-console": "off",
"react-hooks/exhaustive-deps": "off",
- "react/jsx-max-props-per-line": [1, { "maximum": { "single": 2, "multi": 1 } }],
- "react/jsx-first-prop-new-line": ["error", "multiline"],
"strict": [ "error", "global" ],
"curly": "warn",
"import/order": [
diff --git a/.prettierrc b/.prettierrc
new file mode 100644
index 00000000..9da595c9
--- /dev/null
+++ b/.prettierrc
@@ -0,0 +1,10 @@
+{
+ "useTabs": true,
+ "printWidth": 80,
+ "semi": true,
+ "singleQuote": true,
+ "endOfLine": "auto",
+ "arrowParens": "always",
+ "proseWrap": "always",
+ "bracketSpacing": true
+}
diff --git a/classes/module-base.php b/classes/module-base.php
index 4633240c..bfc41351 100644
--- a/classes/module-base.php
+++ b/classes/module-base.php
@@ -190,7 +190,7 @@ public function add_route( string $id, $instance ) {
* @access public
* @return Module[]
*/
- public function get_components() {
+ public function get_components(): array {
return $this->components;
}
diff --git a/modules/legacy/module.php b/modules/legacy/module.php
index 3b04414b..9d38de8b 100644
--- a/modules/legacy/module.php
+++ b/modules/legacy/module.php
@@ -21,7 +21,7 @@ public static function component_list() : array {
'Frontend',
'Customizer',
'Settings',
- 'Admin'
+ 'Admin',
];
}
@@ -30,7 +30,7 @@ public function backwards_compatibility() {
/**
* @var Customizer $customizer
*/
- $customizer = $this->get_components( 'Customizer' );
+ $customizer = $this->get_components()['Customizer'];
$customizer_fields = $customizer->get_customizer_fields();
$options = [];
$mods = get_theme_mods();
diff --git a/modules/settings/assets/js/admin.js b/modules/settings/assets/js/admin.js
index c3b25101..761df35b 100644
--- a/modules/settings/assets/js/admin.js
+++ b/modules/settings/assets/js/admin.js
@@ -3,13 +3,13 @@ import { StrictMode, Fragment, createRoot } from '@wordpress/element';
import App from './app';
import { PluginSettingsProvider } from './contexts/plugin-settings';
-const rootNode = document.getElementById( 'ea11y-app' );
+const rootNode = document.getElementById('ea11y-app');
// Can't use the settings hook in the global scope so accessing directly
const isDevelopment = window?.ea11ySettingsData?.isDevelopment;
-const AppWrapper = Boolean( isDevelopment ) ? StrictMode : Fragment;
+const AppWrapper = Boolean(isDevelopment) ? StrictMode : Fragment;
-const root = createRoot( rootNode );
+const root = createRoot(rootNode);
root.render(
diff --git a/modules/settings/assets/js/api/exceptions/APIError.js b/modules/settings/assets/js/api/exceptions/APIError.js
index f13a1f1f..2750d975 100644
--- a/modules/settings/assets/js/api/exceptions/APIError.js
+++ b/modules/settings/assets/js/api/exceptions/APIError.js
@@ -1,6 +1,6 @@
class APIError extends Error {
- constructor( message ) {
- super( message );
+ constructor(message) {
+ super(message);
this.name = 'APIError';
}
diff --git a/modules/settings/assets/js/api/index.js b/modules/settings/assets/js/api/index.js
index 2648f103..79f675b1 100644
--- a/modules/settings/assets/js/api/index.js
+++ b/modules/settings/assets/js/api/index.js
@@ -6,126 +6,126 @@ const wpV2Prefix = '/wp/v2';
const v1Prefix = '/ea11y/v1';
class API {
- static async request( { path, data, method = 'POST' } ) {
+ static async request({ path, data, method = 'POST' }) {
try {
- if ( 'GET' === method && ! path.startsWith( wpV2Prefix ) ) {
- path = addQueryArgs( path, { sb_time: new Date().getTime() } );
+ if ('GET' === method && !path.startsWith(wpV2Prefix)) {
+ path = addQueryArgs(path, { sb_time: new Date().getTime() });
}
- const response = await apiFetch( {
+ const response = await apiFetch({
path,
method,
data,
- } );
+ });
- if ( path.startsWith( wpV2Prefix ) ) {
+ if (path.startsWith(wpV2Prefix)) {
return response;
}
- if ( ! response.success ) {
- throw new APIError( response.data.message );
+ if (!response.success) {
+ throw new APIError(response.data.message);
}
return response.data;
- } catch ( e ) {
- if ( e instanceof APIError ) {
+ } catch (e) {
+ if (e instanceof APIError) {
throw e;
} else {
- throw new APIError( e.message );
+ throw new APIError(e.message);
}
}
}
- static async initConnect( context = 'new' ) {
+ static async initConnect(context = 'new') {
const data = {
wp_rest: window?.ea11ySettingsData?.wpRestNonce,
};
- if ( 'update' === context ) {
+ if ('update' === context) {
data.update_redirect_uri = true;
}
- return API.request( {
+ return API.request({
method: 'POST',
- path: `${ v1Prefix }/connect/authorize`,
+ path: `${v1Prefix}/connect/authorize`,
data,
- } );
+ });
}
static async clearSession() {
- return API.request( {
+ return API.request({
method: 'POST',
- path: `${ v1Prefix }/connect/deactivate_and_disconnect`,
+ path: `${v1Prefix}/connect/deactivate_and_disconnect`,
data: {
wp_rest: window?.ea11ySettingsData?.wpRestNonce,
clear_session: true,
},
- } );
+ });
}
static async deactivateAndDisconnect() {
- return API.request( {
+ return API.request({
method: 'POST',
- path: `${ v1Prefix }/connect/deactivate_and_disconnect`,
+ path: `${v1Prefix}/connect/deactivate_and_disconnect`,
data: {
wp_rest: window?.ea11ySettingsData?.wpRestNonce,
},
- } );
+ });
}
static async deactivate() {
- return API.request( {
+ return API.request({
method: 'POST',
- path: `${ v1Prefix }/connect/deactivate`,
+ path: `${v1Prefix}/connect/deactivate`,
data: {
wp_rest: window?.ea11ySettingsData?.wpRestNonce,
},
- } );
+ });
}
static async disconnect() {
- return API.request( {
+ return API.request({
method: 'POST',
- path: `${ v1Prefix }/connect/disconnect`,
+ path: `${v1Prefix}/connect/disconnect`,
data: {
wp_rest: window?.ea11ySettingsData?.wpRestNonce,
},
- } );
+ });
}
static async reconnect() {
- return API.request( {
+ return API.request({
method: 'POST',
- path: `${ v1Prefix }/connect/reconnect`,
+ path: `${v1Prefix}/connect/reconnect`,
data: {
wp_rest: window?.ea11ySettingsData?.wpRestNonce,
},
- } );
+ });
}
static async getSettings() {
- return API.request( {
+ return API.request({
method: 'GET',
- path: `${ wpV2Prefix }/settings`,
- } );
+ path: `${wpV2Prefix}/settings`,
+ });
}
- static async updateSettings( data ) {
- return API.request( {
+ static async updateSettings(data) {
+ return API.request({
method: 'PUT',
- path: `${ wpV2Prefix }/settings`,
+ path: `${wpV2Prefix}/settings`,
data,
- } );
+ });
}
/**
* @return {Promise} {}
*/
static async getPluginSettings() {
- return API.request( {
+ return API.request({
method: 'GET',
- path: `${ v1Prefix }/settings/get-settings`,
- } );
+ path: `${v1Prefix}/settings/get-settings`,
+ });
}
}
diff --git a/modules/settings/assets/js/app.js b/modules/settings/assets/js/app.js
index 1a10f881..9a6cad78 100644
--- a/modules/settings/assets/js/app.js
+++ b/modules/settings/assets/js/app.js
@@ -3,30 +3,32 @@ import Box from '@elementor/ui/Box';
import DirectionProvider from '@elementor/ui/DirectionProvider';
import Grid from '@elementor/ui/Grid';
import { ThemeProvider } from '@elementor/ui/styles';
-import { ConnectModal, Notifications, MenuItems, AdminTopBar, BottomBar } from '@ea11y/components';
+import {
+ ConnectModal,
+ Notifications,
+ MenuItems,
+ AdminTopBar,
+ BottomBar,
+} from '@ea11y/components';
import { useNotificationSettings, useSettings } from '@ea11y/hooks';
import { usePluginSettingsContext } from './contexts/plugin-settings';
import { Sidebar } from './layouts/sidebar';
const App = () => {
const { isConnected } = usePluginSettingsContext();
- const {
- notificationMessage,
- notificationType,
- } = useNotificationSettings();
+ const { notificationMessage, notificationType } = useNotificationSettings();
const { selectedMenu } = useSettings();
// Accessing the selected menu item
- const selectedParent = MenuItems[ selectedMenu.parent ];
- const selectedChild = selectedMenu.child ? selectedParent.children[ selectedMenu.child ] : null;
+ const selectedParent = MenuItems[selectedMenu.parent];
+ const selectedChild = selectedMenu.child
+ ? selectedParent.children[selectedMenu.child]
+ : null;
return (
-
+
- { ! isConnected && }
-
+ {!isConnected && }
+
{
justifyContent="space-between"
>
-
- { selectedChild ? selectedChild.page : selectedParent?.page }
+
+ {selectedChild ? selectedChild.page : selectedParent?.page}
-
+
);
diff --git a/modules/settings/assets/js/components/admin-top-bar/index.js b/modules/settings/assets/js/components/admin-top-bar/index.js
index ec97e36f..ff926716 100644
--- a/modules/settings/assets/js/components/admin-top-bar/index.js
+++ b/modules/settings/assets/js/components/admin-top-bar/index.js
@@ -11,20 +11,19 @@ export const AdminTopBar = () => {
alignItems: 'center',
backgroundColor: 'background.default',
gap: '10px',
- borderBottom: '1px solid rgba(0, 0, 0, 0.12)' };
+ borderBottom: '1px solid rgba(0, 0, 0, 0.12)',
+ };
return (
-
+
+ sx={{ display: 'inline-flex', alignItems: 'center', gap: 1 }}
+ aria-label={__('Help', 'pojo-accessibility')}
+ >
diff --git a/modules/settings/assets/js/components/alignment-matrix-control/index.js b/modules/settings/assets/js/components/alignment-matrix-control/index.js
index 9153498d..feecb05a 100644
--- a/modules/settings/assets/js/components/alignment-matrix-control/index.js
+++ b/modules/settings/assets/js/components/alignment-matrix-control/index.js
@@ -9,41 +9,41 @@ import { useState } from '@wordpress/element';
import { __ } from '@wordpress/i18n';
const AlignmentMatrixControl = () => {
- const [ selectedValue, setSelectedValue ] = useState( 'center-right' );
+ const [selectedValue, setSelectedValue] = useState('center-right');
- const handleChange = ( event ) => {
- setSelectedValue( event.target.value );
+ const handleChange = (event) => {
+ setSelectedValue(event.target.value);
};
const options = [
- { value: 'top-left', label: __( 'Top Left', 'pojo-accessibility' ) },
- { value: 'top-right', label: __( 'Top Right', 'pojo-accessibility' ) },
- { value: 'center-left', label: __( 'Center Left', 'pojo-accessibility' ) },
- { value: 'center-right', label: __( 'Center Right', 'pojo-accessibility' ) },
- { value: 'bottom-left', label: __( 'Bottom Left', 'pojo-accessibility' ) },
- { value: 'bottom-right', label: __( 'Bottom Right', 'pojo-accessibility' ) },
+ { value: 'top-left', label: __('Top Left', 'pojo-accessibility') },
+ { value: 'top-right', label: __('Top Right', 'pojo-accessibility') },
+ { value: 'center-left', label: __('Center Left', 'pojo-accessibility') },
+ { value: 'center-right', label: __('Center Right', 'pojo-accessibility') },
+ { value: 'bottom-left', label: __('Bottom Left', 'pojo-accessibility') },
+ { value: 'bottom-right', label: __('Bottom Right', 'pojo-accessibility') },
];
return (
-
- { __( 'Default Position', 'pojo-accessibility' ) }
+
+ {__('Default Position', 'pojo-accessibility')}
{
borderColor: 'secondary.main',
borderRadius: 1,
width: '100px',
- } }
+ }}
>
- { options.map( ( option, i ) => } /> ) }
+ {options.map((option, i) => (
+ }
+ />
+ ))}
diff --git a/modules/settings/assets/js/components/bottom-bar/index.js b/modules/settings/assets/js/components/bottom-bar/index.js
index 5ecc9ec6..95cca683 100644
--- a/modules/settings/assets/js/components/bottom-bar/index.js
+++ b/modules/settings/assets/js/components/bottom-bar/index.js
@@ -7,11 +7,12 @@ export const BottomBar = () => {
+ borderTop="1px solid rgba(0, 0, 0, 0.12)"
+ >
- { __( 'Save Changes', 'pojo-accessibility' ) }
+ {__('Save Changes', 'pojo-accessibility')}
);
diff --git a/modules/settings/assets/js/components/color-picker/index.js b/modules/settings/assets/js/components/color-picker/index.js
index a3cf6cab..beecd7a0 100644
--- a/modules/settings/assets/js/components/color-picker/index.js
+++ b/modules/settings/assets/js/components/color-picker/index.js
@@ -9,42 +9,39 @@ import { __ } from '@wordpress/i18n';
import './style.css';
const ColorPicker = () => {
- const [ color, setColor ] = useState( '#2563eb' );
+ const [color, setColor] = useState('#2563eb');
return (
-
- { __( 'Color', 'pojo-accessibility' ) }
+
+ {__('Color', 'pojo-accessibility')}
-
+
-
+
+ padding={2}
+ sx={{ backgroundColor: color }}
+ borderRadius={1}
+ marginRight={1}
+ >
+ }}
+ />
diff --git a/modules/settings/assets/js/components/connect-modal/connect-modal-icon.js b/modules/settings/assets/js/components/connect-modal/connect-modal-icon.js
index 8bc13676..ce023c72 100644
--- a/modules/settings/assets/js/components/connect-modal/connect-modal-icon.js
+++ b/modules/settings/assets/js/components/connect-modal/connect-modal-icon.js
@@ -4,201 +4,265 @@ const ConnectModalIcon = () => {
return (
-
+
-
-
-
+ strokeLinejoin="round"
+ />
+
+
+
-
-
+ fill="url(#pattern0_4586_17927)"
+ />
+
+
+ strokeMiterlimit="10"
+ />
+ strokeLinejoin="round"
+ />
+ strokeLinejoin="round"
+ />
+ strokeLinejoin="round"
+ />
-
+ strokeLinejoin="round"
+ />
+
+ strokeMiterlimit="10"
+ />
+ strokeLinejoin="round"
+ />
-
+ strokeLinejoin="round"
+ />
+
+ strokeLinejoin="round"
+ />
+ strokeLinejoin="round"
+ />
+ strokeLinejoin="round"
+ />
-
-
+ strokeLinejoin="round"
+ />
+
+
+ strokeMiterlimit="10"
+ />
-
+ strokeMiterlimit="10"
+ />
+
+ strokeLinecap="round"
+ />
+ strokeLinejoin="round"
+ />
+ strokeLinejoin="round"
+ />
+ strokeLinejoin="round"
+ />
+ strokeLinejoin="round"
+ />
+ strokeLinejoin="round"
+ />
+ strokeLinejoin="round"
+ />
+ strokeLinejoin="round"
+ />
+ strokeLinejoin="round"
+ />
+ strokeLinejoin="round"
+ />
+ fill="white"
+ />
-
+ height="1"
+ >
+
{
y1="62.9463"
x2="288.705"
y2="69.6428"
- gradientUnits="userSpaceOnUse">
+ gradientUnits="userSpaceOnUse"
+ >
-
+
+ transform="translate(0.0888672)"
+ />
+ xlinkHref="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAX0AAADpCAYAAADI+eewAAAACXBIWXMAAC4jAAAuIwF4pT92AAAFUklEQVR4Xu3b0WrjVhRAUav0/39ZfSiCy0WyncROZO21oCSO5enAwPbx0c2yrusNgIZ/Hl0AwHWIPkCI6AOEiD5AiOgDhIg+QIjoA4SIPkCI6AOEiD5AiOgDhIg+QIjoA4SIPkCI6AOEiD5AiOgDhIg+QIjoA4SIPkCI6AOEiD5AiOgDhIg+QIjoA4SIPkCI6AOEiD5AiOgDhIg+QIjoA4SIPkCI6AOEiD5AiOgDhIg+QIjoA4SIPkCI6AOEiD5AiOgDhIg+QIjoA4SIPkCI6AOEiD5AiOgDhIg+QIjoA4SIPkCI6AOEiD5AiOgDhIg+QIjoA4SIPkCI6AOEiD5AiOgDhIg+QIjoA4SIPkCI6AOEiD5AiOgDhIg+QIjoA4SIPkCI6AOEiD5AiOgDhIg+QIjoA4SIPkCI6AOEiD5AiOgDhIg+QIjoA4SIPkCI6AOEiD5AiOgDhIg+QIjoA4SIPkCI6AOEiD5AiOgDhIg+QIjoA4SIPkCI6AOEiD5AiOgDhIg+QIjoA4SIPkCI6AOEiD5AiOgDhIg+QIjoA4SIPkCI6AOEiD5AiOgDhIg+QIjoA4SIPkCI6AOEiD5AiOgDhIg+QIjoA4SIPkCI6AOEiD5AiOgDhIg+QIjoA4SIPkCI6AO32+12W5ZlfXQNn29ZV//OABUmfYhalmWdp3vT/vWZ9IHb7fZ/8Nd1XR5dx2cz6UPYONkLfoPoQ5A1Tte/jy4Armee6k38HSZ9gBDRh7B1XRernhbRh4s7ivp4ZHNb6VjtXJ8jmxBw7zjm/KYg/NfmRi5c3Bh8gcd6BwKOYr+9IWz/7b+aKxF9uLAx6uP+fu/7+SvXZKcPF3K0u392p7+9CZj6r0v04SLmWO9N7M8e0RT967LegQuYb9aOj8evR1O8yHeIPnygLex7u/nt8d5XsN6BD7RN7Huhn6+bf/YMbxLXZdKHD3Q0yY+RHz8FHL2OHtGHDzQerxyDP8d8fuxYJn4jF07uXswfTfjizsxOH07s3pn5e0E/mvCfZf1zXSZ9OKmjUG9vBHtrnb0bvDAy6cMJ3Zvw966bw//odY888//mM7mRCydzL9rLcDZ/vm58TrQ5IvpwEmOwx2iPcd+ee/RJ4KfT/k9fz3mJPpzEM9P5fDJnfgN45s+gTfThpMZpe479/L0buDzLjVz4I0f793urmznur7x5O/Op4Zoc2YQ/8uxkPu/09z4BwLOsd+Bk5un96KYufIfowx/YW8+M+/nxOqHnlUQffsm8phmfm49i3rsWfkL04Y32pvR70/tR4IWfV3EjF95oL9ZHN2OPbuxa7/BKJn14o6OTN3uBF3d+g+jDG+3t7r9y5NJah1cTfXiDo739/LPtBu78/dH18FN+IxdeaDt9853nzxh4nzSuR/Thl8zHMY9u3P4lkb8+p3fgjb563v7dbwTP/B24NpM+vNjeRL/9/Og1r4q9qPOI6MMPjXv6MfhzyOf4fyf0os5PiT68yRz8vcd7nwjgnUQfXmxvehd0zkL04YtM5nwy0QcI8Ru5ACGiDxAi+gAhog8QIvoAIaIPECL6ACGiDxAi+gAhog8QIvoAIaIPECL6ACGiDxAi+gAhog8QIvoAIaIPECL6ACGiDxAi+gAhog8QIvoAIaIPECL6ACGiDxAi+gAhog8QIvoAIaIPECL6ACGiDxAi+gAhog8QIvoAIaIPECL6ACGiDxAi+gAhog8QIvoAIaIPECL6ACGiDxAi+gAhog8QIvoAIaIPECL6ACGiDxAi+gAhog8QIvoAIaIPECL6ACGiDxAi+gAhog8QIvoAIaIPECL6ACGiDxDyH3IoUtUNxiZ6AAAAAElFTkSuQmCC"
+ />
);
diff --git a/modules/settings/assets/js/components/connect-modal/index.js b/modules/settings/assets/js/components/connect-modal/index.js
index 51ea0df4..eb9befde 100644
--- a/modules/settings/assets/js/components/connect-modal/index.js
+++ b/modules/settings/assets/js/components/connect-modal/index.js
@@ -11,14 +11,14 @@ function ConnectModal() {
const { redirectToConnect } = useAuth();
return (
-
+
-
-
- { __( 'Connect plugin on your site!', 'pojo-accessibility' ) }
+ }}
+ >
+
+
+ {__('Connect plugin on your site!', 'pojo-accessibility')}
- { __( 'Connect', 'pojo-accessibility' ) }
+ onClick={redirectToConnect}
+ >
+ {__('Connect', 'pojo-accessibility')}
diff --git a/modules/settings/assets/js/components/icon-select/index.js b/modules/settings/assets/js/components/icon-select/index.js
index e85c88fd..bf8db607 100644
--- a/modules/settings/assets/js/components/icon-select/index.js
+++ b/modules/settings/assets/js/components/icon-select/index.js
@@ -4,55 +4,69 @@ import Paper from '@elementor/ui/Paper';
import Radio from '@elementor/ui/Radio';
import RadioGroup from '@elementor/ui/RadioGroup';
import Typography from '@elementor/ui/Typography';
-import { AccessibilityControlsIcon, AccessibilityEyeIcon, AccessibilityPersonIcon, AccessibilityTextIcon } from '@ea11y/icons';
+import {
+ AccessibilityControlsIcon,
+ AccessibilityEyeIcon,
+ AccessibilityPersonIcon,
+ AccessibilityTextIcon,
+} from '@ea11y/icons';
import { useState } from '@wordpress/element';
import { __ } from '@wordpress/i18n';
-const IconSelect = ( props ) => {
- const [ selectedValue, setSelectedValue ] = useState( 'person' );
+const IconSelect = (props) => {
+ const [selectedValue, setSelectedValue] = useState('person');
const optionStyle = {
- color: 'info.main', fontSize: 44,
+ color: 'info.main',
+ fontSize: 44,
};
const options = [
{
- value: 'person', icon: , label: __( 'Accessibility Person Icon', 'pojo-accessibility' ),
+ value: 'person',
+ icon: ,
+ label: __('Accessibility Person Icon', 'pojo-accessibility'),
},
{
- value: 'eye', icon: , label: __( 'Accessibility Eye Icon', 'pojo-accessibility' ),
+ value: 'eye',
+ icon: ,
+ label: __('Accessibility Eye Icon', 'pojo-accessibility'),
},
{
- value: 'text', icon: , label: __( 'Accessibility Text Badge Icon', 'pojo-accessibility' ),
+ value: 'text',
+ icon: ,
+ label: __('Accessibility Text Badge Icon', 'pojo-accessibility'),
},
{
- value: 'controls', icon: , label: __( 'Accessibility Controls Slider Icon', 'pojo-accessibility' ),
+ value: 'controls',
+ icon: ,
+ label: __('Accessibility Controls Slider Icon', 'pojo-accessibility'),
},
];
return (
-
- { __( 'Icon', 'pojo-accessibility' ) }
+
+ {__('Icon', 'pojo-accessibility')}
- { options.map( ( option ) => (
+ {options.map((option) => (
setSelectedValue( option.value ) }
- sx={ {
+ onClick={() => setSelectedValue(option.value)}
+ sx={{
borderRadius: 'md',
boxShadow: 'sm',
display: 'flex',
@@ -64,18 +78,22 @@ const IconSelect = ( props ) => {
p: 2,
minWidth: 100,
minHeight: 100,
- borderColor: selectedValue === option.value ? 'info.main' : 'divider',
+ borderColor:
+ selectedValue === option.value ? 'info.main' : 'divider',
borderWidth: selectedValue === option.value ? 2 : 1,
cursor: 'pointer',
- } }
- >{ option.icon }
+ }}
+ >
+ {option.icon}
+ value={option.value}
+ sx={{
+ opacity: 0,
+ position: 'absolute',
+ }}
+ />
- ) ) }
+ ))}
);
diff --git a/modules/settings/assets/js/components/icon-size/index.js b/modules/settings/assets/js/components/icon-size/index.js
index 7f041a8f..b5096849 100644
--- a/modules/settings/assets/js/components/icon-size/index.js
+++ b/modules/settings/assets/js/components/icon-size/index.js
@@ -4,44 +4,60 @@ import Paper from '@elementor/ui/Paper';
import Radio from '@elementor/ui/Radio';
import RadioGroup from '@elementor/ui/RadioGroup';
import Typography from '@elementor/ui/Typography';
-import { AccessibilityEyeIcon, AccessibilityPersonIcon, AccessibilityTextIcon } from '@ea11y/icons';
+import {
+ AccessibilityEyeIcon,
+ AccessibilityPersonIcon,
+ AccessibilityTextIcon,
+} from '@ea11y/icons';
import { useState } from '@wordpress/element';
import { __ } from '@wordpress/i18n';
-const IconSize = ( props ) => {
- const [ selectedValue, setSelectedValue ] = useState( 'medium' );
+const IconSize = (props) => {
+ const [selectedValue, setSelectedValue] = useState('medium');
const optionStyle = { color: 'info.main', fontSize: 44 };
const options = [
- { value: 'small', icon: , label: __( 'Accessibility Person Icon', 'pojo-accessibility' ) },
- { value: 'medium', icon: , label: __( 'Accessibility Eye Icon', 'pojo-accessibility' ) },
- { value: 'large', icon: , label: __( 'Accessibility Text Badge Icon', 'pojo-accessibility' ) },
+ {
+ value: 'small',
+ icon: ,
+ label: __('Accessibility Person Icon', 'pojo-accessibility'),
+ },
+ {
+ value: 'medium',
+ icon: ,
+ label: __('Accessibility Eye Icon', 'pojo-accessibility'),
+ },
+ {
+ value: 'large',
+ icon: ,
+ label: __('Accessibility Text Badge Icon', 'pojo-accessibility'),
+ },
];
return (
-
- { __( 'Size', 'pojo-accessibility' ) }
+
+ {__('Size', 'pojo-accessibility')}
- { options.map( ( option ) => (
+ {options.map((option) => (
setSelectedValue( option.value ) }
- sx={ {
+ onClick={() => setSelectedValue(option.value)}
+ sx={{
borderRadius: 'md',
boxShadow: 'sm',
display: 'flex',
@@ -53,14 +69,19 @@ const IconSize = ( props ) => {
p: 2,
minWidth: 100,
minHeight: 100,
- borderColor: selectedValue === option.value ? 'info.main' : 'divider',
+ borderColor:
+ selectedValue === option.value ? 'info.main' : 'divider',
borderWidth: selectedValue === option.value ? 2 : 1,
cursor: 'pointer',
- } }
- >{ option.icon }
-
+ }}
+ >
+ {option.icon}
+
- ) ) }
+ ))}
);
diff --git a/modules/settings/assets/js/components/my-account-menu/index.js b/modules/settings/assets/js/components/my-account-menu/index.js
index d35b0a14..0995398c 100644
--- a/modules/settings/assets/js/components/my-account-menu/index.js
+++ b/modules/settings/assets/js/components/my-account-menu/index.js
@@ -8,65 +8,80 @@ import ListItemText from '@elementor/ui/ListItemText';
import Menu from '@elementor/ui/Menu';
import MenuItem from '@elementor/ui/MenuItem';
import Typography from '@elementor/ui/Typography';
-import { bindMenu, bindTrigger, usePopupState } from '@elementor/ui/usePopupState';
-import { useSettings } from '@ea11y/hooks';
import {
- CreditCardIcon,
- UserArrowIcon,
-} from '@ea11y/icons';
+ bindMenu,
+ bindTrigger,
+ usePopupState,
+} from '@elementor/ui/usePopupState';
+import { useSettings } from '@ea11y/hooks';
+import { CreditCardIcon, UserArrowIcon } from '@ea11y/icons';
import { __ } from '@wordpress/i18n';
const MyAccountMenu = () => {
const { openSidebar } = useSettings();
- const accountMenuState = usePopupState( { variant: 'popover', popupId: 'myAccountMenu' } );
+ const accountMenuState = usePopupState({
+ variant: 'popover',
+ popupId: 'myAccountMenu',
+ });
return (
<>
-
+
-
+
-
-
+
+
-
+
JB
-
- Jack Baueuer
- jack@bauer.com
+
+
+ Jack Baueuer
+
+
+ jack@bauer.com
+
-
-
-
- { __( 'Switch account', 'pojo-accessibility' ) }
+
+
+
+ {__('Switch account', 'pojo-accessibility')}
-
-
-
- { __( 'Billing', 'pojo-accessibility' ) }
+
+
+
+ {__('Billing', 'pojo-accessibility')}
diff --git a/modules/settings/assets/js/components/notifications/index.js b/modules/settings/assets/js/components/notifications/index.js
index 28a60244..66cc545b 100644
--- a/modules/settings/assets/js/components/notifications/index.js
+++ b/modules/settings/assets/js/components/notifications/index.js
@@ -2,7 +2,7 @@ import Alert from '@elementor/ui/Alert';
import Snackbar from '@elementor/ui/Snackbar';
import { useNotificationSettings } from '@ea11y/hooks';
-const Notifications = ( { type, message } ) => {
+const Notifications = ({ type, message }) => {
const {
showNotification,
setShowNotification,
@@ -11,24 +11,25 @@ const Notifications = ( { type, message } ) => {
} = useNotificationSettings();
const closeNotification = () => {
- setShowNotification( ! showNotification );
- setNotificationMessage( '' );
- setNotificationType( '' );
+ setShowNotification(!showNotification);
+ setNotificationMessage('');
+ setNotificationType('');
};
return (
setShowNotification( ! showNotification ) }
- severity={ type }
- variant="filled" >
- { message }
+ onClose={() => setShowNotification(!showNotification)}
+ severity={type}
+ variant="filled"
+ >
+ {message}
);
diff --git a/modules/settings/assets/js/components/position-control/index.js b/modules/settings/assets/js/components/position-control/index.js
index fcba18bb..eab814af 100644
--- a/modules/settings/assets/js/components/position-control/index.js
+++ b/modules/settings/assets/js/components/position-control/index.js
@@ -6,24 +6,28 @@ import MenuItem from '@elementor/ui/MenuItem';
import Select from '@elementor/ui/Select';
import TextField from '@elementor/ui/TextField';
import { styled } from '@elementor/ui/styles';
-import { usePopupState, bindTrigger, bindMenu } from '@elementor/ui/usePopupState';
+import {
+ usePopupState,
+ bindTrigger,
+ bindMenu,
+} from '@elementor/ui/usePopupState';
import { useState } from '@wordpress/element';
import { __ } from '@wordpress/i18n';
-const units = [ 'PX', 'REM', 'EM' ];
+const units = ['PX', 'REM', 'EM'];
const horizontalOptions = [
- { value: 'to-left', label: __( 'To the left', 'pojo-accessibility' ) },
- { value: 'to-right', label: __( 'To the right', 'pojo-accessibility' ) },
+ { value: 'to-left', label: __('To the left', 'pojo-accessibility') },
+ { value: 'to-right', label: __('To the right', 'pojo-accessibility') },
];
const verticalOptions = [
- { value: 'higher', label: __( 'Higher', 'pojo-accessibility' ) },
- { value: 'lower', label: __( 'Lower', 'pojo-accessibility' ) },
+ { value: 'higher', label: __('Higher', 'pojo-accessibility') },
+ { value: 'lower', label: __('Lower', 'pojo-accessibility') },
];
// Customization for the WP admin global CSS.
-const StyledTextField = styled( TextField )( () => ( {
+const StyledTextField = styled(TextField)(() => ({
width: '200px',
'.wp-admin & .MuiInputBase-input, & .MuiInputBase-input:focus': {
backgroundColor: 'initial',
@@ -37,64 +41,68 @@ const StyledTextField = styled( TextField )( () => ( {
},
height: '56px',
},
-} ) );
+}));
-const PositionControl = ( { type, disabled }, props ) => {
- const [ unitsIndex, setUnitsIndex ] = useState( 0 );
- const popupState = usePopupState( {
+const PositionControl = ({ type, disabled }, props) => {
+ const [unitsIndex, setUnitsIndex] = useState(0);
+ const popupState = usePopupState({
variant: 'popover',
popupId: 'textfield-inner-selection',
- } );
+ });
- const handleMenuItemClick = ( index ) => {
- setUnitsIndex( index );
+ const handleMenuItemClick = (index) => {
+ setUnitsIndex(index);
popupState.close();
};
- const [ position, setPosition ] = useState( 10 );
- const handlePositionChange = ( event ) => setPosition( event.target.value );
+ const [position, setPosition] = useState(10);
+ const handlePositionChange = (event) => setPosition(event.target.value);
return (
-
+
- { units[ unitsIndex ] }
+ {units[unitsIndex]}
-
- { units.map( ( unit, index ) => (
- handleMenuItemClick( index ) }>
- { unit }
+
+ {units.map((unit, index) => (
+ handleMenuItemClick(index)}
+ >
+ {unit}
- ) ) }
+ ))}
),
- } }
+ }}
/>
{
vertical: 'top',
horizontal: 'left',
},
- } }
+ }}
>
- {
- type === 'horizontal' ? horizontalOptions.map( ( option ) => (
-
- { option.label }
-
- ) ) : verticalOptions.map( ( option ) => (
-
- { option.label }
-
- ) )
- }
+ {type === 'horizontal'
+ ? horizontalOptions.map((option) => (
+
+ {option.label}
+
+ ))
+ : verticalOptions.map((option) => (
+
+ {option.label}
+
+ ))}
);
diff --git a/modules/settings/assets/js/components/sidebar-app-bar/index.js b/modules/settings/assets/js/components/sidebar-app-bar/index.js
index b8ce2542..fa44c5c0 100644
--- a/modules/settings/assets/js/components/sidebar-app-bar/index.js
+++ b/modules/settings/assets/js/components/sidebar-app-bar/index.js
@@ -10,26 +10,30 @@ import { __ } from '@wordpress/i18n';
const SidebarAppBar = () => {
const { openSidebar, setOpenSidebar } = useSettings();
- return (
-
-
-
-
- { __( 'Accessibility', 'pojo-accessibility' ) }
-
-
- setOpenSidebar( ! openSidebar ) }>
-
-
-
- );
+ return (
+
+
+
+
+
+ {__('Accessibility', 'pojo-accessibility')}
+
+
+ setOpenSidebar(!openSidebar)}
+ >
+
+
+
+
+ );
};
export default SidebarAppBar;
diff --git a/modules/settings/assets/js/components/sidebar-menu/index.js b/modules/settings/assets/js/components/sidebar-menu/index.js
index a2d1129c..1e226d16 100644
--- a/modules/settings/assets/js/components/sidebar-menu/index.js
+++ b/modules/settings/assets/js/components/sidebar-menu/index.js
@@ -10,61 +10,70 @@ import { MenuItems } from './menu';
const SidebarMenu = () => {
const { openSidebar, selectedMenu, setSelectedMenu } = useSettings();
- const [ expandedItems, setExpandedItems ] = useState( { widget: true } );
+ const [expandedItems, setExpandedItems] = useState({ widget: true });
- const handleSelectedMenu = ( parentKey, childKey ) => {
- if ( childKey ) {
- setSelectedMenu( { parent: parentKey, child: childKey } );
+ const handleSelectedMenu = (parentKey, childKey) => {
+ if (childKey) {
+ setSelectedMenu({ parent: parentKey, child: childKey });
} else {
- setSelectedMenu( { parent: parentKey, child: null } );
+ setSelectedMenu({ parent: parentKey, child: null });
}
};
- const handleToggleItem = ( itemName ) => {
- setExpandedItems( ( prev ) => ( {
+ const handleToggleItem = (itemName) => {
+ setExpandedItems((prev) => ({
...prev,
- [ itemName ]: ! prev[ itemName ], // Toggle the expanded state for the clicked item
- } ) );
+ [itemName]: !prev[itemName], // Toggle the expanded state for the clicked item
+ }));
};
- return (
- { Object.entries( MenuItems ).map( ( [ key, item ] ) => (
- <>
-
- item.children ? handleToggleItem( key ) : handleSelectedMenu( key ) }
- sx={ { justifyContent: 'center' } }
- selected={ key === selectedMenu.parent && ( ! selectedMenu.child || ! openSidebar ) }
- >
- { item.icon }
-
- { item.children && (
-
-
-
- ) }
-
-
- { item.children && expandedItems[ key ] && (
-
- { Object.entries( item.children ).map( ( [ childKey, child ] ) => (
-
- handleSelectedMenu( key, childKey ) }>
-
-
-
- ) ) }
-
- ) }
- >
- ) ) }
-
);
+ return (
+
+ {Object.entries(MenuItems).map(([key, item]) => (
+ <>
+
+
+ item.children ? handleToggleItem(key) : handleSelectedMenu(key)
+ }
+ sx={{ justifyContent: 'center' }}
+ selected={
+ key === selectedMenu.parent &&
+ (!selectedMenu.child || !openSidebar)
+ }
+ >
+ {item.icon}
+
+ {item.children && (
+
+
+
+ )}
+
+
+ {item.children && expandedItems[key] && (
+
+ {Object.entries(item.children).map(([childKey, child]) => (
+
+ handleSelectedMenu(key, childKey)}
+ >
+
+
+
+ ))}
+
+ )}
+ >
+ ))}
+
+ );
};
export default SidebarMenu;
diff --git a/modules/settings/assets/js/components/sidebar-menu/menu.js b/modules/settings/assets/js/components/sidebar-menu/menu.js
index 9f82b18f..9f46c05b 100644
--- a/modules/settings/assets/js/components/sidebar-menu/menu.js
+++ b/modules/settings/assets/js/components/sidebar-menu/menu.js
@@ -5,24 +5,24 @@ import { AccessibilityStatement, Menu, IconSettings } from '../../pages';
export const MenuItems = {
widget: {
- name: __( 'Widget', 'pojo-accessibility' ),
+ name: __('Widget', 'pojo-accessibility'),
key: 'widget',
icon: ,
children: {
iconSettings: {
- name: __( 'Icon Settings', 'pojo-accessibility' ),
+ name: __('Icon Settings', 'pojo-accessibility'),
key: 'icon-settings',
page: ,
},
menu: {
- name: __( 'Menu', 'pojo-accessibility' ),
+ name: __('Menu', 'pojo-accessibility'),
key: 'menu',
page: ,
},
},
},
accessibilityStatement: {
- name: __( 'Accessibility Statement', 'pojo-accessibility' ),
+ name: __('Accessibility Statement', 'pojo-accessibility'),
key: 'accessibility-statement',
page: ,
icon: ,
diff --git a/modules/settings/assets/js/contexts/plugin-settings-context.js b/modules/settings/assets/js/contexts/plugin-settings-context.js
index 54d028f9..60cabe02 100644
--- a/modules/settings/assets/js/contexts/plugin-settings-context.js
+++ b/modules/settings/assets/js/contexts/plugin-settings-context.js
@@ -1,40 +1,50 @@
-import { createContext, useCallback, useContext, useEffect, useState } from '@wordpress/element';
+import {
+ createContext,
+ useCallback,
+ useContext,
+ useEffect,
+ useState,
+} from '@wordpress/element';
import { __ } from '@wordpress/i18n';
import API from '../api';
import { useToastNotification } from '../hooks';
-const PluginSettingsContext = createContext( {} );
+const PluginSettingsContext = createContext({});
-export const PluginSettingsProvider = ( { children } ) => {
+export const PluginSettingsProvider = ({ children }) => {
const { error } = useToastNotification();
- const [ pluginSettings, setPluginSettings ] = useState();
- const [ loaded, setLoaded ] = useState( false );
+ const [pluginSettings, setPluginSettings] = useState();
+ const [loaded, setLoaded] = useState(false);
- const refreshPluginSettings = useCallback( () => {
- API.getPluginSettings().then( ( settings ) => {
- if ( 'isConnected' in settings ) {
- settings.isConnected = Boolean( settings.isConnected );
- }
+ const refreshPluginSettings = useCallback(() => {
+ API.getPluginSettings()
+ .then((settings) => {
+ if ('isConnected' in settings) {
+ settings.isConnected = Boolean(settings.isConnected);
+ }
- setPluginSettings( settings );
- setLoaded( true );
- } ).catch( () => {
- error( __( 'An error occurred.', 'pojo-accessibility' ) );
- setLoaded( true );
- } );
- }, [] );
+ setPluginSettings(settings);
+ setLoaded(true);
+ })
+ .catch(() => {
+ error(__('An error occurred.', 'pojo-accessibility'));
+ setLoaded(true);
+ });
+ }, []);
- useEffect( () => {
+ useEffect(() => {
refreshPluginSettings();
- }, [ refreshPluginSettings ] );
+ }, [refreshPluginSettings]);
return (
-
- { children }
+
+ {children}
);
};
export const usePluginSettingsContext = () => {
- return useContext( PluginSettingsContext );
+ return useContext(PluginSettingsContext);
};
diff --git a/modules/settings/assets/js/contexts/plugin-settings.js b/modules/settings/assets/js/contexts/plugin-settings.js
index 54d028f9..60cabe02 100644
--- a/modules/settings/assets/js/contexts/plugin-settings.js
+++ b/modules/settings/assets/js/contexts/plugin-settings.js
@@ -1,40 +1,50 @@
-import { createContext, useCallback, useContext, useEffect, useState } from '@wordpress/element';
+import {
+ createContext,
+ useCallback,
+ useContext,
+ useEffect,
+ useState,
+} from '@wordpress/element';
import { __ } from '@wordpress/i18n';
import API from '../api';
import { useToastNotification } from '../hooks';
-const PluginSettingsContext = createContext( {} );
+const PluginSettingsContext = createContext({});
-export const PluginSettingsProvider = ( { children } ) => {
+export const PluginSettingsProvider = ({ children }) => {
const { error } = useToastNotification();
- const [ pluginSettings, setPluginSettings ] = useState();
- const [ loaded, setLoaded ] = useState( false );
+ const [pluginSettings, setPluginSettings] = useState();
+ const [loaded, setLoaded] = useState(false);
- const refreshPluginSettings = useCallback( () => {
- API.getPluginSettings().then( ( settings ) => {
- if ( 'isConnected' in settings ) {
- settings.isConnected = Boolean( settings.isConnected );
- }
+ const refreshPluginSettings = useCallback(() => {
+ API.getPluginSettings()
+ .then((settings) => {
+ if ('isConnected' in settings) {
+ settings.isConnected = Boolean(settings.isConnected);
+ }
- setPluginSettings( settings );
- setLoaded( true );
- } ).catch( () => {
- error( __( 'An error occurred.', 'pojo-accessibility' ) );
- setLoaded( true );
- } );
- }, [] );
+ setPluginSettings(settings);
+ setLoaded(true);
+ })
+ .catch(() => {
+ error(__('An error occurred.', 'pojo-accessibility'));
+ setLoaded(true);
+ });
+ }, []);
- useEffect( () => {
+ useEffect(() => {
refreshPluginSettings();
- }, [ refreshPluginSettings ] );
+ }, [refreshPluginSettings]);
return (
-
- { children }
+
+ {children}
);
};
export const usePluginSettingsContext = () => {
- return useContext( PluginSettingsContext );
+ return useContext(PluginSettingsContext);
};
diff --git a/modules/settings/assets/js/hooks/use-auth.js b/modules/settings/assets/js/hooks/use-auth.js
index 791ec33c..174568ec 100644
--- a/modules/settings/assets/js/hooks/use-auth.js
+++ b/modules/settings/assets/js/hooks/use-auth.js
@@ -7,7 +7,7 @@ export const useAuth = () => {
const redirectToConnect = async () => {
const link = await getConnectLink();
- window.open( link, '_self' ).focus();
+ window.open(link, '_self').focus();
};
const getConnectLink = async () => {
@@ -15,9 +15,9 @@ export const useAuth = () => {
};
const getUpgradeLink = () => {
- const url = new URL( UPGRADE_LINK );
+ const url = new URL(UPGRADE_LINK);
- url.searchParams.append( 'subscription_id', subscriptionId );
+ url.searchParams.append('subscription_id', subscriptionId);
return url.toString();
};
diff --git a/modules/settings/assets/js/hooks/use-modal.js b/modules/settings/assets/js/hooks/use-modal.js
index 19aaaaf1..e43b966c 100644
--- a/modules/settings/assets/js/hooks/use-modal.js
+++ b/modules/settings/assets/js/hooks/use-modal.js
@@ -1,14 +1,14 @@
import { useState } from '@wordpress/element';
-export const useModal = ( defaultIsOpen = true ) => {
- const [ isOpen, setIsOpen ] = useState( defaultIsOpen );
+export const useModal = (defaultIsOpen = true) => {
+ const [isOpen, setIsOpen] = useState(defaultIsOpen);
const open = () => {
- setIsOpen( true );
+ setIsOpen(true);
};
const close = () => {
- setIsOpen( false );
+ setIsOpen(false);
};
return {
diff --git a/modules/settings/assets/js/hooks/use-notifications.js b/modules/settings/assets/js/hooks/use-notifications.js
index 0ea75585..97471ec2 100644
--- a/modules/settings/assets/js/hooks/use-notifications.js
+++ b/modules/settings/assets/js/hooks/use-notifications.js
@@ -1,49 +1,46 @@
import { useState, createContext, useContext } from '@wordpress/element';
-const NotificationsContext = createContext( undefined );
+const NotificationsContext = createContext(undefined);
export function useNotificationSettings() {
- return useContext( NotificationsContext );
+ return useContext(NotificationsContext);
}
-export const NotificationsProvider = ( { children } ) => {
- const [ showNotification, setShowNotification ] = useState( false );
- const [ notificationMessage, setNotificationMessage ] = useState( '' );
- const [ notificationType, setNotificationType ] = useState( '' );
+export const NotificationsProvider = ({ children }) => {
+ const [showNotification, setShowNotification] = useState(false);
+ const [notificationMessage, setNotificationMessage] = useState('');
+ const [notificationType, setNotificationType] = useState('');
return (
- { children }
+ {children}
);
};
export const useToastNotification = () => {
- const {
- setNotificationMessage,
- setNotificationType,
- setShowNotification,
- } = useContext( NotificationsContext );
-
- const error = ( message ) => {
- setNotificationMessage( message );
- setNotificationType( 'error' );
- setShowNotification( true );
+ const { setNotificationMessage, setNotificationType, setShowNotification } =
+ useContext(NotificationsContext);
+
+ const error = (message) => {
+ setNotificationMessage(message);
+ setNotificationType('error');
+ setShowNotification(true);
};
- const success = ( message ) => {
- setNotificationMessage( message );
- setNotificationType( 'success' );
- setShowNotification( true );
+ const success = (message) => {
+ setNotificationMessage(message);
+ setNotificationType('success');
+ setShowNotification(true);
};
return {
diff --git a/modules/settings/assets/js/hooks/use-settings.js b/modules/settings/assets/js/hooks/use-settings.js
index 7c58be86..700ca921 100644
--- a/modules/settings/assets/js/hooks/use-settings.js
+++ b/modules/settings/assets/js/hooks/use-settings.js
@@ -3,25 +3,28 @@ import { useState, createContext, useContext } from '@wordpress/element';
/**
* Context Component.
*/
-const SettingsContext = createContext( null );
+const SettingsContext = createContext(null);
export function useSettings() {
- return useContext( SettingsContext );
+ return useContext(SettingsContext);
}
-export const SettingsProvider = ( { children } ) => {
- const [ openSidebar, setOpenSidebar ] = useState( true );
- const [ selectedMenu, setSelectedMenu ] = useState( { parent: 'widget', child: 'iconSettings' } );
+export const SettingsProvider = ({ children }) => {
+ const [openSidebar, setOpenSidebar] = useState(true);
+ const [selectedMenu, setSelectedMenu] = useState({
+ parent: 'widget',
+ child: 'iconSettings',
+ });
return (
- { children }
+ {children}
);
};
diff --git a/modules/settings/assets/js/hooks/use-storage.js b/modules/settings/assets/js/hooks/use-storage.js
index 23775120..814a0ba1 100644
--- a/modules/settings/assets/js/hooks/use-storage.js
+++ b/modules/settings/assets/js/hooks/use-storage.js
@@ -2,8 +2,8 @@ import { store as coreDataStore } from '@wordpress/core-data';
import { dispatch } from '@wordpress/data';
export const useStorage = () => {
- const save = async ( data ) => {
- return await dispatch( coreDataStore ).saveEntityRecord( 'root', 'site', data );
+ const save = async (data) => {
+ return await dispatch(coreDataStore).saveEntityRecord('root', 'site', data);
};
return {
diff --git a/modules/settings/assets/js/icons/accessibility-controls.js b/modules/settings/assets/js/icons/accessibility-controls.js
index 6aa3b140..fbcbefd8 100644
--- a/modules/settings/assets/js/icons/accessibility-controls.js
+++ b/modules/settings/assets/js/icons/accessibility-controls.js
@@ -1,25 +1,22 @@
import SvgIcon from '@elementor/ui/SvgIcon';
-function AccessibilityControlsIcon( props ) {
+function AccessibilityControlsIcon(props) {
return (
-
+
-
+ strokeLinejoin="round"
+ />
);
}
diff --git a/modules/settings/assets/js/icons/accessibility-eye.js b/modules/settings/assets/js/icons/accessibility-eye.js
index cdeda1f8..9c1d63b1 100644
--- a/modules/settings/assets/js/icons/accessibility-eye.js
+++ b/modules/settings/assets/js/icons/accessibility-eye.js
@@ -1,25 +1,23 @@
import SvgIcon from '@elementor/ui/SvgIcon';
-function AccessibilityEyeIcon( props ) {
+function AccessibilityEyeIcon(props) {
return (
-
+
+ strokeLinejoin="round"
+ />
@@ -27,7 +25,8 @@ function AccessibilityEyeIcon( props ) {
width="48"
height="48"
fill="white"
- transform="translate(8 8)" />
+ transform="translate(8 8)"
+ />
diff --git a/modules/settings/assets/js/icons/accessibility-person.js b/modules/settings/assets/js/icons/accessibility-person.js
index 051c77e7..71f5ab12 100644
--- a/modules/settings/assets/js/icons/accessibility-person.js
+++ b/modules/settings/assets/js/icons/accessibility-person.js
@@ -1,25 +1,26 @@
import SvgIcon from '@elementor/ui/SvgIcon';
-function AccessibilityPersonIcon( props ) {
+function AccessibilityPersonIcon(props) {
return (
-
-
+
+
+ strokeLinejoin="round"
+ />
);
}
diff --git a/modules/settings/assets/js/icons/accessibility-text.js b/modules/settings/assets/js/icons/accessibility-text.js
index 57f075ea..88c81a12 100644
--- a/modules/settings/assets/js/icons/accessibility-text.js
+++ b/modules/settings/assets/js/icons/accessibility-text.js
@@ -1,13 +1,13 @@
import SvgIcon from '@elementor/ui/SvgIcon';
-function AccessibilityTextIcon( props ) {
+function AccessibilityTextIcon(props) {
return (
-
+ strokeOpacity="0.12"
+ />
+
-
+ strokeWidth="3"
+ />
+
);
}
diff --git a/modules/settings/assets/js/icons/credit-card.js b/modules/settings/assets/js/icons/credit-card.js
index af62533f..bbb52b8b 100644
--- a/modules/settings/assets/js/icons/credit-card.js
+++ b/modules/settings/assets/js/icons/credit-card.js
@@ -1,16 +1,13 @@
import SvgIcon from '@elementor/ui/SvgIcon';
-const CreditCardIcon = ( props, { size } ) => {
+const CreditCardIcon = (props, { size }) => {
return (
-
+
-
+ d="M5 4.79163C3.96447 4.79163 3.125 5.63109 3.125 6.66663V7.70829H16.875V6.66663C16.875 5.63109 16.0355 4.79163 15 4.79163H5ZM18.125 6.66663C18.125 4.94074 16.7259 3.54163 15 3.54163H5C3.27411 3.54163 1.875 4.94074 1.875 6.66663V13.3333C1.875 15.0592 3.27411 16.4583 5 16.4583H15C16.7259 16.4583 18.125 15.0592 18.125 13.3333V6.66663ZM16.875 8.95829H3.125V13.3333C3.125 14.3688 3.96447 15.2083 5 15.2083H15C16.0355 15.2083 16.875 14.3688 16.875 13.3333V8.95829ZM5.20833 12.5C5.20833 12.1548 5.48816 11.875 5.83333 11.875H5.84167C6.18684 11.875 6.46667 12.1548 6.46667 12.5C6.46667 12.8451 6.18684 13.125 5.84167 13.125H5.83333C5.48816 13.125 5.20833 12.8451 5.20833 12.5ZM8.54167 12.5C8.54167 12.1548 8.82149 11.875 9.16667 11.875H10.8333C11.1785 11.875 11.4583 12.1548 11.4583 12.5C11.4583 12.8451 11.1785 13.125 10.8333 13.125H9.16667C8.82149 13.125 8.54167 12.8451 8.54167 12.5Z"
+ />
);
};
diff --git a/modules/settings/assets/js/icons/elementor-logo.js b/modules/settings/assets/js/icons/elementor-logo.js
index 5f3ad308..4afefe69 100644
--- a/modules/settings/assets/js/icons/elementor-logo.js
+++ b/modules/settings/assets/js/icons/elementor-logo.js
@@ -1,14 +1,15 @@
import SvgIcon from '@elementor/ui/SvgIcon';
-const ElementorLogo = ( { size } ) => {
+const ElementorLogo = ({ size }) => {
return (
-
+
+ clipRule="evenodd"
+ />
diff --git a/modules/settings/assets/js/icons/square-rounded-chevrons-left.js b/modules/settings/assets/js/icons/square-rounded-chevrons-left.js
index a753c862..4757bac1 100644
--- a/modules/settings/assets/js/icons/square-rounded-chevrons-left.js
+++ b/modules/settings/assets/js/icons/square-rounded-chevrons-left.js
@@ -1,16 +1,18 @@
import SvgIcon from '@elementor/ui/SvgIcon';
-const SquareRoundedChevronsLeft = ( props, { size } ) => {
+const SquareRoundedChevronsLeft = (props, { size }) => {
return (
+ fontSize={size}
+ sx={{ ...props.sx }}
+ {...props}
+ >
+ d="M5.33033 5.33033C4.21884 6.44182 3.75 8.39464 3.75 12C3.75 15.6054 4.21884 17.5582 5.33033 18.6697C6.44182 19.7812 8.39464 20.25 12 20.25C15.6054 20.25 17.5582 19.7812 18.6697 18.6697C19.7812 17.5582 20.25 15.6054 20.25 12C20.25 8.39464 19.7812 6.44182 18.6697 5.33033C17.5582 4.21884 15.6054 3.75 12 3.75C8.39464 3.75 6.44182 4.21884 5.33033 5.33033ZM4.26967 4.26967C5.85818 2.68116 8.40536 2.25 12 2.25C15.5946 2.25 18.1418 2.68116 19.7303 4.26967C21.3188 5.85818 21.75 8.40536 21.75 12C21.75 15.5946 21.3188 18.1418 19.7303 19.7303C18.1418 21.3188 15.5946 21.75 12 21.75C8.40536 21.75 5.85818 21.3188 4.26967 19.7303C2.68116 18.1418 2.25 15.5946 2.25 12C2.25 8.40536 2.68116 5.85818 4.26967 4.26967ZM11.5303 8.46967C11.8232 8.76256 11.8232 9.23744 11.5303 9.53033L9.06066 12L11.5303 14.4697C11.8232 14.7626 11.8232 15.2374 11.5303 15.5303C11.2374 15.8232 10.7626 15.8232 10.4697 15.5303L7.46967 12.5303C7.17678 12.2374 7.17678 11.7626 7.46967 11.4697L10.4697 8.46967C10.7626 8.17678 11.2374 8.17678 11.5303 8.46967ZM15.5303 8.46967C15.8232 8.76256 15.8232 9.23744 15.5303 9.53033L13.0607 12L15.5303 14.4697C15.8232 14.7626 15.8232 15.2374 15.5303 15.5303C15.2374 15.8232 14.7626 15.8232 14.4697 15.5303L11.4697 12.5303C11.1768 12.2374 11.1768 11.7626 11.4697 11.4697L14.4697 8.46967C14.7626 8.17678 15.2374 8.17678 15.5303 8.46967Z"
+ />
);
};
diff --git a/modules/settings/assets/js/icons/user-arrow.js b/modules/settings/assets/js/icons/user-arrow.js
index 2adbdbe6..0262aeb6 100644
--- a/modules/settings/assets/js/icons/user-arrow.js
+++ b/modules/settings/assets/js/icons/user-arrow.js
@@ -1,21 +1,15 @@
import SvgIcon from '@elementor/ui/SvgIcon';
-const UserArrowIcon = ( props, { size } ) => {
+const UserArrowIcon = (props, { size }) => {
return (
-
+
-
-
+
+
);
};
diff --git a/modules/settings/assets/js/icons/widget.js b/modules/settings/assets/js/icons/widget.js
index c7c84e4a..49f1a891 100644
--- a/modules/settings/assets/js/icons/widget.js
+++ b/modules/settings/assets/js/icons/widget.js
@@ -1,8 +1,8 @@
import SvgIcon from '@elementor/ui/SvgIcon';
-const WidgetIcon = ( { size } ) => {
+const WidgetIcon = ({ size }) => {
return (
-
+
{
stroke="black"
strokeWidth="1.5"
strokeLinecap="round"
- strokeLinejoin="round" />
+ strokeLinejoin="round"
+ />
+ strokeLinejoin="round"
+ />
{
stroke="black"
strokeWidth="1.5"
strokeLinecap="round"
- strokeLinejoin="round" />
+ strokeLinejoin="round"
+ />
);
diff --git a/modules/settings/assets/js/layouts/icon-design-settings.js b/modules/settings/assets/js/layouts/icon-design-settings.js
index 3327300e..437eede3 100644
--- a/modules/settings/assets/js/layouts/icon-design-settings.js
+++ b/modules/settings/assets/js/layouts/icon-design-settings.js
@@ -6,22 +6,20 @@ import { __ } from '@wordpress/i18n';
const IconDesignSettings = () => {
return (
-
-
- { __( 'Design', 'pojo-accessibility' ) }
- { __( 'Customize the design of the button that visitors use to open the widget.', 'pojo-accessibility' ) }
+
+
+
+ {__('Design', 'pojo-accessibility')}
+
+
+ {__(
+ 'Customize the design of the button that visitors use to open the widget.',
+ 'pojo-accessibility',
+ )}
+
-
-
+
+
diff --git a/modules/settings/assets/js/layouts/position-settings-desktop.js b/modules/settings/assets/js/layouts/position-settings-desktop.js
index 66e50126..b50ea5cd 100644
--- a/modules/settings/assets/js/layouts/position-settings-desktop.js
+++ b/modules/settings/assets/js/layouts/position-settings-desktop.js
@@ -7,34 +7,44 @@ import { useState } from '@wordpress/element';
import { __ } from '@wordpress/i18n';
const PositionSettingsDesktop = () => {
- const [ hiddenOnDesktop, setHiddenOnDesktop ] = useState( false );
- const [ disableExactPosition, setDisableExactPosition ] = useState( true );
+ const [hiddenOnDesktop, setHiddenOnDesktop] = useState(false);
+ const [disableExactPosition, setDisableExactPosition] = useState(true);
return (
<>
{ __( 'Hide on desktop', 'pojo-accessibility' ) } }
+ label={
+
+ {__('Hide on desktop', 'pojo-accessibility')}
+
+ }
labelPlacement="start"
- control={ }
- sx={ { marginLeft: 0, marginBottom: 3 } }
- onChange={ () => setHiddenOnDesktop( ! hiddenOnDesktop ) } />
- { ! hiddenOnDesktop &&
-
+ control={ }
+ sx={{ marginLeft: 0, marginBottom: 3 }}
+ onChange={() => setHiddenOnDesktop(!hiddenOnDesktop)}
+ />
+ {!hiddenOnDesktop && (
+
{ __( 'Exact position', 'pojo-accessibility' ) } }
+ label={
+
+ {__('Exact position', 'pojo-accessibility')}
+
+ }
labelPlacement="start"
- control={ }
- sx={ { marginLeft: 0 } }
- onChange={ () => setDisableExactPosition( ! disableExactPosition ) } />
-
-
+ control={ }
+ sx={{ marginLeft: 0 }}
+ onChange={() => setDisableExactPosition(!disableExactPosition)}
+ />
+
+
- }
+ )}
>
);
};
diff --git a/modules/settings/assets/js/layouts/position-settings.js b/modules/settings/assets/js/layouts/position-settings.js
index 36399753..c8f876e4 100644
--- a/modules/settings/assets/js/layouts/position-settings.js
+++ b/modules/settings/assets/js/layouts/position-settings.js
@@ -16,54 +16,57 @@ const TABS = {
};
const PositionSettings = () => {
- const [ currentTab, setCurrentTab ] = useState( TABS.one );
- const { getTabProps } = useTabs( currentTab );
+ const [currentTab, setCurrentTab] = useState(TABS.one);
+ const { getTabProps } = useTabs(currentTab);
- const changeTab = ( tab ) => () => {
- setCurrentTab( tab );
+ const changeTab = (tab) => () => {
+ setCurrentTab(tab);
};
return (
-
-
- { __( 'Position', 'pojo-accessibility' ) }
- { __( 'Set where the widget appears on your site. This applies to all pages.', 'pojo-accessibility' ) }
+
+
+
+ {__('Position', 'pojo-accessibility')}
+
+
+ {__(
+ 'Set where the widget appears on your site. This applies to all pages.',
+ 'pojo-accessibility',
+ )}
+
}
+ icon={ }
iconPosition="start"
- onClick={ changeTab( TABS.one ) }
+ onClick={changeTab(TABS.one)}
/>
}
+ icon={ }
iconPosition="start"
- onClick={ changeTab( TABS.two ) }
+ onClick={changeTab(TABS.two)}
/>
- { currentTab === TABS.one ? (
+ {currentTab === TABS.one ? (
) : (
-
-
- ) }
+
+ )}
);
};
diff --git a/modules/settings/assets/js/layouts/sidebar.js b/modules/settings/assets/js/layouts/sidebar.js
index 1ff31c39..a462cc84 100644
--- a/modules/settings/assets/js/layouts/sidebar.js
+++ b/modules/settings/assets/js/layouts/sidebar.js
@@ -9,8 +9,8 @@ export const Sidebar = () => {
return (
{
height: '100%',
justifyContent: 'space-between',
},
- } }
+ }}
>
-
+
);
};
diff --git a/modules/settings/assets/js/pages/accessibility-statement.js b/modules/settings/assets/js/pages/accessibility-statement.js
index c4a0c857..34cbc5cb 100644
--- a/modules/settings/assets/js/pages/accessibility-statement.js
+++ b/modules/settings/assets/js/pages/accessibility-statement.js
@@ -1,5 +1,5 @@
const AccessibilityStatement = () => {
- return ( AccessibilityStatement );
+ return AccessibilityStatement ;
};
export default AccessibilityStatement;
diff --git a/modules/settings/assets/js/pages/icon-settings.js b/modules/settings/assets/js/pages/icon-settings.js
index bb8bb85f..e744134d 100644
--- a/modules/settings/assets/js/pages/icon-settings.js
+++ b/modules/settings/assets/js/pages/icon-settings.js
@@ -1,5 +1,5 @@
const IconSettings = () => {
- return ( IconSettings );
+ return IconSettings ;
};
export default IconSettings;
diff --git a/modules/settings/assets/js/pages/menu.js b/modules/settings/assets/js/pages/menu.js
index 2b618ce1..eff5dfbd 100644
--- a/modules/settings/assets/js/pages/menu.js
+++ b/modules/settings/assets/js/pages/menu.js
@@ -1,5 +1,5 @@
const Menu = () => {
- return ( Menu );
+ return Menu ;
};
export default Menu;
diff --git a/package-lock.json b/package-lock.json
index aee17755..d6fbf6c8 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -28,12 +28,15 @@
"@wordpress/eslint-plugin": "^21.3.0",
"@wordpress/scripts": "^30.3.0",
"eslint": "^8.57.1",
+ "eslint-config-prettier": "^9.1.0",
"eslint-import-resolver-webpack": "^0.13.9",
"eslint-plugin-babel": "^5.3.1",
"eslint-plugin-import": "^2.31.0",
"eslint-plugin-jsx-a11y": "^6.10.1",
+ "eslint-plugin-prettier": "^5.2.1",
"eslint-plugin-react": "^7.37.1",
- "husky": "^9.1.6"
+ "husky": "^9.1.6",
+ "prettier": "^3.4.1"
}
},
"node_modules/@ampproject/remapping": {
@@ -6536,6 +6539,18 @@
}
}
},
+ "node_modules/@wordpress/eslint-plugin/node_modules/eslint-config-prettier": {
+ "version": "8.10.0",
+ "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz",
+ "integrity": "sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==",
+ "dev": true,
+ "bin": {
+ "eslint-config-prettier": "bin/cli.js"
+ },
+ "peerDependencies": {
+ "eslint": ">=7.0.0"
+ }
+ },
"node_modules/@wordpress/eslint-plugin/node_modules/globals": {
"version": "13.24.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz",
@@ -10755,9 +10770,9 @@
}
},
"node_modules/eslint-config-prettier": {
- "version": "8.10.0",
- "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz",
- "integrity": "sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==",
+ "version": "9.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz",
+ "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==",
"dev": true,
"bin": {
"eslint-config-prettier": "bin/cli.js"
@@ -18191,11 +18206,10 @@
}
},
"node_modules/prettier": {
- "version": "3.3.3",
- "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz",
- "integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==",
+ "version": "3.4.1",
+ "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.4.1.tgz",
+ "integrity": "sha512-G+YdqtITVZmOJje6QkXQWzl3fSfMxFwm1tjTyo9exhkmWSqC4Yhd1+lug++IlR2mvRVAxEDDWYkQdeSztajqgg==",
"dev": true,
- "peer": true,
"bin": {
"prettier": "bin/prettier.cjs"
},
diff --git a/package.json b/package.json
index e8767b27..23eb061d 100644
--- a/package.json
+++ b/package.json
@@ -9,6 +9,7 @@
"start": "wp-scripts start",
"format": "wp-scripts format",
"lint:js": "wp-scripts lint-js",
+ "lint:js:fix": "wp-scripts lint-js --fix",
"prepare": "husky install",
"local:start": "wp-env start",
"local:stop": "wp-env stop",
@@ -26,11 +27,14 @@
"@wordpress/scripts": "^30.3.0",
"eslint": "^8.57.1",
"eslint-import-resolver-webpack": "^0.13.9",
+ "eslint-config-prettier": "^9.1.0",
"eslint-plugin-babel": "^5.3.1",
"eslint-plugin-import": "^2.31.0",
"eslint-plugin-jsx-a11y": "^6.10.1",
+ "eslint-plugin-prettier": "^5.2.1",
"eslint-plugin-react": "^7.37.1",
- "husky": "^9.1.6"
+ "husky": "^9.1.6",
+ "prettier": "^3.4.1"
},
"dependencies": {
"@elementor/icons": "^1.17.0",
diff --git a/webpack.config.js b/webpack.config.js
index ae6ffc06..415bf6cf 100644
--- a/webpack.config.js
+++ b/webpack.config.js
@@ -1,13 +1,9 @@
-const path = require( 'path' );
-const defaultConfig = require( '@wordpress/scripts/config/webpack.config' );
+const path = require('path');
+const defaultConfig = require('@wordpress/scripts/config/webpack.config');
// add your entry points here
const entryPoints = {
- admin: path.resolve(
- process.cwd(),
- 'modules/settings/assets/js',
- 'admin.js',
- ),
+ admin: path.resolve(process.cwd(), 'modules/settings/assets/js', 'admin.js'),
};
module.exports = {
@@ -15,16 +11,31 @@ module.exports = {
entry: entryPoints,
output: {
...defaultConfig.output,
- path: path.resolve( process.cwd(), 'assets/build' ),
+ path: path.resolve(process.cwd(), 'assets/build'),
},
resolve: {
alias: {
- '@ea11y/hooks': path.resolve( __dirname, 'modules/settings/assets/js/hooks/' ),
- '@ea11y/components': path.resolve( __dirname, 'modules/settings/assets/js/components/' ),
- '@ea11y/icons': path.resolve( __dirname, 'modules/settings/assets/js/icons/' ),
- '@ea11y/layouts': path.resolve( __dirname, 'modules/settings/assets/js/layouts/' ),
- '@ea11y/pages': path.resolve( __dirname, 'modules/settings/assets/js/pages/' ),
+ '@ea11y/hooks': path.resolve(
+ __dirname,
+ 'modules/settings/assets/js/hooks/',
+ ),
+ '@ea11y/components': path.resolve(
+ __dirname,
+ 'modules/settings/assets/js/components/',
+ ),
+ '@ea11y/icons': path.resolve(
+ __dirname,
+ 'modules/settings/assets/js/icons/',
+ ),
+ '@ea11y/layouts': path.resolve(
+ __dirname,
+ 'modules/settings/assets/js/layouts/',
+ ),
+ '@ea11y/pages': path.resolve(
+ __dirname,
+ 'modules/settings/assets/js/pages/',
+ ),
},
- extensions: [ '.js', '.jsx' ],
+ extensions: ['.js', '.jsx'],
},
};
From 7f62f9f01df155eb3e79c73136cd16be61bc40b3 Mon Sep 17 00:00:00 2001
From: Nirbhay Singh <121793120+nirbhayel@users.noreply.github.com>
Date: Wed, 4 Dec 2024 11:33:04 +0530
Subject: [PATCH 010/290] Feature/app 810 assemble icon settings page (#117)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* Initial refactor commit
* ✅ Added build and tests CI/CD
* update: add src for admin settings
* update: incorrect constant names
* update: namespace
* add: accessibility settings
* update: webpack to output files inside a folder
* update: build output folders
* update: removed commented code
* update: npm scripts
* add: webpack config
* add: hooks
* update: move admin setting to the module folder
* update: assets loading logic
* update: add rule to move jsx props to multiline imporving readability
* add: connect modal
* update: hooks import for better readability
* update: replace functions with hooks
* add: connect module
* add: settings and get settings route
* add: hooks and contexts to get settings
* add: hooks
* add: notification component
* add: data api
* add: settings provider and connect settings
* add: husky
* add: icon size control
* fix: icon size control labels
* add: icon select component
* add: color picker component
* add: accessibility icons
* add: icon export
* update: add icons to the component
* fix: styling for the icon select control
* update: color picker with react-colorful component
* update: icon size component with live icon design
* fix: styling of radio boxes
* add: icon design settings layout
* add: position settings layout
* add: layout exports
* add: alignment matrix and position control components
* add: position settings & position settings for mobile layout
* fix: formatting and text-domain
* update: filter names
* fix: hook import
* add: set function for settings
* add: prop-types package
* update: refactor notification component and context
* update: remove filter for authorize url
* update: imports and exports of hooks
* update: plugin settings context filename and relevant imports
* update: icons and icon imports
* add: sidebar(wip)
* update: fix width of connect screen on mobile
* update: sidebar layout
* Update modules/settings/assets/js/components/color-picker/style.css
Co-authored-by: Raz Ohad
* update: color picker class name
* add: credit card and user arrow icons
* update: hidden wpfooter and fixed sidebar height
* update: sidebar layout
* add: basic page layouts
* update: sidebar layout
* add: sidebar menu, sidebar app bar and my account menu components
* update: add sidebar and menu settings
* update: add page layouts
* update: admin top bar
* add: bottom bar
* add: bottom bar and top bar
* add: bottom bar and top bar
* update: page content styling
* fix: styling
* fix: styling
* update: text domain
* add: props to wrapper
* add: icon design and position setting layouts
* add: in page scroll behaviour to the settings
* add: widget icons and getter function
* update: icon design settings getter and setter functions
* update: imports
* add: mobile layout for position settings
* add: icon position settings
* add: icon position settings hooks and handlers
* fix: alignment of controls in AlignmentMatrixControl
* update: useSettings and usePositionSetting hooks and relevant functions
* fix: colors of AlignmentMatrixControl
* fix: styling of components and layouts
* add: aliases
* add: container wrapper to page
* update: accessibility options rendering logic
* fix: order of the icons
* add: aliases for components and hooks imports
* fix: styling of settings panel
* fix: container height for settings page
* update: toggle control states
* add: widget icon settings
* add: load saved widget icon settings
* update: move layout to page for different designs per page
* update: add changes tracking and disable button logic
* add: async/await to save settings
* update: convert options to array of objects
* Update modules/settings/assets/js/components/bottom-bar/index.js
Co-authored-by: VasylD
* Update modules/settings/assets/js/app.js
Co-authored-by: VasylD
* fix: remove duplicate entries
---------
Co-authored-by: Ohad
Co-authored-by: Raz Ohad
Co-authored-by: VasylD
---
.eslintrc | 20 ++--
modules/settings/assets/css/style.css | 2 +-
modules/settings/assets/js/app.js | 13 +--
.../js/components/admin-top-bar/index.js | 4 +-
.../alignment-matrix-control/index.js | 97 +++++++++++--------
.../assets/js/components/bottom-bar/index.js | 38 +++++++-
.../js/components/color-picker/index.js | 19 ++--
.../js/components/color-picker/style.css | 2 +-
.../assets/js/components/icon-select/index.js | 60 +++---------
.../assets/js/components/icon-size/index.js | 53 ++++------
.../settings/assets/js/components/index.js | 6 +-
.../js/components/position-control/index.js | 49 +++++++---
.../js/components/sidebar-menu/index.js | 10 +-
.../assets/js/components/sidebar-menu/menu.js | 2 +-
.../js/contexts/plugin-settings-context.js | 50 ----------
.../assets/js/contexts/plugin-settings.js | 2 +-
.../js/helpers/accessibility-options.js | 44 +++++++++
modules/settings/assets/js/hooks/index.js | 3 +
.../assets/js/hooks/use-icon-design.js | 16 +++
.../assets/js/hooks/use-icon-positioon.js | 40 ++++++++
.../assets/js/hooks/use-saved-settings.js | 30 ++++++
.../settings/assets/js/hooks/use-settings.js | 62 ++++++++++++
.../assets/js/layouts/icon-design-settings.js | 4 +-
modules/settings/assets/js/layouts/index.js | 1 +
.../js/layouts/position-settings-desktop.js | 75 +++++++++-----
.../js/layouts/position-settings-mobile.js | 80 +++++++++++++++
.../assets/js/layouts/position-settings.js | 17 ++--
.../settings/assets/js/pages/icon-settings.js | 19 +++-
modules/settings/module.php | 49 +++++++---
package-lock.json | 1 +
30 files changed, 600 insertions(+), 268 deletions(-)
create mode 100644 modules/settings/assets/js/helpers/accessibility-options.js
create mode 100644 modules/settings/assets/js/hooks/use-icon-design.js
create mode 100644 modules/settings/assets/js/hooks/use-icon-positioon.js
create mode 100644 modules/settings/assets/js/hooks/use-saved-settings.js
create mode 100644 modules/settings/assets/js/layouts/position-settings-mobile.js
diff --git a/.eslintrc b/.eslintrc
index 3f69276d..59bbe1a0 100644
--- a/.eslintrc
+++ b/.eslintrc
@@ -10,16 +10,6 @@
"babel",
"react"
],
- "settings": {
- "import/resolver": {
- "node": {
- "paths": ["node_modules"]
- },
- "webpack": {
- "config": "webpack.config.js"
- }
- }
- },
"env": {
"browser": true,
"node": true,
@@ -62,5 +52,15 @@
"count": 1
}]
},
+ "settings": {
+ "import/resolver": {
+ "node": {
+ "paths": ["node_modules"]
+ },
+ "webpack": {
+ "config": "webpack.config.js"
+ }
+ }
+ },
"parser": "@babel/eslint-parser"
}
diff --git a/modules/settings/assets/css/style.css b/modules/settings/assets/css/style.css
index 8fa3d9b6..724999ce 100644
--- a/modules/settings/assets/css/style.css
+++ b/modules/settings/assets/css/style.css
@@ -15,7 +15,7 @@ html:not([dir='rtl']) #ea11y-app {
html[dir='rtl'] #ea11y-app {
margin-right: -20px;
background: white;
- height: calc(100vh - 32px);
+ height: calc( 100vh - 32px );
}
#ea11y-app * {
diff --git a/modules/settings/assets/js/app.js b/modules/settings/assets/js/app.js
index 9a6cad78..502d8024 100644
--- a/modules/settings/assets/js/app.js
+++ b/modules/settings/assets/js/app.js
@@ -8,13 +8,17 @@ import {
Notifications,
MenuItems,
AdminTopBar,
- BottomBar,
} from '@ea11y/components';
-import { useNotificationSettings, useSettings } from '@ea11y/hooks';
+import {
+ useNotificationSettings,
+ useSettings,
+ useSavedSettings,
+} from '@ea11y/hooks';
import { usePluginSettingsContext } from './contexts/plugin-settings';
import { Sidebar } from './layouts/sidebar';
const App = () => {
+ useSavedSettings();
const { isConnected } = usePluginSettingsContext();
const { notificationMessage, notificationType } = useNotificationSettings();
const { selectedMenu } = useSettings();
@@ -37,10 +41,7 @@ const App = () => {
justifyContent="space-between"
>
-
- {selectedChild ? selectedChild.page : selectedParent?.page}
-
-
+ {selectedChild ? selectedChild.page : selectedParent?.page}
diff --git a/modules/settings/assets/js/components/admin-top-bar/index.js b/modules/settings/assets/js/components/admin-top-bar/index.js
index ff926716..b92cfd81 100644
--- a/modules/settings/assets/js/components/admin-top-bar/index.js
+++ b/modules/settings/assets/js/components/admin-top-bar/index.js
@@ -5,7 +5,7 @@ import Toolbar from '@elementor/ui/Toolbar';
import { __ } from '@wordpress/i18n';
import { HELP_LINK } from '../../constants';
-export const AdminTopBar = () => {
+const AdminTopBar = () => {
const toolBarStyle = {
justifyContent: 'end',
alignItems: 'center',
@@ -30,3 +30,5 @@ export const AdminTopBar = () => {
);
};
+
+export default AdminTopBar;
diff --git a/modules/settings/assets/js/components/alignment-matrix-control/index.js b/modules/settings/assets/js/components/alignment-matrix-control/index.js
index feecb05a..7186ccf9 100644
--- a/modules/settings/assets/js/components/alignment-matrix-control/index.js
+++ b/modules/settings/assets/js/components/alignment-matrix-control/index.js
@@ -2,68 +2,89 @@ import Box from '@elementor/ui/Box';
import FormControl from '@elementor/ui/FormControl';
import FormControlLabel from '@elementor/ui/FormControlLabel';
import FormLabel from '@elementor/ui/FormLabel';
+import Paper from '@elementor/ui/Paper';
import Radio from '@elementor/ui/Radio';
import RadioGroup from '@elementor/ui/RadioGroup';
+import Tooltip from '@elementor/ui/Tooltip';
import Typography from '@elementor/ui/Typography';
-import { useState } from '@wordpress/element';
+import { useIconPosition } from '@ea11y/hooks';
import { __ } from '@wordpress/i18n';
-const AlignmentMatrixControl = () => {
- const [selectedValue, setSelectedValue] = useState('center-right');
+const AlignmentMatrixControl = ({ mode }) => {
+ const { iconPosition, updateIconPosition } = useIconPosition();
const handleChange = (event) => {
- setSelectedValue(event.target.value);
+ updateIconPosition(mode, 'position', event.target.value);
};
+ // Define options based on the mode
const options = [
{ value: 'top-left', label: __('Top Left', 'pojo-accessibility') },
+ ...(mode === 'desktop'
+ ? [{ value: 'top-center', label: __('Top Center', 'pojo-accessibility') }]
+ : []),
{ value: 'top-right', label: __('Top Right', 'pojo-accessibility') },
{ value: 'center-left', label: __('Center Left', 'pojo-accessibility') },
+ ...(mode === 'desktop' ? [{ value: 'empty' }] : []),
{ value: 'center-right', label: __('Center Right', 'pojo-accessibility') },
{ value: 'bottom-left', label: __('Bottom Left', 'pojo-accessibility') },
+ ...(mode === 'desktop'
+ ? [
+ {
+ value: 'bottom-center',
+ label: __('Bottom Center', 'pojo-accessibility'),
+ },
+ ]
+ : []),
{ value: 'bottom-right', label: __('Bottom Right', 'pojo-accessibility') },
];
return (
-
+
{__('Default Position', 'pojo-accessibility')}
-
-
- {options.map((option, i) => (
- }
- />
- ))}
-
-
+
+
+
+
+ {options.map((option) =>
+ 'empty' === option.value ? (
+
+ ) : (
+
+ }
+ />
+
+ ),
+ )}
+
+
+
+
);
};
diff --git a/modules/settings/assets/js/components/bottom-bar/index.js b/modules/settings/assets/js/components/bottom-bar/index.js
index 95cca683..02ad0521 100644
--- a/modules/settings/assets/js/components/bottom-bar/index.js
+++ b/modules/settings/assets/js/components/bottom-bar/index.js
@@ -1,8 +1,35 @@
import Box from '@elementor/ui/Box';
import Button from '@elementor/ui/Button';
+import { useSettings, useStorage, useToastNotification } from '@ea11y/hooks';
import { __ } from '@wordpress/i18n';
-export const BottomBar = () => {
+const BottomBar = () => {
+ const { selectedMenu, iconDesign, iconPosition, hasChanges, setHasChanges } =
+ useSettings();
+ const { save } = useStorage();
+ const { success, error } = useToastNotification();
+
+ const saveSettings = async () => {
+ if (
+ selectedMenu.parent === 'widget' &&
+ selectedMenu.child === 'iconSettings'
+ ) {
+ try {
+ await save({
+ a11y_widget_icon_settings: {
+ style: iconDesign,
+ position: iconPosition,
+ },
+ });
+
+ success('Settings saved!');
+ setHasChanges(false);
+ } catch (e) {
+ error('Failed to save settings!');
+ }
+ }
+ };
+
return (
{
width="100%"
borderTop="1px solid rgba(0, 0, 0, 0.12)"
>
-
+
{__('Save Changes', 'pojo-accessibility')}
);
};
+
+export default BottomBar;
diff --git a/modules/settings/assets/js/components/color-picker/index.js b/modules/settings/assets/js/components/color-picker/index.js
index beecd7a0..dcb502dd 100644
--- a/modules/settings/assets/js/components/color-picker/index.js
+++ b/modules/settings/assets/js/components/color-picker/index.js
@@ -4,37 +4,36 @@ import FormLabel from '@elementor/ui/FormLabel';
import Grid from '@elementor/ui/Grid';
import Typography from '@elementor/ui/Typography';
import { HexColorPicker, HexColorInput } from 'react-colorful';
-import { useState } from '@wordpress/element';
+import { useIconDesign } from '@ea11y/hooks';
import { __ } from '@wordpress/i18n';
import './style.css';
const ColorPicker = () => {
- const [color, setColor] = useState('#2563eb');
+ const { iconDesign, updateIconDesign } = useIconDesign();
return (
-
+
-
+
{__('Color', 'pojo-accessibility')}
updateIconDesign({ color: value })}
className="widget-settings-color-picker"
/>
updateIconDesign({ color: value })}
style={{
width: '100%',
border: '1px solid rgba(0, 0, 0, 0.12)',
diff --git a/modules/settings/assets/js/components/color-picker/style.css b/modules/settings/assets/js/components/color-picker/style.css
index 3025ab64..05d57330 100644
--- a/modules/settings/assets/js/components/color-picker/style.css
+++ b/modules/settings/assets/js/components/color-picker/style.css
@@ -1,5 +1,5 @@
.widget-settings-color-picker.react-colorful {
- min-width: 460px;
+ width: 100%;
}
.widget-settings-color-picker .react-colorful__saturation {
border-radius: 0;
diff --git a/modules/settings/assets/js/components/icon-select/index.js b/modules/settings/assets/js/components/icon-select/index.js
index bf8db607..a025019d 100644
--- a/modules/settings/assets/js/components/icon-select/index.js
+++ b/modules/settings/assets/js/components/icon-select/index.js
@@ -4,44 +4,13 @@ import Paper from '@elementor/ui/Paper';
import Radio from '@elementor/ui/Radio';
import RadioGroup from '@elementor/ui/RadioGroup';
import Typography from '@elementor/ui/Typography';
-import {
- AccessibilityControlsIcon,
- AccessibilityEyeIcon,
- AccessibilityPersonIcon,
- AccessibilityTextIcon,
-} from '@ea11y/icons';
-import { useState } from '@wordpress/element';
+import { useIconDesign } from '@ea11y/hooks';
+import { cloneElement } from '@wordpress/element';
import { __ } from '@wordpress/i18n';
+import options from '../../helpers/accessibility-options';
const IconSelect = (props) => {
- const [selectedValue, setSelectedValue] = useState('person');
- const optionStyle = {
- color: 'info.main',
- fontSize: 44,
- };
-
- const options = [
- {
- value: 'person',
- icon: ,
- label: __('Accessibility Person Icon', 'pojo-accessibility'),
- },
- {
- value: 'eye',
- icon: ,
- label: __('Accessibility Eye Icon', 'pojo-accessibility'),
- },
- {
- value: 'text',
- icon: ,
- label: __('Accessibility Text Badge Icon', 'pojo-accessibility'),
- },
- {
- value: 'controls',
- icon: ,
- label: __('Accessibility Controls Slider Icon', 'pojo-accessibility'),
- },
- ];
+ const { iconDesign, updateIconDesign } = useIconDesign();
return (
@@ -54,10 +23,11 @@ const IconSelect = (props) => {
{...props}
aria-labelledby="icon-select-radio-buttons-group-label"
name="icon-select-radio-buttons-group"
- value={selectedValue}
+ value={iconDesign.icon}
sx={{
display: 'flex',
flexDirection: 'row',
+ flexWrap: 'nowrap',
gap: 2,
}}
>
@@ -65,7 +35,7 @@ const IconSelect = (props) => {
setSelectedValue(option.value)}
+ onClick={() => updateIconDesign({ icon: option.value })}
sx={{
borderRadius: 'md',
boxShadow: 'sm',
@@ -76,21 +46,21 @@ const IconSelect = (props) => {
justifyContent: 'center',
gap: 1.5,
p: 2,
- minWidth: 100,
+ minWidth: 10,
minHeight: 100,
borderColor:
- selectedValue === option.value ? 'info.main' : 'divider',
- borderWidth: selectedValue === option.value ? 2 : 1,
+ iconDesign.icon === option.value ? 'info.main' : 'divider',
+ borderWidth: iconDesign.icon === option.value ? 2 : 1,
cursor: 'pointer',
}}
>
- {option.icon}
+ {option.icon &&
+ cloneElement(option.icon, {
+ sx: { color: iconDesign.color, fontSize: 44 },
+ })}
))}
diff --git a/modules/settings/assets/js/components/icon-size/index.js b/modules/settings/assets/js/components/icon-size/index.js
index b5096849..b5b77092 100644
--- a/modules/settings/assets/js/components/icon-size/index.js
+++ b/modules/settings/assets/js/components/icon-size/index.js
@@ -4,48 +4,32 @@ import Paper from '@elementor/ui/Paper';
import Radio from '@elementor/ui/Radio';
import RadioGroup from '@elementor/ui/RadioGroup';
import Typography from '@elementor/ui/Typography';
-import {
- AccessibilityEyeIcon,
- AccessibilityPersonIcon,
- AccessibilityTextIcon,
-} from '@ea11y/icons';
-import { useState } from '@wordpress/element';
+import { useIconDesign } from '@ea11y/hooks';
+import { cloneElement } from '@wordpress/element';
import { __ } from '@wordpress/i18n';
+import { getOptionByValue } from '../../helpers/accessibility-options';
const IconSize = (props) => {
- const [selectedValue, setSelectedValue] = useState('medium');
- const optionStyle = { color: 'info.main', fontSize: 44 };
+ const { iconDesign, updateIconDesign } = useIconDesign();
+ const icon = getOptionByValue(iconDesign.icon);
const options = [
- {
- value: 'small',
- icon: ,
- label: __('Accessibility Person Icon', 'pojo-accessibility'),
- },
- {
- value: 'medium',
- icon: ,
- label: __('Accessibility Eye Icon', 'pojo-accessibility'),
- },
- {
- value: 'large',
- icon: ,
- label: __('Accessibility Text Badge Icon', 'pojo-accessibility'),
- },
+ { value: 'large', fontSize: 64 },
+ { value: 'medium', fontSize: 44 },
+ { value: 'small', fontSize: 36 },
];
-
return (
-
+
{__('Size', 'pojo-accessibility')}
{
setSelectedValue(option.value)}
+ onClick={() => updateIconDesign({ size: option.value })}
sx={{
borderRadius: 'md',
boxShadow: 'sm',
@@ -67,15 +51,18 @@ const IconSize = (props) => {
flexGrow: 1,
gap: 1.5,
p: 2,
- minWidth: 100,
+ minWidth: 10,
minHeight: 100,
borderColor:
- selectedValue === option.value ? 'info.main' : 'divider',
- borderWidth: selectedValue === option.value ? 2 : 1,
+ iconDesign.size === option.value ? 'info.main' : 'divider',
+ borderWidth: iconDesign.size === option.value ? 2 : 1,
cursor: 'pointer',
}}
>
- {option.icon}
+ {icon?.icon &&
+ cloneElement(icon.icon, {
+ sx: { color: iconDesign.color, fontSize: option.fontSize },
+ })}
({
},
}));
-const PositionControl = ({ type, disabled }, props) => {
+const PositionControl = ({ type, disabled, mode }) => {
+ const { iconPosition, updateExactPosition } = useIconPosition();
const [unitsIndex, setUnitsIndex] = useState(0);
const popupState = usePopupState({
variant: 'popover',
- popupId: 'textfield-inner-selection',
+ popupId: 'position-settings',
});
const handleMenuItemClick = (index) => {
setUnitsIndex(index);
+ updateExactPosition(
+ mode,
+ type,
+ iconPosition[mode].exactPosition[type].direction,
+ iconPosition[mode].exactPosition[type].value,
+ units[index],
+ );
popupState.close();
};
-
- const [position, setPosition] = useState(10);
- const handlePositionChange = (event) => setPosition(event.target.value);
-
+ const handlePositionChange = (event) => {
+ updateExactPosition(
+ mode,
+ type,
+ iconPosition[mode].exactPosition[type].direction,
+ event.target.value,
+ iconPosition[mode].exactPosition[type].unit,
+ );
+ };
+ const handlePositionDirection = (event) => {
+ updateExactPosition(
+ mode,
+ type,
+ event.target.value,
+ iconPosition[mode].exactPosition[type].value,
+ iconPosition[mode].exactPosition[type].unit,
+ );
+ };
return (
{
color="inherit"
sx={{ font: 'inherit', minWidth: 'initial' }}
{...bindTrigger(popupState)}
+ disabled={disabled}
>
{units[unitsIndex]}
-
{units.map((unit, index) => (
{
}}
/>
{
const { openSidebar, selectedMenu, setSelectedMenu } = useSettings();
@@ -29,8 +29,8 @@ const SidebarMenu = () => {
return (
{Object.entries(MenuItems).map(([key, item]) => (
- <>
-
+
+
item.children ? handleToggleItem(key) : handleSelectedMenu(key)
@@ -70,7 +70,7 @@ const SidebarMenu = () => {
))}
)}
- >
+
))}
);
diff --git a/modules/settings/assets/js/components/sidebar-menu/menu.js b/modules/settings/assets/js/components/sidebar-menu/menu.js
index 9f46c05b..1b618df7 100644
--- a/modules/settings/assets/js/components/sidebar-menu/menu.js
+++ b/modules/settings/assets/js/components/sidebar-menu/menu.js
@@ -1,7 +1,7 @@
import { PagesIcon } from '@elementor/icons';
import { WidgetIcon } from '@ea11y/icons';
+import { AccessibilityStatement, Menu, IconSettings } from '@ea11y/pages';
import { __ } from '@wordpress/i18n';
-import { AccessibilityStatement, Menu, IconSettings } from '../../pages';
export const MenuItems = {
widget: {
diff --git a/modules/settings/assets/js/contexts/plugin-settings-context.js b/modules/settings/assets/js/contexts/plugin-settings-context.js
index 60cabe02..e69de29b 100644
--- a/modules/settings/assets/js/contexts/plugin-settings-context.js
+++ b/modules/settings/assets/js/contexts/plugin-settings-context.js
@@ -1,50 +0,0 @@
-import {
- createContext,
- useCallback,
- useContext,
- useEffect,
- useState,
-} from '@wordpress/element';
-import { __ } from '@wordpress/i18n';
-import API from '../api';
-import { useToastNotification } from '../hooks';
-
-const PluginSettingsContext = createContext({});
-
-export const PluginSettingsProvider = ({ children }) => {
- const { error } = useToastNotification();
- const [pluginSettings, setPluginSettings] = useState();
- const [loaded, setLoaded] = useState(false);
-
- const refreshPluginSettings = useCallback(() => {
- API.getPluginSettings()
- .then((settings) => {
- if ('isConnected' in settings) {
- settings.isConnected = Boolean(settings.isConnected);
- }
-
- setPluginSettings(settings);
- setLoaded(true);
- })
- .catch(() => {
- error(__('An error occurred.', 'pojo-accessibility'));
- setLoaded(true);
- });
- }, []);
-
- useEffect(() => {
- refreshPluginSettings();
- }, [refreshPluginSettings]);
-
- return (
-
- {children}
-
- );
-};
-
-export const usePluginSettingsContext = () => {
- return useContext(PluginSettingsContext);
-};
diff --git a/modules/settings/assets/js/contexts/plugin-settings.js b/modules/settings/assets/js/contexts/plugin-settings.js
index 60cabe02..d6686642 100644
--- a/modules/settings/assets/js/contexts/plugin-settings.js
+++ b/modules/settings/assets/js/contexts/plugin-settings.js
@@ -1,3 +1,4 @@
+import { useToastNotification } from '@ea11y/hooks';
import {
createContext,
useCallback,
@@ -7,7 +8,6 @@ import {
} from '@wordpress/element';
import { __ } from '@wordpress/i18n';
import API from '../api';
-import { useToastNotification } from '../hooks';
const PluginSettingsContext = createContext({});
diff --git a/modules/settings/assets/js/helpers/accessibility-options.js b/modules/settings/assets/js/helpers/accessibility-options.js
new file mode 100644
index 00000000..8c344db1
--- /dev/null
+++ b/modules/settings/assets/js/helpers/accessibility-options.js
@@ -0,0 +1,44 @@
+import { __ } from '@wordpress/i18n';
+import {
+ AccessibilityPersonIcon,
+ AccessibilityTextIcon,
+ AccessibilityEyeIcon,
+ AccessibilityControlsIcon,
+} from '../icons';
+
+const optionStyle = {
+ color: 'info.main',
+ fontSize: 44,
+};
+
+// Define options as an object
+const options = [
+ {
+ value: 'person',
+ icon: ,
+ label: __('Accessibility Person Icon', 'pojo-accessibility'),
+ },
+ {
+ value: 'eye',
+ icon: ,
+ label: __('Accessibility Eye Icon', 'pojo-accessibility'),
+ },
+ {
+ value: 'controls',
+ icon: ,
+ label: __('Accessibility Controls Slider Icon', 'pojo-accessibility'),
+ },
+ {
+ value: 'text',
+ icon: ,
+ label: __('Accessibility Text Badge Icon', 'pojo-accessibility'),
+ },
+];
+
+// Export the options object
+export default options;
+
+// Optionally, export a function to get a specific option by value
+export const getOptionByValue = (value) => {
+ return Object.values(options).find((option) => option.value === value);
+};
diff --git a/modules/settings/assets/js/hooks/index.js b/modules/settings/assets/js/hooks/index.js
index 1ae75e25..19a8d4e9 100644
--- a/modules/settings/assets/js/hooks/index.js
+++ b/modules/settings/assets/js/hooks/index.js
@@ -6,3 +6,6 @@ export { useStorage } from './use-storage';
export { useToastNotification } from './use-notifications';
export { NotificationsProvider } from './use-notifications';
export { useNotificationSettings } from './use-notifications';
+export { useIconPosition } from './use-icon-positioon';
+export { useIconDesign } from './use-icon-design';
+export { useSavedSettings } from './use-saved-settings';
diff --git a/modules/settings/assets/js/hooks/use-icon-design.js b/modules/settings/assets/js/hooks/use-icon-design.js
new file mode 100644
index 00000000..487ab6f4
--- /dev/null
+++ b/modules/settings/assets/js/hooks/use-icon-design.js
@@ -0,0 +1,16 @@
+import { useSettings } from '@ea11y/hooks';
+
+export const useIconDesign = () => {
+ const { iconDesign, setIconDesign, setHasChanges } = useSettings();
+
+ const updateIconDesign = (newValues) => {
+ setIconDesign((prev) => ({
+ ...prev,
+ ...newValues,
+ }));
+
+ setHasChanges(true);
+ };
+
+ return { iconDesign, updateIconDesign };
+};
diff --git a/modules/settings/assets/js/hooks/use-icon-positioon.js b/modules/settings/assets/js/hooks/use-icon-positioon.js
new file mode 100644
index 00000000..17cca254
--- /dev/null
+++ b/modules/settings/assets/js/hooks/use-icon-positioon.js
@@ -0,0 +1,40 @@
+import { useSettings } from '@ea11y/hooks';
+import { useCallback } from '@wordpress/element';
+
+export const useIconPosition = () => {
+ const { iconPosition, setIconPosition, setHasChanges } = useSettings();
+
+ const updateIconPosition = useCallback(
+ (device, key, value) => {
+ setIconPosition((prevState) => ({
+ ...prevState,
+ [device]: {
+ ...prevState[device],
+ [key]: value,
+ },
+ }));
+ setHasChanges(true);
+ },
+ [setIconPosition],
+ );
+
+ const updateExactPosition = (device, axis, direction, value, unit) => {
+ setIconPosition((prevState) => ({
+ ...prevState,
+ [device]: {
+ ...prevState[device],
+ exactPosition: {
+ ...prevState[device].exactPosition,
+ [axis]: {
+ direction,
+ value,
+ unit,
+ },
+ },
+ },
+ }));
+ setHasChanges(true);
+ };
+
+ return { iconPosition, updateIconPosition, updateExactPosition };
+};
diff --git a/modules/settings/assets/js/hooks/use-saved-settings.js b/modules/settings/assets/js/hooks/use-saved-settings.js
new file mode 100644
index 00000000..ad6f87f4
--- /dev/null
+++ b/modules/settings/assets/js/hooks/use-saved-settings.js
@@ -0,0 +1,30 @@
+import { useSettings } from '@ea11y/hooks';
+import { store as coreDataStore } from '@wordpress/core-data';
+import { useSelect } from '@wordpress/data';
+import { useEffect } from '@wordpress/element';
+
+export const useSavedSettings = () => {
+ const { setIconDesign, setIconPosition } = useSettings();
+
+ const result = useSelect((select) => {
+ return {
+ data: select(coreDataStore).getEntityRecord('root', 'site'),
+ hasFinishedResolution: select(coreDataStore).hasFinishedResolution(
+ 'getEntityRecord',
+ ['root', 'site'],
+ ),
+ };
+ }, []);
+
+ useEffect(() => {
+ if (result.hasFinishedResolution) {
+ if (result?.data?.a11y_widget_icon_settings?.style) {
+ setIconDesign(result.data.a11y_widget_icon_settings.style);
+ }
+
+ if (result?.data?.a11y_widget_icon_settings?.position) {
+ setIconPosition(result.data.a11y_widget_icon_settings.position);
+ }
+ }
+ }, [result.hasFinishedResolution]);
+};
diff --git a/modules/settings/assets/js/hooks/use-settings.js b/modules/settings/assets/js/hooks/use-settings.js
index 700ca921..0fb825b1 100644
--- a/modules/settings/assets/js/hooks/use-settings.js
+++ b/modules/settings/assets/js/hooks/use-settings.js
@@ -15,6 +15,56 @@ export const SettingsProvider = ({ children }) => {
parent: 'widget',
child: 'iconSettings',
});
+
+ // Icon Design
+ const [widgetIcon, setWidgetIcon] = useState('person');
+ const [widgetIconSize, setWidgetIconSize] = useState('medium');
+ const [widgetIconColor, setWidgetIconColor] = useState('#2563eb');
+ const [iconDesign, setIconDesign] = useState({
+ icon: 'person',
+ size: 'medium',
+ color: '#2563eb',
+ });
+
+ // Icon Position
+ const [iconPosition, setIconPosition] = useState({
+ desktop: {
+ hidden: false,
+ enableExactPosition: false,
+ exactPosition: {
+ horizontal: {
+ direction: 'to-left',
+ value: 10,
+ unit: 'px',
+ },
+ vertical: {
+ direction: 'higher',
+ value: 10,
+ unit: 'px',
+ },
+ },
+ position: 'top-left',
+ },
+ mobile: {
+ hidden: false,
+ enableExactPosition: false,
+ exactPosition: {
+ horizontal: {
+ direction: 'to-right',
+ value: 10,
+ unit: 'px',
+ },
+ vertical: {
+ direction: 'lower',
+ value: 10,
+ unit: 'px',
+ },
+ },
+ position: 'top-left',
+ },
+ });
+
+ const [hasChanges, setHasChanges] = useState(false);
return (
{
setOpenSidebar,
selectedMenu,
setSelectedMenu,
+ widgetIcon,
+ setWidgetIcon,
+ widgetIconSize,
+ setWidgetIconSize,
+ widgetIconColor,
+ setWidgetIconColor,
+ iconPosition,
+ setIconPosition,
+ iconDesign,
+ setIconDesign,
+ hasChanges,
+ setHasChanges,
}}
>
{children}
diff --git a/modules/settings/assets/js/layouts/icon-design-settings.js b/modules/settings/assets/js/layouts/icon-design-settings.js
index 437eede3..4b22ca41 100644
--- a/modules/settings/assets/js/layouts/icon-design-settings.js
+++ b/modules/settings/assets/js/layouts/icon-design-settings.js
@@ -4,9 +4,9 @@ import Typography from '@elementor/ui/Typography';
import { ColorPicker, IconSelect, IconSize } from '@ea11y/components';
import { __ } from '@wordpress/i18n';
-const IconDesignSettings = () => {
+const IconDesignSettings = (props) => {
return (
-
+
{__('Design', 'pojo-accessibility')}
diff --git a/modules/settings/assets/js/layouts/index.js b/modules/settings/assets/js/layouts/index.js
index 94895503..92f073ee 100644
--- a/modules/settings/assets/js/layouts/index.js
+++ b/modules/settings/assets/js/layouts/index.js
@@ -1,3 +1,4 @@
export { default as IconDesignSettings } from './icon-design-settings';
export { default as PositionSettings } from './position-settings';
export { default as PositionSettingsDesktop } from './position-settings-desktop';
+export { default as PositionSettingsMobile } from './position-settings-mobile';
diff --git a/modules/settings/assets/js/layouts/position-settings-desktop.js b/modules/settings/assets/js/layouts/position-settings-desktop.js
index b50ea5cd..e588dc69 100644
--- a/modules/settings/assets/js/layouts/position-settings-desktop.js
+++ b/modules/settings/assets/js/layouts/position-settings-desktop.js
@@ -3,45 +3,74 @@ import FormControlLabel from '@elementor/ui/FormControlLabel';
import Switch from '@elementor/ui/Switch';
import Typography from '@elementor/ui/Typography';
import { AlignmentMatrixControl, PositionControl } from '@ea11y/components';
-import { useState } from '@wordpress/element';
+import { useIconPosition } from '@ea11y/hooks';
import { __ } from '@wordpress/i18n';
const PositionSettingsDesktop = () => {
- const [hiddenOnDesktop, setHiddenOnDesktop] = useState(false);
- const [disableExactPosition, setDisableExactPosition] = useState(true);
+ const { iconPosition, updateIconPosition } = useIconPosition();
+
+ const toggleVisibility = (device) => {
+ updateIconPosition(device, 'hidden', !iconPosition[device].hidden);
+ };
+
+ const toggleExactPosition = (device) => {
+ updateIconPosition(
+ device,
+ 'enableExactPosition',
+ !iconPosition[device].enableExactPosition,
+ );
+ };
+
+ const hideOnDesktopLabel = (
+
+ {__('Hide on desktop', 'pojo-accessibility')}
+
+ );
+
+ const exactPositionLabel = (
+
+ {__('Exact position', 'pojo-accessibility')}
+
+ );
+
return (
<>
- {__('Hide on desktop', 'pojo-accessibility')}
-
- }
+ label={hideOnDesktopLabel}
labelPlacement="start"
- control={ }
- sx={{ marginLeft: 0, marginBottom: 3 }}
- onChange={() => setHiddenOnDesktop(!hiddenOnDesktop)}
+ control={ }
+ sx={{ marginLeft: 2, marginBottom: 3 }}
+ onChange={() => toggleVisibility('desktop')}
+ checked={iconPosition.desktop.hidden}
/>
- {!hiddenOnDesktop && (
-
-
+ {!iconPosition.desktop.hidden && (
+
+
- {__('Exact position', 'pojo-accessibility')}
-
- }
+ label={exactPositionLabel}
labelPlacement="start"
- control={ }
+ control={ }
sx={{ marginLeft: 0 }}
- onChange={() => setDisableExactPosition(!disableExactPosition)}
+ onChange={() => toggleExactPosition('desktop')}
+ checked={iconPosition.desktop?.enableExactPosition}
/>
+
-
)}
diff --git a/modules/settings/assets/js/layouts/position-settings-mobile.js b/modules/settings/assets/js/layouts/position-settings-mobile.js
new file mode 100644
index 00000000..a5759852
--- /dev/null
+++ b/modules/settings/assets/js/layouts/position-settings-mobile.js
@@ -0,0 +1,80 @@
+import Box from '@elementor/ui/Box';
+import FormControlLabel from '@elementor/ui/FormControlLabel';
+import Switch from '@elementor/ui/Switch';
+import Typography from '@elementor/ui/Typography';
+import { AlignmentMatrixControl, PositionControl } from '@ea11y/components';
+import { useIconPosition } from '@ea11y/hooks';
+import { __ } from '@wordpress/i18n';
+
+const PositionSettingsMobile = () => {
+ const { iconPosition, updateIconPosition } = useIconPosition();
+
+ const toggleVisibility = (device) => {
+ updateIconPosition(device, 'hidden', !iconPosition[device].hidden);
+ };
+
+ const toggleExactPosition = (device) => {
+ updateIconPosition(
+ device,
+ 'enableExactPosition',
+ !iconPosition[device].enableExactPosition,
+ );
+ };
+
+ const hideOnMobileLabel = (
+
+ {__('Hide on mobile', 'pojo-accessibility')}
+
+ );
+
+ const exactPositionLabel = (
+
+ {__('Exact position', 'pojo-accessibility')}
+
+ );
+
+ return (
+ <>
+ }
+ sx={{ marginLeft: 2, marginBottom: 3 }}
+ onChange={() => toggleVisibility('mobile')}
+ checked={iconPosition.mobile.hidden}
+ />
+ {!iconPosition.mobile.hidden && (
+
+
+
+ }
+ sx={{ marginLeft: 0 }}
+ onChange={() => toggleExactPosition('mobile')}
+ checked={iconPosition.mobile?.enableExactPosition}
+ />
+
+
+
+
+ )}
+ >
+ );
+};
+
+export default PositionSettingsMobile;
diff --git a/modules/settings/assets/js/layouts/position-settings.js b/modules/settings/assets/js/layouts/position-settings.js
index c8f876e4..07fdd1a1 100644
--- a/modules/settings/assets/js/layouts/position-settings.js
+++ b/modules/settings/assets/js/layouts/position-settings.js
@@ -6,7 +6,10 @@ import TabPanel from '@elementor/ui/TabPanel';
import Tabs from '@elementor/ui/Tabs';
import Typography from '@elementor/ui/Typography';
import useTabs from '@elementor/ui/useTabs';
-import { PositionSettingsDesktop } from '@ea11y/layouts';
+import {
+ PositionSettingsDesktop,
+ PositionSettingsMobile,
+} from '@ea11y/layouts';
import { useState } from '@wordpress/element';
import { __ } from '@wordpress/i18n';
@@ -15,7 +18,7 @@ const TABS = {
two: 'two',
};
-const PositionSettings = () => {
+export const PositionSettings = (props) => {
const [currentTab, setCurrentTab] = useState(TABS.one);
const { getTabProps } = useTabs(currentTab);
@@ -24,7 +27,7 @@ const PositionSettings = () => {
};
return (
-
+
{__('Position', 'pojo-accessibility')}
@@ -36,10 +39,10 @@ const PositionSettings = () => {
)}
-
+
@@ -65,7 +68,9 @@ const PositionSettings = () => {
) : (
-
+
+
+
)}
);
diff --git a/modules/settings/assets/js/pages/icon-settings.js b/modules/settings/assets/js/pages/icon-settings.js
index e744134d..0b9211e8 100644
--- a/modules/settings/assets/js/pages/icon-settings.js
+++ b/modules/settings/assets/js/pages/icon-settings.js
@@ -1,5 +1,22 @@
+import Container from '@elementor/ui/Container';
+import Typography from '@elementor/ui/Typography';
+import { BottomBar } from '@ea11y/components';
+import { IconDesignSettings, PositionSettings } from '@ea11y/layouts';
+import { __ } from '@wordpress/i18n';
+
const IconSettings = () => {
- return IconSettings ;
+ return (
+ <>
+
+
+ {__('Icon Settings', 'pojo-accessibility')}
+
+
+
+
+
+ >
+ );
};
export default IconSettings;
diff --git a/modules/settings/module.php b/modules/settings/module.php
index d44047df..4880108f 100644
--- a/modules/settings/module.php
+++ b/modules/settings/module.php
@@ -20,16 +20,6 @@ public function get_name(): string {
return 'settings';
}
- public function render_top_bar() {
- if ( 'toplevel_page_accessibility-settings-2' !== get_current_screen()->id ) {
- return;
- }
-
- ?>
-
-
@@ -41,7 +31,7 @@ public function render_app() {
Connect::is_connected(),
];
}
+
+ /**
+ * Register settings.
+ *
+ * Register settings for the plugin.
+ *
+ * @return void
+ * @throws Throwable
+ */
+ public function register_settings(): void {
+ $settings = [
+ 'widget_icon_settings' => [
+ 'type' => 'object',
+ 'show_in_rest' => [
+ 'schema' => [
+ 'type' => 'object',
+ 'additionalProperties' => true
+ ],
+ ]
+ ],
+ 'close_post_connect_modal' => [
+ 'type' => 'boolean',
+ ],
+ ];
+
+ foreach ( $settings as $setting => $args ) {
+ if ( ! isset( $args['show_in_rest'] ) ) {
+ $args['show_in_rest'] = true;
+ }
+ register_setting( 'options', self::SETTING_PREFIX . $setting, $args );
+ }
+ }
+
/**
* Module constructor.
*/
@@ -108,7 +131,7 @@ public function __construct() {
$this->register_routes();
$this->register_components();
add_action( 'admin_menu', [ $this, 'register_page' ] );
- add_action( 'in_admin_header', [ $this, 'render_top_bar' ] );
add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_scripts' ] );
+ add_action( 'rest_api_init', [ $this, 'register_settings' ] );
}
}
diff --git a/package-lock.json b/package-lock.json
index d6fbf6c8..70900e48 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -10945,6 +10945,7 @@
"resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.31.0.tgz",
"integrity": "sha512-ixmkI62Rbc2/w8Vfxyh1jQRTdRTF52VxwRVHl/ykPAmqG+Nb7/kNn+byLP0LxPgI7zWA16Jt82SybJInmMia3A==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"@rtsao/scc": "^1.1.0",
"array-includes": "^3.1.8",
From 6f62e6d78e88b55fd8fb6a2635a95b934ef57197 Mon Sep 17 00:00:00 2001
From: Nirbhay Singh <121793120+nirbhayel@users.noreply.github.com>
Date: Wed, 4 Dec 2024 18:30:07 +0530
Subject: [PATCH 011/290] Feature/app 708 widget menu settings (#118)
* add: icons for menu settings
* add: placeholder layout for widget preview in menu settings
* update: load saved settings and updated imports
* add: logics for handling and saving menu settings
* add: useSavedSettings hook
* update: set export as default for Sidebar layout
* add: widget menu settings layout and settings
* update: add widget menu settings and widget preview layouts
* add: hide/show minimum option alert notification
* update: styling of the save button
* update: save settings logic to use async/await
* fix: accessibility text icon
---
modules/settings/assets/js/app.js | 8 +-
.../assets/js/components/bottom-bar/index.js | 23 ++-
.../assets/js/components/icon-select/index.js | 8 +-
.../assets/js/components/icon-size/index.js | 7 +-
.../assets/js/constants/menu-settings.js | 83 +++++++++
modules/settings/assets/js/hooks/index.js | 2 +-
.../assets/js/hooks/use-saved-settings.js | 17 +-
.../settings/assets/js/hooks/use-settings.js | 39 ++--
.../assets/js/icons/accessibility-controls.js | 5 +-
.../assets/js/icons/accessibility-eye.js | 5 +-
.../assets/js/icons/accessibility-person.js | 6 +-
.../assets/js/icons/accessibility-text.js | 77 +++++---
modules/settings/assets/js/icons/contrast.js | 20 +++
.../settings/assets/js/icons/graysacale.js | 11 ++
.../settings/assets/js/icons/hide-images.js | 17 ++
modules/settings/assets/js/icons/index.js | 10 ++
.../settings/assets/js/icons/line-height.js | 13 ++
.../assets/js/icons/page-structure.js | 30 ++++
.../assets/js/icons/pause-animations.js | 16 ++
.../settings/assets/js/icons/readable-font.js | 15 ++
.../settings/assets/js/icons/reading-panel.js | 17 ++
modules/settings/assets/js/icons/site-map.js | 15 ++
modules/settings/assets/js/icons/text-size.js | 12 ++
.../assets/js/layouts/icon-design-settings.js | 2 +-
modules/settings/assets/js/layouts/index.js | 3 +
.../assets/js/layouts/menu-settings.js | 169 ++++++++++++++++++
modules/settings/assets/js/layouts/sidebar.js | 4 +-
.../assets/js/layouts/widget-preview.js | 21 +++
modules/settings/assets/js/pages/menu.js | 18 +-
modules/settings/module.php | 26 ++-
30 files changed, 641 insertions(+), 58 deletions(-)
create mode 100644 modules/settings/assets/js/constants/menu-settings.js
create mode 100644 modules/settings/assets/js/icons/contrast.js
create mode 100644 modules/settings/assets/js/icons/graysacale.js
create mode 100644 modules/settings/assets/js/icons/hide-images.js
create mode 100644 modules/settings/assets/js/icons/line-height.js
create mode 100644 modules/settings/assets/js/icons/page-structure.js
create mode 100644 modules/settings/assets/js/icons/pause-animations.js
create mode 100644 modules/settings/assets/js/icons/readable-font.js
create mode 100644 modules/settings/assets/js/icons/reading-panel.js
create mode 100644 modules/settings/assets/js/icons/site-map.js
create mode 100644 modules/settings/assets/js/icons/text-size.js
create mode 100644 modules/settings/assets/js/layouts/menu-settings.js
create mode 100644 modules/settings/assets/js/layouts/widget-preview.js
diff --git a/modules/settings/assets/js/app.js b/modules/settings/assets/js/app.js
index 502d8024..d2c0980b 100644
--- a/modules/settings/assets/js/app.js
+++ b/modules/settings/assets/js/app.js
@@ -14,12 +14,12 @@ import {
useSettings,
useSavedSettings,
} from '@ea11y/hooks';
+import { Sidebar } from '@ea11y/layouts';
import { usePluginSettingsContext } from './contexts/plugin-settings';
-import { Sidebar } from './layouts/sidebar';
const App = () => {
useSavedSettings();
- const { isConnected } = usePluginSettingsContext();
+ const { isConnected, isRTL } = usePluginSettingsContext();
const { notificationMessage, notificationType } = useNotificationSettings();
const { selectedMenu } = useSettings();
@@ -29,7 +29,7 @@ const App = () => {
? selectedParent.children[selectedMenu.child]
: null;
return (
-
+
{!isConnected && }
@@ -38,7 +38,7 @@ const App = () => {
width="100%"
display="flex"
flexDirection="column"
- justifyContent="space-between"
+ justifyContent="start"
>
{selectedChild ? selectedChild.page : selectedParent?.page}
diff --git a/modules/settings/assets/js/components/bottom-bar/index.js b/modules/settings/assets/js/components/bottom-bar/index.js
index 02ad0521..ccd2873f 100644
--- a/modules/settings/assets/js/components/bottom-bar/index.js
+++ b/modules/settings/assets/js/components/bottom-bar/index.js
@@ -4,13 +4,29 @@ import { useSettings, useStorage, useToastNotification } from '@ea11y/hooks';
import { __ } from '@wordpress/i18n';
const BottomBar = () => {
- const { selectedMenu, iconDesign, iconPosition, hasChanges, setHasChanges } =
- useSettings();
+ const {
+ selectedMenu,
+ widgetMenuSettings,
+ iconDesign,
+ iconPosition,
+ hasChanges,
+ setHasChanges,
+ } = useSettings();
const { save } = useStorage();
const { success, error } = useToastNotification();
const saveSettings = async () => {
- if (
+ if (selectedMenu.parent === 'widget' && selectedMenu.child === 'menu') {
+ try {
+ await save({
+ a11y_widget_menu_settings: widgetMenuSettings,
+ });
+ success('Settings saved!');
+ setHasChanges(false);
+ } catch (e) {
+ error('Failed to save settings!');
+ }
+ } else if (
selectedMenu.parent === 'widget' &&
selectedMenu.child === 'iconSettings'
) {
@@ -29,7 +45,6 @@ const BottomBar = () => {
}
}
};
-
return (
{
gap: 1.5,
p: 2,
minWidth: 10,
+ width: 100,
minHeight: 100,
borderColor:
iconDesign.icon === option.value ? 'info.main' : 'divider',
@@ -56,7 +57,12 @@ const IconSelect = (props) => {
>
{option.icon &&
cloneElement(option.icon, {
- sx: { color: iconDesign.color, fontSize: 44 },
+ sx: {
+ color: iconDesign.color,
+ fontSize: 44,
+ height: 44,
+ width: 'auto',
+ },
})}
{
>
{icon?.icon &&
cloneElement(icon.icon, {
- sx: { color: iconDesign.color, fontSize: option.fontSize },
+ sx: {
+ color: iconDesign.color,
+ fontSize: option.fontSize,
+ height: option.fontSize,
+ width: 'auto',
+ },
})}
,
+ },
+ 'line-height': {
+ title: __('Adjust line height', 'pojo-accessibility'),
+ icon: ,
+ },
+ 'align-text': {
+ title: __('Align text', 'pojo-accessibility'),
+ icon: ,
+ },
+ 'readable-font': {
+ title: __('Readable font', 'pojo-accessibility'),
+ icon: ,
+ },
+ },
+ },
+ 'color-adjustments': {
+ title: __('Color Adjustments', 'pojo-accessibility'),
+ options: {
+ greyscale: {
+ title: __('Greyscale', 'pojo-accessibility'),
+ icon: ,
+ },
+ contrast: {
+ title: __('Contrast', 'pojo-accessibility'),
+ icon: ,
+ },
+ },
+ },
+ 'orientation-adjustments': {
+ title: __('Orientation Adjustments', 'pojo-accessibility'),
+ options: {
+ 'page-structure': {
+ title: __('Page structure', 'pojo-accessibility'),
+ icon: ,
+ },
+ 'site-map': {
+ title: __('Site map', 'pojo-accessibility'),
+ icon: ,
+ },
+ 'reading-panel': {
+ title: __('Reading panel', 'pojo-accessibility'),
+ icon: ,
+ },
+ 'hide-images': {
+ title: __('Hide images', 'pojo-accessibility'),
+ icon: ,
+ },
+ 'pause-animations': {
+ title: __('Pause animations', 'pojo-accessibility'),
+ icon: ,
+ },
+ 'highlight-links': {
+ title: __('Highlight links', 'pojo-accessibility'),
+ icon: ,
+ },
+ },
+ },
+};
diff --git a/modules/settings/assets/js/hooks/index.js b/modules/settings/assets/js/hooks/index.js
index 19a8d4e9..fdabbf9d 100644
--- a/modules/settings/assets/js/hooks/index.js
+++ b/modules/settings/assets/js/hooks/index.js
@@ -6,6 +6,6 @@ export { useStorage } from './use-storage';
export { useToastNotification } from './use-notifications';
export { NotificationsProvider } from './use-notifications';
export { useNotificationSettings } from './use-notifications';
+export { useSavedSettings } from './use-saved-settings';
export { useIconPosition } from './use-icon-positioon';
export { useIconDesign } from './use-icon-design';
-export { useSavedSettings } from './use-saved-settings';
diff --git a/modules/settings/assets/js/hooks/use-saved-settings.js b/modules/settings/assets/js/hooks/use-saved-settings.js
index ad6f87f4..7a8c1384 100644
--- a/modules/settings/assets/js/hooks/use-saved-settings.js
+++ b/modules/settings/assets/js/hooks/use-saved-settings.js
@@ -4,7 +4,12 @@ import { useSelect } from '@wordpress/data';
import { useEffect } from '@wordpress/element';
export const useSavedSettings = () => {
- const { setIconDesign, setIconPosition } = useSettings();
+ const {
+ setWidgetMenuSettings,
+ setHideMinimumOptionAlert,
+ setIconDesign,
+ setIconPosition,
+ } = useSettings();
const result = useSelect((select) => {
return {
@@ -18,10 +23,20 @@ export const useSavedSettings = () => {
useEffect(() => {
if (result.hasFinishedResolution) {
+ if (result?.data?.a11y_widget_menu_settings) {
+ setWidgetMenuSettings(result.data.a11y_widget_menu_settings);
+ }
+
if (result?.data?.a11y_widget_icon_settings?.style) {
setIconDesign(result.data.a11y_widget_icon_settings.style);
}
+ if (result?.data?.a11y_hide_minimum_active_options_alert) {
+ setHideMinimumOptionAlert(
+ result.data.a11y_hide_minimum_active_options_alert,
+ );
+ }
+
if (result?.data?.a11y_widget_icon_settings?.position) {
setIconPosition(result.data.a11y_widget_icon_settings.position);
}
diff --git a/modules/settings/assets/js/hooks/use-settings.js b/modules/settings/assets/js/hooks/use-settings.js
index 0fb825b1..2f21c427 100644
--- a/modules/settings/assets/js/hooks/use-settings.js
+++ b/modules/settings/assets/js/hooks/use-settings.js
@@ -15,11 +15,30 @@ export const SettingsProvider = ({ children }) => {
parent: 'widget',
child: 'iconSettings',
});
+ const [widgetMenuSettings, setWidgetMenuSettings] = useState({
+ 'content-adjustments': {
+ 'text-size': true,
+ 'line-height': true,
+ 'align-text': true,
+ 'readable-font': true,
+ },
+ 'color-adjustments': {
+ greyscale: true,
+ contrast: true,
+ },
+ 'orientation-adjustments': {
+ 'page-structure': true,
+ 'site-map': true,
+ 'reading-panel': true,
+ 'hide-images': true,
+ 'pause-animations': true,
+ 'highlight-links': true,
+ },
+ });
- // Icon Design
- const [widgetIcon, setWidgetIcon] = useState('person');
- const [widgetIconSize, setWidgetIconSize] = useState('medium');
- const [widgetIconColor, setWidgetIconColor] = useState('#2563eb');
+ // Track settings changes to enable/disable Save Changes button
+ const [hasChanges, setHasChanges] = useState(false);
+ const [hideMinimumOptionAlert, setHideMinimumOptionAlert] = useState(false);
const [iconDesign, setIconDesign] = useState({
icon: 'person',
size: 'medium',
@@ -63,8 +82,6 @@ export const SettingsProvider = ({ children }) => {
position: 'top-left',
},
});
-
- const [hasChanges, setHasChanges] = useState(false);
return (
{
setOpenSidebar,
selectedMenu,
setSelectedMenu,
- widgetIcon,
- setWidgetIcon,
- widgetIconSize,
- setWidgetIconSize,
- widgetIconColor,
- setWidgetIconColor,
+ widgetMenuSettings,
+ setWidgetMenuSettings,
+ hideMinimumOptionAlert,
+ setHideMinimumOptionAlert,
iconPosition,
setIconPosition,
iconDesign,
diff --git a/modules/settings/assets/js/icons/accessibility-controls.js b/modules/settings/assets/js/icons/accessibility-controls.js
index fbcbefd8..8edc32f1 100644
--- a/modules/settings/assets/js/icons/accessibility-controls.js
+++ b/modules/settings/assets/js/icons/accessibility-controls.js
@@ -1,6 +1,9 @@
import SvgIcon from '@elementor/ui/SvgIcon';
+import { useSettings } from '@ea11y/hooks';
function AccessibilityControlsIcon(props) {
+ const { iconDesign } = useSettings();
+ const strokeColor = `lch(from ${iconDesign?.color || '#fff'} calc((50 - l) * 100) 0 0)`;
return (
+
+
-
-
+
+
+
+
+
+
+
+
+
+
+
+
);
diff --git a/modules/settings/assets/js/icons/contrast.js b/modules/settings/assets/js/icons/contrast.js
new file mode 100644
index 00000000..8b326903
--- /dev/null
+++ b/modules/settings/assets/js/icons/contrast.js
@@ -0,0 +1,20 @@
+import SvgIcon from '@elementor/ui/SvgIcon';
+
+const ContrastIcon = (props, { size }) => {
+ return (
+
+
+
+
+ );
+};
+
+export default ContrastIcon;
diff --git a/modules/settings/assets/js/icons/graysacale.js b/modules/settings/assets/js/icons/graysacale.js
new file mode 100644
index 00000000..3283b734
--- /dev/null
+++ b/modules/settings/assets/js/icons/graysacale.js
@@ -0,0 +1,11 @@
+import SvgIcon from '@elementor/ui/SvgIcon';
+
+const GrayscaleIcon = (props, { size }) => {
+ return (
+
+
+
+ );
+};
+
+export default GrayscaleIcon;
diff --git a/modules/settings/assets/js/icons/hide-images.js b/modules/settings/assets/js/icons/hide-images.js
new file mode 100644
index 00000000..8988a53c
--- /dev/null
+++ b/modules/settings/assets/js/icons/hide-images.js
@@ -0,0 +1,17 @@
+import SvgIcon from '@elementor/ui/SvgIcon';
+
+const HideImagesIcon = (props, { size }) => {
+ return (
+
+
+
+
+
+ );
+};
+
+export default HideImagesIcon;
diff --git a/modules/settings/assets/js/icons/index.js b/modules/settings/assets/js/icons/index.js
index 27fefa68..287cba62 100644
--- a/modules/settings/assets/js/icons/index.js
+++ b/modules/settings/assets/js/icons/index.js
@@ -7,3 +7,13 @@ export { default as AccessibilityPersonIcon } from './accessibility-person';
export { default as AccessibilityEyeIcon } from './accessibility-eye';
export { default as AccessibilityTextIcon } from './accessibility-text';
export { default as AccessibilityControlsIcon } from './accessibility-controls';
+export { default as TextSizeIcon } from './text-size';
+export { default as LineHeightIcon } from './line-height';
+export { default as GrayscaleIcon } from './graysacale';
+export { default as ContrastIcon } from './contrast';
+export { default as PageStructureIcon } from './page-structure';
+export { default as SiteMapIcon } from './site-map';
+export { default as ReadingPanelIcon } from './reading-panel';
+export { default as HideImagesIcon } from './hide-images';
+export { default as PauseAnimationsIcon } from './pause-animations';
+export { default as ReadableFontIcon } from './readable-font';
diff --git a/modules/settings/assets/js/icons/line-height.js b/modules/settings/assets/js/icons/line-height.js
new file mode 100644
index 00000000..6127ecfc
--- /dev/null
+++ b/modules/settings/assets/js/icons/line-height.js
@@ -0,0 +1,13 @@
+import SvgIcon from '@elementor/ui/SvgIcon';
+
+const LineHeightIcon = (props, { size }) => {
+ return (
+
+
+
+
+
+ );
+};
+
+export default LineHeightIcon;
diff --git a/modules/settings/assets/js/icons/page-structure.js b/modules/settings/assets/js/icons/page-structure.js
new file mode 100644
index 00000000..ec6c82c8
--- /dev/null
+++ b/modules/settings/assets/js/icons/page-structure.js
@@ -0,0 +1,30 @@
+import SvgIcon from '@elementor/ui/SvgIcon';
+
+const PageStructureIcon = (props, { size }) => {
+ return (
+
+
+
+
+
+
+ );
+};
+
+export default PageStructureIcon;
diff --git a/modules/settings/assets/js/icons/pause-animations.js b/modules/settings/assets/js/icons/pause-animations.js
new file mode 100644
index 00000000..f3c66f94
--- /dev/null
+++ b/modules/settings/assets/js/icons/pause-animations.js
@@ -0,0 +1,16 @@
+import SvgIcon from '@elementor/ui/SvgIcon';
+
+const PauseAnimationsIcon = (props, { size }) => {
+ return (
+
+
+
+
+ );
+};
+
+export default PauseAnimationsIcon;
diff --git a/modules/settings/assets/js/icons/readable-font.js b/modules/settings/assets/js/icons/readable-font.js
new file mode 100644
index 00000000..1c8a5ae0
--- /dev/null
+++ b/modules/settings/assets/js/icons/readable-font.js
@@ -0,0 +1,15 @@
+import SvgIcon from '@elementor/ui/SvgIcon';
+
+const ReadableFontIcon = (props, { size }) => {
+ return (
+
+
+
+ );
+};
+
+export default ReadableFontIcon;
diff --git a/modules/settings/assets/js/icons/reading-panel.js b/modules/settings/assets/js/icons/reading-panel.js
new file mode 100644
index 00000000..2f0ee5cd
--- /dev/null
+++ b/modules/settings/assets/js/icons/reading-panel.js
@@ -0,0 +1,17 @@
+import SvgIcon from '@elementor/ui/SvgIcon';
+
+const ReadingPanelIcon = (props, { size }) => {
+ return (
+
+
+
+
+
+ );
+};
+
+export default ReadingPanelIcon;
diff --git a/modules/settings/assets/js/icons/site-map.js b/modules/settings/assets/js/icons/site-map.js
new file mode 100644
index 00000000..1925dd7b
--- /dev/null
+++ b/modules/settings/assets/js/icons/site-map.js
@@ -0,0 +1,15 @@
+import SvgIcon from '@elementor/ui/SvgIcon';
+
+const SiteMapIcon = (props, { size }) => {
+ return (
+
+
+
+ );
+};
+
+export default SiteMapIcon;
diff --git a/modules/settings/assets/js/icons/text-size.js b/modules/settings/assets/js/icons/text-size.js
new file mode 100644
index 00000000..e93f1b01
--- /dev/null
+++ b/modules/settings/assets/js/icons/text-size.js
@@ -0,0 +1,12 @@
+import SvgIcon from '@elementor/ui/SvgIcon';
+
+const TextSizeIcon = (props, { size }) => {
+ return (
+
+
+
+
+ );
+};
+
+export default TextSizeIcon;
diff --git a/modules/settings/assets/js/layouts/icon-design-settings.js b/modules/settings/assets/js/layouts/icon-design-settings.js
index 4b22ca41..ba005f15 100644
--- a/modules/settings/assets/js/layouts/icon-design-settings.js
+++ b/modules/settings/assets/js/layouts/icon-design-settings.js
@@ -18,7 +18,7 @@ const IconDesignSettings = (props) => {
)}
-
+
diff --git a/modules/settings/assets/js/layouts/index.js b/modules/settings/assets/js/layouts/index.js
index 92f073ee..6de94e6f 100644
--- a/modules/settings/assets/js/layouts/index.js
+++ b/modules/settings/assets/js/layouts/index.js
@@ -1,4 +1,7 @@
export { default as IconDesignSettings } from './icon-design-settings';
export { default as PositionSettings } from './position-settings';
export { default as PositionSettingsDesktop } from './position-settings-desktop';
+export { default as MenuSettings } from './menu-settings';
+export { default as WidgetPreview } from './widget-preview';
+export { default as Sidebar } from './sidebar';
export { default as PositionSettingsMobile } from './position-settings-mobile';
diff --git a/modules/settings/assets/js/layouts/menu-settings.js b/modules/settings/assets/js/layouts/menu-settings.js
new file mode 100644
index 00000000..67e04055
--- /dev/null
+++ b/modules/settings/assets/js/layouts/menu-settings.js
@@ -0,0 +1,169 @@
+import { CardActions } from '@elementor/ui';
+import Alert from '@elementor/ui/Alert';
+import Card from '@elementor/ui/Card';
+import CardContent from '@elementor/ui/CardContent';
+import CardHeader from '@elementor/ui/CardHeader';
+import Divider from '@elementor/ui/Divider';
+import List from '@elementor/ui/List';
+import ListItem from '@elementor/ui/ListItem';
+import ListItemIcon from '@elementor/ui/ListItemIcon';
+import ListItemText from '@elementor/ui/ListItemText';
+import Switch from '@elementor/ui/Switch';
+import Typography from '@elementor/ui/Typography';
+import { styled } from '@elementor/ui/styles';
+import { BottomBar } from '@ea11y/components';
+import { useSettings, useStorage } from '@ea11y/hooks';
+import { useEffect, useState } from '@wordpress/element';
+import { __ } from '@wordpress/i18n';
+import { MENU_SETTINGS } from '../constants/menu-settings';
+
+// Customization for the WP admin global CSS.
+const StyledSwitch = styled(Switch)(() => ({
+ input: {
+ height: '56px',
+ },
+}));
+
+const MenuSettings = () => {
+ const {
+ widgetMenuSettings,
+ setWidgetMenuSettings,
+ setHasChanges,
+ hideMinimumOptionAlert,
+ setHideMinimumOptionAlert,
+ } = useSettings();
+ const [disableOptions, setDisableOptions] = useState(false);
+ const { save } = useStorage();
+
+ useEffect(() => {
+ if (!areAtLeastTwoOptionsEnabled(widgetMenuSettings)) {
+ setDisableOptions(true);
+ } else {
+ setDisableOptions(false);
+ save({ a11y_hide_minimum_active_options_alert: false }).then(() => {
+ setHideMinimumOptionAlert(false);
+ });
+ }
+ }, [widgetMenuSettings]);
+ // Function to toggle the value of a setting
+ const toggleSetting = (category, option) => {
+ setWidgetMenuSettings((prevSettings) => {
+ const newSettings = {
+ ...prevSettings,
+ [category]: {
+ ...prevSettings[category],
+ [option]: !prevSettings[category][option],
+ },
+ };
+
+ setHasChanges(true); // Mark as changed
+ return newSettings;
+ });
+ };
+
+ // Function to check if at least two options are enabled
+ const areAtLeastTwoOptionsEnabled = (settings) => {
+ let enabledCount = 0;
+
+ // Iterate through each category in settings
+ for (const category in settings) {
+ if (settings.hasOwnProperty(category)) {
+ // Count enabled options in the current category
+ for (const option in settings[category]) {
+ if (settings[category][option]) {
+ enabledCount++;
+ }
+ }
+ }
+ }
+
+ return enabledCount > 2; // Return true if at least two options are enabled
+ };
+
+ const handleCloseNotification = () => {
+ save({ a11y_hide_minimum_active_options_alert: true }).then(() => {
+ setHideMinimumOptionAlert(true);
+ });
+ };
+ return (
+
+
+ {disableOptions && !hideMinimumOptionAlert && (
+
+ {__('At least two option must remain active', 'pojo-accessibility')}
+
+ )}
+
+
+ {Object.entries(MENU_SETTINGS).map(([parentKey, parentItem]) => {
+ return (
+
+
+
+
+ {parentItem.title}
+
+
+
+ {parentItem.options &&
+ Object.entries(parentItem.options).map(
+ ([childKey, childValue]) => {
+ return (
+
+ toggleSetting(parentKey, childKey)
+ }
+ disabled={
+ widgetMenuSettings[parentKey]?.[childKey]
+ ? disableOptions
+ : false
+ }
+ />
+ }
+ >
+ {childValue.icon}
+
+
+ );
+ },
+ )}
+
+
+ );
+ })}
+
+
+
+
+
+
+ );
+};
+
+export default MenuSettings;
diff --git a/modules/settings/assets/js/layouts/sidebar.js b/modules/settings/assets/js/layouts/sidebar.js
index a462cc84..9eb2bfdb 100644
--- a/modules/settings/assets/js/layouts/sidebar.js
+++ b/modules/settings/assets/js/layouts/sidebar.js
@@ -3,7 +3,7 @@ import Drawer from '@elementor/ui/Drawer';
import { MyAccountMenu, SidebarAppBar, SidebarMenu } from '@ea11y/components';
import { useSettings } from '@ea11y/hooks';
-export const Sidebar = () => {
+const Sidebar = () => {
const { openSidebar } = useSettings();
return (
@@ -30,3 +30,5 @@ export const Sidebar = () => {
);
};
+
+export default Sidebar;
diff --git a/modules/settings/assets/js/layouts/widget-preview.js b/modules/settings/assets/js/layouts/widget-preview.js
new file mode 100644
index 00000000..d3cbc6aa
--- /dev/null
+++ b/modules/settings/assets/js/layouts/widget-preview.js
@@ -0,0 +1,21 @@
+import Card from '@elementor/ui/Card';
+import CardContent from '@elementor/ui/CardContent';
+import CardHeader from '@elementor/ui/CardHeader';
+import { __ } from '@wordpress/i18n';
+
+const WidgetPreview = () => {
+ return (
+
+
+
+
+ );
+};
+
+export default WidgetPreview;
diff --git a/modules/settings/assets/js/pages/menu.js b/modules/settings/assets/js/pages/menu.js
index eff5dfbd..062105b6 100644
--- a/modules/settings/assets/js/pages/menu.js
+++ b/modules/settings/assets/js/pages/menu.js
@@ -1,5 +1,21 @@
+import Box from '@elementor/ui/Box';
+import Container from '@elementor/ui/Container';
+import Typography from '@elementor/ui/Typography';
+import { MenuSettings, WidgetPreview } from '@ea11y/layouts';
+import { __ } from '@wordpress/i18n';
+
const Menu = () => {
- return Menu ;
+ return (
+
+
+ {__('Menu', 'pojo-accessibility')}
+
+
+
+
+
+
+ );
};
export default Menu;
diff --git a/modules/settings/module.php b/modules/settings/module.php
index 4880108f..588c004c 100644
--- a/modules/settings/module.php
+++ b/modules/settings/module.php
@@ -5,6 +5,7 @@
use EA11y\Classes\Module_Base;
use EA11y\Classes\Utils;
use EA11y\Modules\Connect\Module as Connect;
+use Throwable;
if ( ! defined( 'ABSPATH' ) ) {
exit; // Exit if accessed directly.
@@ -89,6 +90,7 @@ public static function get_plugin_settings(): array {
return [
'isConnected' => Connect::is_connected(),
+ 'isRTL' => is_rtl(),
];
}
@@ -102,18 +104,30 @@ public static function get_plugin_settings(): array {
*/
public function register_settings(): void {
$settings = [
+ 'widget_menu_settings' => [
+ 'type' => 'object',
+ 'show_in_rest' => [
+ 'schema' => [
+ 'type' => 'object',
+ 'additionalProperties' => true
+ ],
+ ]
+ ],
'widget_icon_settings' => [
'type' => 'object',
- 'show_in_rest' => [
- 'schema' => [
- 'type' => 'object',
- 'additionalProperties' => true
- ],
- ]
+ 'show_in_rest' => [
+ 'schema' => [
+ 'type' => 'object',
+ 'additionalProperties' => true
+ ],
+ ]
],
'close_post_connect_modal' => [
'type' => 'boolean',
],
+ 'hide_minimum_active_options_alert' => [
+ 'type' => 'boolean',
+ ]
];
foreach ( $settings as $setting => $args ) {
From f8355d05e49027c3a0215d72dbf57f259e53af38 Mon Sep 17 00:00:00 2001
From: Nirbhay Singh <121793120+nirbhayel@users.noreply.github.com>
Date: Thu, 12 Dec 2024 16:32:56 +0530
Subject: [PATCH 012/290] update: app type (#119)
---
modules/connect/classes/config.php | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/modules/connect/classes/config.php b/modules/connect/classes/config.php
index e1f565ba..dcfa959e 100644
--- a/modules/connect/classes/config.php
+++ b/modules/connect/classes/config.php
@@ -15,7 +15,7 @@ class Config {
const APP_REST_NAMESPACE = 'ea11y';
const BASE_URL = 'https://my.elementor.com/connect';
const ADMIN_PAGE = 'accessibility-settings-2';
- const APP_TYPE = 'app_mailer';
+ const APP_TYPE = 'app_access';
const SCOPES = 'openid offline_access';
const STATE_NONCE = 'ea11y_auth_nonce';
const CONNECT_MODE = 'site';
From f5671a35f657c10f15a0374fd478c1c0f48295f6 Mon Sep 17 00:00:00 2001
From: Nirbhay Singh <121793120+nirbhayel@users.noreply.github.com>
Date: Mon, 16 Dec 2024 15:30:46 +0530
Subject: [PATCH 013/290] [APP-834] Update account menu buttons (#121)
* update: account menu buttons
* update: billing link
* add: error handling for switch account
---
modules/settings/assets/js/api/index.js | 9 ++++++
.../js/components/my-account-menu/index.js | 30 ++++++++++++++++---
modules/settings/assets/js/constants/index.js | 1 +
modules/settings/module.php | 4 +--
package-lock.json | 9 +++---
package.json | 2 +-
6 files changed, 44 insertions(+), 11 deletions(-)
diff --git a/modules/settings/assets/js/api/index.js b/modules/settings/assets/js/api/index.js
index 79f675b1..ec0d7857 100644
--- a/modules/settings/assets/js/api/index.js
+++ b/modules/settings/assets/js/api/index.js
@@ -127,6 +127,15 @@ class API {
path: `${v1Prefix}/settings/get-settings`,
});
}
+
+ /**
+ * Go to connect service
+ * @return {Promise} redirect
+ */
+ static async redirectToConnect() {
+ const link = await this.initConnect();
+ window.open(link, '_self').focus();
+ }
}
export default API;
diff --git a/modules/settings/assets/js/components/my-account-menu/index.js b/modules/settings/assets/js/components/my-account-menu/index.js
index 0995398c..4a2a8146 100644
--- a/modules/settings/assets/js/components/my-account-menu/index.js
+++ b/modules/settings/assets/js/components/my-account-menu/index.js
@@ -1,4 +1,4 @@
-import { ChevronDownIcon, UserIcon } from '@elementor/icons';
+import { ChevronDownIcon, UserIcon, ExternalLinkIcon } from '@elementor/icons';
import Avatar from '@elementor/ui/Avatar';
import Box from '@elementor/ui/Box';
import List from '@elementor/ui/List';
@@ -13,16 +13,34 @@ import {
bindTrigger,
usePopupState,
} from '@elementor/ui/usePopupState';
-import { useSettings } from '@ea11y/hooks';
+import { useSettings, useToastNotification } from '@ea11y/hooks';
import { CreditCardIcon, UserArrowIcon } from '@ea11y/icons';
import { __ } from '@wordpress/i18n';
+import API from '../../api';
+import { BILLING_LINK } from '../../constants';
const MyAccountMenu = () => {
const { openSidebar } = useSettings();
+ const { error } = useToastNotification();
const accountMenuState = usePopupState({
variant: 'popover',
popupId: 'myAccountMenu',
});
+ const onDeactivateAndDisconnect = async () => {
+ try {
+ await API.disconnect();
+ await API.redirectToConnect();
+ } catch (e) {
+ error(
+ __('Failed to switch account. Please try again.', 'pojo-accessibility'),
+ );
+ console.error(e);
+ }
+ };
+
+ const redirectToBilling = () => {
+ window.open(BILLING_LINK, '_blank').focus();
+ };
return (
<>
@@ -72,17 +90,21 @@ const MyAccountMenu = () => {
-
+
{__('Switch account', 'pojo-accessibility')}
-
+
{__('Billing', 'pojo-accessibility')}
+
>
diff --git a/modules/settings/assets/js/constants/index.js b/modules/settings/assets/js/constants/index.js
index c4169b45..3df31794 100644
--- a/modules/settings/assets/js/constants/index.js
+++ b/modules/settings/assets/js/constants/index.js
@@ -1,2 +1,3 @@
export const HELP_LINK = 'https://go.elementor.com/';
export const UPGRADE_LINK = 'https://go.elementor.com/';
+export const BILLING_LINK = 'https://my.elementor.com/';
diff --git a/modules/settings/module.php b/modules/settings/module.php
index 588c004c..c3b63c0c 100644
--- a/modules/settings/module.php
+++ b/modules/settings/module.php
@@ -12,8 +12,8 @@
}
class Module extends Module_Base {
- const SETTING_PREFIX = 'a11y_';
- const SETTING_GROUP = 'a11y_settings';
+ const SETTING_PREFIX = 'ea11y_';
+ const SETTING_GROUP = 'ea11y_settings';
const SETTING_BASE_SLUG = 'accessibility-settings-2'; //TODO: Change this later
const SETTING_CAPABILITY = 'manage_options';
diff --git a/package-lock.json b/package-lock.json
index 70900e48..285cff0c 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -8,7 +8,7 @@
"name": "pojo-accessibility",
"version": "2.1.0",
"dependencies": {
- "@elementor/icons": "^1.17.0",
+ "@elementor/icons": "^1.20.0",
"@elementor/ui": "^1.21.2",
"@wordpress/api-fetch": "^7.10.0",
"@wordpress/core-data": "^7.10.0",
@@ -2069,9 +2069,10 @@
}
},
"node_modules/@elementor/icons": {
- "version": "1.18.1",
- "resolved": "https://registry.npmjs.org/@elementor/icons/-/icons-1.18.1.tgz",
- "integrity": "sha512-/69Adp/Q0ebKQOnNKekzX3ym7CQNotBq4JXO+pqtUXbqwbL0O7k56aR81yZSVns1TMOip5+Qxbgxemth0k0FlQ==",
+ "version": "1.20.0",
+ "resolved": "https://registry.npmjs.org/@elementor/icons/-/icons-1.20.0.tgz",
+ "integrity": "sha512-1UgAIDO8qY7R7OjTZ+9cIMqgYtD7LAjIqVJiGmnkJMeb7sM65UebHvZiVVSZX7+jqJ1vuoLH+lmvAZlm8eqoGQ==",
+ "license": "GPL-3.0-or-later",
"peerDependencies": {
"@elementor/ui": "^1.4.61",
"react": "^17.0.0 || ^18.0.0"
diff --git a/package.json b/package.json
index 23eb061d..7604992f 100644
--- a/package.json
+++ b/package.json
@@ -37,7 +37,7 @@
"prettier": "^3.4.1"
},
"dependencies": {
- "@elementor/icons": "^1.17.0",
+ "@elementor/icons": "^1.20.0",
"@elementor/ui": "^1.21.2",
"@wordpress/api-fetch": "^7.10.0",
"@wordpress/core-data": "^7.10.0",
From 00a0db3742826dcdd5c983a9a866c3746d7d74b2 Mon Sep 17 00:00:00 2001
From: Nirbhay Singh <121793120+nirbhayel@users.noreply.github.com>
Date: Mon, 16 Dec 2024 15:32:32 +0530
Subject: [PATCH 014/290] [APP-835] add service data (#122)
* add: client functions
* add: site register and site info endpoints
* update: add plan data settings
* update: add support for 201 response code
* update: add plan data key
* update: store the plan data on the once the site is registered
* update: add filter for client url
* add: retry registering in there is any error after connect
* update: setting prefix
* add: plan data
* update: add account details to menu
* fix: lint issues
---
classes/services/client.php | 197 ++++++++++++++++++
classes/utils.php | 9 +-
.../assets/js/components/bottom-bar/index.js | 4 +-
.../js/components/my-account-menu/index.js | 36 +++-
.../assets/js/hooks/use-saved-settings.js | 21 +-
.../settings/assets/js/hooks/use-settings.js | 4 +
modules/settings/classes/settings.php | 3 +
modules/settings/module.php | 69 ++++++
8 files changed, 323 insertions(+), 20 deletions(-)
create mode 100644 classes/services/client.php
diff --git a/classes/services/client.php b/classes/services/client.php
new file mode 100644
index 00000000..58e34a89
--- /dev/null
+++ b/classes/services/client.php
@@ -0,0 +1,197 @@
+ EA11Y_VERSION,
+ // Which language to return.
+ 'site_lang' => get_bloginfo( 'language' ),
+ // site to connect
+ 'site_url' => trailingslashit( home_url() ),
+ // current user
+ 'local_id' => get_current_user_id(),
+ // User Agent
+ 'user_agent' => ! empty( $_SERVER['HTTP_USER_AGENT'] )
+ ? sanitize_text_field( wp_unslash( $_SERVER['HTTP_USER_AGENT'] ) )
+ : 'Unknown',
+ ];
+ }
+
+ public function make_request( $method, $endpoint, $body = [], array $headers = [], $send_json = false ) {
+ $headers = array_replace_recursive( [
+ 'x-elementor-a11y' => EA11Y_VERSION,
+ 'x-elementor-apps' => 'a11y',
+ ], $headers );
+
+ $headers = array_replace_recursive(
+ $headers,
+ $this->is_connected() ? $this->generate_authentication_headers( $endpoint ) : []
+ );
+
+ $body = array_replace_recursive( $body, $this->get_site_info() );
+
+ if ( $send_json ) {
+ $headers['Content-Type'] = 'application/json';
+ $body = wp_json_encode( $body );
+ }
+
+ return $this->request(
+ $method,
+ $endpoint,
+ [
+ 'timeout' => 100,
+ 'headers' => $headers,
+ 'body' => $body,
+ ]
+ );
+ }
+
+ public static function get_client_base_url() {
+ return apply_filters( 'ea11y_client_base_url', self::BASE_URL );
+ }
+
+ private static function get_remote_url( $endpoint ): string {
+ return self::get_client_base_url() . $endpoint;
+ }
+
+ protected function is_connected(): bool {
+ return Connect::is_connected();
+ }
+
+ public function add_bearer_token( $headers ) {
+ if ( $this->is_connected() ) {
+ $headers['Authorization'] = 'Bearer ' . Data::get_access_token();
+ }
+ return $headers;
+ }
+
+ protected function generate_authentication_headers( $endpoint ): array {
+ $headers = [
+ 'endpoint' => $endpoint,
+ ];
+
+ return $this->add_bearer_token( $headers );
+ }
+
+ /**
+ * @throws Service_Exception
+ */
+ protected function request( $method, $endpoint, $args = [] ) {
+ $args['method'] = $method;
+
+ $response = wp_remote_request(
+ self::get_remote_url( $endpoint ),
+ $args
+ );
+
+ if ( is_wp_error( $response ) ) {
+ $message = $response->get_error_message();
+
+ return new WP_Error(
+ $response->get_error_code(),
+ is_array( $message ) ? join( ', ', $message ) : $message
+ );
+ }
+
+ $body = wp_remote_retrieve_body( $response );
+ $response_code = (int) wp_remote_retrieve_response_code( $response );
+
+ if ( ! $response_code ) {
+ return new WP_Error( 500, 'No Response' );
+ }
+
+ // Server sent a success message without content.
+ if ( 'null' === $body ) {
+ $body = true;
+ }
+
+ // Return with no content on successfull deletion of domain from service.
+ if ( 204 === $response_code ) {
+ $body = true;
+ return $body;
+ }
+
+ $body = json_decode( $body );
+
+ if ( false === $body ) {
+ return new WP_Error( 422, 'Wrong Server Response' );
+ }
+
+ // If the token is invalid, refresh it and try again once only.
+ if ( ! $this->refreshed && ! empty( $body->message ) && ( false !== strpos( $body->message, 'Invalid Token' ) ) ) {
+ Service::refresh_token();
+ $this->refreshed = true;
+ $args['headers'] = $this->add_bearer_token( $args['headers'] );
+ return $this->request( $method, $endpoint, $args );
+ }
+
+ if ( ! in_array( $response_code, [ 200, 201 ] ) ) {
+ // In case $as_array = true.
+ $message = $body->message ?? wp_remote_retrieve_response_message( $response );
+ $message = is_array( $message ) ? join( ', ', $message ) : $message;
+ $code = isset( $body->code ) ? (int) $body->code : $response_code;
+
+ return new WP_Error( $code, $message );
+ }
+
+ return $body;
+ }
+
+ /**
+ * get_site_data
+ * @return mixed|WP_Error Site data
+ */
+ public static function get_site_data() {
+ return self::get_instance()->make_request( 'POST', 'stats' );
+ }
+
+ /**
+ * register_website
+ * @return mixed|WP_Error Site data
+ */
+ public static function register_website() {
+ return self::get_instance()->make_request( 'POST', 'site' );
+ }
+}
diff --git a/classes/utils.php b/classes/utils.php
index ee124871..5f99732e 100644
--- a/classes/utils.php
+++ b/classes/utils.php
@@ -1,13 +1,18 @@
id, 'options-' );
}
- public static function is_elementor_installed() {
+ public static function is_elementor_installed() :bool {
$file_path = 'elementor/elementor.php';
$installed_plugins = get_plugins();
return isset( $installed_plugins[ $file_path ] );
diff --git a/modules/settings/assets/js/components/bottom-bar/index.js b/modules/settings/assets/js/components/bottom-bar/index.js
index ccd2873f..dfbea832 100644
--- a/modules/settings/assets/js/components/bottom-bar/index.js
+++ b/modules/settings/assets/js/components/bottom-bar/index.js
@@ -19,7 +19,7 @@ const BottomBar = () => {
if (selectedMenu.parent === 'widget' && selectedMenu.child === 'menu') {
try {
await save({
- a11y_widget_menu_settings: widgetMenuSettings,
+ ea11y_widget_menu_settings: widgetMenuSettings,
});
success('Settings saved!');
setHasChanges(false);
@@ -32,7 +32,7 @@ const BottomBar = () => {
) {
try {
await save({
- a11y_widget_icon_settings: {
+ ea11y_widget_icon_settings: {
style: iconDesign,
position: iconPosition,
},
diff --git a/modules/settings/assets/js/components/my-account-menu/index.js b/modules/settings/assets/js/components/my-account-menu/index.js
index 4a2a8146..e4c17291 100644
--- a/modules/settings/assets/js/components/my-account-menu/index.js
+++ b/modules/settings/assets/js/components/my-account-menu/index.js
@@ -7,6 +7,7 @@ import ListItemIcon from '@elementor/ui/ListItemIcon';
import ListItemText from '@elementor/ui/ListItemText';
import Menu from '@elementor/ui/Menu';
import MenuItem from '@elementor/ui/MenuItem';
+import Tooltip from '@elementor/ui/Tooltip';
import Typography from '@elementor/ui/Typography';
import {
bindMenu,
@@ -20,12 +21,23 @@ import API from '../../api';
import { BILLING_LINK } from '../../constants';
const MyAccountMenu = () => {
- const { openSidebar } = useSettings();
+ const { openSidebar, planData } = useSettings();
const { error } = useToastNotification();
const accountMenuState = usePopupState({
variant: 'popover',
popupId: 'myAccountMenu',
});
+
+ const truncateEmail = (email, maxLength = 24) => {
+ if (email === undefined || email === null) {
+ return '';
+ }
+ if (email.length <= maxLength) {
+ return email;
+ }
+ return email.slice(0, maxLength - 3) + '...';
+ };
+
const onDeactivateAndDisconnect = async () => {
try {
await API.disconnect();
@@ -41,6 +53,7 @@ const MyAccountMenu = () => {
const redirectToBilling = () => {
window.open(BILLING_LINK, '_blank').focus();
};
+
return (
<>
@@ -80,14 +93,21 @@ const MyAccountMenu = () => {
onClick={accountMenuState.close}
sx={{ gap: 1, width: '225px' }}
>
- JB
+
+
+
-
- Jack Baueuer
-
-
- jack@bauer.com
-
+ {planData?.user?.email.length < 24 ? (
+
+ {planData?.user?.email}
+
+ ) : (
+
+
+ {truncateEmail(planData?.user?.email)}
+
+
+ )}
diff --git a/modules/settings/assets/js/hooks/use-saved-settings.js b/modules/settings/assets/js/hooks/use-saved-settings.js
index 7a8c1384..18697615 100644
--- a/modules/settings/assets/js/hooks/use-saved-settings.js
+++ b/modules/settings/assets/js/hooks/use-saved-settings.js
@@ -9,6 +9,7 @@ export const useSavedSettings = () => {
setHideMinimumOptionAlert,
setIconDesign,
setIconPosition,
+ setPlanData,
} = useSettings();
const result = useSelect((select) => {
@@ -23,22 +24,26 @@ export const useSavedSettings = () => {
useEffect(() => {
if (result.hasFinishedResolution) {
- if (result?.data?.a11y_widget_menu_settings) {
- setWidgetMenuSettings(result.data.a11y_widget_menu_settings);
+ if (result?.data?.ea11y_widget_menu_settings) {
+ setWidgetMenuSettings(result.data.ea11y_widget_menu_settings);
}
- if (result?.data?.a11y_widget_icon_settings?.style) {
- setIconDesign(result.data.a11y_widget_icon_settings.style);
+ if (result?.data?.ea11y_widget_icon_settings?.style) {
+ setIconDesign(result.data.ea11y_widget_icon_settings.style);
}
- if (result?.data?.a11y_hide_minimum_active_options_alert) {
+ if (result?.data?.ea11y_hide_minimum_active_options_alert) {
setHideMinimumOptionAlert(
- result.data.a11y_hide_minimum_active_options_alert,
+ result.data.ea11y_hide_minimum_active_options_alert,
);
}
- if (result?.data?.a11y_widget_icon_settings?.position) {
- setIconPosition(result.data.a11y_widget_icon_settings.position);
+ if (result?.data?.ea11y_widget_icon_settings?.position) {
+ setIconPosition(result.data.ea11y_widget_icon_settings.position);
+ }
+
+ if (result?.data?.ea11y_plan_data) {
+ setPlanData(result.data.ea11y_plan_data);
}
}
}, [result.hasFinishedResolution]);
diff --git a/modules/settings/assets/js/hooks/use-settings.js b/modules/settings/assets/js/hooks/use-settings.js
index 2f21c427..1e079b9e 100644
--- a/modules/settings/assets/js/hooks/use-settings.js
+++ b/modules/settings/assets/js/hooks/use-settings.js
@@ -36,6 +36,8 @@ export const SettingsProvider = ({ children }) => {
},
});
+ const [planData, setPlanData] = useState(null);
+
// Track settings changes to enable/disable Save Changes button
const [hasChanges, setHasChanges] = useState(false);
const [hideMinimumOptionAlert, setHideMinimumOptionAlert] = useState(false);
@@ -99,6 +101,8 @@ export const SettingsProvider = ({ children }) => {
setIconDesign,
hasChanges,
setHasChanges,
+ planData,
+ setPlanData,
}}
>
{children}
diff --git a/modules/settings/classes/settings.php b/modules/settings/classes/settings.php
index 1ef1d258..e566c146 100644
--- a/modules/settings/classes/settings.php
+++ b/modules/settings/classes/settings.php
@@ -8,6 +8,9 @@
class Settings {
+ public const IS_VALID_PLAN_DATA = 'ea11y_is_valid_plan_data';
+ public const PLAN_DATA = 'ea11y_plan_data';
+
/**
* Returns plugin settings data by option name typecasted to an appropriate data type.
*
diff --git a/modules/settings/module.php b/modules/settings/module.php
index c3b63c0c..3ff7e795 100644
--- a/modules/settings/module.php
+++ b/modules/settings/module.php
@@ -5,7 +5,12 @@
use EA11y\Classes\Module_Base;
use EA11y\Classes\Utils;
use EA11y\Modules\Connect\Module as Connect;
+use EA11y\Modules\Connect\Classes\Config;
+use EA11y\Modules\Connect\Classes\Data;
+use EA11y\Classes\Logger;
+use EA11y\Modules\Settings\Classes\Settings;
use Throwable;
+use Exception;
if ( ! defined( 'ABSPATH' ) ) {
exit; // Exit if accessed directly.
@@ -56,6 +61,7 @@ public function register_page() : void {
* Enqueue Scripts and Styles
*/
public function enqueue_scripts( $hook ) : void {
+ //TODO: Update page name
if ( 'toplevel_page_accessibility-settings-2' !== $hook ) {
return;
}
@@ -94,6 +100,58 @@ public static function get_plugin_settings(): array {
];
}
+ /**
+ * @throws Exception
+ */
+ public function on_connect(): void {
+ if ( ! Connect::is_connected() ) {
+ return;
+ }
+
+ $register_response = Utils::get_api_client()->make_request(
+ 'POST',
+ 'site/register'
+ );
+
+ if ( $register_response && ! is_wp_error( $register_response ) ) {
+ Data::set_subscription_id( $register_response->id );
+ update_option( Settings::PLAN_DATA, $register_response );
+ update_option( Settings::IS_VALID_PLAN_DATA, true );
+ } else {
+ Logger::error( esc_html( $register_response->get_error_message() ) );
+ update_option( Settings::IS_VALID_PLAN_DATA, false );
+ }
+ }
+
+ /**
+ * Retry registering the site if it fails during connect.
+ *
+ * @param $current_screen
+ * @return void
+ */
+ public function check_plan_data( $current_screen ) : void {
+ //TODO: Update page name
+ if ( 'toplevel_page_accessibility-settings-2' !== $current_screen->base ) {
+ return;
+ }
+
+ if ( Connect::is_connected() && get_option( Settings::PLAN_DATA ) === false ) {
+ $register_response = Utils::get_api_client()->make_request(
+ 'POST',
+ 'site/register'
+ );
+
+ if ( $register_response && ! is_wp_error( $register_response ) ) {
+ Data::set_subscription_id( $register_response->id );
+ update_option( Settings::PLAN_DATA, $register_response );
+ update_option( Settings::IS_VALID_PLAN_DATA, true );
+ } else {
+ Logger::error( esc_html( $register_response->get_error_message() ) );
+ update_option( Settings::IS_VALID_PLAN_DATA, false );
+ }
+ }
+ }
+
/**
* Register settings.
*
@@ -122,6 +180,15 @@ public function register_settings(): void {
],
]
],
+ 'plan_data' => [
+ 'type' => 'object',
+ 'show_in_rest' => [
+ 'schema' => [
+ 'type' => 'object',
+ 'additionalProperties' => true
+ ],
+ ]
+ ],
'close_post_connect_modal' => [
'type' => 'boolean',
],
@@ -147,5 +214,7 @@ public function __construct() {
add_action( 'admin_menu', [ $this, 'register_page' ] );
add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_scripts' ] );
add_action( 'rest_api_init', [ $this, 'register_settings' ] );
+ add_action( 'on_connect_' . Config::APP_PREFIX . '_connected', [ $this, 'on_connect' ] );
+ add_action( 'current_screen', [ $this, 'check_plan_data' ] );
}
}
From ab453fe7ff211d2430f61515bea2088f61ba09b2 Mon Sep 17 00:00:00 2001
From: Nirbhay Singh <121793120+nirbhayel@users.noreply.github.com>
Date: Mon, 16 Dec 2024 15:32:50 +0530
Subject: [PATCH 015/290] update: add data checkbox support (#123)
---
modules/connect/classes/config.php | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/modules/connect/classes/config.php b/modules/connect/classes/config.php
index dcfa959e..83fb6f54 100644
--- a/modules/connect/classes/config.php
+++ b/modules/connect/classes/config.php
@@ -16,7 +16,7 @@ class Config {
const BASE_URL = 'https://my.elementor.com/connect';
const ADMIN_PAGE = 'accessibility-settings-2';
const APP_TYPE = 'app_access';
- const SCOPES = 'openid offline_access';
+ const SCOPES = 'openid offline_access share_usage_data';
const STATE_NONCE = 'ea11y_auth_nonce';
const CONNECT_MODE = 'site';
}
From c84ff70e99ee7a46b60a6eaa1acdc0b1e8f336fa Mon Sep 17 00:00:00 2001
From: Nirbhay Singh <121793120+nirbhayel@users.noreply.github.com>
Date: Mon, 30 Dec 2024 16:32:04 +0530
Subject: [PATCH 016/290] [APP-928] Settings pointer (#125)
* add: settings pointer
* update: add alias for the settings
---
includes/manager.php | 1 +
modules/core/components/pointers.php | 49 ++++++++++
modules/core/module.php | 61 ++++++++++++
.../js/components/my-account-menu/index.js | 2 +-
.../settings/components/settings-pointer.php | 92 +++++++++++++++++++
modules/settings/module.php | 80 ++++++++--------
6 files changed, 247 insertions(+), 38 deletions(-)
create mode 100644 modules/core/components/pointers.php
create mode 100644 modules/core/module.php
create mode 100644 modules/settings/components/settings-pointer.php
diff --git a/includes/manager.php b/includes/manager.php
index 247b9b20..a5ddaab8 100644
--- a/includes/manager.php
+++ b/includes/manager.php
@@ -19,6 +19,7 @@ public static function get_module_list(): array {
'Legacy',
'Connect',
'Settings',
+ 'Core',
];
}
diff --git a/modules/core/components/pointers.php b/modules/core/components/pointers.php
new file mode 100644
index 00000000..8120d4d0
--- /dev/null
+++ b/modules/core/components/pointers.php
@@ -0,0 +1,49 @@
+ 'Invalid nonce' ] );
+ }
+
+ $pointer = sanitize_text_field( $_POST['data']['pointer'] ) ?? null;
+
+ if ( empty( $pointer ) ) {
+ wp_send_json_error( [ 'message' => 'The pointer id must be provided' ] );
+ }
+
+ $pointer = explode( ',', $pointer );
+
+ $user_dismissed_meta = get_user_meta( get_current_user_id(), self::DISMISSED_POINTERS_META_KEY, true );
+
+ if ( ! $user_dismissed_meta ) {
+ $user_dismissed_meta = [];
+ }
+
+ foreach ( $pointer as $item ) {
+ $user_dismissed_meta[ $item ] = true;
+ }
+
+ update_user_meta( get_current_user_id(), self::DISMISSED_POINTERS_META_KEY, $user_dismissed_meta );
+
+ wp_send_json_success( [] );
+ }
+
+ public static function is_dismissed( string $slug ): bool {
+ $meta = (array) get_user_meta( get_current_user_id(), self::DISMISSED_POINTERS_META_KEY, true );
+
+ return key_exists( $slug, $meta );
+ }
+
+ public function __construct() {
+ add_action( 'wp_ajax_ea11y_pointer_dismissed', [ $this, 'dismiss_pointers' ] );
+ }
+}
diff --git a/modules/core/module.php b/modules/core/module.php
new file mode 100644
index 00000000..4650674b
--- /dev/null
+++ b/modules/core/module.php
@@ -0,0 +1,61 @@
+ sprintf(
+ '%s ',
+ admin_url( 'admin.php?page=' . Settings::SETTING_BASE_SLUG ),
+ esc_html__( 'Dashboard', 'pojo-accessibility' )
+ ),
+ ];
+
+ if ( Connect::is_connected() ) {
+ $custom_links['upgrade'] = sprintf(
+ '%s ',
+ 'https://go.elementor.com/sm-panel-wp-dash-upgrade-plugins/',
+ esc_html__( 'Upgrade', 'pojo-accessibility' )
+ );
+ } else {
+ $custom_links['connect'] = sprintf(
+ '%s ',
+ admin_url( 'admin.php?page=' . Settings::SETTING_BASE_SLUG ),
+ esc_html__( 'Connect', 'pojo-accessibility' )
+ );
+ }
+
+ return array_merge( $custom_links, $links );
+ }
+
+ /**
+ * Module constructor.
+ */
+ public function __construct() {
+ $this->register_components();
+
+ add_filter( 'plugin_action_links', [ $this, 'add_plugin_links' ], 10, 2 );
+ }
+}
diff --git a/modules/settings/assets/js/components/my-account-menu/index.js b/modules/settings/assets/js/components/my-account-menu/index.js
index e4c17291..e6619022 100644
--- a/modules/settings/assets/js/components/my-account-menu/index.js
+++ b/modules/settings/assets/js/components/my-account-menu/index.js
@@ -53,7 +53,7 @@ const MyAccountMenu = () => {
const redirectToBilling = () => {
window.open(BILLING_LINK, '_blank').focus();
};
-
+
return (
<>
diff --git a/modules/settings/components/settings-pointer.php b/modules/settings/components/settings-pointer.php
new file mode 100644
index 00000000..39415e00
--- /dev/null
+++ b/modules/settings/components/settings-pointer.php
@@ -0,0 +1,92 @@
+' . esc_html__( 'One Click Accessibility', 'pojo-accessibility' ) . '';
+ $pointer_content .= '' . esc_html__( "Start setting up and customizing your site's accessibility widget.", 'pojo-accessibility' ) . '
';
+
+ $pointer_content .= sprintf(
+ '%s
',
+ admin_url( 'admin.php?page=' . SettingsModule::SETTING_BASE_SLUG ),
+ esc_html__( 'Get Started', 'pojo-accessibility' )
+ );
+
+ $allowed_tags = [
+ 'h3' => [],
+ 'p' => [],
+ 'a' => [
+ 'class' => [],
+ 'href' => [],
+ ],
+ ];
+ ?>
+
+
+
+
@@ -115,8 +121,8 @@ public function on_connect(): void {
if ( $register_response && ! is_wp_error( $register_response ) ) {
Data::set_subscription_id( $register_response->id );
- update_option( Settings::PLAN_DATA, $register_response );
- update_option( Settings::IS_VALID_PLAN_DATA, true );
+ update_option( Settings::PLAN_DATA, $register_response );
+ update_option( Settings::IS_VALID_PLAN_DATA, true );
} else {
Logger::error( esc_html( $register_response->get_error_message() ) );
update_option( Settings::IS_VALID_PLAN_DATA, false );
@@ -124,33 +130,33 @@ public function on_connect(): void {
}
/**
- * Retry registering the site if it fails during connect.
- *
+ * Retry registering the site if it fails during connect.
+ *
* @param $current_screen
* @return void
*/
- public function check_plan_data( $current_screen ) : void {
- //TODO: Update page name
- if ( 'toplevel_page_accessibility-settings-2' !== $current_screen->base ) {
- return;
- }
-
- if ( Connect::is_connected() && get_option( Settings::PLAN_DATA ) === false ) {
- $register_response = Utils::get_api_client()->make_request(
- 'POST',
- 'site/register'
- );
-
- if ( $register_response && ! is_wp_error( $register_response ) ) {
- Data::set_subscription_id( $register_response->id );
- update_option( Settings::PLAN_DATA, $register_response );
- update_option( Settings::IS_VALID_PLAN_DATA, true );
- } else {
- Logger::error( esc_html( $register_response->get_error_message() ) );
- update_option( Settings::IS_VALID_PLAN_DATA, false );
- }
- }
- }
+ public function check_plan_data( $current_screen ) : void {
+ //TODO: Update page name
+ if ( 'toplevel_page_accessibility-settings-2' !== $current_screen->base ) {
+ return;
+ }
+
+ if ( Connect::is_connected() && get_option( Settings::PLAN_DATA ) === false ) {
+ $register_response = Utils::get_api_client()->make_request(
+ 'POST',
+ 'site/register'
+ );
+
+ if ( $register_response && ! is_wp_error( $register_response ) ) {
+ Data::set_subscription_id( $register_response->id );
+ update_option( Settings::PLAN_DATA, $register_response );
+ update_option( Settings::IS_VALID_PLAN_DATA, true );
+ } else {
+ Logger::error( esc_html( $register_response->get_error_message() ) );
+ update_option( Settings::IS_VALID_PLAN_DATA, false );
+ }
+ }
+ }
/**
* Register settings.
@@ -167,34 +173,34 @@ public function register_settings(): void {
'show_in_rest' => [
'schema' => [
'type' => 'object',
- 'additionalProperties' => true
+ 'additionalProperties' => true,
],
- ]
+ ],
],
'widget_icon_settings' => [
'type' => 'object',
'show_in_rest' => [
'schema' => [
'type' => 'object',
- 'additionalProperties' => true
+ 'additionalProperties' => true,
],
- ]
+ ],
],
'plan_data' => [
'type' => 'object',
'show_in_rest' => [
'schema' => [
'type' => 'object',
- 'additionalProperties' => true
+ 'additionalProperties' => true,
],
- ]
+ ],
],
'close_post_connect_modal' => [
'type' => 'boolean',
],
- 'hide_minimum_active_options_alert' => [
- 'type' => 'boolean',
- ]
+ 'hide_minimum_active_options_alert' => [
+ 'type' => 'boolean',
+ ],
];
foreach ( $settings as $setting => $args ) {
@@ -210,11 +216,11 @@ public function register_settings(): void {
*/
public function __construct() {
$this->register_routes();
- $this->register_components();
+ $this->register_components( self::component_list() );
add_action( 'admin_menu', [ $this, 'register_page' ] );
add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_scripts' ] );
add_action( 'rest_api_init', [ $this, 'register_settings' ] );
add_action( 'on_connect_' . Config::APP_PREFIX . '_connected', [ $this, 'on_connect' ] );
- add_action( 'current_screen', [ $this, 'check_plan_data' ] );
+ add_action( 'current_screen', [ $this, 'check_plan_data' ] );
}
}
From 680e9ffa64f573a459074e5c0c0f58b0c473b601 Mon Sep 17 00:00:00 2001
From: Nirbhay Singh <121793120+nirbhayel@users.noreply.github.com>
Date: Mon, 30 Dec 2024 16:32:40 +0530
Subject: [PATCH 017/290] [APP-837] Add post connect modal (#120)
* add: post connect modal
* update: settings prefix
* fix: connect modal design
* update: connect modal text
* add: connect modal graphics
* update: connect modal icon
* update: post connect modal
* update: sidebar menu text
* update: text of icon settings
* update: text
* update: php compatibility with return types
---
modules/settings/assets/js/app.js | 5 +-
.../connect-modal/connect-modal-icon.js | 297 ------------------
.../js/components/connect-modal/index.js | 93 ++++--
.../settings/assets/js/components/index.js | 1 +
.../js/components/post-connect-modal/index.js | 75 +++++
.../assets/js/components/sidebar-menu/menu.js | 8 +-
.../assets/js/contexts/plugin-settings.js | 6 +
.../assets/js/icons/connect-modal-icon.js | 44 +++
modules/settings/assets/js/icons/index.js | 2 +
.../js/icons/post-connect-modal-icon.js | 44 +++
.../assets/js/layouts/icon-design-settings.js | 2 +-
.../assets/js/layouts/menu-settings.js | 4 +-
.../assets/js/layouts/position-settings.js | 2 +-
.../settings/assets/js/pages/icon-settings.js | 2 +-
modules/settings/assets/js/pages/menu.js | 2 +-
modules/settings/classes/settings.php | 20 +-
modules/settings/module.php | 1 +
17 files changed, 275 insertions(+), 333 deletions(-)
delete mode 100644 modules/settings/assets/js/components/connect-modal/connect-modal-icon.js
create mode 100644 modules/settings/assets/js/components/post-connect-modal/index.js
create mode 100644 modules/settings/assets/js/icons/connect-modal-icon.js
create mode 100644 modules/settings/assets/js/icons/post-connect-modal-icon.js
diff --git a/modules/settings/assets/js/app.js b/modules/settings/assets/js/app.js
index d2c0980b..070f3956 100644
--- a/modules/settings/assets/js/app.js
+++ b/modules/settings/assets/js/app.js
@@ -8,6 +8,7 @@ import {
Notifications,
MenuItems,
AdminTopBar,
+ PostConnectModal,
} from '@ea11y/components';
import {
useNotificationSettings,
@@ -19,7 +20,8 @@ import { usePluginSettingsContext } from './contexts/plugin-settings';
const App = () => {
useSavedSettings();
- const { isConnected, isRTL } = usePluginSettingsContext();
+ const { isConnected, isRTL, closePostConnectModal } =
+ usePluginSettingsContext();
const { notificationMessage, notificationType } = useNotificationSettings();
const { selectedMenu } = useSettings();
@@ -32,6 +34,7 @@ const App = () => {
{!isConnected && }
+ {isConnected && !closePostConnectModal && }
{
- return (
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- );
-};
-
-export default ConnectModalIcon;
diff --git a/modules/settings/assets/js/components/connect-modal/index.js b/modules/settings/assets/js/components/connect-modal/index.js
index eb9befde..243db861 100644
--- a/modules/settings/assets/js/components/connect-modal/index.js
+++ b/modules/settings/assets/js/components/connect-modal/index.js
@@ -1,20 +1,30 @@
+import { CircleCheckFilledIcon } from '@elementor/icons';
import Box from '@elementor/ui/Box';
import Button from '@elementor/ui/Button';
import Grid from '@elementor/ui/Grid';
+import List from '@elementor/ui/List';
+import ListItem from '@elementor/ui/ListItem';
+import ListItemIcon from '@elementor/ui/ListItemIcon';
+import ListItemText from '@elementor/ui/ListItemText';
import Modal from '@elementor/ui/Modal';
import Typography from '@elementor/ui/Typography';
import { useAuth, useModal } from '@ea11y/hooks';
+import { ConnectModalIcon } from '@ea11y/icons';
import { __ } from '@wordpress/i18n';
function ConnectModal() {
const { isOpen } = useModal();
const { redirectToConnect } = useAuth();
+ const ListItemStyle = { margin: '8px', padding: 0 };
+ const ListItemTextStyle = { color: 'text.secondary', margin: 0, padding: 0 };
+ const listIconColor = 'info.main';
+
return (
-
-
- {__('Connect plugin on your site!', 'pojo-accessibility')}
-
-
+
- {__('Connect', 'pojo-accessibility')}
-
+ {__("Let's improve your site's accessibility", 'pojo-accessibility')}
+
+
+ {__(
+ 'Make your site more inclusive with One Click Accessibility.',
+ 'pojo-accessibility',
+ )}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {__('Get started', 'pojo-accessibility')}
+
+
);
diff --git a/modules/settings/assets/js/components/index.js b/modules/settings/assets/js/components/index.js
index 7c5d25f5..963b0a54 100644
--- a/modules/settings/assets/js/components/index.js
+++ b/modules/settings/assets/js/components/index.js
@@ -11,3 +11,4 @@ export { default as PositionControl } from './position-control';
export { MenuItems } from '../components/sidebar-menu/menu';
export { default as AdminTopBar } from './admin-top-bar';
export { default as BottomBar } from './bottom-bar';
+export { default as PostConnectModal } from './post-connect-modal';
diff --git a/modules/settings/assets/js/components/post-connect-modal/index.js b/modules/settings/assets/js/components/post-connect-modal/index.js
new file mode 100644
index 00000000..25fd98df
--- /dev/null
+++ b/modules/settings/assets/js/components/post-connect-modal/index.js
@@ -0,0 +1,75 @@
+import Button from '@elementor/ui/Button';
+import Grid from '@elementor/ui/Grid';
+import Modal from '@elementor/ui/Modal';
+import Typography from '@elementor/ui/Typography';
+import { useModal, useStorage } from '@ea11y/hooks';
+import { PostConnectModalIcon } from '@ea11y/icons';
+import { __ } from '@wordpress/i18n';
+
+const PostConnectModal = () => {
+ const { isOpen, close } = useModal();
+ const { save } = useStorage();
+
+ const onClose = async () => {
+ await save({
+ ea11y_close_post_connect_modal: true,
+ });
+ close();
+ };
+
+ return (
+
+
+
+
+ {__("You're all set", 'site-mailer')}
+
+
+ {__(
+ 'The One Click Accessibility widget is now active and ready to use on your site!',
+ 'site-mailer',
+ )}
+
+
+ {__('Done', 'pojo-accessibility')}
+
+
+
+ );
+};
+
+export default PostConnectModal;
diff --git a/modules/settings/assets/js/components/sidebar-menu/menu.js b/modules/settings/assets/js/components/sidebar-menu/menu.js
index 1b618df7..5372ff8c 100644
--- a/modules/settings/assets/js/components/sidebar-menu/menu.js
+++ b/modules/settings/assets/js/components/sidebar-menu/menu.js
@@ -5,24 +5,24 @@ import { __ } from '@wordpress/i18n';
export const MenuItems = {
widget: {
- name: __('Widget', 'pojo-accessibility'),
+ name: __('Accessibility Widget', 'pojo-accessibility'),
key: 'widget',
icon: ,
children: {
iconSettings: {
- name: __('Icon Settings', 'pojo-accessibility'),
+ name: __('Design & position', 'pojo-accessibility'),
key: 'icon-settings',
page: ,
},
menu: {
- name: __('Menu', 'pojo-accessibility'),
+ name: __('Feature management', 'pojo-accessibility'),
key: 'menu',
page: ,
},
},
},
accessibilityStatement: {
- name: __('Accessibility Statement', 'pojo-accessibility'),
+ name: __('Accessibility statement', 'pojo-accessibility'),
key: 'accessibility-statement',
page: ,
icon: ,
diff --git a/modules/settings/assets/js/contexts/plugin-settings.js b/modules/settings/assets/js/contexts/plugin-settings.js
index d6686642..804ca034 100644
--- a/modules/settings/assets/js/contexts/plugin-settings.js
+++ b/modules/settings/assets/js/contexts/plugin-settings.js
@@ -23,6 +23,12 @@ export const PluginSettingsProvider = ({ children }) => {
settings.isConnected = Boolean(settings.isConnected);
}
+ if ('closePostConnectModal' in settings) {
+ settings.closePostConnectModal = Boolean(
+ settings.closePostConnectModal,
+ );
+ }
+
setPluginSettings(settings);
setLoaded(true);
})
diff --git a/modules/settings/assets/js/icons/connect-modal-icon.js b/modules/settings/assets/js/icons/connect-modal-icon.js
new file mode 100644
index 00000000..ef2054bf
--- /dev/null
+++ b/modules/settings/assets/js/icons/connect-modal-icon.js
@@ -0,0 +1,44 @@
+import SvgIcon from '@elementor/ui/SvgIcon';
+
+const ConnectModalIcon = () => {
+ return (
+
+
+
+
+
+
+
+
+
+ );
+};
+
+export default ConnectModalIcon;
diff --git a/modules/settings/assets/js/icons/index.js b/modules/settings/assets/js/icons/index.js
index 287cba62..d67c047d 100644
--- a/modules/settings/assets/js/icons/index.js
+++ b/modules/settings/assets/js/icons/index.js
@@ -17,3 +17,5 @@ export { default as ReadingPanelIcon } from './reading-panel';
export { default as HideImagesIcon } from './hide-images';
export { default as PauseAnimationsIcon } from './pause-animations';
export { default as ReadableFontIcon } from './readable-font';
+export { default as PostConnectModalIcon } from './post-connect-modal-icon';
+export { default as ConnectModalIcon } from './connect-modal-icon';
diff --git a/modules/settings/assets/js/icons/post-connect-modal-icon.js b/modules/settings/assets/js/icons/post-connect-modal-icon.js
new file mode 100644
index 00000000..a8a12621
--- /dev/null
+++ b/modules/settings/assets/js/icons/post-connect-modal-icon.js
@@ -0,0 +1,44 @@
+import SvgIcon from '@elementor/ui/SvgIcon';
+
+const PostConnectModalIcon = () => {
+ return (
+
+
+
+
+
+
+
+
+
+ );
+};
+
+export default PostConnectModalIcon;
diff --git a/modules/settings/assets/js/layouts/icon-design-settings.js b/modules/settings/assets/js/layouts/icon-design-settings.js
index ba005f15..34103e41 100644
--- a/modules/settings/assets/js/layouts/icon-design-settings.js
+++ b/modules/settings/assets/js/layouts/icon-design-settings.js
@@ -13,7 +13,7 @@ const IconDesignSettings = (props) => {
{__(
- 'Customize the design of the button that visitors use to open the widget.',
+ "Customize your accessibility button's color, icon, and size to match your brand.",
'pojo-accessibility',
)}
diff --git a/modules/settings/assets/js/layouts/menu-settings.js b/modules/settings/assets/js/layouts/menu-settings.js
index 67e04055..8b867f49 100644
--- a/modules/settings/assets/js/layouts/menu-settings.js
+++ b/modules/settings/assets/js/layouts/menu-settings.js
@@ -88,9 +88,9 @@ const MenuSettings = () => {
return (
diff --git a/modules/settings/assets/js/layouts/position-settings.js b/modules/settings/assets/js/layouts/position-settings.js
index 07fdd1a1..5490ba68 100644
--- a/modules/settings/assets/js/layouts/position-settings.js
+++ b/modules/settings/assets/js/layouts/position-settings.js
@@ -34,7 +34,7 @@ export const PositionSettings = (props) => {
{__(
- 'Set where the widget appears on your site. This applies to all pages.',
+ 'Decide where you want your accessibility button to appear across every page of your site so visitors can easily find it.',
'pojo-accessibility',
)}
diff --git a/modules/settings/assets/js/pages/icon-settings.js b/modules/settings/assets/js/pages/icon-settings.js
index 0b9211e8..fe2e143d 100644
--- a/modules/settings/assets/js/pages/icon-settings.js
+++ b/modules/settings/assets/js/pages/icon-settings.js
@@ -9,7 +9,7 @@ const IconSettings = () => {
<>
- {__('Icon Settings', 'pojo-accessibility')}
+ {__('Design & position', 'pojo-accessibility')}
diff --git a/modules/settings/assets/js/pages/menu.js b/modules/settings/assets/js/pages/menu.js
index 062105b6..9cf46006 100644
--- a/modules/settings/assets/js/pages/menu.js
+++ b/modules/settings/assets/js/pages/menu.js
@@ -8,7 +8,7 @@ const Menu = () => {
return (
- {__('Menu', 'pojo-accessibility')}
+ {__('Feature management', 'pojo-accessibility')}
diff --git a/modules/settings/classes/settings.php b/modules/settings/classes/settings.php
index e566c146..ff77904d 100644
--- a/modules/settings/classes/settings.php
+++ b/modules/settings/classes/settings.php
@@ -7,24 +7,30 @@
}
class Settings {
+ public const CLOSE_POST_CONNECT_MODAL = 'ea11y_close_post_connect_modal';
public const IS_VALID_PLAN_DATA = 'ea11y_is_valid_plan_data';
public const PLAN_DATA = 'ea11y_plan_data';
/**
- * Returns plugin settings data by option name typecasted to an appropriate data type.
+ * Returns plugin settings data by option name
+ * type cast to an appropriate data type.
*
* @param string $option_name
* @return mixed
*/
public static function get( string $option_name ) {
- $data = get_option( $option_name );
-
- switch ( $option_name ) {
- default:
- return $data;
- }
+ return get_option( $option_name );
}
+
+ /**
+ * Update the settings data by option name.
+ *
+ * @param string $option_name
+ * @param $value
+ *
+ * @return bool
+ */
public static function set( string $option_name, $value ): bool {
return update_option( $option_name, $value, false );
}
diff --git a/modules/settings/module.php b/modules/settings/module.php
index 47085597..2a85bc35 100644
--- a/modules/settings/module.php
+++ b/modules/settings/module.php
@@ -102,6 +102,7 @@ public static function get_plugin_settings(): array {
return [
'isConnected' => Connect::is_connected(),
+ 'closePostConnectModal' => Settings::get( Settings::CLOSE_POST_CONNECT_MODAL ),
'isRTL' => is_rtl(),
];
}
From 08ced7ec9ab51ae23eb12f5b2624e56e9d006700 Mon Sep 17 00:00:00 2001
From: Nirbhay Singh <121793120+nirbhayel@users.noreply.github.com>
Date: Mon, 30 Dec 2024 16:32:53 +0530
Subject: [PATCH 018/290] add: accessibility statement page structure (#126)
---
.../js/pages/accessibility-statement.js | 61 ++++++++++++++++++-
1 file changed, 60 insertions(+), 1 deletion(-)
diff --git a/modules/settings/assets/js/pages/accessibility-statement.js b/modules/settings/assets/js/pages/accessibility-statement.js
index 34cbc5cb..74e9447c 100644
--- a/modules/settings/assets/js/pages/accessibility-statement.js
+++ b/modules/settings/assets/js/pages/accessibility-statement.js
@@ -1,5 +1,64 @@
+import Container from '@elementor/ui/Container';
+import FormControl from '@elementor/ui/FormControl';
+import FormControlLabel from '@elementor/ui/FormControlLabel';
+import Radio from '@elementor/ui/Radio';
+import RadioGroup from '@elementor/ui/RadioGroup';
+import Typography from '@elementor/ui/Typography';
+import { BottomBar } from '@ea11y/components';
+import { __ } from '@wordpress/i18n';
+
const AccessibilityStatement = () => {
- return AccessibilityStatement ;
+ return (
+ <>
+
+
+ {__('Accessibility statement', 'pojo-accessibility')}
+
+
+ {__(
+ 'An accessibility statement showcases your efforts to create an inclusive online space, highlighting helpful features and a commitment to accessibility. Learn more',
+ 'pojo-accessibility',
+ )}
+
+
+ {__(
+ 'Already have an accessibile statement page?',
+ 'pojo-accessibility',
+ )}
+
+
+
+ }
+ label={__('No, I do not have one', 'pojo-accessibility')}
+ value={false}
+ />
+ }
+ label={__('Yes', 'pojo-accessibility')}
+ value={true}
+ />
+
+
+
+
+ >
+ );
};
export default AccessibilityStatement;
From 45a15d224e97ea7434d9f357bfaefbb6307029d4 Mon Sep 17 00:00:00 2001
From: Nirbhay Singh <121793120+nirbhayel@users.noreply.github.com>
Date: Mon, 30 Dec 2024 22:03:53 +0530
Subject: [PATCH 019/290] [APP-721] Render widget and global settings (#124)
* add: webhook endpoint
* add: widget module
* add: default widget settings on successful registration
* update: name of global object to ea11yWidget
* update: remove json encoding to make objects available on the frontend
* update: widget url, filter and enqueuing method
* update: removed obsolete code
* update: enqueue script only when connected
* update: add check for valid plan data and key
* update: conditional check
* update: conditional check
---
classes/services/client.php | 16 ++++--
includes/manager.php | 1 +
modules/settings/classes/settings.php | 2 +
modules/settings/module.php | 73 +++++++++++++++++++++++++++
modules/widget/module.php | 66 ++++++++++++++++++++++++
5 files changed, 154 insertions(+), 4 deletions(-)
create mode 100644 modules/widget/module.php
diff --git a/classes/services/client.php b/classes/services/client.php
index 58e34a89..38218738 100644
--- a/classes/services/client.php
+++ b/classes/services/client.php
@@ -56,9 +56,19 @@ public static function get_site_info(): array {
'user_agent' => ! empty( $_SERVER['HTTP_USER_AGENT'] )
? sanitize_text_field( wp_unslash( $_SERVER['HTTP_USER_AGENT'] ) )
: 'Unknown',
+ 'webhook_url' => self::webhook_endpoint(),
];
}
+ /**
+ * Log update endpoint
+ * @return string
+ */
+ private static function webhook_endpoint(): string {
+ $blog_id = get_current_blog_id();
+ return get_rest_url( $blog_id, 'a11y/v1/webhooks/common' );
+ }
+
public function make_request( $method, $endpoint, $body = [], array $headers = [], $send_json = false ) {
$headers = array_replace_recursive( [
'x-elementor-a11y' => EA11Y_VERSION,
@@ -147,14 +157,12 @@ protected function request( $method, $endpoint, $args = [] ) {
$body = true;
}
- // Return with no content on successfull deletion of domain from service.
+ // Return with no content on successful deletion of domain from service.
if ( 204 === $response_code ) {
$body = true;
return $body;
}
- $body = json_decode( $body );
-
if ( false === $body ) {
return new WP_Error( 422, 'Wrong Server Response' );
}
@@ -167,7 +175,7 @@ protected function request( $method, $endpoint, $args = [] ) {
return $this->request( $method, $endpoint, $args );
}
- if ( ! in_array( $response_code, [ 200, 201 ] ) ) {
+ if ( ! in_array( $response_code, [ 200, 201 ], true ) ) {
// In case $as_array = true.
$message = $body->message ?? wp_remote_retrieve_response_message( $response );
$message = is_array( $message ) ? join( ', ', $message ) : $message;
diff --git a/includes/manager.php b/includes/manager.php
index a5ddaab8..ab839df9 100644
--- a/includes/manager.php
+++ b/includes/manager.php
@@ -19,6 +19,7 @@ public static function get_module_list(): array {
'Legacy',
'Connect',
'Settings',
+ 'Widget',
'Core',
];
}
diff --git a/modules/settings/classes/settings.php b/modules/settings/classes/settings.php
index ff77904d..42589bc9 100644
--- a/modules/settings/classes/settings.php
+++ b/modules/settings/classes/settings.php
@@ -11,6 +11,8 @@ class Settings {
public const IS_VALID_PLAN_DATA = 'ea11y_is_valid_plan_data';
public const PLAN_DATA = 'ea11y_plan_data';
+ public const WIDGET_ICON_SETTINGS = 'ea11y_widget_icon_settings';
+ public const WIDGET_MENU_SETTINGS = 'ea11y_widget_menu_settings';
/**
* Returns plugin settings data by option name
diff --git a/modules/settings/module.php b/modules/settings/module.php
index 2a85bc35..041cacdd 100644
--- a/modules/settings/module.php
+++ b/modules/settings/module.php
@@ -124,12 +124,85 @@ public function on_connect(): void {
Data::set_subscription_id( $register_response->id );
update_option( Settings::PLAN_DATA, $register_response );
update_option( Settings::IS_VALID_PLAN_DATA, true );
+ $this->set_default_settings();
} else {
Logger::error( esc_html( $register_response->get_error_message() ) );
update_option( Settings::IS_VALID_PLAN_DATA, false );
}
}
+ /**
+ * Set default values after successful registration.
+ * @return void
+ */
+ private function set_default_settings() : void {
+ $widget_menu_settings = [
+ 'content-adjustments' => [
+ 'text-size' => true,
+ 'line-height' => true,
+ 'align-text' => true,
+ 'readable-font' => true,
+ ],
+ 'color-adjustments' => [
+ 'greyscale' => true,
+ 'contrast' => true,
+ ],
+ 'orientation-adjustments' => [
+ 'page-structure' => true,
+ 'site-map' => true,
+ 'reading-panel' => true,
+ 'hide-images' => true,
+ 'pause-animations' => true,
+ 'highlight-links' => true,
+ ],
+ ];
+
+ $widget_icon_settings = [
+ 'desktop' => [
+ 'hidden' => false,
+ 'enableExactPosition' => false,
+ 'exactPosition' => [
+ 'horizontal' => [
+ 'direction' => 'to-left',
+ 'value' => 10,
+ 'unit' => 'px',
+ ],
+ 'vertical' => [
+ 'direction' => 'higher',
+ 'value' => 10,
+ 'unit' => 'px',
+ ],
+ ],
+ 'position' => 'top-left',
+ ],
+ 'mobile' => [
+ 'hidden' => false,
+ 'enableExactPosition' => false,
+ 'exactPosition' => [
+ 'horizontal' => [
+ 'direction' => 'to-right',
+ 'value' => 10,
+ 'unit' => 'px',
+ ],
+ 'vertical' => [
+ 'direction' => 'lower',
+ 'value' => 10,
+ 'unit' => 'px',
+ ],
+ ],
+ 'position' => 'top-left',
+ ],
+ ];
+
+ if ( ! get_option( Settings::WIDGET_MENU_SETTINGS ) ) {
+ update_option( Settings::WIDGET_MENU_SETTINGS, $widget_menu_settings );
+ }
+
+ if ( ! get_option( Settings::WIDGET_ICON_SETTINGS ) ) {
+ update_option( Settings::WIDGET_ICON_SETTINGS, $widget_icon_settings );
+ }
+ }
+
/**
* Retry registering the site if it fails during connect.
*
diff --git a/modules/widget/module.php b/modules/widget/module.php
new file mode 100644
index 00000000..2ef87baa
--- /dev/null
+++ b/modules/widget/module.php
@@ -0,0 +1,66 @@
+public_api_key ) ) {
+ return;
+ }
+
+ wp_enqueue_script(
+ 'ea11y-widget',
+ $this->get_widget_url() .'?api_key=' . $plan_data->public_api_key,
+ [],
+ EA11Y_VERSION,
+ true
+ );
+
+ wp_localize_script(
+ 'ea11y-widget',
+ 'ea11yWidget',
+ [
+ 'iconSettings' => get_option( 'ea11y_widget_icon_settings' ),
+ 'menuSettings' => get_option( 'ea11y_widget_menu_settings' ),
+ ]
+ );
+ }
+
+ private function get_widget_url() : string {
+ return apply_filters( 'ea11y_widget_url', '' ); // TODO: add public url
+ }
+
+ /**
+ * Module constructor.
+ */
+ public function __construct() {
+ add_action( 'wp_enqueue_scripts', [ $this, 'enqueue_accessibility_widget' ] );
+ }
+}
From 6bcec99136bc8db389484e0df4fc4a3e4787c879 Mon Sep 17 00:00:00 2001
From: Nirbhay Singh <121793120+nirbhayel@users.noreply.github.com>
Date: Mon, 6 Jan 2025 17:36:44 +0530
Subject: [PATCH 020/290] fix: widget loading error (#128)
---
modules/widget/module.php | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/modules/widget/module.php b/modules/widget/module.php
index 2ef87baa..af05976c 100644
--- a/modules/widget/module.php
+++ b/modules/widget/module.php
@@ -29,7 +29,7 @@ public function enqueue_accessibility_widget () : void {
return;
}
- $plan_data = Settings::get( Settings::PLAN_DATA );
+ $plan_data = json_decode(Settings::get( Settings::PLAN_DATA ));
if ( ! isset( $plan_data->public_api_key ) ) {
return;
From 6b093b85b05cf1cc810c08fc02572a89b73a5cf3 Mon Sep 17 00:00:00 2001
From: Raz Ohad
Date: Tue, 7 Jan 2025 13:13:39 +0200
Subject: [PATCH 021/290] [Legacy] Upgrade To New [APP-949] (#127)
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* Added `Notice_Base` and `Notices` component to core module
* Always load core module and load all other modules based on legacy status
* added filter in customizer settings
* added bubble / pimple in admin menu to indicate upgrade
* added `Dismissible_Deprecated_Nag` notice to none legacy pages
* added `Dismissible_Deprecated_Nag` notice to legacy pages
* Added `Upgrade` component to legacy module
includes:
* loading of notices
* introduction modal
* admin menu pimple
* customizer notice
* pointer
* confirmation modal
* upgrade logic and handler
* ✅ Fixed legacy module test
* added `local:quick-run` command to run in browser mode
* update phpunit workflow
* ensure wp.ajax is loaded
* wrong translations
* Updated strings
* added "Equally"
* remove unused test
---
.github/workflows/phpunit.yml | 16 +-
classes/module-base.php | 5 +-
classes/utils/assets.php | 2 +-
classes/utils/notice-base.php | 215 +++++++++
modules/connect/classes/utils.php | 2 +-
modules/core/components/notices.php | 61 +++
modules/core/module.php | 7 +-
modules/legacy/components/customizer.php | 2 +-
modules/legacy/components/settings.php | 2 +-
modules/legacy/components/upgrade.php | 433 ++++++++++++++++++
modules/legacy/module.php | 9 +
.../notices/dismissible-deprecated-nag.php | 42 ++
.../legacy/notices/sticky-deprecated-nag.php | 43 ++
.../settings/components/settings-pointer.php | 1 +
modules/settings/module.php | 2 +-
package.json | 1 +
.../plugin/modules/legacy/module-test.php | 3 +-
17 files changed, 829 insertions(+), 17 deletions(-)
create mode 100644 classes/utils/notice-base.php
create mode 100644 modules/core/components/notices.php
create mode 100644 modules/legacy/components/upgrade.php
create mode 100644 modules/legacy/notices/dismissible-deprecated-nag.php
create mode 100644 modules/legacy/notices/sticky-deprecated-nag.php
diff --git a/.github/workflows/phpunit.yml b/.github/workflows/phpunit.yml
index a85ad10d..d11ffab2 100644
--- a/.github/workflows/phpunit.yml
+++ b/.github/workflows/phpunit.yml
@@ -92,16 +92,16 @@ jobs:
- name: Install dependencies
uses: ramsey/composer-install@v3
- #- name: Install Node.js
- # uses: actions/setup-node@v2
- # with:
- # node-version: 18.x
+ - name: Install Node.js
+ uses: actions/setup-node@v4
+ with:
+ node-version: 20.x
- #- name: Install dependencies
- # run: npm ci
+ - name: Install dependencies
+ run: npm ci
- #- name: Build assets
- # run: npm run build
+ - name: Build assets
+ run: npm run build
- name: Set up WordPress and WordPress Test Library
uses: sjinks/setup-wordpress-test-library@master
diff --git a/classes/module-base.php b/classes/module-base.php
index bfc41351..61b0c45b 100644
--- a/classes/module-base.php
+++ b/classes/module-base.php
@@ -2,6 +2,7 @@
namespace EA11y\Classes;
+use EA11y\Modules\Legacy\Module as LegacyModule;
use ReflectionClass;
use ReflectionException;
@@ -101,8 +102,8 @@ public static function set_instance( $instance ) {
* @static
* @return bool
*/
- public static function is_active() {
- return true;
+ public static function is_active(): bool {
+ return ! LegacyModule::is_active();
}
/**
diff --git a/classes/utils/assets.php b/classes/utils/assets.php
index aa2e2cf5..3ea62a30 100644
--- a/classes/utils/assets.php
+++ b/classes/utils/assets.php
@@ -126,7 +126,7 @@ public static function enqueue_app_assets( string $handle = '', bool $with_css =
);
// add translation support
- wp_set_script_translations( $handle, 'elementor-sw' );
+ wp_set_script_translations( $handle, 'pojo-accessibility' );
if ( ! $with_css ) {
return;
diff --git a/classes/utils/notice-base.php b/classes/utils/notice-base.php
new file mode 100644
index 00000000..d90bf754
--- /dev/null
+++ b/classes/utils/notice-base.php
@@ -0,0 +1,215 @@
+id;
+ }
+
+ /**
+ * Get the action name for the notice
+ *
+ * @return string
+ */
+ public function get_action_name() : string {
+ return self::ACTION_PREFIX . '_' . $this->get_id();
+ }
+
+
+ public function show(): bool {
+ if ( ! $this->conditions ) {
+ return false;
+ }
+ if ( $this->is_dismissible && $this->is_dismissed() ) {
+ return false;
+ }
+ if ( $this->capability && ! current_user_can( $this->capability ) ) {
+ return false;
+ }
+ return true;
+ }
+
+ public function is_dismissed() : bool {
+ if ( $this->per_user ) {
+ $dismissed = get_user_meta( get_current_user_id(), self::DISMISSED_NOTICES, true );
+ } else {
+ $dismissed = get_option( self::DISMISSED_NOTICES, [] );
+ }
+ return in_array( $this->get_id(), (array) $dismissed );
+ }
+
+ public function dismiss() {
+ $dismissed = get_option( self::DISMISSED_NOTICES, [] );
+ $dismissed[] = $this->get_id();
+ update_option( self::DISMISSED_NOTICES, $dismissed, false );
+ }
+
+ public function dismiss_per_user() {
+ $user_id = get_current_user_id();
+ if ( ! $user_id ) {
+ wp_send_json_error( [ 'message' => 'Invalid user' ] );
+ }
+ $dismissed = get_user_meta( $user_id, self::DISMISSED_NOTICES, true );
+ if ( ! $dismissed ) {
+ $dismissed = [];
+ }
+ $dismissed[] = $this->get_id();
+ update_user_meta( $user_id, self::DISMISSED_NOTICES, $dismissed );
+ }
+
+ public function handle_dismiss() {
+ if ( ! $this->is_dismissible ) {
+ return;
+ }
+ if ( ! isset( $_REQUEST['nonce'] ) || ! wp_verify_nonce( sanitize_text_field( wp_unslash( $_REQUEST['nonce'] ) ), $this->get_action_name() ) ) {
+ wp_send_json_error( [ 'message' => 'Invalid nonce' ] );
+ }
+
+ if ($this->per_user) {
+ $this->dismiss_per_user();
+ } else {
+ $this->dismiss();
+ }
+
+ wp_send_json_success( [] );
+ }
+
+ public function render() {
+ echo sprintf( '%6$s
',
+ $this->is_dismissible ? 'ea11y-dismiss is-dismissible' : '',
+ esc_attr( $this->type ),
+ esc_attr( $this->get_id() ),
+ esc_attr( $this->get_action_name() ),
+ wp_create_nonce( $this->get_action_name() ),
+ $this->content()
+ );
+ }
+
+ public function print_js() {
+ // used to make sure we only print this js once per page
+ $action = 'admin_notices_print_js';
+ if ( did_action( $action ) ) {
+ return;
+ }
+ do_action( $action );
+
+ ?>
+
+ show() ) {
+ return;
+ }
+ if ( $this->is_dismissible ) {
+ add_action( 'admin_footer', [ $this, 'print_js' ] );
+ }
+
+ $this->render();
+ }
+
+ public function content(): string {
+ return $this->content;
+ }
+
+ /**
+ * @throws \Exception
+ */
+ public function __construct() {
+ if ( ! $this->content() ) {
+ throw new \Exception( 'Notice content is required' );
+ }
+
+ if ( ! in_array( $this->type, [ 'info', 'warning', 'error', 'success' ] ) ) {
+ throw new \Exception( 'Invalid notice type' );
+ }
+ }
+}
diff --git a/modules/connect/classes/utils.php b/modules/connect/classes/utils.php
index 9edfc198..c4c0c863 100644
--- a/modules/connect/classes/utils.php
+++ b/modules/connect/classes/utils.php
@@ -22,7 +22,7 @@ public static function get_clients_url(): string {
* get_redirect_uri
* @return string
*/
- public static function get_redirect_uri( string $domain = '' ): string {
+ public static function get_redirect_uri( string $domain = '' ) : string {
if ( false !== strpos( Config::ADMIN_PAGE, '?page=' ) ) {
$admin_url = admin_url( Config::ADMIN_PAGE );
} else {
diff --git a/modules/core/components/notices.php b/modules/core/components/notices.php
new file mode 100644
index 00000000..aa375ad6
--- /dev/null
+++ b/modules/core/components/notices.php
@@ -0,0 +1,61 @@
+notices[ $notice_instance->get_id() ] = $notice_instance;
+ }
+
+ public function show_notices() {
+ foreach ( $this->notices as $notice ) {
+ $notice->maybe_show_notice();
+ }
+ }
+
+ public function handle_dismiss() {
+ if ( empty( $_REQUEST['notice_id'] ) ) {
+ wp_send_json_error( [ 'message' => 'Invalid ID' ] );
+ }
+
+ $notice = $this->get_notice( sanitize_text_field( wp_unslash( $_REQUEST['notice_id'] ) ) );
+ if ( ! $notice ) {
+ wp_send_json_error( [ 'message' => 'Invalid ID' ] );
+ }
+
+ $notice->handle_dismiss();
+
+ wp_send_json_success( [] );
+ }
+
+ /**
+ * @param string $sanitize_text_field
+ *
+ * @return Notice_Base|null
+ */
+ private function get_notice( string $sanitize_text_field ): ?Notice_Base {
+ return $this->notices[ $sanitize_text_field ] ?? null;
+ }
+
+ public function __construct() {
+ if ( ! is_admin() ) {
+ return;
+ }
+ add_action( 'admin_notices', [ $this, 'show_notices' ] );
+ add_action( 'wp_ajax_' . self::AJAX_ACTION, [ $this, 'handle_dismiss' ] );
+ do_action( 'ea11y_register_notices', $this );
+ }
+}
diff --git a/modules/core/module.php b/modules/core/module.php
index 4650674b..2d14f9c9 100644
--- a/modules/core/module.php
+++ b/modules/core/module.php
@@ -17,10 +17,11 @@ public function get_name(): string {
public static function component_list() : array {
return [
'Pointers',
+ 'Notices',
];
}
- public function add_plugin_links( $links, $plugin_file_name ): array {
+ public function add_plugin_links( $links, $plugin_file_name ) : array {
if ( ! str_ends_with( $plugin_file_name, '/pojo-accessibility.php' ) ) {
return (array) $links;
}
@@ -50,6 +51,10 @@ public function add_plugin_links( $links, $plugin_file_name ): array {
return array_merge( $custom_links, $links );
}
+ public static function is_active() : bool {
+ return true;
+ }
+
/**
* Module constructor.
*/
diff --git a/modules/legacy/components/customizer.php b/modules/legacy/components/customizer.php
index 464c831f..a3a93838 100644
--- a/modules/legacy/components/customizer.php
+++ b/modules/legacy/components/customizer.php
@@ -171,7 +171,7 @@ public function customize_a11y( $wp_customize ) {
$section_description = '' . __( 'Use the control below to customize the appearance and layout of the Accessibility Toolbar', 'pojo-accessibility' ) . '
' .
sprintf( __( 'Additional Toolbar settings can be configured at the %s page.', 'pojo-accessibility' ),
'' . __( 'Accessibility Toolbar', 'pojo-accessibility' ) . ' '
- ) . '
';
+ ) . '
' . apply_filters( 'pojo_a11y_customizer_section_description', '' );
$wp_customize->add_section( 'accessibility', [
'title' => __( 'Accessibility', 'pojo-accessibility' ),
diff --git a/modules/legacy/components/settings.php b/modules/legacy/components/settings.php
index 6e86fb4d..821798d1 100644
--- a/modules/legacy/components/settings.php
+++ b/modules/legacy/components/settings.php
@@ -575,7 +575,7 @@ public function display_settings_page() {
public function admin_menu() {
$this->menu_slug = add_menu_page(
__( 'Accessibility', 'pojo-accessibility' ),
- __( 'Accessibility', 'pojo-accessibility' ),
+ __( 'Accessibility', 'pojo-accessibility' ) . ' ',
'manage_options',
'accessibility-settings',
[ &$this, 'display_settings_page' ],
diff --git a/modules/legacy/components/upgrade.php b/modules/legacy/components/upgrade.php
new file mode 100644
index 00000000..3e194f3d
--- /dev/null
+++ b/modules/legacy/components/upgrade.php
@@ -0,0 +1,433 @@
+base, [ Settings::SETTINGS_PAGE, Settings::TOOLBAR_PAGE ] );
+ }
+
+ /**
+ * get_learn_more_link
+ * @return string
+ */
+ public static function get_learn_more_link() : string {
+ return 'https://www.pojo.me/accessibility/';
+ }
+
+ /**
+ * get_switch_now_link
+ * @return string
+ */
+ public static function get_switch_now_link() : string {
+ return add_query_arg( [
+ 'page' => 'accessibility-settings',
+ self::CONFIRMATION_MODAL => '1',
+ ], admin_url() );
+ }
+
+ /**
+ * add_deprecated_notice_to_customizer_section_description
+ * @return string
+ */
+ public function add_deprecated_notice_to_customizer_section_description(): string {
+ $content = sprintf(
+ '%s
%s
%s
',
+ esc_html__( 'New! Switch to our updated accessibility widget for better features and control.', 'pojo-accessibility' ),
+ self::get_learn_more_link(),
+ esc_html__( 'Learn More', 'pojo-accessibility' ),
+ self::get_switch_now_link(),
+ esc_html__( 'Switch Now', 'pojo-accessibility' )
+ );
+ return "";
+ }
+
+ /**
+ * maybe_add_introduction_modal
+ */
+ public function maybe_add_introduction_modal() {
+ if ( $this->disable_introduction_modal ) {
+ return;
+ }
+
+ // only show to admins on legacy pages and to admin users
+ if ( ! $this->is_legacy_page() || ! current_user_can( 'manage_options' ) ) {
+ return;
+ }
+
+ $dismissed = get_user_meta( get_current_user_id(), self::INTRODUCTION_NOTICE, true );
+ if ( $dismissed ) {
+ return;
+ }
+
+ add_thickbox();
+ wp_enqueue_script( 'jquery' );
+ add_action( 'admin_footer', function() {
+ ?>
+
+
+
+ is_legacy_page() || ! current_user_can( 'manage_options' ) ) {
+ return;
+ }
+
+ if ( ! isset( $_GET[ self::CONFIRMATION_MODAL ] ) ) {
+ return;
+ }
+
+ $this->disable_introduction_modal = true;
+
+ add_thickbox();
+ wp_enqueue_script( 'jquery' );
+ add_action( 'admin_footer', function() {
+ ?>
+
+
+
add icons here!!!
+
+
+
+
+
+
+
+ register_notice( new $class_name() );
+ }
+ }
+
+ /**
+ * handle_ajax_upgrade
+ */
+ public function handle_ajax_upgrade() {
+ if ( ! current_user_can( 'manage_options' ) ) {
+ wp_send_json_error( [ 'message' => 'Unauthorized' ] );
+ }
+
+ if ( ! isset( $_REQUEST['nonce'] ) || ! wp_verify_nonce( sanitize_text_field( wp_unslash( $_REQUEST['nonce'] ) ), self::AJAX_ACTION ) ) {
+ wp_send_json_error( [ 'message' => 'Invalid nonce' ] );
+ }
+
+ self::upgrade();
+ wp_send_json_success( [] );
+ }
+
+ /**
+ * maybe_render_pointer
+ */
+ public function maybe_render_pointer() {
+ if ( ! current_user_can( 'manage_options' ) ) {
+ return;
+ }
+
+ if ( $this->is_legacy_page() ) {
+ return;
+ }
+
+ if ( Pointers::is_dismissed( self::AJAX_ACTION ) ) {
+ return;
+ }
+
+
+ wp_enqueue_script( 'wp-pointer' );
+ wp_enqueue_style( 'wp-pointer' );
+
+ $pointer_content = '' . esc_html__( 'Accessibility', 'pojo-accessibility' ) . ' ';
+ $pointer_content .= '' . esc_html__( "Our new, improved accessibility widget is now available! Equally is packed with advanced styling options, improved feature controls, and so much more. ", 'pojo-accessibility' ) . '
';
+
+ $pointer_content .= sprintf(
+ '%s
',
+ self::get_switch_now_link(),
+ esc_html__( 'View more details', 'pojo-accessibility' )
+ );
+
+ $allowed_tags = [
+ 'h3' => [],
+ 'p' => [],
+ 'a' => [
+ 'class' => [],
+ 'href' => [],
+ ],
+ ];
+ ?>
+
+
+
+ modules_manager->get_modules( 'Legacy' )->get_component( 'Settings' );
}
+ public static function is_active(): bool {
+ if ( get_option( 'pojo_a11y_toolbar', false ) && ! Upgrade::is_upgraded() ) {
+ return true;
+ }
+ return false;
+ }
+
/**
* Module constructor.
*/
diff --git a/modules/legacy/notices/dismissible-deprecated-nag.php b/modules/legacy/notices/dismissible-deprecated-nag.php
new file mode 100644
index 00000000..a6e55c72
--- /dev/null
+++ b/modules/legacy/notices/dismissible-deprecated-nag.php
@@ -0,0 +1,42 @@
+conditions = false;
+ }
+ }
+
+ public function content(): string {
+ return sprintf( '%s
%s %s
',
+ esc_html__( 'Time to take your site’s accessibility to the next level with Equally, our newest accessibility widget is packed advanced customization, flexible feature controls, and a built-in statement generator. Want more details before switching?', 'pojo-accessibility' ),
+ esc_attr( Upgrade::get_learn_more_link() ),
+ esc_html__( 'Learn more', 'pojo-accessibility' ),
+ esc_attr( Upgrade::get_switch_now_link() ),
+ esc_html__( 'Switch To Equally', 'pojo-accessibility' )
+ );
+ }
+
+ public function __construct() {
+ add_action( 'current_screen', [ $this, 'maybe_add_nag_deprecation_notice' ] );
+ parent::__construct();
+ }
+}
diff --git a/modules/legacy/notices/sticky-deprecated-nag.php b/modules/legacy/notices/sticky-deprecated-nag.php
new file mode 100644
index 00000000..1ae6abba
--- /dev/null
+++ b/modules/legacy/notices/sticky-deprecated-nag.php
@@ -0,0 +1,43 @@
+%s%s%s
%s
',
+ __( 'New accessibility widget available!', 'pojo-accessibility' ),
+ __( 'Your current accessibility Widget is no longer supported. Switch to Equally by Elementor now to access more customization, control, and tools for a more inclusive site.', 'pojo-accessibility' ),
+ Upgrade::get_learn_more_link(), // link to learn more
+ __( 'Learn More', 'pojo-accessibility' ),
+ Upgrade::get_switch_now_link(), // link to switch now
+ __( 'Switch Now', 'pojo-accessibility' )
+ );
+ }
+
+ public function maybe_add_nag_deprecation_notice() {
+ if ( ! Upgrade::is_legacy_page() ) {
+ $this->conditions = false;
+ }
+ }
+
+ public function __construct() {
+ add_action( 'current_screen', [ $this, 'maybe_add_nag_deprecation_notice' ] );
+ parent::__construct();
+ }
+}
diff --git a/modules/settings/components/settings-pointer.php b/modules/settings/components/settings-pointer.php
index 39415e00..f2f3273d 100644
--- a/modules/settings/components/settings-pointer.php
+++ b/modules/settings/components/settings-pointer.php
@@ -23,6 +23,7 @@ public function admin_print_script() {
wp_enqueue_script( 'wp-pointer' );
wp_enqueue_style( 'wp-pointer' );
+ wp_enqueue_script( 'wp-util' );
$pointer_content = '' . esc_html__( 'One Click Accessibility', 'pojo-accessibility' ) . ' ';
$pointer_content .= '' . esc_html__( "Start setting up and customizing your site's accessibility widget.", 'pojo-accessibility' ) . '
';
diff --git a/modules/settings/module.php b/modules/settings/module.php
index 041cacdd..810e1a2c 100644
--- a/modules/settings/module.php
+++ b/modules/settings/module.php
@@ -292,7 +292,7 @@ public function __construct() {
$this->register_routes();
$this->register_components( self::component_list() );
add_action( 'admin_menu', [ $this, 'register_page' ] );
- add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_scripts' ] );
+ add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_scripts' ], 9 );
add_action( 'rest_api_init', [ $this, 'register_settings' ] );
add_action( 'on_connect_' . Config::APP_PREFIX . '_connected', [ $this, 'on_connect' ] );
add_action( 'current_screen', [ $this, 'check_plan_data' ] );
diff --git a/package.json b/package.json
index 7604992f..76a143e7 100644
--- a/package.json
+++ b/package.json
@@ -13,6 +13,7 @@
"prepare": "husky install",
"local:start": "wp-env start",
"local:stop": "wp-env stop",
+ "local:quick-run": "npx @wp-now/wp-now start",
"local:composer:dev": "wp-env run cli --env-cwd=wp-content/plugins/one-click-accessibility composer install",
"local:composer:build": "wp-env run cli --env-cwd=wp-content/plugins/one-click-accessibility composer install --no-dev",
"local:wp-cli": "wp-env run cli --env-cwd=wp-content/plugins/one-click-accessibility wp",
diff --git a/tests/phpunit/plugin/modules/legacy/module-test.php b/tests/phpunit/plugin/modules/legacy/module-test.php
index 4f5af7ab..92fb22a1 100644
--- a/tests/phpunit/plugin/modules/legacy/module-test.php
+++ b/tests/phpunit/plugin/modules/legacy/module-test.php
@@ -13,7 +13,8 @@ class Module extends Module_Test_Base {
'Frontend',
'Customizer',
'Settings',
- 'Admin'
+ 'Admin',
+ 'Upgrade'
];
public $routes = [];
From c33cd72e2d35e43b01e95271bb140bc64ac5411c Mon Sep 17 00:00:00 2001
From: Raz Ohad
Date: Wed, 8 Jan 2025 11:54:17 +0200
Subject: [PATCH 022/290] =?UTF-8?q?=E2=9C=85=20use=20custom=20version=20of?=
=?UTF-8?q?=20wp=20test=20library=20(#129)?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
* ✅ use custom version of wp test library
* cleanup
* update WP versions for testing
---
.github/workflows/phpunit.yml | 4 ++--
phpunit.xml | 28 ----------------------------
2 files changed, 2 insertions(+), 30 deletions(-)
delete mode 100755 phpunit.xml
diff --git a/.github/workflows/phpunit.yml b/.github/workflows/phpunit.yml
index d11ffab2..077eff9e 100644
--- a/.github/workflows/phpunit.yml
+++ b/.github/workflows/phpunit.yml
@@ -23,7 +23,7 @@ jobs:
fail-fast: false
matrix:
php: [7.4, 8.0, 8.1, 8.2]
- wp: [6.4.x, latest, nightly]
+ wp: [6.5.x, 6.6.x, latest, nightly]
ms: [no, yes]
coverage: [no]
phpunit: [9]
@@ -104,7 +104,7 @@ jobs:
run: npm run build
- name: Set up WordPress and WordPress Test Library
- uses: sjinks/setup-wordpress-test-library@master
+ uses: bainternet/setup-wordpress-test-library@master
with:
version: ${{ matrix.wp }}
diff --git a/phpunit.xml b/phpunit.xml
deleted file mode 100755
index 1d881d87..00000000
--- a/phpunit.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-
-
-
-
-
-
-
- ./tests/
-
-
-
-
-
- ./
-
- tests
-
-
-
-
-
\ No newline at end of file
From 74712192efec6e53e80c9347bc8e7a7ccf1bf44a Mon Sep 17 00:00:00 2001
From: Nirbhay Singh <121793120+nirbhayel@users.noreply.github.com>
Date: Thu, 9 Jan 2025 13:33:54 +0530
Subject: [PATCH 023/290] [APP-711] Widget preview (#130)
* add: dynamic script loader for widget
* update: settings name
* update: settings save function and comments
* update: tools settings object structure
* add: widget preview section
* update: added setting page slug as a constant
* update: enqueue widget for preview in the settings
* add: widget icon assets link
* add: widget icon svgs
* update: store widget url in a constant
* update: store widget url in a constant
* update: trigger widget preview update on menu item changes
* update: remove the icon option from the frontend.
* update: add widget URL
* update: plan data setting type
* update: widget plan url
* update: widget plan url and parse plan data
* fix: phpcs error ext-json missing
* fix: widget url
* fix: save and use plan data as a serialized option
* fix: use template string for widget url
---
assets/images/widget-icon-controls.svg | 4 +
assets/images/widget-icon-eye.svg | 11 +++
assets/images/widget-icon-person.svg | 5 ++
assets/images/widget-icon-text.svg | 6 ++
composer.json | 3 +-
.../components/dynamic-script-loader/index.js | 46 ++++++++++
.../settings/assets/js/components/index.js | 1 +
modules/settings/assets/js/constants/index.js | 1 +
.../assets/js/constants/menu-settings.js | 17 ++--
.../settings/assets/js/hooks/use-settings.js | 46 ++++++----
.../assets/js/layouts/menu-settings.js | 27 +++---
.../assets/js/layouts/widget-preview.js | 39 ++++++--
modules/settings/module.php | 76 ++++++++++------
modules/widget/module.php | 90 ++++++++++++++++++-
14 files changed, 292 insertions(+), 80 deletions(-)
create mode 100644 assets/images/widget-icon-controls.svg
create mode 100644 assets/images/widget-icon-eye.svg
create mode 100644 assets/images/widget-icon-person.svg
create mode 100644 assets/images/widget-icon-text.svg
create mode 100644 modules/settings/assets/js/components/dynamic-script-loader/index.js
diff --git a/assets/images/widget-icon-controls.svg b/assets/images/widget-icon-controls.svg
new file mode 100644
index 00000000..72335f21
--- /dev/null
+++ b/assets/images/widget-icon-controls.svg
@@ -0,0 +1,4 @@
+
+
+
+
diff --git a/assets/images/widget-icon-eye.svg b/assets/images/widget-icon-eye.svg
new file mode 100644
index 00000000..56ebe87d
--- /dev/null
+++ b/assets/images/widget-icon-eye.svg
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/assets/images/widget-icon-person.svg b/assets/images/widget-icon-person.svg
new file mode 100644
index 00000000..c1b545d1
--- /dev/null
+++ b/assets/images/widget-icon-person.svg
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/assets/images/widget-icon-text.svg b/assets/images/widget-icon-text.svg
new file mode 100644
index 00000000..32e89e9f
--- /dev/null
+++ b/assets/images/widget-icon-text.svg
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/composer.json b/composer.json
index 97f699d3..f2f3a08e 100644
--- a/composer.json
+++ b/composer.json
@@ -26,7 +26,8 @@
"lint": "phpcs --standard=./ruleset.xml ./**/*.php"
},
"require": {
- "firebase/php-jwt": "^6.10"
+ "firebase/php-jwt": "^6.10",
+ "ext-json": "*"
},
"config": {
"allow-plugins": {
diff --git a/modules/settings/assets/js/components/dynamic-script-loader/index.js b/modules/settings/assets/js/components/dynamic-script-loader/index.js
new file mode 100644
index 00000000..6bb83fb5
--- /dev/null
+++ b/modules/settings/assets/js/components/dynamic-script-loader/index.js
@@ -0,0 +1,46 @@
+import { useEffect } from '@wordpress/element';
+
+const DynamicScriptLoader = ({ src, onLoad, onError }) => {
+ useEffect(() => {
+ // Check if the script already exists
+ const existingScript = document.querySelector(`script[src="${src}"]`);
+ if (existingScript) {
+ console.log(`Script with src "${src}" already loaded.`);
+ return;
+ }
+
+ // Create a new script element
+ const script = document.createElement('script');
+ script.src = src;
+ script.async = true;
+
+ // Attach onLoad and onError handlers
+ script.onload = () => {
+ console.log(`Script loaded successfully: ${src}`);
+ if (onLoad) {
+ onLoad();
+ window?.ea11yWidget?.widget?.open();
+ }
+ };
+
+ script.onerror = () => {
+ console.error(`Failed to load script: ${src}`);
+ if (onError) {
+ onError();
+ }
+ };
+
+ // Append the script to the document head
+ document.head.appendChild(script);
+
+ // Cleanup: Remove the script if the component unmounts
+ return () => {
+ document.head.removeChild(script);
+ console.log(`Script removed: ${src}`);
+ };
+ }, [src, onLoad, onError]);
+
+ return null;
+};
+
+export default DynamicScriptLoader;
diff --git a/modules/settings/assets/js/components/index.js b/modules/settings/assets/js/components/index.js
index 963b0a54..c5d3cffe 100644
--- a/modules/settings/assets/js/components/index.js
+++ b/modules/settings/assets/js/components/index.js
@@ -12,3 +12,4 @@ export { MenuItems } from '../components/sidebar-menu/menu';
export { default as AdminTopBar } from './admin-top-bar';
export { default as BottomBar } from './bottom-bar';
export { default as PostConnectModal } from './post-connect-modal';
+export { default as DynamicScriptLoader } from './dynamic-script-loader';
diff --git a/modules/settings/assets/js/constants/index.js b/modules/settings/assets/js/constants/index.js
index 3df31794..a61af180 100644
--- a/modules/settings/assets/js/constants/index.js
+++ b/modules/settings/assets/js/constants/index.js
@@ -1,3 +1,4 @@
export const HELP_LINK = 'https://go.elementor.com/';
export const UPGRADE_LINK = 'https://go.elementor.com/';
export const BILLING_LINK = 'https://my.elementor.com/';
+export const WIDGET_URL = 'https://cdn.elementor.com/a11y/widget.js';
diff --git a/modules/settings/assets/js/constants/menu-settings.js b/modules/settings/assets/js/constants/menu-settings.js
index 65c3d10c..86d01eed 100644
--- a/modules/settings/assets/js/constants/menu-settings.js
+++ b/modules/settings/assets/js/constants/menu-settings.js
@@ -7,7 +7,6 @@ import {
TextSizeIcon,
ContrastIcon,
PageStructureIcon,
- SiteMapIcon,
ReadingPanelIcon,
HideImagesIcon,
PauseAnimationsIcon,
@@ -20,15 +19,15 @@ export const MENU_SETTINGS = {
'content-adjustments': {
title: __('Content Adjustments', 'pojo-accessibility'),
options: {
- 'text-size': {
+ 'bigger-text': {
title: __('Adjust text size', 'pojo-accessibility'),
icon: ,
},
- 'line-height': {
+ 'bigger-line-height': {
title: __('Adjust line height', 'pojo-accessibility'),
icon: ,
},
- 'align-text': {
+ 'text-align': {
title: __('Align text', 'pojo-accessibility'),
icon: ,
},
@@ -41,7 +40,7 @@ export const MENU_SETTINGS = {
'color-adjustments': {
title: __('Color Adjustments', 'pojo-accessibility'),
options: {
- greyscale: {
+ grayscale: {
title: __('Greyscale', 'pojo-accessibility'),
icon: ,
},
@@ -58,12 +57,8 @@ export const MENU_SETTINGS = {
title: __('Page structure', 'pojo-accessibility'),
icon: ,
},
- 'site-map': {
- title: __('Site map', 'pojo-accessibility'),
- icon: ,
- },
- 'reading-panel': {
- title: __('Reading panel', 'pojo-accessibility'),
+ 'reading-mask': {
+ title: __('Reading mask', 'pojo-accessibility'),
icon: ,
},
'hide-images': {
diff --git a/modules/settings/assets/js/hooks/use-settings.js b/modules/settings/assets/js/hooks/use-settings.js
index 1e079b9e..637ad6c3 100644
--- a/modules/settings/assets/js/hooks/use-settings.js
+++ b/modules/settings/assets/js/hooks/use-settings.js
@@ -15,24 +15,40 @@ export const SettingsProvider = ({ children }) => {
parent: 'widget',
child: 'iconSettings',
});
+
const [widgetMenuSettings, setWidgetMenuSettings] = useState({
- 'content-adjustments': {
- 'text-size': true,
- 'line-height': true,
- 'align-text': true,
- 'readable-font': true,
+ 'bigger-text': {
+ enabled: true,
+ },
+ 'bigger-line-height': {
+ enabled: true,
+ },
+ 'text-align': {
+ enabled: true,
+ },
+ 'readable-font': {
+ enabled: true,
+ },
+ grayscale: {
+ enabled: true,
+ },
+ contrast: {
+ enabled: true,
+ },
+ 'page-structure': {
+ enabled: true,
+ },
+ 'reading-mask': {
+ enabled: true,
+ },
+ 'hide-images': {
+ enabled: true,
},
- 'color-adjustments': {
- greyscale: true,
- contrast: true,
+ 'pause-animations': {
+ enabled: true,
},
- 'orientation-adjustments': {
- 'page-structure': true,
- 'site-map': true,
- 'reading-panel': true,
- 'hide-images': true,
- 'pause-animations': true,
- 'highlight-links': true,
+ 'highlight-links': {
+ enabled: true,
},
});
diff --git a/modules/settings/assets/js/layouts/menu-settings.js b/modules/settings/assets/js/layouts/menu-settings.js
index 8b867f49..94e360f6 100644
--- a/modules/settings/assets/js/layouts/menu-settings.js
+++ b/modules/settings/assets/js/layouts/menu-settings.js
@@ -17,7 +17,7 @@ import { useEffect, useState } from '@wordpress/element';
import { __ } from '@wordpress/i18n';
import { MENU_SETTINGS } from '../constants/menu-settings';
-// Customization for the WP admin global CSS.
+// Customization to override the WP admin global CSS.
const StyledSwitch = styled(Switch)(() => ({
input: {
height: '56px',
@@ -45,30 +45,32 @@ const MenuSettings = () => {
});
}
}, [widgetMenuSettings]);
- // Function to toggle the value of a setting
+
+ // Toggle the value of a setting
const toggleSetting = (category, option) => {
setWidgetMenuSettings((prevSettings) => {
const newSettings = {
...prevSettings,
- [category]: {
- ...prevSettings[category],
- [option]: !prevSettings[category][option],
+ [option]: {
+ enabled: !prevSettings[option]?.enabled,
},
};
- setHasChanges(true); // Mark as changed
+ setHasChanges(true);
+ if (window?.ea11yWidget?.toolsSettings) {
+ window.ea11yWidget.toolsSettings = newSettings;
+ window.ea11yWidget.widget.updateState();
+ }
return newSettings;
});
};
- // Function to check if at least two options are enabled
+ // Check if at least two options are enabled
const areAtLeastTwoOptionsEnabled = (settings) => {
let enabledCount = 0;
- // Iterate through each category in settings
for (const category in settings) {
if (settings.hasOwnProperty(category)) {
- // Count enabled options in the current category
for (const option in settings[category]) {
if (settings[category][option]) {
enabledCount++;
@@ -77,7 +79,7 @@ const MenuSettings = () => {
}
}
- return enabledCount > 2; // Return true if at least two options are enabled
+ return enabledCount > 2;
};
const handleCloseNotification = () => {
@@ -126,14 +128,13 @@ const MenuSettings = () => {
size="medium"
color="info"
checked={
- widgetMenuSettings[parentKey]?.[childKey] ||
- false
+ widgetMenuSettings[childKey]?.enabled || false
}
onChange={() =>
toggleSetting(parentKey, childKey)
}
disabled={
- widgetMenuSettings[parentKey]?.[childKey]
+ widgetMenuSettings[childKey]?.enabled
? disableOptions
: false
}
diff --git a/modules/settings/assets/js/layouts/widget-preview.js b/modules/settings/assets/js/layouts/widget-preview.js
index d3cbc6aa..039f2eb2 100644
--- a/modules/settings/assets/js/layouts/widget-preview.js
+++ b/modules/settings/assets/js/layouts/widget-preview.js
@@ -1,20 +1,41 @@
import Card from '@elementor/ui/Card';
import CardContent from '@elementor/ui/CardContent';
import CardHeader from '@elementor/ui/CardHeader';
+import { DynamicScriptLoader } from '@ea11y/components';
+import { useSettings } from '@ea11y/hooks';
import { __ } from '@wordpress/i18n';
+import { WIDGET_URL } from '../constants';
const WidgetPreview = () => {
+ const { planData } = useSettings();
+ const handleScriptLoad = () => {
+ console.log('External script loaded!');
+ };
+
+ const handleScriptError = () => {
+ console.error('Failed to load the external script.');
+ };
return (
-
-
+
+
+
+
+
-
-
+ >
);
};
diff --git a/modules/settings/module.php b/modules/settings/module.php
index 810e1a2c..58b8960f 100644
--- a/modules/settings/module.php
+++ b/modules/settings/module.php
@@ -21,6 +21,7 @@ class Module extends Module_Base {
const SETTING_GROUP = 'ea11y_settings';
const SETTING_BASE_SLUG = 'accessibility-settings-2'; //TODO: Change this later
const SETTING_CAPABILITY = 'manage_options';
+ const SETTING_PAGE_SLUG = 'toplevel_page_' . self::SETTING_BASE_SLUG;
public function get_name(): string {
return 'settings';
@@ -67,8 +68,7 @@ public function register_page() : void {
* Enqueue Scripts and Styles
*/
public function enqueue_scripts( $hook ) : void {
- //TODO: Update page name
- if ( 'toplevel_page_accessibility-settings-2' !== $hook ) {
+ if ( self::SETTING_PAGE_SLUG !== $hook ) {
return;
}
@@ -120,9 +120,20 @@ public function on_connect(): void {
'site/register'
);
+ $this->save_plan_data( $register_response );
+ }
+
+ /**
+ * Save plan data to plan_data option
+ * @param $register_response
+ *
+ * @return void
+ */
+ public function save_plan_data( $register_response ) : void {
if ( $register_response && ! is_wp_error( $register_response ) ) {
- Data::set_subscription_id( $register_response->id );
- update_option( Settings::PLAN_DATA, $register_response );
+ $decoded_response = json_decode( $register_response );
+ Data::set_subscription_id( $decoded_response->id );
+ update_option( Settings::PLAN_DATA, $decoded_response );
update_option( Settings::IS_VALID_PLAN_DATA, true );
$this->set_default_settings();
} else {
@@ -137,23 +148,38 @@ public function on_connect(): void {
*/
private function set_default_settings() : void {
$widget_menu_settings = [
- 'content-adjustments' => [
- 'text-size' => true,
- 'line-height' => true,
- 'align-text' => true,
- 'readable-font' => true,
+ 'bigger-text' => [
+ 'enabled' => true,
+ ],
+ 'bigger-line-height' => [
+ 'enabled' => true,
+ ],
+ 'text-align' => [
+ 'enabled' => true,
],
- 'color-adjustments' => [
- 'greyscale' => true,
- 'contrast' => true,
+ 'readable-font' => [
+ 'enabled' => true,
],
- 'orientation-adjustments' => [
- 'page-structure' => true,
- 'site-map' => true,
- 'reading-panel' => true,
- 'hide-images' => true,
- 'pause-animations' => true,
- 'highlight-links' => true,
+ 'grayscale' => [
+ 'enabled' => true,
+ ],
+ 'contrast' => [
+ 'enabled' => true,
+ ],
+ 'page-structure' => [
+ 'enabled' => true,
+ ],
+ 'reading-mask' => [
+ 'enabled' => true,
+ ],
+ 'hide-images' => [
+ 'enabled' => true,
+ ],
+ 'pause-animations' => [
+ 'enabled' => true,
+ ],
+ 'highlight-links' => [
+ 'enabled' => true,
],
];
@@ -210,8 +236,7 @@ private function set_default_settings() : void {
* @return void
*/
public function check_plan_data( $current_screen ) : void {
- //TODO: Update page name
- if ( 'toplevel_page_accessibility-settings-2' !== $current_screen->base ) {
+ if ( self::SETTING_PAGE_SLUG !== $current_screen->base ) {
return;
}
@@ -221,14 +246,7 @@ public function check_plan_data( $current_screen ) : void {
'site/register'
);
- if ( $register_response && ! is_wp_error( $register_response ) ) {
- Data::set_subscription_id( $register_response->id );
- update_option( Settings::PLAN_DATA, $register_response );
- update_option( Settings::IS_VALID_PLAN_DATA, true );
- } else {
- Logger::error( esc_html( $register_response->get_error_message() ) );
- update_option( Settings::IS_VALID_PLAN_DATA, false );
- }
+ $this->save_plan_data( $register_response );
}
}
diff --git a/modules/widget/module.php b/modules/widget/module.php
index af05976c..8eda063c 100644
--- a/modules/widget/module.php
+++ b/modules/widget/module.php
@@ -4,6 +4,7 @@
use EA11y\Classes\Module_Base;
use EA11y\Modules\Connect\Module as Connect;
+use EA11y\Modules\Settings\Module as SettingsModule;
use EA11y\Modules\Settings\Classes\Settings;
use Exception;
@@ -29,7 +30,7 @@ public function enqueue_accessibility_widget () : void {
return;
}
- $plan_data = json_decode(Settings::get( Settings::PLAN_DATA ));
+ $plan_data = Settings::get( Settings::PLAN_DATA );
if ( ! isset( $plan_data->public_api_key ) ) {
return;
@@ -48,19 +49,104 @@ public function enqueue_accessibility_widget () : void {
'ea11yWidget',
[
'iconSettings' => get_option( 'ea11y_widget_icon_settings' ),
- 'menuSettings' => get_option( 'ea11y_widget_menu_settings' ),
+ 'toolsSettings' => get_option( 'ea11y_widget_menu_settings' ),
+ 'widgetIconURL' => $this->get_widget_icon_url(),
]
);
}
+ /**
+ * Get widget URL
+ * @return string
+ */
private function get_widget_url() : string {
return apply_filters( 'ea11y_widget_url', '' ); // TODO: add public url
}
+ /**
+ * Get widget icon URL
+ * @return string
+ */
+ public function get_widget_icon_url() : string {
+ $option = get_option( 'ea11y_widget_icon_settings' );
+
+ if ( ! $option ) {
+ return 'person';
+ }
+
+ $slug = 'person';
+
+ if ( $option['style']['icon'] ) {
+ $slug = $option['style']['icon'];
+ }
+
+ return EA11Y_ASSETS_URL . 'images/widget-icon-' . $slug . '.svg';
+ }
+
+ /**
+ * Load scripts in admin
+ * @param $hook
+ *
+ * @return void
+ */
+ public function enqueue_accessibility_widget_admin ( $hook ) : void {
+ if ( SettingsModule::SETTING_PAGE_SLUG !== $hook ) {
+ return;
+ }
+
+ if ( ! Connect::is_connected() ) {
+ return;
+ }
+
+ $plan_data = Settings::get( Settings::PLAN_DATA );
+
+ if ( ! isset( $plan_data->public_api_key ) ) {
+ return;
+ }
+
+ wp_enqueue_script(
+ 'ea11y-widget',
+ EA11Y_ASSETS_URL . '/js/widget.js',
+ [],
+ EA11Y_VERSION,
+ true
+ );
+
+ wp_localize_script(
+ 'ea11y-widget',
+ 'ea11yWidget',
+ [
+ 'iconSettings' => $this->get_widget_icon_settings(),
+ 'toolsSettings' => get_option( 'ea11y_widget_menu_settings' ),
+ 'preview' => true,
+ 'previewContainer' => '#ea11y-widget-preview--container',
+ 'apiKey' => $plan_data->public_api_key,
+ 'widgetIconURL' => $this->get_widget_icon_url(),
+ ]
+ );
+ }
+
+ /**
+ * Remove person object from the icon settings for frontend.
+ * @return array
+ */
+ public function get_widget_icon_settings () : array {
+ $option = get_option( 'ea11y_widget_icon_settings' );
+
+ if ( ! $option ) {
+ return [];
+ }
+
+ unset( $option['style']['icon'] );
+
+ return $option;
+ }
+
/**
* Module constructor.
*/
public function __construct() {
add_action( 'wp_enqueue_scripts', [ $this, 'enqueue_accessibility_widget' ] );
+ add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_accessibility_widget_admin' ] );
}
}
From cd6a7e854e922431e259647cf8aadd6da89f49ec Mon Sep 17 00:00:00 2001
From: Nirbhay Singh <121793120+nirbhayel@users.noreply.github.com>
Date: Mon, 13 Jan 2025 12:39:55 +0530
Subject: [PATCH 024/290] [APP-908] Accessibility generator (#131)
* add: accessibility statement radio icons
* update: add form group on radio buttons
* add: statement generator
* add: statement generator
* add: accessibility statement data option
* update: create page in WordPress and save it to the option
* update: exclude zip file from the git
* update: render statement page conditionally
* add: statement link layout and settings
* add: preload statement data
* update: publish the created page and add link for it
* update: changed Dynamic Script Loader to WidgetLoader
* add: accessibility statement url
* update: text and styling
* update: styling of the preview text
* update: restructure statement generator
* add: support for dynamic update in statement links
* update: remove index.css file for widget loader
* add: widget styling for settings page
* add: empty link when hide link is enabled
* update: statement page structure and logic
* fix: typo
* update: convert component into a styled component
* fix: styling and layout
* update: icons
* update: convert radio buttons to styled component
* fix: typo and style
* add: fading for the link preview
* update: import
* update: styling and spacing
* fix: sidebar layout
* update: wpcs to latest version
* fix: spacing
* fix: wpcs version
* add: check for valid statement page
* fix: jitters on rendering
* fix: use escape attribute
* update: settings menu slug and plugin name
* fix: menu item rendering
* update: definition of the styled text field
* add: addPage function to the API
* fix: add notification on page creation
* add: copy link icon
* update: optimize SVGs
---
.gitignore | 1 +
assets/images/widget-icon-controls.svg | 5 +-
assets/images/widget-icon-eye.svg | 12 +-
assets/images/widget-icon-person.svg | 6 +-
assets/images/widget-icon-text.svg | 7 +-
composer.json | 2 +-
modules/legacy/components/upgrade.php | 3 +-
modules/settings/assets/css/style.css | 49 ++++
modules/settings/assets/js/api/index.js | 8 +
.../assets/js/components/copy-link/index.js | 62 ++++
.../assets/js/components/error/index.js | 15 +
.../js/components/html-to-typography/index.js | 61 ++++
.../assets/js/components/icon-select/index.js | 38 ++-
.../assets/js/components/icon-size/index.js | 36 ++-
.../settings/assets/js/components/index.js | 6 +-
.../js/components/position-control/index.js | 31 +-
.../js/components/sidebar-app-bar/index.js | 2 +-
.../js/components/sidebar-menu/index.js | 33 ++-
.../assets/js/components/sidebar-menu/menu.js | 8 +-
.../components/statement-generator/index.js | 274 ++++++++++++++++++
.../index.js | 27 +-
.../js/helpers/accessibility-statement.js | 34 +++
.../assets/js/helpers/statement-generator.js | 26 ++
.../assets/js/hooks/use-saved-settings.js | 7 +
.../settings/assets/js/hooks/use-settings.js | 20 ++
.../icons/accessibility-statement-create.js | 105 +++++++
.../icons/accessibility-statement-existing.js | 95 ++++++
modules/settings/assets/js/icons/index.js | 2 +
.../assets/js/layouts/icon-design-settings.js | 2 +-
modules/settings/assets/js/layouts/index.js | 1 +
.../assets/js/layouts/menu-settings.js | 1 +
modules/settings/assets/js/layouts/sidebar.js | 6 +-
.../assets/js/layouts/statement-link.js | 184 ++++++++++++
.../assets/js/layouts/widget-preview.js | 26 +-
.../js/pages/accessibility-statement.js | 238 ++++++++++++---
.../settings/assets/js/pages/icon-settings.js | 2 +-
modules/settings/assets/js/pages/menu.js | 2 +-
modules/settings/module.php | 15 +-
modules/widget/module.php | 14 +
package-lock.json | 126 +++++++-
package.json | 6 +-
41 files changed, 1421 insertions(+), 177 deletions(-)
create mode 100644 modules/settings/assets/js/components/copy-link/index.js
create mode 100644 modules/settings/assets/js/components/error/index.js
create mode 100644 modules/settings/assets/js/components/html-to-typography/index.js
create mode 100644 modules/settings/assets/js/components/statement-generator/index.js
rename modules/settings/assets/js/components/{dynamic-script-loader => widget-loader}/index.js (61%)
create mode 100644 modules/settings/assets/js/helpers/accessibility-statement.js
create mode 100644 modules/settings/assets/js/helpers/statement-generator.js
create mode 100644 modules/settings/assets/js/icons/accessibility-statement-create.js
create mode 100644 modules/settings/assets/js/icons/accessibility-statement-existing.js
create mode 100644 modules/settings/assets/js/layouts/statement-link.js
diff --git a/.gitignore b/.gitignore
index e0a3e550..f7fce55b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -15,3 +15,4 @@ coverage/
.phpunit.result.cache
.editorconfig
.vscode
+*.zip
diff --git a/assets/images/widget-icon-controls.svg b/assets/images/widget-icon-controls.svg
index 72335f21..38fab3c1 100644
--- a/assets/images/widget-icon-controls.svg
+++ b/assets/images/widget-icon-controls.svg
@@ -1,4 +1 @@
-
-
-
-
+
diff --git a/assets/images/widget-icon-eye.svg b/assets/images/widget-icon-eye.svg
index 56ebe87d..ebf058d4 100644
--- a/assets/images/widget-icon-eye.svg
+++ b/assets/images/widget-icon-eye.svg
@@ -1,11 +1 @@
-
-
-
-
-
-
-
-
-
-
-
+
diff --git a/assets/images/widget-icon-person.svg b/assets/images/widget-icon-person.svg
index c1b545d1..4aac00c2 100644
--- a/assets/images/widget-icon-person.svg
+++ b/assets/images/widget-icon-person.svg
@@ -1,5 +1 @@
-
-
-
-
-
+
diff --git a/assets/images/widget-icon-text.svg b/assets/images/widget-icon-text.svg
index 32e89e9f..c5e1e18b 100644
--- a/assets/images/widget-icon-text.svg
+++ b/assets/images/widget-icon-text.svg
@@ -1,6 +1 @@
-
-
-
-
-
-
+
diff --git a/composer.json b/composer.json
index f2f3a08e..59d13685 100644
--- a/composer.json
+++ b/composer.json
@@ -13,7 +13,7 @@
"johnpbloch/wordpress-core": "^6.0",
"dealerdirect/phpcodesniffer-composer-installer": "^0.7.1",
"squizlabs/php_codesniffer": "^3.6",
- "wp-coding-standards/wpcs": "2.3",
+ "wp-coding-standards/wpcs": "^2.3.0",
"php-stubs/wordpress-stubs": "^6.0",
"elementor/eunit": "^0.0.10",
"phpcompatibility/phpcompatibility-wp": "^2.1",
diff --git a/modules/legacy/components/upgrade.php b/modules/legacy/components/upgrade.php
index 3e194f3d..73ed5f54 100644
--- a/modules/legacy/components/upgrade.php
+++ b/modules/legacy/components/upgrade.php
@@ -380,8 +380,7 @@ public function maybe_render_pointer() {
}
jQuery( document ).ready( function( $ ) {
- //TODO: Update page URL
- $( '#' ).pointer( {
+ $( '#' ).pointer( {
content: '',
pointerClass: 'ea11y-settings-pointer',
position: {
diff --git a/modules/settings/assets/css/style.css b/modules/settings/assets/css/style.css
index 724999ce..fb455c6d 100644
--- a/modules/settings/assets/css/style.css
+++ b/modules/settings/assets/css/style.css
@@ -28,3 +28,52 @@ html[dir='rtl'] #ea11y-app {
box-shadow: none;
border-color: rgba(12, 13, 14, 0.23);
}
+
+/* Widget Preview in Menu Settings */
+
+#ea11y-widget-preview--container #ea11y-root {
+ display: flex;
+ justify-content: center;
+}
+
+@media (min-width: 480px) {
+ .ea11y-widget-container {
+ max-width: 100% !important;
+ }
+}
+
+/* Widget style for statement section */
+
+.ea11y-statement--widget-preview {
+ height: 250px;
+ position: relative;
+ padding: 25px;
+ overflow: hidden;
+}
+
+.ea11y-statement--widget-preview .ea11y-widget-container--preview {
+ position: absolute;
+}
+
+.ea11y-statement--widget-preview .ea11y-widget-container * {
+ opacity: 0.5;
+}
+
+.ea11y-statement--widget-preview .ea11y-widget-container:before {
+ content: '';
+ position: absolute;
+ top: 0;
+ left: 0;
+ height: 100%;
+ width: 100%;
+ background-color: #eaf4ff;
+ opacity: 0.1;
+ z-index: 0;
+ box-sizing: border-box;
+}
+
+.ea11y-statement--widget-preview .ea11y-widget-statement-link,
+.ea11y-statement--widget-preview .ea11y-widget-statement-link * {
+ z-index: 1;
+ opacity: 1;
+}
diff --git a/modules/settings/assets/js/api/index.js b/modules/settings/assets/js/api/index.js
index ec0d7857..e2f35b10 100644
--- a/modules/settings/assets/js/api/index.js
+++ b/modules/settings/assets/js/api/index.js
@@ -118,6 +118,14 @@ class API {
});
}
+ static async addPage(data) {
+ return API.request({
+ method: 'POST',
+ path: `${wpV2Prefix}/pages`,
+ data,
+ });
+ }
+
/**
* @return {Promise} {}
*/
diff --git a/modules/settings/assets/js/components/copy-link/index.js b/modules/settings/assets/js/components/copy-link/index.js
new file mode 100644
index 00000000..c078436d
--- /dev/null
+++ b/modules/settings/assets/js/components/copy-link/index.js
@@ -0,0 +1,62 @@
+import { LinkIcon } from '@elementor/icons';
+import IconButton from '@elementor/ui/IconButton';
+import Tooltip from '@elementor/ui/Tooltip';
+import clipboardCopy from 'clipboard-copy';
+import { useState } from '@wordpress/element';
+import { __ } from '@wordpress/i18n';
+
+const CopyLink = ({ content }) => {
+ const [open, setOpen] = useState(false);
+ const [copied, setCopied] = useState(false);
+
+ const handleClose = () => {
+ setOpen(false);
+ setTimeout(() => setCopied(false), 200); // add delay for animation
+ };
+
+ const handleOpen = () => {
+ setOpen(true);
+ };
+
+ const copyToClipboard = async () => {
+ await clipboardCopy(content);
+ setCopied(true);
+ };
+
+ return (
+ {
+ state.styles.popper.zIndex = '99999'; // Apply zIndex to the Popper element
+ },
+ },
+ ],
+ }}
+ >
+
+
+
+
+ );
+};
+
+export default CopyLink;
diff --git a/modules/settings/assets/js/components/error/index.js b/modules/settings/assets/js/components/error/index.js
new file mode 100644
index 00000000..7e4ec4c3
--- /dev/null
+++ b/modules/settings/assets/js/components/error/index.js
@@ -0,0 +1,15 @@
+import Alert from '@elementor/ui/Alert';
+import AlertTitle from '@elementor/ui/AlertTitle';
+import { __ } from '@wordpress/i18n';
+
+const AlertError = () => {
+ return (
+
+
+ {__('Something went wrong!', 'pojo-accessibility')}
+
+
+ );
+};
+
+export default AlertError;
diff --git a/modules/settings/assets/js/components/html-to-typography/index.js b/modules/settings/assets/js/components/html-to-typography/index.js
new file mode 100644
index 00000000..04b0b931
--- /dev/null
+++ b/modules/settings/assets/js/components/html-to-typography/index.js
@@ -0,0 +1,61 @@
+import Typography from '@elementor/ui/Typography';
+import parse from 'html-react-parser';
+
+const HtmlToTypography = ({ htmlString, replacements }) => {
+ // Replace placeholders in the text string with state variables
+ const replacePlaceholders = (text) => {
+ let updatedText = text;
+
+ // Replace each placeholder with the corresponding value from replacements
+ Object.keys(replacements).forEach((key) => {
+ const placeholder = `{${key}}`; // Create placeholder format (e.g., {company_name})
+ const value = replacements[key]; // Get the replacement value
+ updatedText = updatedText.replace(new RegExp(placeholder, 'g'), value);
+ });
+
+ return updatedText;
+ };
+
+ // Function to transform HTML elements into Typography components
+ const transform = (node) => {
+ if (node.type === 'tag') {
+ const tagName = node.name; // Extract the HTML tag name
+
+ // Map HTML tags to Typography variants
+ const supportedTags = [
+ 'h1',
+ 'h2',
+ 'h3',
+ 'h4',
+ 'h5',
+ 'h6',
+ 'p',
+ 'span',
+ 'div',
+ ];
+ if (supportedTags.includes(tagName)) {
+ return (
+
+ {node.children && node.children.map((child) => transform(child))}
+
+ );
+ }
+ }
+
+ // If the node is text, replace placeholders and return
+ if (node.type === 'text') {
+ return replacePlaceholders(node.data);
+ }
+
+ return null;
+ };
+
+ // Parse and transform the HTML string
+ return <>{parse(htmlString, { replace: transform })}>;
+};
+
+export default HtmlToTypography;
diff --git a/modules/settings/assets/js/components/icon-select/index.js b/modules/settings/assets/js/components/icon-select/index.js
index fd9e3d68..1ccca74c 100644
--- a/modules/settings/assets/js/components/icon-select/index.js
+++ b/modules/settings/assets/js/components/icon-select/index.js
@@ -4,11 +4,32 @@ import Paper from '@elementor/ui/Paper';
import Radio from '@elementor/ui/Radio';
import RadioGroup from '@elementor/ui/RadioGroup';
import Typography from '@elementor/ui/Typography';
+import { styled } from '@elementor/ui/styles';
import { useIconDesign } from '@ea11y/hooks';
import { cloneElement } from '@wordpress/element';
import { __ } from '@wordpress/i18n';
import options from '../../helpers/accessibility-options';
+const StyledPaper = styled(Paper)`
+ display: flex;
+ flex-direction: column;
+ flex-grow: 1;
+ gap: 12px;
+ align-items: center;
+ justify-content: center;
+ padding: 24px;
+ min-width: 10px;
+ width: 100px;
+ min-height: 100px;
+ border-radius: ${({ theme }) => theme.shape.borderRadius};
+ box-shadow: ${({ theme }) => theme.shadows[0]};
+ cursor: pointer;
+ :hover {
+ box-shadow: 0px 0px 15px 0px rgba(37, 99, 235, 0.15);
+ border-color: ${({ theme }) => theme.palette.info.main};
+ }
+`;
+
const IconSelect = (props) => {
const { iconDesign, updateIconDesign } = useIconDesign();
@@ -32,27 +53,14 @@ const IconSelect = (props) => {
}}
>
{options.map((option) => (
- updateIconDesign({ icon: option.value })}
sx={{
- borderRadius: 'md',
- boxShadow: 'sm',
- display: 'flex',
- flexDirection: 'column',
- flexGrow: 1,
- alignItems: 'center',
- justifyContent: 'center',
- gap: 1.5,
- p: 2,
- minWidth: 10,
- width: 100,
- minHeight: 100,
borderColor:
iconDesign.icon === option.value ? 'info.main' : 'divider',
borderWidth: iconDesign.icon === option.value ? 2 : 1,
- cursor: 'pointer',
}}
>
{option.icon &&
@@ -68,7 +76,7 @@ const IconSelect = (props) => {
value={option.value}
sx={{ opacity: 0, position: 'absolute' }}
/>
-
+
))}
diff --git a/modules/settings/assets/js/components/icon-size/index.js b/modules/settings/assets/js/components/icon-size/index.js
index 5bb3a6c0..e6d381b5 100644
--- a/modules/settings/assets/js/components/icon-size/index.js
+++ b/modules/settings/assets/js/components/icon-size/index.js
@@ -4,11 +4,31 @@ import Paper from '@elementor/ui/Paper';
import Radio from '@elementor/ui/Radio';
import RadioGroup from '@elementor/ui/RadioGroup';
import Typography from '@elementor/ui/Typography';
+import { styled } from '@elementor/ui/styles';
import { useIconDesign } from '@ea11y/hooks';
import { cloneElement } from '@wordpress/element';
import { __ } from '@wordpress/i18n';
import { getOptionByValue } from '../../helpers/accessibility-options';
+const StyledPaper = styled(Paper)`
+ display: flex;
+ flex-direction: column;
+ flex-grow: 1;
+ gap: 12px;
+ align-items: center;
+ justify-content: center;
+ padding: 16px
+ min-width: 10px;
+ width: 100px;
+ min-height: 100px;
+ border-radius: ${({ theme }) => theme.shape.borderRadius};
+ box-shadow: ${({ theme }) => theme.shadows[0]};
+ cursor: pointer;
+ :hover {
+ box-shadow: 0px 0px 15px 0px rgba(37, 99, 235, 0.15);
+ border-color: ${({ theme }) => theme.palette.info.main};
+ }
+`;
const IconSize = (props) => {
const { iconDesign, updateIconDesign } = useIconDesign();
const icon = getOptionByValue(iconDesign.icon);
@@ -37,26 +57,14 @@ const IconSize = (props) => {
}}
>
{options.map((option) => (
- updateIconDesign({ size: option.value })}
sx={{
- borderRadius: 'md',
- boxShadow: 'sm',
- display: 'flex',
- flexDirection: 'column',
- alignItems: 'center',
- justifyContent: 'center',
- flexGrow: 1,
- gap: 1.5,
- p: 2,
- minWidth: 10,
- minHeight: 100,
borderColor:
iconDesign.size === option.value ? 'info.main' : 'divider',
borderWidth: iconDesign.size === option.value ? 2 : 1,
- cursor: 'pointer',
}}
>
{icon?.icon &&
@@ -72,7 +80,7 @@ const IconSize = (props) => {
value={option.value}
sx={{ opacity: 0, position: 'absolute' }}
/>
-
+
))}
diff --git a/modules/settings/assets/js/components/index.js b/modules/settings/assets/js/components/index.js
index c5d3cffe..d11a3b0c 100644
--- a/modules/settings/assets/js/components/index.js
+++ b/modules/settings/assets/js/components/index.js
@@ -12,4 +12,8 @@ export { MenuItems } from '../components/sidebar-menu/menu';
export { default as AdminTopBar } from './admin-top-bar';
export { default as BottomBar } from './bottom-bar';
export { default as PostConnectModal } from './post-connect-modal';
-export { default as DynamicScriptLoader } from './dynamic-script-loader';
+export { default as StatementGenerator } from './statement-generator';
+export { default as AlertError } from './error';
+export { default as HtmlToTypography } from './html-to-typography';
+export { default as WidgetLoader } from './widget-loader';
+export { default as CopyLink } from './copy-link';
diff --git a/modules/settings/assets/js/components/position-control/index.js b/modules/settings/assets/js/components/position-control/index.js
index 1f0883de..d49dd5d3 100644
--- a/modules/settings/assets/js/components/position-control/index.js
+++ b/modules/settings/assets/js/components/position-control/index.js
@@ -28,21 +28,22 @@ const verticalOptions = [
];
// Customization for the WP admin global CSS.
-const StyledTextField = styled(TextField)(() => ({
- width: '200px',
- '.wp-admin & .MuiInputBase-input, & .MuiInputBase-input:focus': {
- backgroundColor: 'initial',
- boxShadow: 'none',
- border: 0,
- color: 'inherit',
- outline: 0,
- padding: '16.5px 14px 16.5px 14px',
- '&.MuiInputBase-inputSizeSmall': {
- padding: '8.5px 14px 8.5px 14px',
- },
- height: '56px',
- },
-}));
+const StyledTextField = styled(TextField)`
+ width: 200px;
+ .wp-admin & .MuiInputBase-input,
+ & .MuiInputBase-input:focus {
+ background-color: initial;
+ box-shadow: none;
+ border: 0;
+ color: inherit;
+ outline: 0;
+ padding: 16.5px 14px 16.5px 14px;
+ &.MuiInputBase-inputSizeSmall {
+ padding: 8.5px 14px 8.5px 14px;
+ }
+ height: 56px;
+ }
+`;
const PositionControl = ({ type, disabled, mode }) => {
const { iconPosition, updateExactPosition } = useIconPosition();
diff --git a/modules/settings/assets/js/components/sidebar-app-bar/index.js b/modules/settings/assets/js/components/sidebar-app-bar/index.js
index fa44c5c0..7bb471da 100644
--- a/modules/settings/assets/js/components/sidebar-app-bar/index.js
+++ b/modules/settings/assets/js/components/sidebar-app-bar/index.js
@@ -20,7 +20,7 @@ const SidebarAppBar = () => {
marginLeft={1}
display={!openSidebar ? 'none' : 'inherit'}
>
- {__('Accessibility', 'pojo-accessibility')}
+ {__('Equally', 'pojo-accessibility')}
{
return (
{Object.entries(MenuItems).map(([key, item]) => (
-
-
+
+
- item.children ? handleToggleItem(key) : handleSelectedMenu(key)
+ item?.children ? handleToggleItem(key) : handleSelectedMenu(key)
}
- sx={{ justifyContent: 'center' }}
+ sx={{ justifyContent: 'center', borderRadius: 1 }}
selected={
- key === selectedMenu.parent &&
- (!selectedMenu.child || !openSidebar)
+ key === selectedMenu?.parent &&
+ (!selectedMenu?.child || !openSidebar)
}
>
{item.icon}
- {item.children && (
+ {item?.children && (
{
)}
- {item.children && expandedItems[key] && (
-
- {Object.entries(item.children).map(([childKey, child]) => (
-
+ {item?.children && expandedItems[key] && openSidebar && (
+
+ {Object.entries(item?.children).map(([childKey, child]) => (
+
handleSelectedMenu(key, childKey)}
>
-
+
))}
diff --git a/modules/settings/assets/js/components/sidebar-menu/menu.js b/modules/settings/assets/js/components/sidebar-menu/menu.js
index 5372ff8c..238bef84 100644
--- a/modules/settings/assets/js/components/sidebar-menu/menu.js
+++ b/modules/settings/assets/js/components/sidebar-menu/menu.js
@@ -5,17 +5,17 @@ import { __ } from '@wordpress/i18n';
export const MenuItems = {
widget: {
- name: __('Accessibility Widget', 'pojo-accessibility'),
+ name: __('Accessibility widget', 'pojo-accessibility'),
key: 'widget',
icon: ,
children: {
iconSettings: {
- name: __('Design & position', 'pojo-accessibility'),
+ name: __('Button', 'pojo-accessibility'),
key: 'icon-settings',
page: ,
},
menu: {
- name: __('Feature management', 'pojo-accessibility'),
+ name: __('Capabilities', 'pojo-accessibility'),
key: 'menu',
page: ,
},
@@ -25,6 +25,6 @@ export const MenuItems = {
name: __('Accessibility statement', 'pojo-accessibility'),
key: 'accessibility-statement',
page: ,
- icon: ,
+ icon: ,
},
};
diff --git a/modules/settings/assets/js/components/statement-generator/index.js b/modules/settings/assets/js/components/statement-generator/index.js
new file mode 100644
index 00000000..457298c9
--- /dev/null
+++ b/modules/settings/assets/js/components/statement-generator/index.js
@@ -0,0 +1,274 @@
+import Box from '@elementor/ui/Box';
+import Button from '@elementor/ui/Button';
+import Dialog from '@elementor/ui/Dialog';
+import DialogActions from '@elementor/ui/DialogActions';
+import DialogContent from '@elementor/ui/DialogContent';
+import DialogHeader from '@elementor/ui/DialogHeader';
+import DialogTitle from '@elementor/ui/DialogTitle';
+import ErrorBoundary from '@elementor/ui/ErrorBoundary';
+import FormControl from '@elementor/ui/FormControl';
+import FormHelperText from '@elementor/ui/FormHelperText';
+import FormLabel from '@elementor/ui/FormLabel';
+import TextField from '@elementor/ui/TextField';
+import Typography from '@elementor/ui/Typography';
+import { styled } from '@elementor/ui/styles';
+import { AlertError, HtmlToTypography } from '@ea11y/components';
+import { useSettings, useStorage, useToastNotification } from '@ea11y/hooks';
+import { useState, useEffect } from '@wordpress/element';
+import { __ } from '@wordpress/i18n';
+import API from '../../api';
+import { Statement } from '../../helpers/accessibility-statement';
+import {
+ parseContent,
+ checkEmail,
+ checkDomain,
+ checkCompanyName,
+} from '../../helpers/statement-generator';
+
+// Customization for the WP admin global CSS.
+const StyledTextField = styled(TextField)(() => ({
+ width: '100%',
+ marginTop: 8,
+ '.wp-admin & .MuiInputBase-input, & .MuiInputBase-input:focus': {
+ backgroundColor: 'initial',
+ boxShadow: 'none',
+ border: 0,
+ color: 'inherit',
+ outline: 0,
+ padding: '16.5px 14px 16.5px 14px',
+ '&.MuiInputBase-inputSizeSmall': {
+ padding: '8.5px 14px 8.5px 14px',
+ },
+ height: '40px',
+ },
+}));
+
+const StatementGenerator = ({ open, close }) => {
+ const [isValidName, setValidName] = useState(null);
+ const [isValidEmail, setValidEmail] = useState(null);
+ const [isValidDomain, setValidDomain] = useState(null);
+ const [disableCreateButton, setDisabledCreateButton] = useState(true);
+ const { success, error } = useToastNotification();
+
+ const { companyData, setCompanyData, setAccessibilityStatementData } =
+ useSettings();
+ const { save } = useStorage();
+
+ useEffect(() => {
+ if (checkEmail(companyData?.company_email)) {
+ setValidEmail(true);
+ } else {
+ setValidEmail(false);
+ }
+
+ if (checkCompanyName(companyData?.company_name)) {
+ setValidName(true);
+ } else {
+ setValidName(false);
+ }
+
+ if (checkDomain(companyData?.company_website)) {
+ setValidDomain(true);
+ } else {
+ setValidDomain(false);
+ }
+ }, [companyData]);
+
+ useEffect(() => {
+ if (!isValidEmail || !isValidName || !isValidDomain) {
+ setDisabledCreateButton(true);
+ } else {
+ setDisabledCreateButton(false);
+ }
+ }, [isValidName, isValidEmail, isValidDomain]);
+
+ const handleClose = () => {
+ close();
+ };
+
+ const updateCompanyData = (key, value) => {
+ setCompanyData((prevData) => ({
+ ...prevData,
+ [key]: value,
+ }));
+ };
+
+ const createPage = async () => {
+ const parsedContent = parseContent(Statement, companyData);
+ try {
+ await API.addPage({
+ title: 'Accessibility statement',
+ content: parsedContent,
+ status: 'publish',
+ }).then((response) => {
+ setAccessibilityStatementData({
+ statement: parsedContent,
+ pageId: response.id,
+ createdOn: response.date,
+ link: response.link,
+ });
+ save({
+ ea11y_accessibility_statement_data: {
+ statement: parsedContent,
+ pageId: response.id,
+ createdOn: response.date,
+ link: response.link,
+ },
+ });
+
+ // Update accessibility statement URL in the global object.
+ if (window?.ea11yWidget) {
+ window.ea11yWidget.accessibilityStatementURL = response.link;
+ }
+ close();
+ success('Page created');
+ });
+ } catch (e) {
+ error('Error while creating page');
+ console.log(e);
+ }
+ };
+
+ return (
+ }>
+
+
+
+ {__('Statement generator', 'pojo-accessibility')}
+
+
+
+
+
+
+ {__('Enter your company info', 'pojo-accessibility')}
+
+
+ {__(
+ 'This will generate an accessibility statement that you can preview on the right.',
+ 'pojo-accessibility',
+ )}
+
+
+
+ {__('Company name', 'pojo-accessibility')}
+
+
+ updateCompanyData('company_name', e.currentTarget.value)
+ }
+ error={isValidName === false}
+ />
+ {!isValidName && (
+
+ {__('Company name cannot be empty', 'pojo-accessibility')}
+
+ )}
+
+
+
+ {__('Company website', 'pojo-accessibility')}
+
+
+ updateCompanyData('company_website', e.currentTarget.value)
+ }
+ error={isValidDomain === false}
+ />
+ {!isValidDomain && (
+
+ {__('Please enter a valid domain', 'pojo-accessibility')}
+
+ )}
+
+
+
+ {__('Business email', 'pojo-accessibility')}
+
+
+ updateCompanyData('company_email', e.currentTarget.value)
+ }
+ error={isValidEmail === false}
+ />
+ {!isValidEmail && (
+
+ {__('Please enter a valid email', 'pojo-accessibility')}
+
+ )}
+
+
+
+
+ {__(
+ 'Preview your accessibility statement',
+ 'pojo-accessibility',
+ )}
+
+
+
+
+
+
+
+
+
+
+ {__('Cancel', 'pojo-accessibility')}
+
+
+ {__('Create statement & page', 'pojo-accessibility')}
+
+
+
+
+ );
+};
+
+export default StatementGenerator;
diff --git a/modules/settings/assets/js/components/dynamic-script-loader/index.js b/modules/settings/assets/js/components/widget-loader/index.js
similarity index 61%
rename from modules/settings/assets/js/components/dynamic-script-loader/index.js
rename to modules/settings/assets/js/components/widget-loader/index.js
index 6bb83fb5..1c9d3168 100644
--- a/modules/settings/assets/js/components/dynamic-script-loader/index.js
+++ b/modules/settings/assets/js/components/widget-loader/index.js
@@ -1,7 +1,18 @@
+import { useSettings } from '@ea11y/hooks';
import { useEffect } from '@wordpress/element';
+import { WIDGET_URL } from '../../constants/index';
-const DynamicScriptLoader = ({ src, onLoad, onError }) => {
+const WidgetLoader = ({ src, onLoad, onError }) => {
+ const { planData } = useSettings();
useEffect(() => {
+ const handleScriptLoad = () => {
+ console.log('External script loaded!');
+ };
+
+ const handleScriptError = () => {
+ console.error('Failed to load the external script.');
+ };
+
// Check if the script already exists
const existingScript = document.querySelector(`script[src="${src}"]`);
if (existingScript) {
@@ -11,7 +22,12 @@ const DynamicScriptLoader = ({ src, onLoad, onError }) => {
// Create a new script element
const script = document.createElement('script');
- script.src = src;
+ if (src) {
+ script.src = src;
+ } else {
+ script.src = `${WIDGET_URL}?api_key=${planData?.public_api_key}`;
+ }
+
script.async = true;
// Attach onLoad and onError handlers
@@ -20,6 +36,9 @@ const DynamicScriptLoader = ({ src, onLoad, onError }) => {
if (onLoad) {
onLoad();
window?.ea11yWidget?.widget?.open();
+ } else {
+ handleScriptLoad();
+ window?.ea11yWidget?.widget?.open();
}
};
@@ -27,6 +46,8 @@ const DynamicScriptLoader = ({ src, onLoad, onError }) => {
console.error(`Failed to load script: ${src}`);
if (onError) {
onError();
+ } else {
+ handleScriptError();
}
};
@@ -43,4 +64,4 @@ const DynamicScriptLoader = ({ src, onLoad, onError }) => {
return null;
};
-export default DynamicScriptLoader;
+export default WidgetLoader;
diff --git a/modules/settings/assets/js/helpers/accessibility-statement.js b/modules/settings/assets/js/helpers/accessibility-statement.js
new file mode 100644
index 00000000..add8faaf
--- /dev/null
+++ b/modules/settings/assets/js/helpers/accessibility-statement.js
@@ -0,0 +1,34 @@
+export const Statement = `
+
+Accessibility Statement for {company_website}
+
+
+{company_name} is committed to ensuring digital accessibility for people with disabilities. We are continually improving the user experience for everyone and applying the relevant accessibility standards.
+
+
+Conformance status
+
+
+The Web Content Accessibility Guidelines (WCAG) defines requirements for designers and developers to improve accessibility for people with disabilities. It defines three levels of conformance: Level A, Level AA, and Level AAA.
+
+
+As of the date of this statement, {company_name} website is partially conformant with WCAG 2.2 level AA. Partially conformant means that some parts of the content do not fully conform to the accessibility standard.
+
+
+We are currently working on remediating our website to ensure the best quality usability for all of our users.
+
+
+Feedback
+
+
+We welcome your feedback on the accessibility of {company_name} website. Please let us know if you encounter accessibility barriers on our website:
+
+
+E-mail: {company_email}
+
+
+We try to respond to feedback within 3-5 business days.
+
+
+This statement was created on {current_date}.
+`;
diff --git a/modules/settings/assets/js/helpers/statement-generator.js b/modules/settings/assets/js/helpers/statement-generator.js
new file mode 100644
index 00000000..56f3540d
--- /dev/null
+++ b/modules/settings/assets/js/helpers/statement-generator.js
@@ -0,0 +1,26 @@
+export const checkCompanyName = (companyName) => {
+ return typeof companyName === 'string' && companyName.trim().length > 0;
+};
+
+export const checkEmail = (email) => {
+ const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
+ return emailRegex.test(email);
+};
+
+export const checkDomain = (domain) => {
+ const domainRegex = /^(https?:\/\/)?([a-zA-Z0-9-_]+\.)+[a-zA-Z]{2,}\/?$/;
+ return domainRegex.test(domain);
+};
+
+export const parseContent = (text, replacements) => {
+ let updatedText = text;
+
+ // Replace each placeholder with the corresponding value from replacements
+ Object.keys(replacements).forEach((key) => {
+ const placeholder = `{${key}}`; // Create placeholder format (e.g., {company_name})
+ const value = replacements[key]; // Get the replacement value
+ updatedText = updatedText.replace(new RegExp(placeholder, 'g'), value);
+ });
+
+ return updatedText;
+};
diff --git a/modules/settings/assets/js/hooks/use-saved-settings.js b/modules/settings/assets/js/hooks/use-saved-settings.js
index 18697615..572aeb96 100644
--- a/modules/settings/assets/js/hooks/use-saved-settings.js
+++ b/modules/settings/assets/js/hooks/use-saved-settings.js
@@ -10,6 +10,7 @@ export const useSavedSettings = () => {
setIconDesign,
setIconPosition,
setPlanData,
+ setAccessibilityStatementData,
} = useSettings();
const result = useSelect((select) => {
@@ -45,6 +46,12 @@ export const useSavedSettings = () => {
if (result?.data?.ea11y_plan_data) {
setPlanData(result.data.ea11y_plan_data);
}
+
+ if (result?.data?.ea11y_accessibility_statement_data) {
+ setAccessibilityStatementData(
+ result.data.ea11y_accessibility_statement_data,
+ );
+ }
}
}, [result.hasFinishedResolution]);
};
diff --git a/modules/settings/assets/js/hooks/use-settings.js b/modules/settings/assets/js/hooks/use-settings.js
index 637ad6c3..bb1fb060 100644
--- a/modules/settings/assets/js/hooks/use-settings.js
+++ b/modules/settings/assets/js/hooks/use-settings.js
@@ -100,6 +100,22 @@ export const SettingsProvider = ({ children }) => {
position: 'top-left',
},
});
+
+ const [companyData, setCompanyData] = useState({
+ company_name: 'Acme Inc.',
+ company_website: 'https://www.acme.com/',
+ company_email: 'contact@acme.com',
+ current_date: new Date().toLocaleDateString(),
+ });
+
+ const [accessibilityStatementData, setAccessibilityStatementData] = useState({
+ statement: null,
+ pageId: null,
+ createdOn: null,
+ link: null,
+ hideLink: false,
+ });
+
return (
{
setHasChanges,
planData,
setPlanData,
+ companyData,
+ setCompanyData,
+ accessibilityStatementData,
+ setAccessibilityStatementData,
}}
>
{children}
diff --git a/modules/settings/assets/js/icons/accessibility-statement-create.js b/modules/settings/assets/js/icons/accessibility-statement-create.js
new file mode 100644
index 00000000..501c54ad
--- /dev/null
+++ b/modules/settings/assets/js/icons/accessibility-statement-create.js
@@ -0,0 +1,105 @@
+import SvgIcon from '@elementor/ui/SvgIcon';
+
+function AccessibilityStatementCreateIcon(props) {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
+
+export default AccessibilityStatementCreateIcon;
diff --git a/modules/settings/assets/js/icons/accessibility-statement-existing.js b/modules/settings/assets/js/icons/accessibility-statement-existing.js
new file mode 100644
index 00000000..12f8d49d
--- /dev/null
+++ b/modules/settings/assets/js/icons/accessibility-statement-existing.js
@@ -0,0 +1,95 @@
+import SvgIcon from '@elementor/ui/SvgIcon';
+
+function AccessibilityStatementExistingIcon(props) {
+ return (
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ );
+}
+
+export default AccessibilityStatementExistingIcon;
diff --git a/modules/settings/assets/js/icons/index.js b/modules/settings/assets/js/icons/index.js
index d67c047d..127c5b06 100644
--- a/modules/settings/assets/js/icons/index.js
+++ b/modules/settings/assets/js/icons/index.js
@@ -19,3 +19,5 @@ export { default as PauseAnimationsIcon } from './pause-animations';
export { default as ReadableFontIcon } from './readable-font';
export { default as PostConnectModalIcon } from './post-connect-modal-icon';
export { default as ConnectModalIcon } from './connect-modal-icon';
+export { default as AccessibilityStatementCreateIcon } from './accessibility-statement-create';
+export { default as AccessibilityStatementExistingIcon } from './accessibility-statement-existing';
diff --git a/modules/settings/assets/js/layouts/icon-design-settings.js b/modules/settings/assets/js/layouts/icon-design-settings.js
index 34103e41..f02cd804 100644
--- a/modules/settings/assets/js/layouts/icon-design-settings.js
+++ b/modules/settings/assets/js/layouts/icon-design-settings.js
@@ -18,7 +18,7 @@ const IconDesignSettings = (props) => {
)}
-
+
diff --git a/modules/settings/assets/js/layouts/index.js b/modules/settings/assets/js/layouts/index.js
index 6de94e6f..1c9adcb1 100644
--- a/modules/settings/assets/js/layouts/index.js
+++ b/modules/settings/assets/js/layouts/index.js
@@ -5,3 +5,4 @@ export { default as MenuSettings } from './menu-settings';
export { default as WidgetPreview } from './widget-preview';
export { default as Sidebar } from './sidebar';
export { default as PositionSettingsMobile } from './position-settings-mobile';
+export { default as StatementLink } from './statement-link';
diff --git a/modules/settings/assets/js/layouts/menu-settings.js b/modules/settings/assets/js/layouts/menu-settings.js
index 94e360f6..4e9f853e 100644
--- a/modules/settings/assets/js/layouts/menu-settings.js
+++ b/modules/settings/assets/js/layouts/menu-settings.js
@@ -95,6 +95,7 @@ const MenuSettings = () => {
'Choose which accessibility features and capabilities you want to include.',
'pojo-accessibility',
)}
+ sx={{ paddingBottom: 0 }}
/>
{disableOptions && !hideMinimumOptionAlert && (
diff --git a/modules/settings/assets/js/layouts/sidebar.js b/modules/settings/assets/js/layouts/sidebar.js
index 9eb2bfdb..e53afb00 100644
--- a/modules/settings/assets/js/layouts/sidebar.js
+++ b/modules/settings/assets/js/layouts/sidebar.js
@@ -10,15 +10,17 @@ const Sidebar = () => {
diff --git a/modules/settings/assets/js/layouts/statement-link.js b/modules/settings/assets/js/layouts/statement-link.js
new file mode 100644
index 00000000..836996cb
--- /dev/null
+++ b/modules/settings/assets/js/layouts/statement-link.js
@@ -0,0 +1,184 @@
+import Box from '@elementor/ui/Box';
+import Button from '@elementor/ui/Button';
+import Card from '@elementor/ui/Card';
+import CardActions from '@elementor/ui/CardActions';
+import CardContent from '@elementor/ui/CardContent';
+import CardHeader from '@elementor/ui/CardHeader';
+import FormControl from '@elementor/ui/FormControl';
+import FormControlLabel from '@elementor/ui/FormControlLabel';
+import FormHelperText from '@elementor/ui/FormHelperText';
+import FormLabel from '@elementor/ui/FormLabel';
+import MenuItem from '@elementor/ui/MenuItem';
+import Select from '@elementor/ui/Select';
+import Switch from '@elementor/ui/Switch';
+import Typography from '@elementor/ui/Typography';
+import { CopyLink, WidgetLoader } from '@ea11y/components';
+import { useSettings, useStorage, useToastNotification } from '@ea11y/hooks';
+import { useEntityRecords } from '@wordpress/core-data';
+import { useEffect, useState } from '@wordpress/element';
+import { __ } from '@wordpress/i18n';
+
+const StatementLink = () => {
+ const [disabled, setDisabled] = useState(true);
+ const [isValidPage, setIsValidPage] = useState(false);
+ const { accessibilityStatementData, setAccessibilityStatementData } =
+ useSettings();
+ const { save } = useStorage();
+ const { success, error } = useToastNotification();
+ const pages = useEntityRecords('postType', 'page', { per_page: -1 });
+
+ useEffect(() => {
+ if (window?.ea11yWidget) {
+ if (accessibilityStatementData.hideLink) {
+ window.ea11yWidget.accessibilityStatementURL = null;
+ } else {
+ window.ea11yWidget.accessibilityStatementURL =
+ accessibilityStatementData?.link;
+ }
+ }
+ window?.ea11yWidget?.widget?.updateState();
+ }, [accessibilityStatementData?.hideLink, accessibilityStatementData?.link]);
+
+ useEffect(() => {
+ // Enable button when data is changed
+ setDisabled(false);
+ if (!accessibilityStatementData?.link) {
+ setDisabled(true);
+ setIsValidPage(false);
+ } else {
+ setIsValidPage(true);
+ }
+ }, [accessibilityStatementData]);
+
+ useEffect(() => {
+ // Disable button on load
+ setDisabled(true);
+ }, []);
+
+ const changePage = (id) => {
+ const page = pages.records.filter((record) => record.id === id);
+ if (page.length > 0) {
+ setAccessibilityStatementData({
+ ...accessibilityStatementData,
+ pageId: page[0]?.id,
+ link: page[0]?.link,
+ });
+ }
+ };
+
+ const savePage = async () => {
+ try {
+ await save({
+ ea11y_accessibility_statement_data: accessibilityStatementData,
+ });
+ await success('Settings saved');
+ setDisabled(true);
+ } catch (e) {
+ error('Failed to save settings!');
+ console.error(e);
+ }
+ };
+
+ return (
+
+
+
+
+
+
+
+
+ {__('Choose which page to link', 'pojo-accessibility')}
+
+
+
+ changePage(e.target.value)}
+ value={accessibilityStatementData?.pageId}
+ error={!isValidPage}
+ color="info"
+ fullWidth
+ >
+ {pages?.hasResolved && pages?.records.length > 0 ? (
+ pages?.records.map((page) => (
+
+ {page.title.rendered}
+
+ ))
+ ) : (
+
+ {__('No pages found', 'pojo-accessibility')}
+
+ )}
+
+ {accessibilityStatementData?.link && (
+
+ )}
+
+ {!isValidPage && (
+
+ {__('Please select a page', 'pojo-accessibility')}
+
+ )}
+
+
+
+
+ {__('Want to hide the link?', 'pojo-accessibility')}
+
+
+
+ }
+ sx={{ marginBottom: 3, alignSelf: 'start', ml: 0 }}
+ onChange={() => {
+ setAccessibilityStatementData({
+ ...accessibilityStatementData,
+ hideLink: !accessibilityStatementData.hideLink,
+ });
+ }}
+ checked={accessibilityStatementData?.hideLink}
+ />
+
+
+
+
+
+
+
+
+
+ {__('Save changes', 'pojo-accessibility')}
+
+
+
+ );
+};
+
+export default StatementLink;
diff --git a/modules/settings/assets/js/layouts/widget-preview.js b/modules/settings/assets/js/layouts/widget-preview.js
index 039f2eb2..5f35967d 100644
--- a/modules/settings/assets/js/layouts/widget-preview.js
+++ b/modules/settings/assets/js/layouts/widget-preview.js
@@ -1,20 +1,10 @@
import Card from '@elementor/ui/Card';
import CardContent from '@elementor/ui/CardContent';
import CardHeader from '@elementor/ui/CardHeader';
-import { DynamicScriptLoader } from '@ea11y/components';
-import { useSettings } from '@ea11y/hooks';
+import { WidgetLoader } from '@ea11y/components';
import { __ } from '@wordpress/i18n';
-import { WIDGET_URL } from '../constants';
const WidgetPreview = () => {
- const { planData } = useSettings();
- const handleScriptLoad = () => {
- console.log('External script loaded!');
- };
-
- const handleScriptError = () => {
- console.error('Failed to load the external script.');
- };
return (
<>
@@ -27,14 +17,16 @@ const WidgetPreview = () => {
/>
-
+
>
);
};
diff --git a/modules/settings/assets/js/pages/accessibility-statement.js b/modules/settings/assets/js/pages/accessibility-statement.js
index 74e9447c..0c600a5f 100644
--- a/modules/settings/assets/js/pages/accessibility-statement.js
+++ b/modules/settings/assets/js/pages/accessibility-statement.js
@@ -1,62 +1,210 @@
+import Box from '@elementor/ui/Box';
+import Button from '@elementor/ui/Button';
import Container from '@elementor/ui/Container';
import FormControl from '@elementor/ui/FormControl';
-import FormControlLabel from '@elementor/ui/FormControlLabel';
+import FormLabel from '@elementor/ui/FormLabel';
+import Paper from '@elementor/ui/Paper';
import Radio from '@elementor/ui/Radio';
import RadioGroup from '@elementor/ui/RadioGroup';
import Typography from '@elementor/ui/Typography';
-import { BottomBar } from '@ea11y/components';
+import { styled } from '@elementor/ui/styles';
+import { StatementGenerator } from '@ea11y/components';
+import { useModal, useSettings } from '@ea11y/hooks';
+import {
+ AccessibilityStatementExistingIcon,
+ AccessibilityStatementCreateIcon,
+} from '@ea11y/icons';
+import { StatementLink } from '@ea11y/layouts';
+import { useEffect, useState } from '@wordpress/element';
import { __ } from '@wordpress/i18n';
+const StyledPaper = styled(Paper)`
+ display: flex;
+ flex-direction: column;
+ flex-grow: 8px;
+ align-items: center;
+ justify-content: center;
+ padding: 24px;
+ width: 500px;
+ min-height: 169px;
+ border-radius: ${({ theme }) => theme.shape.borderRadius};
+ box-shadow: ${({ theme }) => theme.shadows[0]};
+ cursor: pointer;
+ :hover {
+ box-shadow: 0px 0px 15px 0px rgba(37, 99, 235, 0.15);
+ border-color: ${({ theme }) => theme.palette.info.main};
+ }
+`;
+
const AccessibilityStatement = () => {
+ const { accessibilityStatementData } = useSettings();
+ const { isOpen, open, close } = useModal(false);
+ const [continueDisabled, setContinueDisabled] = useState(true);
+ // Store statement option - generate or existing
+ const [statementOption, setStatementOption] = useState('');
+ const [showStatementLink, setShowStatementLink] = useState(false);
+
+ useEffect(() => {
+ setContinueDisabled(false);
+ }, [statementOption]);
+
+ useEffect(() => {
+ setContinueDisabled(true);
+ }, []);
+
+ const handleContinue = () => {
+ if (statementOption === 'generate') {
+ open();
+ setContinueDisabled(true);
+ } else if (statementOption === 'existing') {
+ setShowStatementLink(true);
+ }
+ };
+
return (
<>
-
-
- {__('Accessibility statement', 'pojo-accessibility')}
-
-
+
- {__(
- 'An accessibility statement showcases your efforts to create an inclusive online space, highlighting helpful features and a commitment to accessibility. Learn more',
- 'pojo-accessibility',
+
+ {__('Accessibility statement', 'pojo-accessibility')}
+
+
+ {__(
+ 'An accessibility statement showcases your efforts to create an inclusive online space, highlighting helpful features and a commitment to accessibility. Learn more',
+ 'pojo-accessibility',
+ )}
+
+ {!accessibilityStatementData?.pageId && !showStatementLink && (
+ <>
+
+
+
+ {__(
+ 'Need an accessibility statement?',
+ 'pojo-accessibility',
+ )}
+
+
+ {__(
+ 'You can have a statement created for you or use what you already have.',
+ 'pojo-accessibility',
+ )}
+
+
+
+ {
+ setStatementOption('generate');
+ }}
+ sx={{
+ borderColor:
+ statementOption === 'generate'
+ ? 'info.main'
+ : 'divider',
+ borderWidth: statementOption === 'generate' ? 2 : 1,
+ }}
+ >
+
+
+ {__('Yes, I need one', 'pojo-accessibility')}
+
+
+
+ setStatementOption('existing')}
+ sx={{
+ borderColor:
+ statementOption === 'existing'
+ ? 'info.main'
+ : 'divider',
+ borderWidth: statementOption === 'existing' ? 2 : 1,
+ }}
+ >
+
+
+ {__('No, I already have one', 'pojo-accessibility')}
+
+
+
+
+
+ >
)}
-
-
- {__(
- 'Already have an accessibile statement page?',
- 'pojo-accessibility',
+ {(accessibilityStatementData?.pageId || showStatementLink) && (
+
)}
-
-
-
+ {!accessibilityStatementData?.pageId && !showStatementLink && (
+
- }
- label={__('No, I do not have one', 'pojo-accessibility')}
- value={false}
- />
- }
- label={__('Yes', 'pojo-accessibility')}
- value={true}
- />
-
-
-
-
+
+ {__('Continue', 'pojo-accessibility')}
+
+
+ )}
+
+
>
);
};
diff --git a/modules/settings/assets/js/pages/icon-settings.js b/modules/settings/assets/js/pages/icon-settings.js
index fe2e143d..5601cd0c 100644
--- a/modules/settings/assets/js/pages/icon-settings.js
+++ b/modules/settings/assets/js/pages/icon-settings.js
@@ -9,7 +9,7 @@ const IconSettings = () => {
<>
- {__('Design & position', 'pojo-accessibility')}
+ {__('Button', 'pojo-accessibility')}
diff --git a/modules/settings/assets/js/pages/menu.js b/modules/settings/assets/js/pages/menu.js
index 9cf46006..6e869688 100644
--- a/modules/settings/assets/js/pages/menu.js
+++ b/modules/settings/assets/js/pages/menu.js
@@ -8,7 +8,7 @@ const Menu = () => {
return (
- {__('Feature management', 'pojo-accessibility')}
+ {__('Capabilities', 'pojo-accessibility')}
diff --git a/modules/settings/module.php b/modules/settings/module.php
index 58b8960f..a67bcae5 100644
--- a/modules/settings/module.php
+++ b/modules/settings/module.php
@@ -19,7 +19,7 @@
class Module extends Module_Base {
const SETTING_PREFIX = 'ea11y_';
const SETTING_GROUP = 'ea11y_settings';
- const SETTING_BASE_SLUG = 'accessibility-settings-2'; //TODO: Change this later
+ const SETTING_BASE_SLUG = 'accessibility-settings'; //TODO: Change this later
const SETTING_CAPABILITY = 'manage_options';
const SETTING_PAGE_SLUG = 'toplevel_page_' . self::SETTING_BASE_SLUG;
@@ -46,8 +46,8 @@ public function render_app() {
public function register_page() : void {
add_menu_page(
- __( 'Accessibility New', 'pojo-accessibility' ), //TODO: Change this later
- __( 'Accessibility New', 'pojo-accessibility' ),
+ __( 'Equally', 'pojo-accessibility' ), //TODO: Change this later
+ __( 'Equally', 'pojo-accessibility' ),
self::SETTING_CAPABILITY,
self::SETTING_BASE_SLUG,
[ $this, 'render_app' ],
@@ -287,6 +287,15 @@ public function register_settings(): void {
],
],
],
+ 'accessibility_statement_data' => [
+ 'type' => 'object',
+ 'show_in_rest' => [
+ 'schema' => [
+ 'type' => 'object',
+ 'additionalProperties' => true,
+ ],
+ ],
+ ],
'close_post_connect_modal' => [
'type' => 'boolean',
],
diff --git a/modules/widget/module.php b/modules/widget/module.php
index 8eda063c..84c74f59 100644
--- a/modules/widget/module.php
+++ b/modules/widget/module.php
@@ -50,6 +50,7 @@ public function enqueue_accessibility_widget () : void {
[
'iconSettings' => get_option( 'ea11y_widget_icon_settings' ),
'toolsSettings' => get_option( 'ea11y_widget_menu_settings' ),
+ 'accessibilityStatementURL' => $this->get_accessibility_statement_url(),
'widgetIconURL' => $this->get_widget_icon_url(),
]
);
@@ -83,6 +84,18 @@ public function get_widget_icon_url() : string {
return EA11Y_ASSETS_URL . 'images/widget-icon-' . $slug . '.svg';
}
+ /**
+ * Get accessibility statement URL
+ * @return string
+ */
+ public function get_accessibility_statement_url() : string {
+ $option = get_option( 'ea11y_accessibility_statement_data' );
+ if ( ! empty( $option ) && ! $option['hideLink'] ) {
+ return $option['link'];
+ }
+ return '';
+ }
+
/**
* Load scripts in admin
* @param $hook
@@ -122,6 +135,7 @@ public function enqueue_accessibility_widget_admin ( $hook ) : void {
'previewContainer' => '#ea11y-widget-preview--container',
'apiKey' => $plan_data->public_api_key,
'widgetIconURL' => $this->get_widget_icon_url(),
+ 'accessibilityStatementURL' => $this->get_accessibility_statement_url(),
]
);
}
diff --git a/package-lock.json b/package-lock.json
index 285cff0c..8b0c985d 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -17,6 +17,8 @@
"@wordpress/element": "^6.10.0",
"@wordpress/i18n": "^5.10.0",
"@wordpress/url": "^4.10.0",
+ "clipboard-copy": "^4.0.1",
+ "html-react-parser": "^5.2.2",
"husky": "^9.1.6",
"prop-types": "^15.8.1",
"react-colorful": "^5.6.1"
@@ -8878,6 +8880,26 @@
"tiny-emitter": "^2.0.0"
}
},
+ "node_modules/clipboard-copy": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/clipboard-copy/-/clipboard-copy-4.0.1.tgz",
+ "integrity": "sha512-wOlqdqziE/NNTUJsfSgXmBMIrYmfd5V0HCGsR8uAKHcg+h9NENWINcfRjtWGU77wDHC8B8ijV4hMTGYbrKovng==",
+ "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/cliui": {
"version": "8.0.1",
"resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz",
@@ -10250,7 +10272,6 @@
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz",
"integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==",
- "dev": true,
"dependencies": {
"domelementtype": "^2.3.0",
"domhandler": "^5.0.2",
@@ -10264,7 +10285,6 @@
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
"integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
- "dev": true,
"funding": [
{
"type": "github",
@@ -10289,7 +10309,6 @@
"version": "5.0.3",
"resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz",
"integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==",
- "dev": true,
"dependencies": {
"domelementtype": "^2.3.0"
},
@@ -10301,10 +10320,10 @@
}
},
"node_modules/domutils": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz",
- "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==",
- "dev": true,
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.2.1.tgz",
+ "integrity": "sha512-xWXmuRnN9OMP6ptPd2+H0cCbcYBULa5YDTbMm/2lvkWvNA3O4wcW+GvzooqBuNM8yy6pl3VIAeJTUUWUbfI5Fw==",
+ "license": "BSD-2-Clause",
"dependencies": {
"dom-serializer": "^2.0.0",
"domelementtype": "^2.3.0",
@@ -10436,7 +10455,6 @@
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz",
"integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==",
- "dev": true,
"engines": {
"node": ">=0.12"
},
@@ -13064,6 +13082,16 @@
"resolved": "https://registry.npmjs.org/hpq/-/hpq-1.4.0.tgz",
"integrity": "sha512-ycJQMRaRPBcfnoT1gS5I1XCvbbw9KO94Y0vkwksuOjcJMqNZtb03MF2tCItLI2mQbkZWSSeFinoRDPmjzv4tKg=="
},
+ "node_modules/html-dom-parser": {
+ "version": "5.0.13",
+ "resolved": "https://registry.npmjs.org/html-dom-parser/-/html-dom-parser-5.0.13.tgz",
+ "integrity": "sha512-B7JonBuAfG32I7fDouUQEogBrz3jK9gAuN1r1AaXpED6dIhtg/JwiSRhjGL7aOJwRz3HU4efowCjQBaoXiREqg==",
+ "license": "MIT",
+ "dependencies": {
+ "domhandler": "5.0.3",
+ "htmlparser2": "10.0.0"
+ }
+ },
"node_modules/html-encoding-sniffer": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz",
@@ -13098,6 +13126,27 @@
"integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==",
"dev": true
},
+ "node_modules/html-react-parser": {
+ "version": "5.2.2",
+ "resolved": "https://registry.npmjs.org/html-react-parser/-/html-react-parser-5.2.2.tgz",
+ "integrity": "sha512-yA5012CJGSFWYZsgYzfr6HXJgDap38/AEP4ra8Cw+WHIi2ZRDXRX/QVYdumRf1P8zKyScKd6YOrWYvVEiPfGKg==",
+ "license": "MIT",
+ "dependencies": {
+ "domhandler": "5.0.3",
+ "html-dom-parser": "5.0.13",
+ "react-property": "2.0.2",
+ "style-to-js": "1.1.16"
+ },
+ "peerDependencies": {
+ "@types/react": "0.14 || 15 || 16 || 17 || 18 || 19",
+ "react": "0.14 || 15 || 16 || 17 || 18 || 19"
+ },
+ "peerDependenciesMeta": {
+ "@types/react": {
+ "optional": true
+ }
+ }
+ },
"node_modules/html-tags": {
"version": "3.3.1",
"resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz",
@@ -13110,6 +13159,37 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/htmlparser2": {
+ "version": "10.0.0",
+ "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-10.0.0.tgz",
+ "integrity": "sha512-TwAZM+zE5Tq3lrEHvOlvwgj1XLWQCtaaibSN11Q+gGBAS7Y1uZSWwXXRe4iF6OXnaq1riyQAPFOBtYc77Mxq0g==",
+ "funding": [
+ "https://github.com/fb55/htmlparser2?sponsor=1",
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fb55"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "domelementtype": "^2.3.0",
+ "domhandler": "^5.0.3",
+ "domutils": "^3.2.1",
+ "entities": "^6.0.0"
+ }
+ },
+ "node_modules/htmlparser2/node_modules/entities": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/entities/-/entities-6.0.0.tgz",
+ "integrity": "sha512-aKstq2TDOndCn4diEyp9Uq/Flu2i1GlLkc6XIDQSDMuaFE3OPW5OphLCyQ5SpSJZTb4reN+kTcYru5yIfXoRPw==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.12"
+ },
+ "funding": {
+ "url": "https://github.com/fb55/entities?sponsor=1"
+ }
+ },
"node_modules/http-cache-semantics": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz",
@@ -13451,6 +13531,12 @@
"integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
"dev": true
},
+ "node_modules/inline-style-parser": {
+ "version": "0.2.4",
+ "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.2.4.tgz",
+ "integrity": "sha512-0aO8FkhNZlj/ZIbNi7Lxxr12obT7cL1moPfE4tg1LkX7LlLfC6DeX4l2ZEud1ukP9jNQyNnfzQVqwbwmAATY4Q==",
+ "license": "MIT"
+ },
"node_modules/inquirer": {
"version": "7.3.3",
"resolved": "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz",
@@ -18657,6 +18743,12 @@
"resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz",
"integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg=="
},
+ "node_modules/react-property": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/react-property/-/react-property-2.0.2.tgz",
+ "integrity": "sha512-+PbtI3VuDV0l6CleQMsx2gtK0JZbZKbpdu5ynr+lbsuvtmgbNcS3VM0tuY2QjFNOcWxvXeHjDpy42RO+4U2rug==",
+ "license": "MIT"
+ },
"node_modules/react-refresh": {
"version": "0.14.2",
"resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz",
@@ -20742,6 +20834,24 @@
"integrity": "sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg==",
"dev": true
},
+ "node_modules/style-to-js": {
+ "version": "1.1.16",
+ "resolved": "https://registry.npmjs.org/style-to-js/-/style-to-js-1.1.16.tgz",
+ "integrity": "sha512-/Q6ld50hKYPH3d/r6nr117TZkHR0w0kGGIVfpG9N6D8NymRPM9RqCUv4pRpJ62E5DqOYx2AFpbZMyCPnjQCnOw==",
+ "license": "MIT",
+ "dependencies": {
+ "style-to-object": "1.0.8"
+ }
+ },
+ "node_modules/style-to-object": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/style-to-object/-/style-to-object-1.0.8.tgz",
+ "integrity": "sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g==",
+ "license": "MIT",
+ "dependencies": {
+ "inline-style-parser": "0.2.4"
+ }
+ },
"node_modules/stylehacks": {
"version": "6.1.1",
"resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-6.1.1.tgz",
diff --git a/package.json b/package.json
index 76a143e7..924ed2b2 100644
--- a/package.json
+++ b/package.json
@@ -13,7 +13,7 @@
"prepare": "husky install",
"local:start": "wp-env start",
"local:stop": "wp-env stop",
- "local:quick-run": "npx @wp-now/wp-now start",
+ "local:quick-run": "npx @wp-now/wp-now start",
"local:composer:dev": "wp-env run cli --env-cwd=wp-content/plugins/one-click-accessibility composer install",
"local:composer:build": "wp-env run cli --env-cwd=wp-content/plugins/one-click-accessibility composer install --no-dev",
"local:wp-cli": "wp-env run cli --env-cwd=wp-content/plugins/one-click-accessibility wp",
@@ -27,8 +27,8 @@
"@wordpress/eslint-plugin": "^21.3.0",
"@wordpress/scripts": "^30.3.0",
"eslint": "^8.57.1",
- "eslint-import-resolver-webpack": "^0.13.9",
"eslint-config-prettier": "^9.1.0",
+ "eslint-import-resolver-webpack": "^0.13.9",
"eslint-plugin-babel": "^5.3.1",
"eslint-plugin-import": "^2.31.0",
"eslint-plugin-jsx-a11y": "^6.10.1",
@@ -47,6 +47,8 @@
"@wordpress/element": "^6.10.0",
"@wordpress/i18n": "^5.10.0",
"@wordpress/url": "^4.10.0",
+ "clipboard-copy": "^4.0.1",
+ "html-react-parser": "^5.2.2",
"husky": "^9.1.6",
"prop-types": "^15.8.1",
"react-colorful": "^5.6.1"
From 89c6e541333f9b2a2eef285389cf82435a322197 Mon Sep 17 00:00:00 2001
From: Nirbhay Singh <121793120+nirbhayel@users.noreply.github.com>
Date: Tue, 14 Jan 2025 05:05:44 +0530
Subject: [PATCH 025/290] [APP-908] Additional fixes (#133)
* fix: text domains
* updated: styled component syntax
* update: use await instead of then
* fix: prevent application crash in case widget fails to load
* add: generated info tip card
* update: refactor function
---
.../assets/js/components/copy-link/index.js | 6 +-
.../generated-page-infotip-card/index.js | 44 ++++++++++
.../settings/assets/js/components/index.js | 1 +
.../components/statement-generator/index.js | 80 ++++++++++---------
.../assets/js/helpers/statement-generator.js | 4 +-
.../assets/js/hooks/use-saved-settings.js | 6 ++
.../settings/assets/js/hooks/use-settings.js | 7 ++
.../assets/js/layouts/menu-settings.js | 4 +-
.../assets/js/layouts/statement-link.js | 58 +++++++++-----
modules/settings/module.php | 3 +
10 files changed, 150 insertions(+), 63 deletions(-)
create mode 100644 modules/settings/assets/js/components/generated-page-infotip-card/index.js
diff --git a/modules/settings/assets/js/components/copy-link/index.js b/modules/settings/assets/js/components/copy-link/index.js
index c078436d..d0138955 100644
--- a/modules/settings/assets/js/components/copy-link/index.js
+++ b/modules/settings/assets/js/components/copy-link/index.js
@@ -28,7 +28,11 @@ const CopyLink = ({ content }) => {
open={open}
onClose={handleClose}
onOpen={handleOpen}
- title={copied ? __('Copied!', 'site-mailer') : __('Copy', 'site-mailer')}
+ title={
+ copied
+ ? __('Copied!', 'pojo-accessibility')
+ : __('Copy', 'pojo-accessibility')
+ }
arrow={false}
PopperProps={{
modifiers: [
diff --git a/modules/settings/assets/js/components/generated-page-infotip-card/index.js b/modules/settings/assets/js/components/generated-page-infotip-card/index.js
new file mode 100644
index 00000000..f4b8ee27
--- /dev/null
+++ b/modules/settings/assets/js/components/generated-page-infotip-card/index.js
@@ -0,0 +1,44 @@
+import Button from '@elementor/ui/Button';
+import Card from '@elementor/ui/Card';
+import CardActions from '@elementor/ui/CardActions';
+import CardContent from '@elementor/ui/CardContent';
+import CardHeader from '@elementor/ui/CardHeader';
+import Typography from '@elementor/ui/Typography';
+import { useSettings, useStorage } from '@ea11y/hooks';
+import { __ } from '@wordpress/i18n';
+
+const GeneratedPageInfoTipCard = () => {
+ const { setShowAccessibilityGeneratedInfotip } = useSettings();
+ const { save } = useStorage();
+ const dismissNotice = async () => {
+ setShowAccessibilityGeneratedInfotip(false);
+ await save({
+ ea11y_show_accessibility_generated_page_infotip: false,
+ });
+ };
+ return (
+
+
+
+
+ {__(
+ 'The accessibility statement page you generated is already linked to the widget.',
+ 'pojo-accessibility',
+ )}
+
+
+
+
+ {__('Got it', 'pojo-accessibility')}
+
+
+
+ );
+};
+
+export default GeneratedPageInfoTipCard;
diff --git a/modules/settings/assets/js/components/index.js b/modules/settings/assets/js/components/index.js
index d11a3b0c..d7134f21 100644
--- a/modules/settings/assets/js/components/index.js
+++ b/modules/settings/assets/js/components/index.js
@@ -17,3 +17,4 @@ export { default as AlertError } from './error';
export { default as HtmlToTypography } from './html-to-typography';
export { default as WidgetLoader } from './widget-loader';
export { default as CopyLink } from './copy-link';
+export { default as GeneratedPageInfoTipCard } from './generated-page-infotip-card';
diff --git a/modules/settings/assets/js/components/statement-generator/index.js b/modules/settings/assets/js/components/statement-generator/index.js
index 457298c9..0e1cf2aa 100644
--- a/modules/settings/assets/js/components/statement-generator/index.js
+++ b/modules/settings/assets/js/components/statement-generator/index.js
@@ -26,22 +26,22 @@ import {
} from '../../helpers/statement-generator';
// Customization for the WP admin global CSS.
-const StyledTextField = styled(TextField)(() => ({
- width: '100%',
- marginTop: 8,
- '.wp-admin & .MuiInputBase-input, & .MuiInputBase-input:focus': {
- backgroundColor: 'initial',
- boxShadow: 'none',
- border: 0,
- color: 'inherit',
- outline: 0,
- padding: '16.5px 14px 16.5px 14px',
- '&.MuiInputBase-inputSizeSmall': {
- padding: '8.5px 14px 8.5px 14px',
- },
- height: '40px',
- },
-}));
+const StyledTextField = styled(TextField)`
+ width: 100%;
+ .wp-admin & .MuiInputBase-input,
+ & .MuiInputBase-input:focus {
+ background-color: initial;
+ box-shadow: none;
+ border: 0;
+ color: inherit;
+ outline: 0;
+ padding: 16.5px 14px 16.5px 14px;
+ &.MuiInputBase-inputSizeSmall {
+ padding: 8.5px 14px 8.5px 14px;
+ }
+ height: 40px;
+ }
+`;
const StatementGenerator = ({ open, close }) => {
const [isValidName, setValidName] = useState(null);
@@ -50,8 +50,12 @@ const StatementGenerator = ({ open, close }) => {
const [disableCreateButton, setDisabledCreateButton] = useState(true);
const { success, error } = useToastNotification();
- const { companyData, setCompanyData, setAccessibilityStatementData } =
- useSettings();
+ const {
+ companyData,
+ setCompanyData,
+ setAccessibilityStatementData,
+ setShowAccessibilityGeneratedInfotip,
+ } = useSettings();
const { save } = useStorage();
useEffect(() => {
@@ -96,36 +100,36 @@ const StatementGenerator = ({ open, close }) => {
const createPage = async () => {
const parsedContent = parseContent(Statement, companyData);
try {
- await API.addPage({
+ const response = await API.addPage({
title: 'Accessibility statement',
content: parsedContent,
status: 'publish',
- }).then((response) => {
- setAccessibilityStatementData({
+ });
+ await setAccessibilityStatementData({
+ statement: parsedContent,
+ pageId: response.id,
+ createdOn: response.date,
+ link: response.link,
+ });
+ await setShowAccessibilityGeneratedInfotip(true);
+ await save({
+ ea11y_accessibility_statement_data: {
statement: parsedContent,
pageId: response.id,
createdOn: response.date,
link: response.link,
- });
- save({
- ea11y_accessibility_statement_data: {
- statement: parsedContent,
- pageId: response.id,
- createdOn: response.date,
- link: response.link,
- },
- });
-
- // Update accessibility statement URL in the global object.
- if (window?.ea11yWidget) {
- window.ea11yWidget.accessibilityStatementURL = response.link;
- }
- close();
- success('Page created');
+ },
+ ea11y_show_accessibility_generated_page_infotip: true,
});
+ // Update accessibility statement URL in the global object.
+ if (window?.ea11yWidget) {
+ window.ea11yWidget.accessibilityStatementURL = response.link;
+ }
+ await close();
+ await success('Page created');
} catch (e) {
error('Error while creating page');
- console.log(e);
+ console.error(e);
}
};
diff --git a/modules/settings/assets/js/helpers/statement-generator.js b/modules/settings/assets/js/helpers/statement-generator.js
index 56f3540d..fd802bf7 100644
--- a/modules/settings/assets/js/helpers/statement-generator.js
+++ b/modules/settings/assets/js/helpers/statement-generator.js
@@ -8,7 +8,9 @@ export const checkEmail = (email) => {
};
export const checkDomain = (domain) => {
- const domainRegex = /^(https?:\/\/)?([a-zA-Z0-9-_]+\.)+[a-zA-Z]{2,}\/?$/;
+ // Support IDNs
+ const domainRegex =
+ /^(https?:\/\/)?([a-zA-Z0-9\u00A1-\uFFFF-]+\.)+[a-zA-Z\u00A1-\uFFFF]{2,}\/?$/;
return domainRegex.test(domain);
};
diff --git a/modules/settings/assets/js/hooks/use-saved-settings.js b/modules/settings/assets/js/hooks/use-saved-settings.js
index 572aeb96..bdec61cb 100644
--- a/modules/settings/assets/js/hooks/use-saved-settings.js
+++ b/modules/settings/assets/js/hooks/use-saved-settings.js
@@ -11,6 +11,7 @@ export const useSavedSettings = () => {
setIconPosition,
setPlanData,
setAccessibilityStatementData,
+ setShowAccessibilityGeneratedInfotip,
} = useSettings();
const result = useSelect((select) => {
@@ -52,6 +53,11 @@ export const useSavedSettings = () => {
result.data.ea11y_accessibility_statement_data,
);
}
+ if (result?.data?.ea11y_show_accessibility_generated_page_infotip) {
+ setShowAccessibilityGeneratedInfotip(
+ result.data.ea11y_show_accessibility_generated_page_infotip,
+ );
+ }
}
}, [result.hasFinishedResolution]);
};
diff --git a/modules/settings/assets/js/hooks/use-settings.js b/modules/settings/assets/js/hooks/use-settings.js
index bb1fb060..3c75f072 100644
--- a/modules/settings/assets/js/hooks/use-settings.js
+++ b/modules/settings/assets/js/hooks/use-settings.js
@@ -116,6 +116,11 @@ export const SettingsProvider = ({ children }) => {
hideLink: false,
});
+ const [
+ showAccessibilityGeneratedInfotip,
+ setShowAccessibilityGeneratedInfotip,
+ ] = useState(false);
+
return (
{
setCompanyData,
accessibilityStatementData,
setAccessibilityStatementData,
+ showAccessibilityGeneratedInfotip,
+ setShowAccessibilityGeneratedInfotip,
}}
>
{children}
diff --git a/modules/settings/assets/js/layouts/menu-settings.js b/modules/settings/assets/js/layouts/menu-settings.js
index 4e9f853e..06f8091f 100644
--- a/modules/settings/assets/js/layouts/menu-settings.js
+++ b/modules/settings/assets/js/layouts/menu-settings.js
@@ -57,9 +57,9 @@ const MenuSettings = () => {
};
setHasChanges(true);
- if (window?.ea11yWidget?.toolsSettings) {
+ if (window?.ea11yWidget?.toolsSettings && window?.ea11yWidget?.widget) {
window.ea11yWidget.toolsSettings = newSettings;
- window.ea11yWidget.widget.updateState();
+ window?.ea11yWidget?.widget.updateState();
}
return newSettings;
});
diff --git a/modules/settings/assets/js/layouts/statement-link.js b/modules/settings/assets/js/layouts/statement-link.js
index 836996cb..a7d7ce32 100644
--- a/modules/settings/assets/js/layouts/statement-link.js
+++ b/modules/settings/assets/js/layouts/statement-link.js
@@ -8,11 +8,16 @@ import FormControl from '@elementor/ui/FormControl';
import FormControlLabel from '@elementor/ui/FormControlLabel';
import FormHelperText from '@elementor/ui/FormHelperText';
import FormLabel from '@elementor/ui/FormLabel';
+import Infotip from '@elementor/ui/Infotip';
import MenuItem from '@elementor/ui/MenuItem';
import Select from '@elementor/ui/Select';
import Switch from '@elementor/ui/Switch';
import Typography from '@elementor/ui/Typography';
-import { CopyLink, WidgetLoader } from '@ea11y/components';
+import {
+ CopyLink,
+ WidgetLoader,
+ GeneratedPageInfoTipCard,
+} from '@ea11y/components';
import { useSettings, useStorage, useToastNotification } from '@ea11y/hooks';
import { useEntityRecords } from '@wordpress/core-data';
import { useEffect, useState } from '@wordpress/element';
@@ -21,8 +26,11 @@ import { __ } from '@wordpress/i18n';
const StatementLink = () => {
const [disabled, setDisabled] = useState(true);
const [isValidPage, setIsValidPage] = useState(false);
- const { accessibilityStatementData, setAccessibilityStatementData } =
- useSettings();
+ const {
+ accessibilityStatementData,
+ setAccessibilityStatementData,
+ showAccessibilityGeneratedInfotip,
+ } = useSettings();
const { save } = useStorage();
const { success, error } = useToastNotification();
const pages = useEntityRecords('postType', 'page', { per_page: -1 });
@@ -104,26 +112,34 @@ const StatementLink = () => {
fullWidth
alignItems="center"
>
- changePage(e.target.value)}
- value={accessibilityStatementData?.pageId}
- error={!isValidPage}
- color="info"
- fullWidth
+ }
+ disableHoverListener
+ disableFocusListener
+ open={showAccessibilityGeneratedInfotip}
>
- {pages?.hasResolved && pages?.records.length > 0 ? (
- pages?.records.map((page) => (
-
- {page.title.rendered}
+ changePage(e.target.value)}
+ value={accessibilityStatementData?.pageId}
+ error={!isValidPage}
+ color="info"
+ fullWidth
+ >
+ {pages?.hasResolved && pages?.records.length > 0 ? (
+ pages?.records.map((page) => (
+
+ {page.title.rendered}
+
+ ))
+ ) : (
+
+ {__('No pages found', 'pojo-accessibility')}
- ))
- ) : (
-
- {__('No pages found', 'pojo-accessibility')}
-
- )}
-
+ )}
+
+
{accessibilityStatementData?.link && (
)}
diff --git a/modules/settings/module.php b/modules/settings/module.php
index a67bcae5..effed830 100644
--- a/modules/settings/module.php
+++ b/modules/settings/module.php
@@ -302,6 +302,9 @@ public function register_settings(): void {
'hide_minimum_active_options_alert' => [
'type' => 'boolean',
],
+ 'show_accessibility_generated_page_infotip' => [
+ 'type' => 'boolean',
+ ],
];
foreach ( $settings as $setting => $args ) {
From fd517ffdcb1a527e1c87a33b7facc4431459fb42 Mon Sep 17 00:00:00 2001
From: Pavlo Kniazevych <139438463+pkniazevych@users.noreply.github.com>
Date: Thu, 16 Jan 2025 11:32:20 +0200
Subject: [PATCH 026/290] Fix: Fix the QA bugs [n/a] (#135)
---
assets/css/admin.css | 5 ++
assets/images/menu-icon.svg | 6 +++
modules/core/module.php | 12 ++++-
.../notices/dismissible-deprecated-nag.php | 2 +-
modules/settings/assets/css/style.css | 22 +++-----
.../assets/js/components/copy-link/index.js | 3 +-
.../generated-page-infotip-card/index.js | 9 +++-
.../assets/js/components/icon-select/index.js | 6 ++-
.../js/components/sidebar-app-bar/index.js | 2 +-
.../assets/js/layouts/icon-design-settings.js | 3 ++
.../assets/js/layouts/statement-link.js | 45 ++++++++++++-----
.../js/pages/accessibility-statement.js | 50 +++++++++++++++----
modules/settings/assets/js/utils/index.js | 21 ++++++++
modules/settings/module.php | 19 +++++--
14 files changed, 156 insertions(+), 49 deletions(-)
create mode 100644 assets/css/admin.css
create mode 100644 assets/images/menu-icon.svg
create mode 100644 modules/settings/assets/js/utils/index.js
diff --git a/assets/css/admin.css b/assets/css/admin.css
new file mode 100644
index 00000000..68566a17
--- /dev/null
+++ b/assets/css/admin.css
@@ -0,0 +1,5 @@
+#adminmenu .toplevel_page_accessibility-settings .wp-menu-image img {
+ padding: 5px 0 0;
+ opacity: 1;
+ filter: none;
+}
diff --git a/assets/images/menu-icon.svg b/assets/images/menu-icon.svg
new file mode 100644
index 00000000..edd80d77
--- /dev/null
+++ b/assets/images/menu-icon.svg
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/modules/core/module.php b/modules/core/module.php
index 2d14f9c9..f811aefe 100644
--- a/modules/core/module.php
+++ b/modules/core/module.php
@@ -55,12 +55,22 @@ public static function is_active() : bool {
return true;
}
+ public function enqueue_scripts() : void {
+ wp_enqueue_style(
+ 'ea11y-global-style',
+ EA11Y_ASSETS_URL . 'css/admin.css',
+ [],
+ EA11Y_VERSION
+ );
+ }
+
/**
* Module constructor.
*/
public function __construct() {
$this->register_components();
- add_filter( 'plugin_action_links', [ $this, 'add_plugin_links' ], 10, 2 );
+ add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_scripts' ] );
+ add_filter( 'plugin_action_links', [ $this, 'add_plugin_links' ], 10, 2 );
}
}
diff --git a/modules/legacy/notices/dismissible-deprecated-nag.php b/modules/legacy/notices/dismissible-deprecated-nag.php
index a6e55c72..0ed9cb84 100644
--- a/modules/legacy/notices/dismissible-deprecated-nag.php
+++ b/modules/legacy/notices/dismissible-deprecated-nag.php
@@ -31,7 +31,7 @@ public function content(): string {
esc_attr( Upgrade::get_learn_more_link() ),
esc_html__( 'Learn more', 'pojo-accessibility' ),
esc_attr( Upgrade::get_switch_now_link() ),
- esc_html__( 'Switch To Equally', 'pojo-accessibility' )
+ esc_html__( 'Switch To Web Accessibility', 'pojo-accessibility' )
);
}
diff --git a/modules/settings/assets/css/style.css b/modules/settings/assets/css/style.css
index fb455c6d..98716854 100644
--- a/modules/settings/assets/css/style.css
+++ b/modules/settings/assets/css/style.css
@@ -55,25 +55,15 @@ html[dir='rtl'] #ea11y-app {
position: absolute;
}
-.ea11y-statement--widget-preview .ea11y-widget-container * {
- opacity: 0.5;
-}
-
-.ea11y-statement--widget-preview .ea11y-widget-container:before {
+.ea11y-statement--widget-preview .ea11y-widget-content::after {
content: '';
+
position: absolute;
top: 0;
+ right: 0;
left: 0;
- height: 100%;
- width: 100%;
- background-color: #eaf4ff;
- opacity: 0.1;
- z-index: 0;
- box-sizing: border-box;
-}
+ bottom: 60px;
-.ea11y-statement--widget-preview .ea11y-widget-statement-link,
-.ea11y-statement--widget-preview .ea11y-widget-statement-link * {
- z-index: 1;
- opacity: 1;
+ background-color: #FCFDFF;
+ opacity: 0.6;
}
diff --git a/modules/settings/assets/js/components/copy-link/index.js b/modules/settings/assets/js/components/copy-link/index.js
index d0138955..18f696db 100644
--- a/modules/settings/assets/js/components/copy-link/index.js
+++ b/modules/settings/assets/js/components/copy-link/index.js
@@ -28,12 +28,13 @@ const CopyLink = ({ content }) => {
open={open}
onClose={handleClose}
onOpen={handleOpen}
+ placement="top"
title={
copied
? __('Copied!', 'pojo-accessibility')
: __('Copy', 'pojo-accessibility')
}
- arrow={false}
+ arrow={true}
PopperProps={{
modifiers: [
{
diff --git a/modules/settings/assets/js/components/generated-page-infotip-card/index.js b/modules/settings/assets/js/components/generated-page-infotip-card/index.js
index f4b8ee27..9eee34b2 100644
--- a/modules/settings/assets/js/components/generated-page-infotip-card/index.js
+++ b/modules/settings/assets/js/components/generated-page-infotip-card/index.js
@@ -10,23 +10,28 @@ import { __ } from '@wordpress/i18n';
const GeneratedPageInfoTipCard = () => {
const { setShowAccessibilityGeneratedInfotip } = useSettings();
const { save } = useStorage();
+
const dismissNotice = async () => {
setShowAccessibilityGeneratedInfotip(false);
+
await save({
ea11y_show_accessibility_generated_page_infotip: false,
});
};
+
return (
-
+
+
{__(
- 'The accessibility statement page you generated is already linked to the widget.',
+ 'We went ahead and linked the accessibility statement page you just created to your widget.',
'pojo-accessibility',
)}
+
theme.shape.borderRadius};
box-shadow: ${({ theme }) => theme.shadows[0]};
cursor: pointer;
+
:hover {
- box-shadow: 0px 0px 15px 0px rgba(37, 99, 235, 0.15);
+ box-shadow: 0 0 15px 0 rgba(37, 99, 235, 0.15);
border-color: ${({ theme }) => theme.palette.info.main};
}
`;
@@ -40,6 +41,7 @@ const IconSelect = (props) => {
{__('Icon', 'pojo-accessibility')}
+
{
sx={{
display: 'flex',
flexDirection: 'row',
- flexWrap: 'nowrap',
+ flexWrap: 'wrap',
gap: 2,
}}
>
diff --git a/modules/settings/assets/js/components/sidebar-app-bar/index.js b/modules/settings/assets/js/components/sidebar-app-bar/index.js
index 7bb471da..2bda36c6 100644
--- a/modules/settings/assets/js/components/sidebar-app-bar/index.js
+++ b/modules/settings/assets/js/components/sidebar-app-bar/index.js
@@ -20,7 +20,7 @@ const SidebarAppBar = () => {
marginLeft={1}
display={!openSidebar ? 'none' : 'inherit'}
>
- {__('Equally', 'pojo-accessibility')}
+ {__('Web Accessibility', 'pojo-accessibility')}
{
{__('Design', 'pojo-accessibility')}
+
{__(
"Customize your accessibility button's color, icon, and size to match your brand.",
@@ -18,11 +19,13 @@ const IconDesignSettings = (props) => {
)}
+
+
diff --git a/modules/settings/assets/js/layouts/statement-link.js b/modules/settings/assets/js/layouts/statement-link.js
index a7d7ce32..7b252193 100644
--- a/modules/settings/assets/js/layouts/statement-link.js
+++ b/modules/settings/assets/js/layouts/statement-link.js
@@ -88,7 +88,7 @@ const StatementLink = () => {
};
return (
-
+
{
)}
sx={{ borderBottom: '1px solid', borderBottomColor: 'divider' }}
/>
+
-
-
+
+
{__('Choose which page to link', 'pojo-accessibility')}
+
{
alignItems="center"
>
}
disableHoverListener
disableFocusListener
@@ -125,7 +127,8 @@ const StatementLink = () => {
value={accessibilityStatementData?.pageId}
error={!isValidPage}
color="info"
- fullWidth
+ size="small"
+ sx={{ minWidth: '242px' }}
>
{pages?.hasResolved && pages?.records.length > 0 ? (
pages?.records.map((page) => (
@@ -140,27 +143,35 @@ const StatementLink = () => {
)}
+
{accessibilityStatementData?.link && (
)}
+
{!isValidPage && (
{__('Please select a page', 'pojo-accessibility')}
)}
+
{__('Want to hide the link?', 'pojo-accessibility')}
+
+
}
sx={{ marginBottom: 3, alignSelf: 'start', ml: 0 }}
onChange={() => {
@@ -173,16 +184,24 @@ const StatementLink = () => {
/>
-
-
+
+
+
+ {__('Preview link in widget', 'pojo-accessibility')}
+
+
+
+
+
+
theme.shape.borderRadius};
box-shadow: ${({ theme }) => theme.shadows[0]};
cursor: pointer;
+
:hover {
- box-shadow: 0px 0px 15px 0px rgba(37, 99, 235, 0.15);
+ box-shadow: 0 0 15px 0 rgba(37, 99, 235, 0.15);
border-color: ${({ theme }) => theme.palette.info.main};
}
`;
+const StyledTitle = styled(Typography)`
+ font-weight: 400;
+ letter-spacing: 0.25px;
+`;
+
const AccessibilityStatement = () => {
const { accessibilityStatementData } = useSettings();
const { isOpen, open, close } = useModal(false);
@@ -78,18 +85,33 @@ const AccessibilityStatement = () => {
display: 'flex',
flexDirection: 'column',
alignItems: 'start',
- gap: 4,
+ gap: 2,
}}
>
-
+
{__('Accessibility statement', 'pojo-accessibility')}
-
+
+
- {__(
- 'An accessibility statement showcases your efforts to create an inclusive online space, highlighting helpful features and a commitment to accessibility. Learn more',
- 'pojo-accessibility',
+ {injectTemplateVars(
+ __(
+ 'An accessibility statement showcases your efforts to create an inclusive online space, highlighting helpful features and a commitment to accessibility. {{link}}Learn more{{/link}}',
+ 'pojo-accessibility',
+ ),
+ {
+ link: ({ children }) => (
+
+ {children}
+
+ ),
+ },
)}
+
{!accessibilityStatementData?.pageId && !showStatementLink && (
<>
@@ -102,13 +124,14 @@ const AccessibilityStatement = () => {
color="text.primary"
align="center"
marginBottom="4px"
- marginTop={3}
+ marginTop={4}
>
{__(
'Need an accessibility statement?',
'pojo-accessibility',
)}
+
{
)}
+
{
}}
>
+
{__('Yes, I need one', 'pojo-accessibility')}
+
+
{
}}
>
+
{__('No, I already have one', 'pojo-accessibility')}
+
{
>
)}
+
{(accessibilityStatementData?.pageId || showStatementLink) && (
)}
+
{!accessibilityStatementData?.pageId && !showStatementLink && (
{
)}
+
>
);
diff --git a/modules/settings/assets/js/utils/index.js b/modules/settings/assets/js/utils/index.js
new file mode 100644
index 00000000..3a67ddcc
--- /dev/null
+++ b/modules/settings/assets/js/utils/index.js
@@ -0,0 +1,21 @@
+import { createElement } from '@wordpress/element';
+
+export const injectTemplateVars = (message, components) => {
+ const regex = /\{\{(\w+)\}\}([^]*?)\{\{\/\1\}\}/g;
+ const splitMessage = message.split(regex);
+
+ // eslint-disable-next-line array-callback-return
+ return splitMessage.map((part, index) => {
+ if (index % 3 === 0) {
+ return part;
+ }
+
+ if (index % 3 === 1) {
+ return createElement(
+ components[part],
+ { key: index },
+ splitMessage[index + 1],
+ );
+ }
+ });
+};
diff --git a/modules/settings/module.php b/modules/settings/module.php
index effed830..59351acc 100644
--- a/modules/settings/module.php
+++ b/modules/settings/module.php
@@ -46,12 +46,12 @@ public function render_app() {
public function register_page() : void {
add_menu_page(
- __( 'Equally', 'pojo-accessibility' ), //TODO: Change this later
- __( 'Equally', 'pojo-accessibility' ),
+ __( 'Web Accessibility', 'pojo-accessibility' ),
+ __( 'Web Accessibility', 'pojo-accessibility' ),
self::SETTING_CAPABILITY,
self::SETTING_BASE_SLUG,
[ $this, 'render_app' ],
- 'dashicons-universal-access-alt',
+ EA11Y_ASSETS_URL . 'images/menu-icon.svg',
);
add_submenu_page(
@@ -250,6 +250,17 @@ public function check_plan_data( $current_screen ) : void {
}
}
+ public function remove_admin_footer_text( $text ): string {
+ $screen = get_current_screen();
+
+ if ( self::SETTING_PAGE_SLUG === $screen->base ) {
+ remove_filter( 'update_footer', 'core_update_footer' );
+ return '';
+ }
+
+ return $text;
+ }
+
/**
* Register settings.
*
@@ -321,6 +332,8 @@ public function register_settings(): void {
public function __construct() {
$this->register_routes();
$this->register_components( self::component_list() );
+
+ add_filter( 'admin_footer_text', [ $this, 'remove_admin_footer_text' ] );
add_action( 'admin_menu', [ $this, 'register_page' ] );
add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_scripts' ], 9 );
add_action( 'rest_api_init', [ $this, 'register_settings' ] );
From 0c374dfe8f176c4b67e016aabe6c6dc0782bee2d Mon Sep 17 00:00:00 2001
From: VasylD
Date: Thu, 16 Jan 2025 13:47:14 +0200
Subject: [PATCH 027/290] [APP-830] Add mixpanel events (#134)
* [APP-830] Add mixpanel events
* Merge branch 'develop' into feature/APP-830-add-mixpanel
# Conflicts:
# .gitignore
# modules/settings/assets/js/components/sidebar-menu/index.js
# modules/settings/assets/js/pages/accessibility-statement.js
* Merge branch 'develop' into feature/APP-830-add-mixpanel
# Conflicts:
# .gitignore
# modules/settings/assets/js/components/sidebar-menu/index.js
# modules/settings/assets/js/pages/accessibility-statement.js
* Merge branch 'develop' into feature/APP-830-add-mixpanel
# Conflicts:
# .gitignore
# modules/settings/assets/js/components/sidebar-menu/index.js
# modules/settings/assets/js/pages/accessibility-statement.js
* Merge branch 'develop' into feature/APP-830-add-mixpanel
# Conflicts:
# .gitignore
# modules/settings/assets/js/components/sidebar-menu/index.js
# modules/settings/assets/js/pages/accessibility-statement.js
* Merge branch 'develop' into feature/APP-830-add-mixpanel
# Conflicts:
# .gitignore
# modules/settings/assets/js/components/sidebar-menu/index.js
# modules/settings/assets/js/pages/accessibility-statement.js
* Merge branch 'develop' into feature/APP-830-add-mixpanel
# Conflicts:
# .gitignore
# modules/settings/assets/js/components/sidebar-menu/index.js
# modules/settings/assets/js/pages/accessibility-statement.js
---
.gitignore | 1 +
modules/settings/assets/js/app.js | 11 +-
.../js/components/admin-top-bar/index.js | 6 +
.../alignment-matrix-control/index.js | 7 +
.../assets/js/components/bottom-bar/index.js | 13 +
.../js/components/color-picker/index.js | 17 +-
.../assets/js/components/icon-select/index.js | 10 +-
.../assets/js/components/icon-size/index.js | 11 +-
.../js/components/my-account-menu/index.js | 21 +-
.../js/components/position-control/index.js | 40 +-
.../js/components/post-connect-modal/index.js | 8 +
.../js/components/sidebar-menu/index.js | 23 +-
.../components/statement-generator/index.js | 3 +
.../js/layouts/position-settings-desktop.js | 15 +
.../js/layouts/position-settings-mobile.js | 15 +
.../assets/js/layouts/statement-link.js | 25 +-
.../js/pages/accessibility-statement.js | 20 +-
.../settings/assets/js/pages/icon-settings.js | 7 +
modules/settings/assets/js/pages/menu.js | 8 +
modules/settings/assets/js/services/index.js | 1 +
.../assets/js/services/mixpanel-service.js | 45 +
modules/settings/module.php | 36 +-
package-lock.json | 2624 ++++++++++-------
package.json | 4 +-
webpack.config.js | 4 +
25 files changed, 1791 insertions(+), 1184 deletions(-)
create mode 100644 modules/settings/assets/js/services/index.js
create mode 100644 modules/settings/assets/js/services/mixpanel-service.js
diff --git a/.gitignore b/.gitignore
index f7fce55b..93b4f81c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -15,4 +15,5 @@ coverage/
.phpunit.result.cache
.editorconfig
.vscode
+.env
*.zip
diff --git a/modules/settings/assets/js/app.js b/modules/settings/assets/js/app.js
index 070f3956..7104567a 100644
--- a/modules/settings/assets/js/app.js
+++ b/modules/settings/assets/js/app.js
@@ -16,6 +16,8 @@ import {
useSavedSettings,
} from '@ea11y/hooks';
import { Sidebar } from '@ea11y/layouts';
+import { mixpanelService } from '@ea11y/services';
+import { useEffect } from '@wordpress/element';
import { usePluginSettingsContext } from './contexts/plugin-settings';
const App = () => {
@@ -25,6 +27,13 @@ const App = () => {
const { notificationMessage, notificationType } = useNotificationSettings();
const { selectedMenu } = useSettings();
+ useEffect(() => {
+ mixpanelService.init();
+ mixpanelService.sendEvent('Page View', {
+ page: 'Button',
+ });
+ }, []);
+
// Accessing the selected menu item
const selectedParent = MenuItems[selectedMenu.parent];
const selectedChild = selectedMenu.child
@@ -33,7 +42,7 @@ const App = () => {
return (
- {!isConnected && }
+ {isConnected !== undefined && !isConnected && }
{isConnected && !closePostConnectModal && }
diff --git a/modules/settings/assets/js/components/admin-top-bar/index.js b/modules/settings/assets/js/components/admin-top-bar/index.js
index b92cfd81..2bd451ab 100644
--- a/modules/settings/assets/js/components/admin-top-bar/index.js
+++ b/modules/settings/assets/js/components/admin-top-bar/index.js
@@ -2,6 +2,7 @@ import HelpIcon from '@elementor/icons/HelpIcon';
import AppBar from '@elementor/ui/AppBar';
import Link from '@elementor/ui/Link';
import Toolbar from '@elementor/ui/Toolbar';
+import { mixpanelService } from '@ea11y/services';
import { __ } from '@wordpress/i18n';
import { HELP_LINK } from '../../constants';
@@ -23,6 +24,11 @@ const AdminTopBar = () => {
target="_blank"
sx={{ display: 'inline-flex', alignItems: 'center', gap: 1 }}
aria-label={__('Help', 'pojo-accessibility')}
+ onClick={() =>
+ mixpanelService.sendEvent('Help button clicked', {
+ source: 'Header',
+ })
+ }
>
diff --git a/modules/settings/assets/js/components/alignment-matrix-control/index.js b/modules/settings/assets/js/components/alignment-matrix-control/index.js
index 7186ccf9..58669ef6 100644
--- a/modules/settings/assets/js/components/alignment-matrix-control/index.js
+++ b/modules/settings/assets/js/components/alignment-matrix-control/index.js
@@ -8,6 +8,7 @@ import RadioGroup from '@elementor/ui/RadioGroup';
import Tooltip from '@elementor/ui/Tooltip';
import Typography from '@elementor/ui/Typography';
import { useIconPosition } from '@ea11y/hooks';
+import { mixpanelService } from '@ea11y/services';
import { __ } from '@wordpress/i18n';
const AlignmentMatrixControl = ({ mode }) => {
@@ -15,6 +16,12 @@ const AlignmentMatrixControl = ({ mode }) => {
const handleChange = (event) => {
updateIconPosition(mode, 'position', event.target.value);
+ mixpanelService.sendEvent('Position button clicked', {
+ buttonData: {
+ mode,
+ value: event.target.value,
+ },
+ });
};
// Define options based on the mode
diff --git a/modules/settings/assets/js/components/bottom-bar/index.js b/modules/settings/assets/js/components/bottom-bar/index.js
index dfbea832..174107ab 100644
--- a/modules/settings/assets/js/components/bottom-bar/index.js
+++ b/modules/settings/assets/js/components/bottom-bar/index.js
@@ -1,6 +1,7 @@
import Box from '@elementor/ui/Box';
import Button from '@elementor/ui/Button';
import { useSettings, useStorage, useToastNotification } from '@ea11y/hooks';
+import { mixpanelService } from '@ea11y/services';
import { __ } from '@wordpress/i18n';
const BottomBar = () => {
@@ -23,6 +24,11 @@ const BottomBar = () => {
});
success('Settings saved!');
setHasChanges(false);
+ mixpanelService.sendEvent('Save button clicked', {
+ savedData: {
+ ea11y_widget_menu_settings: widgetMenuSettings,
+ },
+ });
} catch (e) {
error('Failed to save settings!');
}
@@ -40,6 +46,13 @@ const BottomBar = () => {
success('Settings saved!');
setHasChanges(false);
+
+ mixpanelService.sendEvent('Save button clicked', {
+ savedData: {
+ style: iconDesign,
+ position: iconPosition,
+ },
+ });
} catch (e) {
error('Failed to save settings!');
}
diff --git a/modules/settings/assets/js/components/color-picker/index.js b/modules/settings/assets/js/components/color-picker/index.js
index dcb502dd..2a141b12 100644
--- a/modules/settings/assets/js/components/color-picker/index.js
+++ b/modules/settings/assets/js/components/color-picker/index.js
@@ -4,12 +4,19 @@ import FormLabel from '@elementor/ui/FormLabel';
import Grid from '@elementor/ui/Grid';
import Typography from '@elementor/ui/Typography';
import { HexColorPicker, HexColorInput } from 'react-colorful';
+import { useDebouncedCallback } from 'use-debounce';
import { useIconDesign } from '@ea11y/hooks';
+import { mixpanelService } from '@ea11y/services';
import { __ } from '@wordpress/i18n';
import './style.css';
const ColorPicker = () => {
const { iconDesign, updateIconDesign } = useIconDesign();
+ const debounced = useDebouncedCallback((value) => {
+ mixpanelService.sendEvent('Color Changed', {
+ color: value,
+ });
+ }, 1000);
return (
@@ -21,7 +28,10 @@ const ColorPicker = () => {
updateIconDesign({ color: value })}
+ onChange={(value) => {
+ updateIconDesign({ color: value });
+ debounced(value);
+ }}
className="widget-settings-color-picker"
/>
@@ -33,7 +43,10 @@ const ColorPicker = () => {
>
updateIconDesign({ color: value })}
+ onChange={(value) => {
+ updateIconDesign({ color: value });
+ debounced(value);
+ }}
style={{
width: '100%',
border: '1px solid rgba(0, 0, 0, 0.12)',
diff --git a/modules/settings/assets/js/components/icon-select/index.js b/modules/settings/assets/js/components/icon-select/index.js
index 7c8d5d2e..0379b5b1 100644
--- a/modules/settings/assets/js/components/icon-select/index.js
+++ b/modules/settings/assets/js/components/icon-select/index.js
@@ -6,6 +6,7 @@ import RadioGroup from '@elementor/ui/RadioGroup';
import Typography from '@elementor/ui/Typography';
import { styled } from '@elementor/ui/styles';
import { useIconDesign } from '@ea11y/hooks';
+import { mixpanelService } from '@ea11y/services';
import { cloneElement } from '@wordpress/element';
import { __ } from '@wordpress/i18n';
import options from '../../helpers/accessibility-options';
@@ -34,6 +35,13 @@ const StyledPaper = styled(Paper)`
const IconSelect = (props) => {
const { iconDesign, updateIconDesign } = useIconDesign();
+ const selectIcon = (icon) => () => {
+ updateIconDesign({ icon });
+ mixpanelService.sendEvent('Icon type selected', {
+ iconType: icon,
+ });
+ };
+
return (
@@ -58,7 +66,7 @@ const IconSelect = (props) => {
updateIconDesign({ icon: option.value })}
+ onClick={selectIcon(option.value)}
sx={{
borderColor:
iconDesign.icon === option.value ? 'info.main' : 'divider',
diff --git a/modules/settings/assets/js/components/icon-size/index.js b/modules/settings/assets/js/components/icon-size/index.js
index e6d381b5..6ece59b4 100644
--- a/modules/settings/assets/js/components/icon-size/index.js
+++ b/modules/settings/assets/js/components/icon-size/index.js
@@ -6,6 +6,7 @@ import RadioGroup from '@elementor/ui/RadioGroup';
import Typography from '@elementor/ui/Typography';
import { styled } from '@elementor/ui/styles';
import { useIconDesign } from '@ea11y/hooks';
+import { mixpanelService } from '@ea11y/services';
import { cloneElement } from '@wordpress/element';
import { __ } from '@wordpress/i18n';
import { getOptionByValue } from '../../helpers/accessibility-options';
@@ -38,6 +39,14 @@ const IconSize = (props) => {
{ value: 'medium', fontSize: 44 },
{ value: 'small', fontSize: 36 },
];
+
+ const selectIconSize = (size) => () => {
+ updateIconDesign({ size });
+ mixpanelService.sendEvent('Size type clicked', {
+ size,
+ });
+ };
+
return (
@@ -60,7 +69,7 @@ const IconSize = (props) => {
updateIconDesign({ size: option.value })}
+ onClick={selectIconSize(option.value)}
sx={{
borderColor:
iconDesign.size === option.value ? 'info.main' : 'divider',
diff --git a/modules/settings/assets/js/components/my-account-menu/index.js b/modules/settings/assets/js/components/my-account-menu/index.js
index e6619022..74fde2e0 100644
--- a/modules/settings/assets/js/components/my-account-menu/index.js
+++ b/modules/settings/assets/js/components/my-account-menu/index.js
@@ -14,14 +14,16 @@ import {
bindTrigger,
usePopupState,
} from '@elementor/ui/usePopupState';
-import { useSettings, useToastNotification } from '@ea11y/hooks';
+import { useSettings, useStorage, useToastNotification } from '@ea11y/hooks';
import { CreditCardIcon, UserArrowIcon } from '@ea11y/icons';
+import { mixpanelService } from '@ea11y/services';
import { __ } from '@wordpress/i18n';
import API from '../../api';
import { BILLING_LINK } from '../../constants';
const MyAccountMenu = () => {
const { openSidebar, planData } = useSettings();
+ const { save } = useStorage();
const { error } = useToastNotification();
const accountMenuState = usePopupState({
variant: 'popover',
@@ -42,6 +44,12 @@ const MyAccountMenu = () => {
try {
await API.disconnect();
await API.redirectToConnect();
+ await save({
+ ea11y_close_post_connect_modal: false,
+ });
+ mixpanelService.sendEvent('Menu button click', {
+ buttonName: 'Switch account',
+ });
} catch (e) {
error(
__('Failed to switch account. Please try again.', 'pojo-accessibility'),
@@ -52,11 +60,20 @@ const MyAccountMenu = () => {
const redirectToBilling = () => {
window.open(BILLING_LINK, '_blank').focus();
+ mixpanelService.sendEvent('Menu button click', {
+ buttonName: 'Billing',
+ });
};
return (
<>
-
+ {
+ mixpanelService.sendEvent('Menu button click', {
+ buttonName: 'My Account',
+ });
+ }}
+ >
{
updateExactPosition(
mode,
type,
- iconPosition[mode].exactPosition[type].direction,
- iconPosition[mode].exactPosition[type].value,
+ iconPosition[mode]?.exactPosition[type]?.direction,
+ iconPosition[mode]?.exactPosition[type]?.value,
units[index],
);
popupState.close();
+ mixpanelService.sendEvent('Handle Unit Changed', {
+ positionData: {
+ mode,
+ type,
+ unit: units[index],
+ value: iconPosition[mode]?.exactPosition[type]?.direction,
+ direction: iconPosition[mode]?.exactPosition[type]?.value,
+ },
+ });
};
const handlePositionChange = (event) => {
updateExactPosition(
mode,
type,
- iconPosition[mode].exactPosition[type].direction,
+ iconPosition[mode]?.exactPosition[type]?.direction,
event.target.value,
- iconPosition[mode].exactPosition[type].unit,
+ iconPosition[mode]?.exactPosition[type]?.unit,
);
+ mixpanelService.sendEvent('Handle Value Changed', {
+ positionData: {
+ mode,
+ type,
+ value: event.target.value,
+ unit: iconPosition[mode]?.exactPosition[type]?.unit,
+ direction: iconPosition[mode]?.exactPosition[type]?.value,
+ },
+ });
};
const handlePositionDirection = (event) => {
updateExactPosition(
mode,
type,
event.target.value,
- iconPosition[mode].exactPosition[type].value,
- iconPosition[mode].exactPosition[type].unit,
+ iconPosition[mode]?.exactPosition[type]?.value,
+ iconPosition[mode]?.exactPosition[type]?.unit,
);
+ mixpanelService.sendEvent('Handle Direction Changed', {
+ positionData: {
+ mode,
+ type,
+ value: iconPosition[mode]?.exactPosition[type]?.value,
+ unit: iconPosition[mode]?.exactPosition[type]?.unit,
+ direction: event.target.value,
+ },
+ });
};
return (
diff --git a/modules/settings/assets/js/components/post-connect-modal/index.js b/modules/settings/assets/js/components/post-connect-modal/index.js
index 25fd98df..851d7865 100644
--- a/modules/settings/assets/js/components/post-connect-modal/index.js
+++ b/modules/settings/assets/js/components/post-connect-modal/index.js
@@ -4,12 +4,20 @@ import Modal from '@elementor/ui/Modal';
import Typography from '@elementor/ui/Typography';
import { useModal, useStorage } from '@ea11y/hooks';
import { PostConnectModalIcon } from '@ea11y/icons';
+import { mixpanelService } from '@ea11y/services';
+import { useEffect } from '@wordpress/element';
import { __ } from '@wordpress/i18n';
const PostConnectModal = () => {
const { isOpen, close } = useModal();
const { save } = useStorage();
+ useEffect(() => {
+ if (isOpen) {
+ mixpanelService.sendEvent('Connect success');
+ }
+ }, [isOpen]);
+
const onClose = async () => {
await save({
ea11y_close_post_connect_modal: true,
diff --git a/modules/settings/assets/js/components/sidebar-menu/index.js b/modules/settings/assets/js/components/sidebar-menu/index.js
index c636283c..ea31a068 100644
--- a/modules/settings/assets/js/components/sidebar-menu/index.js
+++ b/modules/settings/assets/js/components/sidebar-menu/index.js
@@ -6,26 +6,35 @@ import ListItemIcon from '@elementor/ui/ListItemIcon';
import ListItemText from '@elementor/ui/ListItemText';
import { MenuItems } from '@ea11y/components';
import { useSettings } from '@ea11y/hooks';
+import { mixpanelService } from '@ea11y/services';
import { useState, Fragment } from '@wordpress/element';
const SidebarMenu = () => {
const { openSidebar, selectedMenu, setSelectedMenu } = useSettings();
const [expandedItems, setExpandedItems] = useState({ widget: true });
- const handleSelectedMenu = (parentKey, childKey) => {
+ const handleSelectedMenu = (itemName, parentKey, childKey) => {
if (childKey) {
setSelectedMenu({ parent: parentKey, child: childKey });
} else {
setSelectedMenu({ parent: parentKey, child: null });
}
+
+ mixpanelService.sendEvent('Menu button click', {
+ buttonName: itemName,
+ });
};
- const handleToggleItem = (itemName) => {
+ const handleToggleItem = (itemName, itemKey) => {
setExpandedItems((prev) => ({
...prev,
- [itemName]: !prev[itemName], // Toggle the expanded state for the clicked item
+ [itemKey]: !prev[itemKey], // Toggle the expanded state for the clicked item
}));
+ mixpanelService.sendEvent('Menu button click', {
+ buttonName: itemName,
+ });
};
+
return (
{Object.entries(MenuItems).map(([key, item]) => (
@@ -33,7 +42,9 @@ const SidebarMenu = () => {
- item?.children ? handleToggleItem(key) : handleSelectedMenu(key)
+ item?.children
+ ? handleToggleItem(item.name, key)
+ : handleSelectedMenu(item.name, key)
}
sx={{ justifyContent: 'center', borderRadius: 1 }}
selected={
@@ -65,7 +76,9 @@ const SidebarMenu = () => {
sx={{ paddingLeft: '44px', borderRadius: 1 }}
hidden={!openSidebar}
selected={childKey === selectedMenu?.child && openSidebar}
- onClick={() => handleSelectedMenu(key, childKey)}
+ onClick={() =>
+ handleSelectedMenu(child.name, key, childKey)
+ }
>
diff --git a/modules/settings/assets/js/components/statement-generator/index.js b/modules/settings/assets/js/components/statement-generator/index.js
index 0e1cf2aa..b2afe388 100644
--- a/modules/settings/assets/js/components/statement-generator/index.js
+++ b/modules/settings/assets/js/components/statement-generator/index.js
@@ -14,6 +14,7 @@ import Typography from '@elementor/ui/Typography';
import { styled } from '@elementor/ui/styles';
import { AlertError, HtmlToTypography } from '@ea11y/components';
import { useSettings, useStorage, useToastNotification } from '@ea11y/hooks';
+import { mixpanelService } from '@ea11y/services';
import { useState, useEffect } from '@wordpress/element';
import { __ } from '@wordpress/i18n';
import API from '../../api';
@@ -127,6 +128,8 @@ const StatementGenerator = ({ open, close }) => {
}
await close();
await success('Page created');
+
+ mixpanelService.sendEvent('Statement page created');
} catch (e) {
error('Error while creating page');
console.error(e);
diff --git a/modules/settings/assets/js/layouts/position-settings-desktop.js b/modules/settings/assets/js/layouts/position-settings-desktop.js
index e588dc69..dbddd04d 100644
--- a/modules/settings/assets/js/layouts/position-settings-desktop.js
+++ b/modules/settings/assets/js/layouts/position-settings-desktop.js
@@ -4,6 +4,7 @@ import Switch from '@elementor/ui/Switch';
import Typography from '@elementor/ui/Typography';
import { AlignmentMatrixControl, PositionControl } from '@ea11y/components';
import { useIconPosition } from '@ea11y/hooks';
+import { mixpanelService } from '@ea11y/services';
import { __ } from '@wordpress/i18n';
const PositionSettingsDesktop = () => {
@@ -11,6 +12,13 @@ const PositionSettingsDesktop = () => {
const toggleVisibility = (device) => {
updateIconPosition(device, 'hidden', !iconPosition[device].hidden);
+ mixpanelService.sendEvent('Toggle clicked', {
+ toggleData: {
+ state: !iconPosition[device].hidden,
+ type: 'Hide on desktop',
+ device,
+ },
+ });
};
const toggleExactPosition = (device) => {
@@ -19,6 +27,13 @@ const PositionSettingsDesktop = () => {
'enableExactPosition',
!iconPosition[device].enableExactPosition,
);
+ mixpanelService.sendEvent('Toggle clicked', {
+ toggleData: {
+ state: !iconPosition[device].enableExactPosition,
+ type: 'Exact position',
+ device,
+ },
+ });
};
const hideOnDesktopLabel = (
diff --git a/modules/settings/assets/js/layouts/position-settings-mobile.js b/modules/settings/assets/js/layouts/position-settings-mobile.js
index a5759852..f2aa52ec 100644
--- a/modules/settings/assets/js/layouts/position-settings-mobile.js
+++ b/modules/settings/assets/js/layouts/position-settings-mobile.js
@@ -4,6 +4,7 @@ import Switch from '@elementor/ui/Switch';
import Typography from '@elementor/ui/Typography';
import { AlignmentMatrixControl, PositionControl } from '@ea11y/components';
import { useIconPosition } from '@ea11y/hooks';
+import { mixpanelService } from '@ea11y/services';
import { __ } from '@wordpress/i18n';
const PositionSettingsMobile = () => {
@@ -11,6 +12,13 @@ const PositionSettingsMobile = () => {
const toggleVisibility = (device) => {
updateIconPosition(device, 'hidden', !iconPosition[device].hidden);
+ mixpanelService.sendEvent('Toggle clicked', {
+ toggleData: {
+ state: !iconPosition[device].hidden,
+ type: 'Hide on mobile',
+ device,
+ },
+ });
};
const toggleExactPosition = (device) => {
@@ -19,6 +27,13 @@ const PositionSettingsMobile = () => {
'enableExactPosition',
!iconPosition[device].enableExactPosition,
);
+ mixpanelService.sendEvent('Toggle clicked', {
+ toggleData: {
+ state: !iconPosition[device].enableExactPosition,
+ type: 'Exact position',
+ device,
+ },
+ });
};
const hideOnMobileLabel = (
diff --git a/modules/settings/assets/js/layouts/statement-link.js b/modules/settings/assets/js/layouts/statement-link.js
index 7b252193..b28d301d 100644
--- a/modules/settings/assets/js/layouts/statement-link.js
+++ b/modules/settings/assets/js/layouts/statement-link.js
@@ -19,6 +19,7 @@ import {
GeneratedPageInfoTipCard,
} from '@ea11y/components';
import { useSettings, useStorage, useToastNotification } from '@ea11y/hooks';
+import { mixpanelService } from '@ea11y/services';
import { useEntityRecords } from '@wordpress/core-data';
import { useEffect, useState } from '@wordpress/element';
import { __ } from '@wordpress/i18n';
@@ -71,9 +72,26 @@ const StatementLink = () => {
pageId: page[0]?.id,
link: page[0]?.link,
});
+
+ mixpanelService.sendEvent('Statement page selected', {
+ page: page[0]?.link,
+ });
}
};
+ const onHideLink = () => {
+ setAccessibilityStatementData({
+ ...accessibilityStatementData,
+ hideLink: !accessibilityStatementData.hideLink,
+ });
+ mixpanelService.sendEvent('Toggle clicked', {
+ toggleData: {
+ state: !accessibilityStatementData.hideLink,
+ type: 'Hide link',
+ },
+ });
+ };
+
const savePage = async () => {
try {
await save({
@@ -174,12 +192,7 @@ const StatementLink = () => {
/>
}
sx={{ marginBottom: 3, alignSelf: 'start', ml: 0 }}
- onChange={() => {
- setAccessibilityStatementData({
- ...accessibilityStatementData,
- hideLink: !accessibilityStatementData.hideLink,
- });
- }}
+ onChange={onHideLink}
checked={accessibilityStatementData?.hideLink}
/>
diff --git a/modules/settings/assets/js/pages/accessibility-statement.js b/modules/settings/assets/js/pages/accessibility-statement.js
index b3ce9d27..7943e03b 100644
--- a/modules/settings/assets/js/pages/accessibility-statement.js
+++ b/modules/settings/assets/js/pages/accessibility-statement.js
@@ -16,6 +16,7 @@ import {
AccessibilityStatementCreateIcon,
} from '@ea11y/icons';
import { StatementLink } from '@ea11y/layouts';
+import { mixpanelService } from '@ea11y/services';
import { useEffect, useState } from '@wordpress/element';
import { __ } from '@wordpress/i18n';
import { injectTemplateVars } from '../utils';
@@ -51,6 +52,12 @@ const AccessibilityStatement = () => {
const [statementOption, setStatementOption] = useState('');
const [showStatementLink, setShowStatementLink] = useState(false);
+ useEffect(() => {
+ mixpanelService.sendEvent('Page View', {
+ page: 'Accessibility statement',
+ });
+ }, []);
+
useEffect(() => {
setContinueDisabled(false);
}, [statementOption]);
@@ -59,6 +66,13 @@ const AccessibilityStatement = () => {
setContinueDisabled(true);
}, []);
+ const onStatementOptionClick = (option) => () => {
+ setStatementOption(option);
+ mixpanelService.sendEvent('Statement flow selected', {
+ flowType: option,
+ });
+ };
+
const handleContinue = () => {
if (statementOption === 'generate') {
open();
@@ -159,9 +173,7 @@ const AccessibilityStatement = () => {
{
- setStatementOption('generate');
- }}
+ onClick={onStatementOptionClick('generate')}
sx={{
borderColor:
statementOption === 'generate'
@@ -185,7 +197,7 @@ const AccessibilityStatement = () => {
setStatementOption('existing')}
+ onClick={onStatementOptionClick('existing')}
sx={{
borderColor:
statementOption === 'existing'
diff --git a/modules/settings/assets/js/pages/icon-settings.js b/modules/settings/assets/js/pages/icon-settings.js
index 5601cd0c..d0fb32c8 100644
--- a/modules/settings/assets/js/pages/icon-settings.js
+++ b/modules/settings/assets/js/pages/icon-settings.js
@@ -2,9 +2,16 @@ import Container from '@elementor/ui/Container';
import Typography from '@elementor/ui/Typography';
import { BottomBar } from '@ea11y/components';
import { IconDesignSettings, PositionSettings } from '@ea11y/layouts';
+import { mixpanelService } from '@ea11y/services';
+import { useEffect } from '@wordpress/element';
import { __ } from '@wordpress/i18n';
const IconSettings = () => {
+ useEffect(() => {
+ mixpanelService.sendEvent('Page View', {
+ page: 'Button',
+ });
+ }, []);
return (
<>
diff --git a/modules/settings/assets/js/pages/menu.js b/modules/settings/assets/js/pages/menu.js
index 6e869688..06e37370 100644
--- a/modules/settings/assets/js/pages/menu.js
+++ b/modules/settings/assets/js/pages/menu.js
@@ -2,9 +2,17 @@ import Box from '@elementor/ui/Box';
import Container from '@elementor/ui/Container';
import Typography from '@elementor/ui/Typography';
import { MenuSettings, WidgetPreview } from '@ea11y/layouts';
+import { mixpanelService } from '@ea11y/services';
+import { useEffect } from '@wordpress/element';
import { __ } from '@wordpress/i18n';
const Menu = () => {
+ useEffect(() => {
+ mixpanelService.sendEvent('Page View', {
+ page: 'Capabilities',
+ });
+ }, []);
+
return (
diff --git a/modules/settings/assets/js/services/index.js b/modules/settings/assets/js/services/index.js
new file mode 100644
index 00000000..e60f1da0
--- /dev/null
+++ b/modules/settings/assets/js/services/index.js
@@ -0,0 +1 @@
+export { mixpanelService } from './mixpanel-service';
diff --git a/modules/settings/assets/js/services/mixpanel-service.js b/modules/settings/assets/js/services/mixpanel-service.js
new file mode 100644
index 00000000..5652eeb0
--- /dev/null
+++ b/modules/settings/assets/js/services/mixpanel-service.js
@@ -0,0 +1,45 @@
+import mixpanel from 'mixpanel-browser';
+
+export const SHARE_USAGE_DATA = 'share_usage_data';
+
+const init = () => {
+ const { ea11ySettingsData } = window;
+
+ if (
+ !ea11ySettingsData.mixpanelToken ||
+ !ea11ySettingsData?.planData?.scopes?.includes(SHARE_USAGE_DATA)
+ ) {
+ return;
+ }
+
+ mixpanel.init(ea11ySettingsData.mixpanelToken, {
+ debug: false,
+ track_pageview: false,
+ persistence: 'localStorage',
+ });
+};
+
+const sendEvent = (name, event) => {
+ const { ea11ySettingsData } = window;
+ const plan = ea11ySettingsData?.planData?.plan;
+ if (mixpanel.__loaded) {
+ mixpanel.track(name, {
+ ...event,
+ productName: 'app_access',
+ subscription: {
+ subscriptionId: plan?.subscription_id,
+ name: plan?.name,
+ status: plan?.status,
+ },
+ userData: {
+ id: ea11ySettingsData?.clientId,
+ email: ea11ySettingsData?.planData?.user?.email,
+ },
+ });
+ }
+};
+
+export const mixpanelService = {
+ init,
+ sendEvent,
+};
diff --git a/modules/settings/module.php b/modules/settings/module.php
index 59351acc..3c849782 100644
--- a/modules/settings/module.php
+++ b/modules/settings/module.php
@@ -22,6 +22,7 @@ class Module extends Module_Base {
const SETTING_BASE_SLUG = 'accessibility-settings'; //TODO: Change this later
const SETTING_CAPABILITY = 'manage_options';
const SETTING_PAGE_SLUG = 'toplevel_page_' . self::SETTING_BASE_SLUG;
+ const MIXPANEL_TOKEN = '150605b3b9f979922f2ac5a52e2dcfe9';
public function get_name(): string {
return 'settings';
@@ -51,7 +52,7 @@ public function register_page() : void {
self::SETTING_CAPABILITY,
self::SETTING_BASE_SLUG,
[ $this, 'render_app' ],
- EA11Y_ASSETS_URL . 'images/menu-icon.svg',
+ EA11Y_ASSETS_URL . 'images/menu-icon.svg',
);
add_submenu_page(
@@ -84,10 +85,23 @@ public function enqueue_scripts( $hook ) : void {
wp_localize_script(
'admin',
'ea11ySettingsData',
- [ 'wpRestNonce' => wp_create_nonce( 'wp_rest' ) ]
+ [
+ 'wpRestNonce' => wp_create_nonce( 'wp_rest' ),
+ 'planData' => Settings::get( Settings::PLAN_DATA ),
+ 'clientId' => Data::get_client_id(),
+ 'mixpanelToken' => self::get_mixpanel_token(),
+ ]
);
}
+ /**
+ * Get Mixpanel project Token
+ * @return string
+ */
+ private static function get_mixpanel_token() : string {
+ return apply_filters( 'ea11y_mixpanel_token', self::MIXPANEL_TOKEN );
+ }
+
public static function routes_list() : array {
return [
'Get_Settings',
@@ -250,16 +264,16 @@ public function check_plan_data( $current_screen ) : void {
}
}
- public function remove_admin_footer_text( $text ): string {
- $screen = get_current_screen();
+ public function remove_admin_footer_text( $text ): string {
+ $screen = get_current_screen();
- if ( self::SETTING_PAGE_SLUG === $screen->base ) {
- remove_filter( 'update_footer', 'core_update_footer' );
- return '';
- }
+ if ( self::SETTING_PAGE_SLUG === $screen->base ) {
+ remove_filter( 'update_footer', 'core_update_footer' );
+ return '';
+ }
- return $text;
- }
+ return $text;
+ }
/**
* Register settings.
@@ -333,7 +347,7 @@ public function __construct() {
$this->register_routes();
$this->register_components( self::component_list() );
- add_filter( 'admin_footer_text', [ $this, 'remove_admin_footer_text' ] );
+ add_filter( 'admin_footer_text', [ $this, 'remove_admin_footer_text' ] );
add_action( 'admin_menu', [ $this, 'register_page' ] );
add_action( 'admin_enqueue_scripts', [ $this, 'enqueue_scripts' ], 9 );
add_action( 'rest_api_init', [ $this, 'register_settings' ] );
diff --git a/package-lock.json b/package-lock.json
index 8b0c985d..f78897d3 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -20,8 +20,10 @@
"clipboard-copy": "^4.0.1",
"html-react-parser": "^5.2.2",
"husky": "^9.1.6",
+ "mixpanel-browser": "^2.58.0",
"prop-types": "^15.8.1",
- "react-colorful": "^5.6.1"
+ "react-colorful": "^5.6.1",
+ "use-debounce": "^10.0.4"
},
"devDependencies": {
"@eslint/js": "^9.13.0",
@@ -2029,28 +2031,6 @@
"@csstools/css-tokenizer": "^3.0.1"
}
},
- "node_modules/@csstools/selector-specificity": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-4.0.0.tgz",
- "integrity": "sha512-189nelqtPd8++phaHNwYovKZI0FOzH1vQEE3QhHHkNIGrg5fSs9CbYP3RvfEH5geztnIA9Jwq91wyOIwAW5JIQ==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/csstools"
- },
- {
- "type": "opencollective",
- "url": "https://opencollective.com/csstools"
- }
- ],
- "engines": {
- "node": ">=18"
- },
- "peerDependencies": {
- "postcss-selector-parser": "^6.1.0"
- }
- },
"node_modules/@discoveryjs/json-ext": {
"version": "0.5.7",
"resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz",
@@ -2316,6 +2296,54 @@
"node": "^12.0.0 || ^14.0.0 || >=16.0.0"
}
},
+ "node_modules/@eslint/config-array": {
+ "version": "0.19.1",
+ "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.19.1.tgz",
+ "integrity": "sha512-fo6Mtm5mWyKjA/Chy1BYTdn5mGJoDNjC7C64ug20ADsRDGrA85bN3uK3MaKbeRkRuuIEAR5N33Jr1pbm411/PA==",
+ "dev": true,
+ "dependencies": {
+ "@eslint/object-schema": "^2.1.5",
+ "debug": "^4.3.1",
+ "minimatch": "^3.1.2"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/config-array/node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/@eslint/config-array/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/@eslint/core": {
+ "version": "0.9.1",
+ "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.9.1.tgz",
+ "integrity": "sha512-GuUdqkyyzQI5RMIWkHhvTWLCyLo1jNK3vzkSyaExH5kHPDHcuL2VOpHjmMY+y3+NC69qAKToBqldTBgYeLSr9Q==",
+ "dev": true,
+ "dependencies": {
+ "@types/json-schema": "^7.0.15"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
"node_modules/@eslint/eslintrc": {
"version": "2.1.4",
"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz",
@@ -2407,10 +2435,31 @@
}
},
"node_modules/@eslint/js": {
- "version": "9.14.0",
- "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.14.0.tgz",
- "integrity": "sha512-pFoEtFWCPyDOl+C6Ift+wC7Ro89otjigCf5vcuWqWgqNSQbRrpjSvdeE6ofLz4dHmyxD5f7gIdGT4+p36L6Twg==",
+ "version": "9.17.0",
+ "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.17.0.tgz",
+ "integrity": "sha512-Sxc4hqcs1kTu0iID3kcZDW3JHq2a77HO9P8CP6YEA/FpH3Ll8UXE2r/86Rz9YJLKme39S9vU5OWNjC6Xl0Cr3w==",
+ "dev": true,
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/object-schema": {
+ "version": "2.1.5",
+ "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.5.tgz",
+ "integrity": "sha512-o0bhxnL89h5Bae5T318nFoFzGy+YE5i/gGkoPAgkmTVdRKTiv3p8JHevPiPaMwoloKfEiiaHlawCqaZMqRm+XQ==",
+ "dev": true,
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ }
+ },
+ "node_modules/@eslint/plugin-kit": {
+ "version": "0.2.4",
+ "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.2.4.tgz",
+ "integrity": "sha512-zSkKow6H5Kdm0ZUQUB2kV5JIXqoG0+uH5YADhaEHswm664N9Db8dXSi0nMJpacpMf+MyyglF1vnZohpEg5yUtg==",
"dev": true,
+ "dependencies": {
+ "levn": "^0.4.1"
+ },
"engines": {
"node": "^18.18.0 || ^20.9.0 || >=21.1.0"
}
@@ -2449,6 +2498,57 @@
"resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.8.tgz",
"integrity": "sha512-kym7SodPp8/wloecOpcmSnWJsK7M0E5Wg8UcFA+uO4B9s5d0ywXOEro/8HM9x0rW+TljRzul/14UYz3TleT3ig=="
},
+ "node_modules/@formatjs/ecma402-abstract": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-2.3.2.tgz",
+ "integrity": "sha512-6sE5nyvDloULiyOMbOTJEEgWL32w+VHkZQs8S02Lnn8Y/O5aQhjOEXwWzvR7SsBE/exxlSpY2EsWZgqHbtLatg==",
+ "dev": true,
+ "dependencies": {
+ "@formatjs/fast-memoize": "2.2.6",
+ "@formatjs/intl-localematcher": "0.5.10",
+ "decimal.js": "10",
+ "tslib": "2"
+ }
+ },
+ "node_modules/@formatjs/fast-memoize": {
+ "version": "2.2.6",
+ "resolved": "https://registry.npmjs.org/@formatjs/fast-memoize/-/fast-memoize-2.2.6.tgz",
+ "integrity": "sha512-luIXeE2LJbQnnzotY1f2U2m7xuQNj2DA8Vq4ce1BY9ebRZaoPB1+8eZ6nXpLzsxuW5spQxr7LdCg+CApZwkqkw==",
+ "dev": true,
+ "dependencies": {
+ "tslib": "2"
+ }
+ },
+ "node_modules/@formatjs/icu-messageformat-parser": {
+ "version": "2.9.8",
+ "resolved": "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.9.8.tgz",
+ "integrity": "sha512-hZlLNI3+Lev8IAXuwehLoN7QTKqbx3XXwFW1jh0AdIA9XJdzn9Uzr+2LLBspPm/PX0+NLIfykj/8IKxQqHUcUQ==",
+ "dev": true,
+ "dependencies": {
+ "@formatjs/ecma402-abstract": "2.3.2",
+ "@formatjs/icu-skeleton-parser": "1.8.12",
+ "tslib": "2"
+ }
+ },
+ "node_modules/@formatjs/icu-skeleton-parser": {
+ "version": "1.8.12",
+ "resolved": "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.8.12.tgz",
+ "integrity": "sha512-QRAY2jC1BomFQHYDMcZtClqHR55EEnB96V7Xbk/UiBodsuFc5kujybzt87+qj1KqmJozFhk6n4KiT1HKwAkcfg==",
+ "dev": true,
+ "dependencies": {
+ "@formatjs/ecma402-abstract": "2.3.2",
+ "tslib": "2"
+ }
+ },
+ "node_modules/@formatjs/intl-localematcher": {
+ "version": "0.5.10",
+ "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.5.10.tgz",
+ "integrity": "sha512-af3qATX+m4Rnd9+wHcjJ4w2ijq+rAVP3CCinJQvFv1kgSu1W6jypUmvleJxcewdxmutM8dmIRZFxO/IQBZmP2Q==",
+ "dev": true,
+ "dependencies": {
+ "tslib": "2"
+ }
+ },
"node_modules/@hapi/hoek": {
"version": "9.3.0",
"resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz",
@@ -2464,6 +2564,41 @@
"@hapi/hoek": "^9.0.0"
}
},
+ "node_modules/@humanfs/core": {
+ "version": "0.19.1",
+ "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz",
+ "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==",
+ "dev": true,
+ "engines": {
+ "node": ">=18.18.0"
+ }
+ },
+ "node_modules/@humanfs/node": {
+ "version": "0.16.6",
+ "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz",
+ "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==",
+ "dev": true,
+ "dependencies": {
+ "@humanfs/core": "^0.19.1",
+ "@humanwhocodes/retry": "^0.3.0"
+ },
+ "engines": {
+ "node": ">=18.18.0"
+ }
+ },
+ "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz",
+ "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==",
+ "dev": true,
+ "engines": {
+ "node": ">=18.18"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
+ }
+ },
"node_modules/@humanwhocodes/config-array": {
"version": "0.13.0",
"resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.13.0.tgz",
@@ -2521,6 +2656,109 @@
"deprecated": "Use @eslint/object-schema instead",
"dev": true
},
+ "node_modules/@humanwhocodes/retry": {
+ "version": "0.4.1",
+ "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.1.tgz",
+ "integrity": "sha512-c7hNEllBlenFTHBky65mhq8WD2kbN9Q6gk0bTk8lSBvc554jpXSkST1iePudpt7+A/AQvuHs9EMqjHDXMY1lrA==",
+ "dev": true,
+ "engines": {
+ "node": ">=18.18"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
+ }
+ },
+ "node_modules/@isaacs/cliui": {
+ "version": "8.0.2",
+ "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
+ "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
+ "dev": true,
+ "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.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
+ "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/@isaacs/cliui/node_modules/ansi-styles": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
+ "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
+ "dev": true,
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/@isaacs/cliui/node_modules/string-width": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
+ "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
+ "dev": true,
+ "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/@isaacs/cliui/node_modules/strip-ansi": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+ "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ }
+ },
+ "node_modules/@isaacs/cliui/node_modules/wrap-ansi": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
+ "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
+ "dev": true,
+ "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/@istanbuljs/load-nyc-config": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz",
@@ -3570,6 +3808,15 @@
"url": "https://opencollective.com/parcel"
}
},
+ "node_modules/@paulirish/trace_engine": {
+ "version": "0.0.39",
+ "resolved": "https://registry.npmjs.org/@paulirish/trace_engine/-/trace_engine-0.0.39.tgz",
+ "integrity": "sha512-2Y/ejHX5DDi5bjfWY/0c/BLVSfQ61Jw1Hy60Hnh0hfEO632D3FVctkzT4Q/lVAdvIPR0bUaok9JDTr1pu/OziA==",
+ "dev": true,
+ "dependencies": {
+ "third-party-web": "latest"
+ }
+ },
"node_modules/@pkgr/core": {
"version": "0.1.1",
"resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz",
@@ -3583,13 +3830,13 @@
}
},
"node_modules/@playwright/test": {
- "version": "1.48.2",
- "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.48.2.tgz",
- "integrity": "sha512-54w1xCWfXuax7dz4W2M9uw0gDyh+ti/0K/MxcCUxChFh37kkdxPdfZDw5QBbuPUJHr1CiHJ1hXgSs+GgeQc5Zw==",
+ "version": "1.49.1",
+ "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.49.1.tgz",
+ "integrity": "sha512-Ky+BVzPz8pL6PQxHqNRW1k3mIyv933LML7HktS8uik0bUXNCdPhoS/kLihiO1tMf/egaJb4IutXd7UywvXEW+g==",
"dev": true,
"peer": true,
"dependencies": {
- "playwright": "1.48.2"
+ "playwright": "1.49.1"
},
"bin": {
"playwright": "cli.js"
@@ -3671,15 +3918,15 @@
}
},
"node_modules/@puppeteer/browsers": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.4.1.tgz",
- "integrity": "sha512-0kdAbmic3J09I6dT8e9vE2JOCSt13wHCW5x/ly8TSt2bDtuIWe2TgLZZDHdcziw9AVCzflMAXCrVyRIhIs44Ng==",
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.6.1.tgz",
+ "integrity": "sha512-aBSREisdsGH890S2rQqK82qmQYU3uFpSH8wcZWHgHzl3LfzsxAKbLNiAG9mO8v1Y0UICBeClICxPJvyr0rcuxg==",
"dev": true,
"dependencies": {
- "debug": "^4.3.7",
+ "debug": "^4.4.0",
"extract-zip": "^2.0.1",
"progress": "^2.0.3",
- "proxy-agent": "^6.4.0",
+ "proxy-agent": "^6.5.0",
"semver": "^7.6.3",
"tar-fs": "^3.0.6",
"unbzip2-stream": "^1.4.3",
@@ -4086,127 +4333,96 @@
"react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0"
}
},
+ "node_modules/@rrweb/types": {
+ "version": "2.0.0-alpha.18",
+ "resolved": "https://registry.npmjs.org/@rrweb/types/-/types-2.0.0-alpha.18.tgz",
+ "integrity": "sha512-iMH3amHthJZ9x3gGmBPmdfim7wLGygC2GciIkw2A6SO8giSn8PHYtRT8OKNH4V+k3SZ6RSnYHcTQxBA7pSWZ3Q=="
+ },
"node_modules/@rtsao/scc": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/@rtsao/scc/-/scc-1.1.0.tgz",
"integrity": "sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==",
"dev": true
},
- "node_modules/@sentry/core": {
- "version": "6.19.7",
- "resolved": "https://registry.npmjs.org/@sentry/core/-/core-6.19.7.tgz",
- "integrity": "sha512-tOfZ/umqB2AcHPGbIrsFLcvApdTm9ggpi/kQZFkej7kMphjT+SGBiQfYtjyg9jcRW+ilAR4JXC9BGKsdEQ+8Vw==",
+ "node_modules/@sentry-internal/tracing": {
+ "version": "7.120.2",
+ "resolved": "https://registry.npmjs.org/@sentry-internal/tracing/-/tracing-7.120.2.tgz",
+ "integrity": "sha512-eo2F8cP6X+vr54Mp6vu+NoQEDz0M5O24Tz8jPY0T1CpiWdwCmHb7Sln+oLXeQ3/LlWdVQihBfKDBZfBdUfsBTg==",
"dev": true,
"dependencies": {
- "@sentry/hub": "6.19.7",
- "@sentry/minimal": "6.19.7",
- "@sentry/types": "6.19.7",
- "@sentry/utils": "6.19.7",
- "tslib": "^1.9.3"
+ "@sentry/core": "7.120.2",
+ "@sentry/types": "7.120.2",
+ "@sentry/utils": "7.120.2"
},
"engines": {
- "node": ">=6"
+ "node": ">=8"
}
},
- "node_modules/@sentry/core/node_modules/tslib": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
- "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
- "dev": true
- },
- "node_modules/@sentry/hub": {
- "version": "6.19.7",
- "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-6.19.7.tgz",
- "integrity": "sha512-y3OtbYFAqKHCWezF0EGGr5lcyI2KbaXW2Ik7Xp8Mu9TxbSTuwTe4rTntwg8ngPjUQU3SUHzgjqVB8qjiGqFXCA==",
+ "node_modules/@sentry/core": {
+ "version": "7.120.2",
+ "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.120.2.tgz",
+ "integrity": "sha512-eurLBFQJC7WWWYoEna25Z9I/GJjqAmH339tv52XP8sqXV7B5hRcHDcfrsT/UGHpU316M24p3lWhj0eimtCZ0SQ==",
"dev": true,
"dependencies": {
- "@sentry/types": "6.19.7",
- "@sentry/utils": "6.19.7",
- "tslib": "^1.9.3"
+ "@sentry/types": "7.120.2",
+ "@sentry/utils": "7.120.2"
},
"engines": {
- "node": ">=6"
+ "node": ">=8"
}
},
- "node_modules/@sentry/hub/node_modules/tslib": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
- "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
- "dev": true
- },
- "node_modules/@sentry/minimal": {
- "version": "6.19.7",
- "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-6.19.7.tgz",
- "integrity": "sha512-wcYmSJOdvk6VAPx8IcmZgN08XTXRwRtB1aOLZm+MVHjIZIhHoBGZJYTVQS/BWjldsamj2cX3YGbGXNunaCfYJQ==",
+ "node_modules/@sentry/integrations": {
+ "version": "7.120.2",
+ "resolved": "https://registry.npmjs.org/@sentry/integrations/-/integrations-7.120.2.tgz",
+ "integrity": "sha512-bMvL2fD3TGLM5YAUoQ2Qz6bYeVU8f7YRFNSjKNxK4EbvFgAU9j1FD6EKg0V0RNOJYnJjGIZYMmcWTXBbVTJL6w==",
"dev": true,
"dependencies": {
- "@sentry/hub": "6.19.7",
- "@sentry/types": "6.19.7",
- "tslib": "^1.9.3"
+ "@sentry/core": "7.120.2",
+ "@sentry/types": "7.120.2",
+ "@sentry/utils": "7.120.2",
+ "localforage": "^1.8.1"
},
"engines": {
- "node": ">=6"
+ "node": ">=8"
}
},
- "node_modules/@sentry/minimal/node_modules/tslib": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
- "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
- "dev": true
- },
"node_modules/@sentry/node": {
- "version": "6.19.7",
- "resolved": "https://registry.npmjs.org/@sentry/node/-/node-6.19.7.tgz",
- "integrity": "sha512-gtmRC4dAXKODMpHXKfrkfvyBL3cI8y64vEi3fDD046uqYcrWdgoQsffuBbxMAizc6Ez1ia+f0Flue6p15Qaltg==",
+ "version": "7.120.2",
+ "resolved": "https://registry.npmjs.org/@sentry/node/-/node-7.120.2.tgz",
+ "integrity": "sha512-ZnW9gpIGaoU+vYZyVZca9dObfmWYiXEWIMUM/JXaFb8AhP1OXvYweNiU0Pe/gNrz4oGAogU8scJc70ar7Vj0ww==",
"dev": true,
"dependencies": {
- "@sentry/core": "6.19.7",
- "@sentry/hub": "6.19.7",
- "@sentry/types": "6.19.7",
- "@sentry/utils": "6.19.7",
- "cookie": "^0.4.1",
- "https-proxy-agent": "^5.0.0",
- "lru_map": "^0.3.3",
- "tslib": "^1.9.3"
+ "@sentry-internal/tracing": "7.120.2",
+ "@sentry/core": "7.120.2",
+ "@sentry/integrations": "7.120.2",
+ "@sentry/types": "7.120.2",
+ "@sentry/utils": "7.120.2"
},
"engines": {
- "node": ">=6"
+ "node": ">=8"
}
},
- "node_modules/@sentry/node/node_modules/tslib": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
- "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
- "dev": true
- },
"node_modules/@sentry/types": {
- "version": "6.19.7",
- "resolved": "https://registry.npmjs.org/@sentry/types/-/types-6.19.7.tgz",
- "integrity": "sha512-jH84pDYE+hHIbVnab3Hr+ZXr1v8QABfhx39KknxqKWr2l0oEItzepV0URvbEhB446lk/S/59230dlUUIBGsXbg==",
+ "version": "7.120.2",
+ "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.120.2.tgz",
+ "integrity": "sha512-FWVoiblHQJ892GaOqdXx/5/n5XDLF28z81vJ0lCY49PMh8waz8LJ0b9RSmt9tasSDl0OQ7eUlPl1xu1jTrv1NA==",
"dev": true,
"engines": {
- "node": ">=6"
+ "node": ">=8"
}
},
"node_modules/@sentry/utils": {
- "version": "6.19.7",
- "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-6.19.7.tgz",
- "integrity": "sha512-z95ECmE3i9pbWoXQrD/7PgkBAzJYR+iXtPuTkpBjDKs86O3mT+PXOT3BAn79w2wkn7/i3vOGD2xVr1uiMl26dA==",
+ "version": "7.120.2",
+ "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.120.2.tgz",
+ "integrity": "sha512-jgnQlw11mRfQrQRAXbq4zEd+tbYwHel5eqeS/oU6EImXRjmHNtS79nB8MHvJeQu1FMCpFs1Ymrrs5FICwS6VeQ==",
"dev": true,
"dependencies": {
- "@sentry/types": "6.19.7",
- "tslib": "^1.9.3"
+ "@sentry/types": "7.120.2"
},
"engines": {
- "node": ">=6"
+ "node": ">=8"
}
},
- "node_modules/@sentry/utils/node_modules/tslib": {
- "version": "1.14.1",
- "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
- "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==",
- "dev": true
- },
"node_modules/@sideway/address": {
"version": "4.1.5",
"resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz",
@@ -4785,6 +5001,11 @@
"@types/node": "*"
}
},
+ "node_modules/@types/css-font-loading-module": {
+ "version": "0.0.7",
+ "resolved": "https://registry.npmjs.org/@types/css-font-loading-module/-/css-font-loading-module-0.0.7.tgz",
+ "integrity": "sha512-nl09VhutdjINdWyXxHWN/w9zlNCfr60JUqJbd24YXUuCwgeL0TpFSdElCwb6cxfB6ybE19Gjj4g0jsgkXxKv1Q=="
+ },
"node_modules/@types/eslint": {
"version": "9.6.1",
"resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz",
@@ -5757,9 +5978,9 @@
}
},
"node_modules/@wordpress/babel-preset-default": {
- "version": "8.11.0",
- "resolved": "https://registry.npmjs.org/@wordpress/babel-preset-default/-/babel-preset-default-8.11.0.tgz",
- "integrity": "sha512-allmuNraEE8R2hu4GV65GLF4EHAqkPZHTMNZZs7ujBy/JYYmVRYrg5WQOG6W9addQyjo6Ugx9s2R6Vh8fnYv/A==",
+ "version": "8.15.1",
+ "resolved": "https://registry.npmjs.org/@wordpress/babel-preset-default/-/babel-preset-default-8.15.1.tgz",
+ "integrity": "sha512-RTpysraghWYeV8y9tJY3cZc+AlDJKeW81UqUwywsjhsxEeXNLm3g1bWxhv2H5QJKBHCNP4ICbyF12b8T+H6RXw==",
"dev": true,
"dependencies": {
"@babel/core": "7.25.7",
@@ -5768,8 +5989,8 @@
"@babel/preset-env": "7.25.7",
"@babel/preset-typescript": "7.25.7",
"@babel/runtime": "7.25.7",
- "@wordpress/browserslist-config": "*",
- "@wordpress/warning": "*",
+ "@wordpress/browserslist-config": "^6.15.0",
+ "@wordpress/warning": "^3.15.0",
"browserslist": "^4.21.10",
"core-js": "^3.31.0",
"react": "^18.3.0"
@@ -5822,9 +6043,9 @@
}
},
"node_modules/@wordpress/base-styles": {
- "version": "5.11.0",
- "resolved": "https://registry.npmjs.org/@wordpress/base-styles/-/base-styles-5.11.0.tgz",
- "integrity": "sha512-czK3/eTq/cKUwa8dFNpVdtzlVXbA4fo/b9i+N5fWzwKlZ8jAT/OtdCS+6zTyrv7yVO6R12F4ruXWRXoDKRasIg==",
+ "version": "5.15.0",
+ "resolved": "https://registry.npmjs.org/@wordpress/base-styles/-/base-styles-5.15.0.tgz",
+ "integrity": "sha512-lk/LY/goEpQllEqmt0zbHzVDJhnfo1Eaw6LOzi/IUWe4Y3CY3p4s2rKYVsKf7zysY2ei3mm04qxMRUn5VKtXWw==",
"dev": true,
"engines": {
"node": ">=18.12.0",
@@ -6012,9 +6233,9 @@
}
},
"node_modules/@wordpress/browserslist-config": {
- "version": "6.11.0",
- "resolved": "https://registry.npmjs.org/@wordpress/browserslist-config/-/browserslist-config-6.11.0.tgz",
- "integrity": "sha512-wUDbJ3x7c8iMZLtwo+7VlWZ/vDc47PDW2eSAKW18RrQBSTdaNmWi4qiyFYi7Ye2XkyfUd2gp71MTJjZi6n/V2A==",
+ "version": "6.15.0",
+ "resolved": "https://registry.npmjs.org/@wordpress/browserslist-config/-/browserslist-config-6.15.0.tgz",
+ "integrity": "sha512-JmpThXSvE/ZsihJ/GOBmZZUEgVN78xWIPDacRzEXCPp9FA4UuJpXgx1JY3nWe4L3FyB6XIz+Klk0TfEwfL8S2w==",
"dev": true,
"engines": {
"node": ">=18.12.0",
@@ -6306,9 +6527,9 @@
}
},
"node_modules/@wordpress/dependency-extraction-webpack-plugin": {
- "version": "6.11.0",
- "resolved": "https://registry.npmjs.org/@wordpress/dependency-extraction-webpack-plugin/-/dependency-extraction-webpack-plugin-6.11.0.tgz",
- "integrity": "sha512-MRMu3f/zG428iXuBBwaZKumonQ6Cxz2KDerQkIYkpXFq7aZK/vZRdTeR/MYXZNABmAV54Ss0xp6QJxOBW/WVbQ==",
+ "version": "6.15.0",
+ "resolved": "https://registry.npmjs.org/@wordpress/dependency-extraction-webpack-plugin/-/dependency-extraction-webpack-plugin-6.15.0.tgz",
+ "integrity": "sha512-xCbPU+Lq9eHBh0f3q5aODPvclK0wCLswDHUvgRB4RQLK7/HgOBXUjk27wrCfmcZeMbJeZb953L5o4u+4i41HZg==",
"dev": true,
"dependencies": {
"json2php": "^0.0.7"
@@ -6399,15 +6620,15 @@
}
},
"node_modules/@wordpress/e2e-test-utils-playwright": {
- "version": "1.11.0",
- "resolved": "https://registry.npmjs.org/@wordpress/e2e-test-utils-playwright/-/e2e-test-utils-playwright-1.11.0.tgz",
- "integrity": "sha512-0kSY0rOpKirXgXsNJQ/Mj3NLJhmN1lwkECZFF53iYs/kOAXNaVxs6Ys3T8hleoO47/KZLY7AoEJTxKwK0fWixQ==",
+ "version": "1.15.0",
+ "resolved": "https://registry.npmjs.org/@wordpress/e2e-test-utils-playwright/-/e2e-test-utils-playwright-1.15.0.tgz",
+ "integrity": "sha512-f6dndDExVQilTG3ouDOIWfSLACqkwzupWXU8rYpLQJA+4AW7vAj1Ig8Gpjj2/xufBfdKtljxN+Nt9K57GMk/aw==",
"dev": true,
"dependencies": {
"change-case": "^4.1.2",
"form-data": "^4.0.0",
"get-port": "^5.1.1",
- "lighthouse": "^10.4.0",
+ "lighthouse": "^12.2.2",
"mime": "^3.0.0",
"web-vitals": "^4.2.1"
},
@@ -6707,9 +6928,9 @@
}
},
"node_modules/@wordpress/jest-console": {
- "version": "8.11.0",
- "resolved": "https://registry.npmjs.org/@wordpress/jest-console/-/jest-console-8.11.0.tgz",
- "integrity": "sha512-kkeSrY6YThTSgPKMTo5DA98irIjvgIl8V0Bk0x9M2uoDCCYsz3EJFECrvYR31z7K6EeeJVMhdhnNJriK58PP+A==",
+ "version": "8.15.0",
+ "resolved": "https://registry.npmjs.org/@wordpress/jest-console/-/jest-console-8.15.0.tgz",
+ "integrity": "sha512-fBylXryss4qvRCX5DwenOMK65RU60KDYZDD67GokY4mQBT/Yq0CofUU6fPo9mlAJVADG3kwhKcFYreM4pgWV2A==",
"dev": true,
"dependencies": {
"@babel/runtime": "7.25.7",
@@ -6736,12 +6957,12 @@
}
},
"node_modules/@wordpress/jest-preset-default": {
- "version": "12.11.0",
- "resolved": "https://registry.npmjs.org/@wordpress/jest-preset-default/-/jest-preset-default-12.11.0.tgz",
- "integrity": "sha512-yjU6am+emR++CmDb+si3e+5aNwFk2zz1R4ti/Uq/EeRRFfcCxCopMhnd1J7BiU3BJ3Vm7qJlJgYhhJAqm65jVQ==",
+ "version": "12.15.1",
+ "resolved": "https://registry.npmjs.org/@wordpress/jest-preset-default/-/jest-preset-default-12.15.1.tgz",
+ "integrity": "sha512-xcD4tsTE/tlEFIH7ZnxyIYoVs8Rp4gDsUA6cWoAJeeeJmzcTh/ZGYx9h91InrougA6VoVe43CUgAtVybW37kIw==",
"dev": true,
"dependencies": {
- "@wordpress/jest-console": "*",
+ "@wordpress/jest-console": "^8.15.0",
"babel-jest": "29.7.0"
},
"engines": {
@@ -6835,9 +7056,9 @@
}
},
"node_modules/@wordpress/npm-package-json-lint-config": {
- "version": "5.11.0",
- "resolved": "https://registry.npmjs.org/@wordpress/npm-package-json-lint-config/-/npm-package-json-lint-config-5.11.0.tgz",
- "integrity": "sha512-m65XI5stIUgH/OewrOvBIEYurbm5kSDndieU9t4gWCXXXD5n9RpHOsoex/hsRzZ5ZjTtpgvArJ+dv18+hqIOAw==",
+ "version": "5.15.0",
+ "resolved": "https://registry.npmjs.org/@wordpress/npm-package-json-lint-config/-/npm-package-json-lint-config-5.15.0.tgz",
+ "integrity": "sha512-Y3TYVmmufwfUrrGfo7fOlC92LYRNO1rnQ5X2iyVqhUgVzuVM6OpRB2Qr9AK402yjfihjCLpaPEYMWXXum17yuQ==",
"dev": true,
"engines": {
"node": ">=18.12.0",
@@ -6848,13 +7069,13 @@
}
},
"node_modules/@wordpress/postcss-plugins-preset": {
- "version": "5.11.0",
- "resolved": "https://registry.npmjs.org/@wordpress/postcss-plugins-preset/-/postcss-plugins-preset-5.11.0.tgz",
- "integrity": "sha512-oVZEfLJSxGGMhQCk9+vghgQjxG8l5KGqFUP2Q/2mosc9D20DvSsT8r280R6uiwaD5KUDuYcpdJlD4eVY6t8AIA==",
+ "version": "5.15.1",
+ "resolved": "https://registry.npmjs.org/@wordpress/postcss-plugins-preset/-/postcss-plugins-preset-5.15.1.tgz",
+ "integrity": "sha512-Olina/J8qMGXNnkE8u54pNVoDQhPhISRKDHdjHc7Zwa7jnLpSMLXquLP3JozO7Nb1t4yKUFbUm9IUrVnIzXoxw==",
"dev": true,
"dependencies": {
- "@wordpress/base-styles": "*",
- "autoprefixer": "^10.2.5"
+ "@wordpress/base-styles": "^5.15.0",
+ "autoprefixer": "^10.4.20"
},
"engines": {
"node": ">=18.12.0",
@@ -6910,9 +7131,9 @@
}
},
"node_modules/@wordpress/prettier-config": {
- "version": "4.11.0",
- "resolved": "https://registry.npmjs.org/@wordpress/prettier-config/-/prettier-config-4.11.0.tgz",
- "integrity": "sha512-Aoc8+xWOyiXekodjaEjS44z85XK877LzHZqsQuhC0kNgneDLrKkwI5qNgzwzAMbJ9jI58MPqVISCOX0bDLUPbw==",
+ "version": "4.15.0",
+ "resolved": "https://registry.npmjs.org/@wordpress/prettier-config/-/prettier-config-4.15.0.tgz",
+ "integrity": "sha512-e5GZCnbm65cXbndAX/lAEpeixTetlXofJ6xk93ppm9bt9Y6RkUVe3+LfNlc6AYpRAt97BGIBEG7CXtMPVEz1ew==",
"dev": true,
"engines": {
"node": ">=18.12.0",
@@ -7070,24 +7291,24 @@
}
},
"node_modules/@wordpress/scripts": {
- "version": "30.4.0",
- "resolved": "https://registry.npmjs.org/@wordpress/scripts/-/scripts-30.4.0.tgz",
- "integrity": "sha512-hAX8XB8hWlxAyktT4KkBpGttRwSynmtkpLvbVKeKnj+BjABFs4TGb/HCF9hFpUK3huCAg8Ft/sjjczW+5tqspQ==",
+ "version": "30.8.1",
+ "resolved": "https://registry.npmjs.org/@wordpress/scripts/-/scripts-30.8.1.tgz",
+ "integrity": "sha512-wd/bhgn5ynKy0A80x3VhYjkDTIvuiRGry13urzXc1B5wYftsK4lEeyAnAo5VRyNwWFgcd/i0F9iyz6NaRxjfOw==",
"dev": true,
"dependencies": {
"@babel/core": "7.25.7",
"@pmmmwh/react-refresh-webpack-plugin": "^0.5.11",
"@svgr/webpack": "^8.0.1",
- "@wordpress/babel-preset-default": "*",
- "@wordpress/browserslist-config": "*",
- "@wordpress/dependency-extraction-webpack-plugin": "*",
- "@wordpress/e2e-test-utils-playwright": "*",
- "@wordpress/eslint-plugin": "*",
- "@wordpress/jest-preset-default": "*",
- "@wordpress/npm-package-json-lint-config": "*",
- "@wordpress/postcss-plugins-preset": "*",
- "@wordpress/prettier-config": "*",
- "@wordpress/stylelint-config": "*",
+ "@wordpress/babel-preset-default": "^8.15.1",
+ "@wordpress/browserslist-config": "^6.15.0",
+ "@wordpress/dependency-extraction-webpack-plugin": "^6.15.0",
+ "@wordpress/e2e-test-utils-playwright": "^1.15.0",
+ "@wordpress/eslint-plugin": "^22.1.1",
+ "@wordpress/jest-preset-default": "^12.15.1",
+ "@wordpress/npm-package-json-lint-config": "^5.15.0",
+ "@wordpress/postcss-plugins-preset": "^5.15.1",
+ "@wordpress/prettier-config": "^4.15.0",
+ "@wordpress/stylelint-config": "^23.7.0",
"adm-zip": "^0.5.9",
"babel-jest": "29.7.0",
"babel-loader": "9.2.1",
@@ -7096,7 +7317,7 @@
"check-node-version": "^4.1.0",
"clean-webpack-plugin": "^3.0.0",
"copy-webpack-plugin": "^10.2.0",
- "cross-spawn": "^5.1.0",
+ "cross-spawn": "^7.0.6",
"css-loader": "^6.2.0",
"cssnano": "^6.0.1",
"cwd": "^0.10.0",
@@ -7106,33 +7327,32 @@
"fast-glob": "^3.2.7",
"filenamify": "^4.2.0",
"jest": "^29.6.2",
- "jest-dev-server": "^9.0.1",
+ "jest-dev-server": "^10.1.4",
"jest-environment-jsdom": "^29.6.2",
"jest-environment-node": "^29.6.2",
"json2php": "^0.0.9",
"markdownlint-cli": "^0.31.1",
"merge-deep": "^3.0.3",
- "mini-css-extract-plugin": "^2.5.1",
+ "mini-css-extract-plugin": "^2.9.2",
"minimist": "^1.2.0",
"npm-package-json-lint": "^6.4.0",
"npm-packlist": "^3.0.0",
"postcss": "^8.4.5",
- "postcss-import": "^16.1.0",
"postcss-loader": "^6.2.1",
"prettier": "npm:wp-prettier@3.0.3",
- "puppeteer-core": "^23.1.0",
+ "puppeteer-core": "^23.10.1",
"react-refresh": "^0.14.0",
"read-pkg-up": "^7.0.1",
"resolve-bin": "^0.4.0",
- "rtlcss-webpack-plugin": "^4.0.7",
- "sass": "^1.35.2",
- "sass-loader": "^12.1.0",
+ "rtlcss": "^4.3.0",
+ "sass": "^1.54.0",
+ "sass-loader": "^16.0.3",
"schema-utils": "^4.2.0",
"source-map-loader": "^3.0.0",
"stylelint": "^16.8.2",
"terser-webpack-plugin": "^5.3.10",
"url-loader": "^4.1.1",
- "webpack": "^5.95.0",
+ "webpack": "^5.97.0",
"webpack-bundle-analyzer": "^4.9.1",
"webpack-cli": "^5.1.4",
"webpack-dev-server": "^4.15.1"
@@ -7180,22 +7400,104 @@
"url": "https://opencollective.com/babel"
}
},
- "node_modules/@wordpress/scripts/node_modules/prettier": {
- "name": "wp-prettier",
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/wp-prettier/-/wp-prettier-3.0.3.tgz",
- "integrity": "sha512-X4UlrxDTH8oom9qXlcjnydsjAOD2BmB6yFmvS4Z2zdTzqqpRWb+fbqrH412+l+OUXmbzJlSXjlMFYPgYG12IAA==",
+ "node_modules/@wordpress/scripts/node_modules/@wordpress/eslint-plugin": {
+ "version": "22.1.1",
+ "resolved": "https://registry.npmjs.org/@wordpress/eslint-plugin/-/eslint-plugin-22.1.1.tgz",
+ "integrity": "sha512-Tw6eZwAAblhibXKii6bRubgIKuUOtllk/gHLLGWS1ZLgP0cG+rdFUArG+H6LLRa7l2psFdSK5T6Xas51kg+VBg==",
"dev": true,
- "bin": {
- "prettier": "bin/prettier.cjs"
+ "dependencies": {
+ "@babel/eslint-parser": "7.25.7",
+ "@typescript-eslint/eslint-plugin": "^6.4.1",
+ "@typescript-eslint/parser": "^6.4.1",
+ "@wordpress/babel-preset-default": "^8.15.1",
+ "@wordpress/prettier-config": "^4.15.0",
+ "cosmiconfig": "^7.0.0",
+ "eslint-config-prettier": "^8.3.0",
+ "eslint-plugin-import": "^2.25.2",
+ "eslint-plugin-jest": "^27.4.3",
+ "eslint-plugin-jsdoc": "^46.4.6",
+ "eslint-plugin-jsx-a11y": "^6.5.1",
+ "eslint-plugin-playwright": "^0.15.3",
+ "eslint-plugin-prettier": "^5.0.0",
+ "eslint-plugin-react": "^7.27.0",
+ "eslint-plugin-react-hooks": "^4.3.0",
+ "globals": "^13.12.0",
+ "requireindex": "^1.2.0"
},
"engines": {
- "node": ">=14"
- },
+ "node": ">=18.12.0",
+ "npm": ">=8.19.2"
+ },
+ "peerDependencies": {
+ "@babel/core": ">=7",
+ "eslint": ">=8",
+ "prettier": ">=3",
+ "typescript": ">=5"
+ },
+ "peerDependenciesMeta": {
+ "prettier": {
+ "optional": true
+ },
+ "typescript": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/@wordpress/scripts/node_modules/@wordpress/eslint-plugin/node_modules/eslint-config-prettier": {
+ "version": "8.10.0",
+ "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz",
+ "integrity": "sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==",
+ "dev": true,
+ "bin": {
+ "eslint-config-prettier": "bin/cli.js"
+ },
+ "peerDependencies": {
+ "eslint": ">=7.0.0"
+ }
+ },
+ "node_modules/@wordpress/scripts/node_modules/globals": {
+ "version": "13.24.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz",
+ "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==",
+ "dev": true,
+ "dependencies": {
+ "type-fest": "^0.20.2"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@wordpress/scripts/node_modules/prettier": {
+ "name": "wp-prettier",
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/wp-prettier/-/wp-prettier-3.0.3.tgz",
+ "integrity": "sha512-X4UlrxDTH8oom9qXlcjnydsjAOD2BmB6yFmvS4Z2zdTzqqpRWb+fbqrH412+l+OUXmbzJlSXjlMFYPgYG12IAA==",
+ "dev": true,
+ "bin": {
+ "prettier": "bin/prettier.cjs"
+ },
+ "engines": {
+ "node": ">=14"
+ },
"funding": {
"url": "https://github.com/prettier/prettier?sponsor=1"
}
},
+ "node_modules/@wordpress/scripts/node_modules/type-fest": {
+ "version": "0.20.2",
+ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
+ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
"node_modules/@wordpress/shortcode": {
"version": "4.11.0",
"resolved": "https://registry.npmjs.org/@wordpress/shortcode/-/shortcode-4.11.0.tgz",
@@ -7245,9 +7547,9 @@
}
},
"node_modules/@wordpress/stylelint-config": {
- "version": "23.3.0",
- "resolved": "https://registry.npmjs.org/@wordpress/stylelint-config/-/stylelint-config-23.3.0.tgz",
- "integrity": "sha512-QRNPSgYgAlCC1HuCnGiBIVLlraK0JSYxAbWbNqlubfh8Xu7etUg1LBBY0ZI3wFQ5wwgioOwMDiv6++vqcD71RQ==",
+ "version": "23.7.0",
+ "resolved": "https://registry.npmjs.org/@wordpress/stylelint-config/-/stylelint-config-23.7.0.tgz",
+ "integrity": "sha512-HZvIohAENXvN6bfVq3zMbDogx+TdobUAXHnNmz6g5XUTOyqS7GHf6e8D907oyevFJbhp1o26ua6T5bG6/GjCqQ==",
"dev": true,
"dependencies": {
"@stylistic/stylelint-plugin": "^3.0.1",
@@ -7366,9 +7668,9 @@
}
},
"node_modules/@wordpress/warning": {
- "version": "3.11.0",
- "resolved": "https://registry.npmjs.org/@wordpress/warning/-/warning-3.11.0.tgz",
- "integrity": "sha512-tXCsxlMAYXbRCgZmVHsBkoBGnrytZPGGezGXANRTsyJ00QoQJgxvnH6u22Rs/NOIVHQ5o65/9jKC3g0e6qn7PA==",
+ "version": "3.15.0",
+ "resolved": "https://registry.npmjs.org/@wordpress/warning/-/warning-3.15.0.tgz",
+ "integrity": "sha512-qBE1kWiyey9rlLGQHf3ngdWgov58CV2a8tQR8UMy1EwKUDAS56UXJcAvfAi7b7aMN5gZ+hVa4LWK9WbVuKEdRg==",
"engines": {
"node": ">=18.12.0",
"npm": ">=8.19.2"
@@ -7397,6 +7699,11 @@
"node": ">=6.9.0"
}
},
+ "node_modules/@xstate/fsm": {
+ "version": "1.6.5",
+ "resolved": "https://registry.npmjs.org/@xstate/fsm/-/fsm-1.6.5.tgz",
+ "integrity": "sha512-b5o1I6aLNeYlU/3CPlj/Z91ybk1gUsKT+5NAJI+2W4UjvS5KLG28K9v5UvNoFVjHV8PajVZ00RH3vnjyQO7ZAw=="
+ },
"node_modules/@xtuc/ieee754": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
@@ -7996,9 +8303,9 @@
}
},
"node_modules/axios": {
- "version": "1.7.7",
- "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.7.tgz",
- "integrity": "sha512-S4kL7XrjgBmvdGut0sN3yJxqYzrDOnivkBiN0OFs6hLiUam3UPvswUo0kqGyhqUZGEOytHyumEdXsAkgCOUf3Q==",
+ "version": "1.7.9",
+ "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz",
+ "integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==",
"dev": true,
"dependencies": {
"follow-redirects": "^1.15.6",
@@ -8185,30 +8492,6 @@
"@babel/core": "^7.0.0"
}
},
- "node_modules/babel-runtime": {
- "version": "6.25.0",
- "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.25.0.tgz",
- "integrity": "sha512-zeCYxDePWYAT/DfmQWIHsMSFW2vv45UIwIAMjGvQVsTd47RwsiRH0uK1yzyWZ7LDBKdhnGDPM6NYEO5CZyhPrg==",
- "dev": true,
- "dependencies": {
- "core-js": "^2.4.0",
- "regenerator-runtime": "^0.10.0"
- }
- },
- "node_modules/babel-runtime/node_modules/core-js": {
- "version": "2.6.12",
- "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz",
- "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==",
- "deprecated": "core-js@<3.23.3 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js.",
- "dev": true,
- "hasInstallScript": true
- },
- "node_modules/babel-runtime/node_modules/regenerator-runtime": {
- "version": "0.10.5",
- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz",
- "integrity": "sha512-02YopEIhAgiBHWeoTiA8aitHDt8z6w+rQqNuIftlM+ZtvSl/brTouaU7DW6GO/cHtvxJvS4Hwv2ibKdxIRi24w==",
- "dev": true
- },
"node_modules/balanced-match": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
@@ -8252,13 +8535,21 @@
}
},
"node_modules/bare-stream": {
- "version": "2.3.2",
- "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.3.2.tgz",
- "integrity": "sha512-EFZHSIBkDgSHIwj2l2QZfP4U5OcD4xFAOwhSb/vlr9PIqyGJGvB/nfClJbcnh3EY4jtPE4zsb5ztae96bVF79A==",
+ "version": "2.6.1",
+ "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.6.1.tgz",
+ "integrity": "sha512-eVZbtKM+4uehzrsj49KtCy3Pbg7kO1pJ3SKZ1SFrIH/0pnj9scuGGgUlNDf/7qS8WKtGdiJY5Kyhs/ivYPTB/g==",
"dev": true,
"optional": true,
"dependencies": {
- "streamx": "^2.20.0"
+ "streamx": "^2.21.0"
+ }
+ },
+ "node_modules/base64-arraybuffer": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-1.0.2.tgz",
+ "integrity": "sha512-I3yl4r9QB5ZRY3XuJVEPfc2XhZO6YweFPI+UovAzn+8/hb3oJ6lnysaFcjVpkCPfVWFUDvoZ8kmVDP7WyRtYtQ==",
+ "engines": {
+ "node": ">= 0.6.0"
}
},
"node_modules/base64-js": {
@@ -8740,9 +9031,9 @@
}
},
"node_modules/chokidar": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.1.tgz",
- "integrity": "sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==",
+ "version": "4.0.3",
+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz",
+ "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==",
"dev": true,
"dependencies": {
"readdirp": "^4.0.1"
@@ -8755,15 +9046,15 @@
}
},
"node_modules/chrome-launcher": {
- "version": "0.15.2",
- "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-0.15.2.tgz",
- "integrity": "sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ==",
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-1.1.2.tgz",
+ "integrity": "sha512-YclTJey34KUm5jB1aEJCq807bSievi7Nb/TU4Gu504fUYi3jw3KCIaH6L7nFWQhdEgH3V+wCh+kKD1P5cXnfxw==",
"dev": true,
"dependencies": {
"@types/node": "*",
"escape-string-regexp": "^4.0.0",
"is-wsl": "^2.2.0",
- "lighthouse-logger": "^1.0.0"
+ "lighthouse-logger": "^2.0.1"
},
"bin": {
"print-chrome-path": "bin/print-chrome-path.js"
@@ -8782,13 +9073,12 @@
}
},
"node_modules/chromium-bidi": {
- "version": "0.8.0",
- "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.8.0.tgz",
- "integrity": "sha512-uJydbGdTw0DEUjhoogGveneJVWX/9YuqkWePzMmkBYwtdAqo5d3J/ovNKFr+/2hWXYmYCr6it8mSSTIj6SS6Ug==",
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.11.0.tgz",
+ "integrity": "sha512-6CJWHkNRoyZyjV9Rwv2lYONZf1Xm0IuDyNq97nwSsxxP3wf5Bwy15K5rOvVKMtJ127jJBmxFUanSAOjgFRxgrA==",
"dev": true,
"dependencies": {
"mitt": "3.0.1",
- "urlpattern-polyfill": "10.0.0",
"zod": "3.23.8"
},
"peerDependencies": {
@@ -9044,12 +9334,12 @@
}
},
"node_modules/commander": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz",
- "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==",
+ "version": "12.1.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz",
+ "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==",
"dev": true,
"engines": {
- "node": ">= 6"
+ "node": ">=18"
}
},
"node_modules/comment-parser": {
@@ -9228,15 +9518,6 @@
"integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==",
"dev": true
},
- "node_modules/cookie": {
- "version": "0.4.2",
- "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz",
- "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==",
- "dev": true,
- "engines": {
- "node": ">= 0.6"
- }
- },
"node_modules/cookie-signature": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz",
@@ -9394,42 +9675,20 @@
"node": "^14.15.0 || ^16.10.0 || >=18.0.0"
}
},
- "node_modules/cross-fetch": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz",
- "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==",
- "dev": true,
- "dependencies": {
- "node-fetch": "^2.6.12"
- }
- },
"node_modules/cross-spawn": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz",
- "integrity": "sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==",
- "dev": true,
- "dependencies": {
- "lru-cache": "^4.0.1",
- "shebang-command": "^1.2.0",
- "which": "^1.2.9"
- }
- },
- "node_modules/cross-spawn/node_modules/lru-cache": {
- "version": "4.1.5",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz",
- "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==",
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz",
+ "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==",
"dev": true,
"dependencies": {
- "pseudomap": "^1.0.2",
- "yallist": "^2.1.2"
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
}
},
- "node_modules/cross-spawn/node_modules/yallist": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
- "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==",
- "dev": true
- },
"node_modules/crypto-random-string": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz",
@@ -9530,12 +9789,12 @@
}
},
"node_modules/css-tree": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.0.1.tgz",
- "integrity": "sha512-8Fxxv+tGhORlshCdCwnNJytvlvq46sOLSYEx2ZIGurahWvMucSRnyjPA3AmrMq4VPRYbHVpWj5VkiVasrM2H4Q==",
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.1.0.tgz",
+ "integrity": "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==",
"dev": true,
"dependencies": {
- "mdn-data": "2.12.1",
+ "mdn-data": "2.12.2",
"source-map-js": "^1.0.1"
},
"engines": {
@@ -9834,9 +10093,9 @@
"dev": true
},
"node_modules/debug": {
- "version": "4.3.7",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz",
- "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==",
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz",
+ "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==",
"dependencies": {
"ms": "^2.1.3"
},
@@ -10177,9 +10436,9 @@
"integrity": "sha512-ypdmJU/TbBby2Dxibuv7ZLW3Bs1QEmM7nHjEANfohJLvE0XVujisn1qPJcZxg+qDucsr+bP6fLD1rPS3AhJ7EQ=="
},
"node_modules/devtools-protocol": {
- "version": "0.0.1155343",
- "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1155343.tgz",
- "integrity": "sha512-oD9vGBV2wTc7fAzAM6KC0chSgs234V8+qDEeK+mcbRj2UvcuA7lgBztGi/opj/iahcXD3BSj8Ymvib628yy9FA==",
+ "version": "0.0.1312386",
+ "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1312386.tgz",
+ "integrity": "sha512-DPnhUXvmvKT2dFA/j7B+riVLUt9Q6RKJlcppojL5CoRywJJKLDYnRlw0gTFKfgDPHP5E04UoB71SxoJlVZy8FA==",
"dev": true
},
"node_modules/diff": {
@@ -10360,6 +10619,12 @@
"integrity": "sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg==",
"dev": true
},
+ "node_modules/eastasianwidth": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
+ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
+ "dev": true
+ },
"node_modules/ee-first": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
@@ -11476,20 +11741,6 @@
"concat-map": "0.0.1"
}
},
- "node_modules/eslint/node_modules/cross-spawn": {
- "version": "7.0.5",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.5.tgz",
- "integrity": "sha512-ZVJrKKYunU38/76t0RMOulHOnUcbU9GbpWKAOZ0mhjr7CX6FVrH+4FrAapSOekrgFQ3f/8gwMEuIft0aKq6Hug==",
- "dev": true,
- "dependencies": {
- "path-key": "^3.1.0",
- "shebang-command": "^2.0.0",
- "which": "^2.0.1"
- },
- "engines": {
- "node": ">= 8"
- }
- },
"node_modules/eslint/node_modules/eslint-scope": {
"version": "7.2.2",
"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz",
@@ -11603,27 +11854,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/eslint/node_modules/shebang-command": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
- "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
- "dev": true,
- "dependencies": {
- "shebang-regex": "^3.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/eslint/node_modules/shebang-regex": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
- "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
"node_modules/eslint/node_modules/type-fest": {
"version": "0.20.2",
"resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
@@ -11636,21 +11866,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/eslint/node_modules/which": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
- "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
- "dev": true,
- "dependencies": {
- "isexe": "^2.0.0"
- },
- "bin": {
- "node-which": "bin/node-which"
- },
- "engines": {
- "node": ">= 8"
- }
- },
"node_modules/espree": {
"version": "9.6.1",
"resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz",
@@ -11782,20 +11997,6 @@
"url": "https://github.com/sindresorhus/execa?sponsor=1"
}
},
- "node_modules/execa/node_modules/cross-spawn": {
- "version": "7.0.5",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.5.tgz",
- "integrity": "sha512-ZVJrKKYunU38/76t0RMOulHOnUcbU9GbpWKAOZ0mhjr7CX6FVrH+4FrAapSOekrgFQ3f/8gwMEuIft0aKq6Hug==",
- "dev": true,
- "dependencies": {
- "path-key": "^3.1.0",
- "shebang-command": "^2.0.0",
- "which": "^2.0.1"
- },
- "engines": {
- "node": ">= 8"
- }
- },
"node_modules/execa/node_modules/get-stream": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
@@ -11808,42 +12009,6 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
- "node_modules/execa/node_modules/shebang-command": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
- "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
- "dev": true,
- "dependencies": {
- "shebang-regex": "^3.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/execa/node_modules/shebang-regex": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
- "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/execa/node_modules/which": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
- "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
- "dev": true,
- "dependencies": {
- "isexe": "^2.0.0"
- },
- "bin": {
- "node-which": "bin/node-which"
- },
- "engines": {
- "node": ">= 8"
- }
- },
"node_modules/exit": {
"version": "0.1.2",
"resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz",
@@ -11888,9 +12053,9 @@
"dev": true
},
"node_modules/express": {
- "version": "4.21.1",
- "resolved": "https://registry.npmjs.org/express/-/express-4.21.1.tgz",
- "integrity": "sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==",
+ "version": "4.21.2",
+ "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz",
+ "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==",
"dev": true,
"dependencies": {
"accepts": "~1.3.8",
@@ -11912,7 +12077,7 @@
"methods": "~1.1.2",
"on-finished": "2.4.1",
"parseurl": "~1.3.3",
- "path-to-regexp": "0.1.10",
+ "path-to-regexp": "0.1.12",
"proxy-addr": "~2.0.7",
"qs": "6.13.0",
"range-parser": "~1.2.1",
@@ -11927,6 +12092,10 @@
},
"engines": {
"node": ">= 0.10.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
}
},
"node_modules/express/node_modules/cookie": {
@@ -11954,9 +12123,9 @@
"dev": true
},
"node_modules/express/node_modules/path-to-regexp": {
- "version": "0.1.10",
- "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz",
- "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==",
+ "version": "0.1.12",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz",
+ "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==",
"dev": true
},
"node_modules/external-editor": {
@@ -12126,6 +12295,11 @@
"pend": "~1.2.0"
}
},
+ "node_modules/fflate": {
+ "version": "0.4.8",
+ "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.4.8.tgz",
+ "integrity": "sha512-FJqqoDBR00Mdj9ppamLa/Y7vxm+PRmNWA67N846RvsoYVMKB4q3y/de5PA7gUmRMYK/8CMz2GDZQmCRN1wBcWA=="
+ },
"node_modules/figures": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz",
@@ -12281,48 +12455,387 @@
}
},
"node_modules/find-process": {
- "version": "1.4.7",
- "resolved": "https://registry.npmjs.org/find-process/-/find-process-1.4.7.tgz",
- "integrity": "sha512-/U4CYp1214Xrp3u3Fqr9yNynUrr5Le4y0SsJh2lMDDSbpwYSz3M2SMWQC+wqcx79cN8PQtHQIL8KnuY9M66fdg==",
+ "version": "1.4.8",
+ "resolved": "https://registry.npmjs.org/find-process/-/find-process-1.4.8.tgz",
+ "integrity": "sha512-W2PIdgXfhYeIlTzGiDyGJhjslZcwQCRcSw6plgyLu3CFk1PhQrKkTbQ5jkJ2NhOabMwETTrhl7c+xBcQ7B2jRg==",
"dev": true,
"dependencies": {
- "chalk": "^4.0.0",
- "commander": "^5.1.0",
- "debug": "^4.1.1"
+ "chalk": "^5.4.1",
+ "commander": "^12.1.0",
+ "debug": "^4.4.0",
+ "eslint": "^9.17.0",
+ "glob": "^11.0.0",
+ "loglevel": "^1.9.2",
+ "rimraf": "^6.0.1"
},
"bin": {
"find-process": "bin/find-process.js"
}
},
- "node_modules/find-root": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz",
- "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng=="
- },
- "node_modules/find-up": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
- "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "node_modules/find-process/node_modules/@eslint/eslintrc": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.2.0.tgz",
+ "integrity": "sha512-grOjVNN8P3hjJn/eIETF1wwd12DdnwFDoyceUJLYYdkpbwq3nLi+4fqrTAONx7XDALqlL220wC/RHSC/QTI/0w==",
"dev": true,
"dependencies": {
- "locate-path": "^5.0.0",
- "path-exists": "^4.0.0"
+ "ajv": "^6.12.4",
+ "debug": "^4.3.2",
+ "espree": "^10.0.1",
+ "globals": "^14.0.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": ">=8"
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
}
},
- "node_modules/flat": {
- "version": "5.0.2",
- "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz",
- "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==",
+ "node_modules/find-process/node_modules/argparse": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
+ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
+ "dev": true
+ },
+ "node_modules/find-process/node_modules/chalk": {
+ "version": "5.4.1",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz",
+ "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==",
"dev": true,
- "bin": {
- "flat": "cli.js"
+ "engines": {
+ "node": "^12.17.0 || ^14.13 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
}
},
- "node_modules/flat-cache": {
- "version": "3.2.0",
+ "node_modules/find-process/node_modules/eslint": {
+ "version": "9.17.0",
+ "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.17.0.tgz",
+ "integrity": "sha512-evtlNcpJg+cZLcnVKwsai8fExnqjGPicK7gnUtlNuzu+Fv9bI0aLpND5T44VLQtoMEnI57LoXO9XAkIXwohKrA==",
+ "dev": true,
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.2.0",
+ "@eslint-community/regexpp": "^4.12.1",
+ "@eslint/config-array": "^0.19.0",
+ "@eslint/core": "^0.9.0",
+ "@eslint/eslintrc": "^3.2.0",
+ "@eslint/js": "9.17.0",
+ "@eslint/plugin-kit": "^0.2.3",
+ "@humanfs/node": "^0.16.6",
+ "@humanwhocodes/module-importer": "^1.0.1",
+ "@humanwhocodes/retry": "^0.4.1",
+ "@types/estree": "^1.0.6",
+ "@types/json-schema": "^7.0.15",
+ "ajv": "^6.12.4",
+ "chalk": "^4.0.0",
+ "cross-spawn": "^7.0.6",
+ "debug": "^4.3.2",
+ "escape-string-regexp": "^4.0.0",
+ "eslint-scope": "^8.2.0",
+ "eslint-visitor-keys": "^4.2.0",
+ "espree": "^10.3.0",
+ "esquery": "^1.5.0",
+ "esutils": "^2.0.2",
+ "fast-deep-equal": "^3.1.3",
+ "file-entry-cache": "^8.0.0",
+ "find-up": "^5.0.0",
+ "glob-parent": "^6.0.2",
+ "ignore": "^5.2.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "lodash.merge": "^4.6.2",
+ "minimatch": "^3.1.2",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.3"
+ },
+ "bin": {
+ "eslint": "bin/eslint.js"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://eslint.org/donate"
+ },
+ "peerDependencies": {
+ "jiti": "*"
+ },
+ "peerDependenciesMeta": {
+ "jiti": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/find-process/node_modules/eslint-scope": {
+ "version": "8.2.0",
+ "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.2.0.tgz",
+ "integrity": "sha512-PHlWUfG6lvPc3yvP5A4PNyBL1W8fkDUccmI21JUu/+GKZBoH/W5u6usENXUrWFRsyoW5ACUjFGgAFQp5gUlb/A==",
+ "dev": true,
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/find-process/node_modules/eslint-visitor-keys": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.0.tgz",
+ "integrity": "sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==",
+ "dev": true,
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/find-process/node_modules/eslint/node_modules/chalk": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
+ "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+ "dev": true,
+ "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/find-process/node_modules/espree": {
+ "version": "10.3.0",
+ "resolved": "https://registry.npmjs.org/espree/-/espree-10.3.0.tgz",
+ "integrity": "sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==",
+ "dev": true,
+ "dependencies": {
+ "acorn": "^8.14.0",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^4.2.0"
+ },
+ "engines": {
+ "node": "^18.18.0 || ^20.9.0 || >=21.1.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/find-process/node_modules/file-entry-cache": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz",
+ "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==",
+ "dev": true,
+ "dependencies": {
+ "flat-cache": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=16.0.0"
+ }
+ },
+ "node_modules/find-process/node_modules/find-up": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
+ "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
+ "dev": true,
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/find-process/node_modules/flat-cache": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz",
+ "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==",
+ "dev": true,
+ "dependencies": {
+ "flatted": "^3.2.9",
+ "keyv": "^4.5.4"
+ },
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/find-process/node_modules/glob": {
+ "version": "11.0.0",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.0.tgz",
+ "integrity": "sha512-9UiX/Bl6J2yaBbxKoEBRm4Cipxgok8kQYcOPEhScPwebu2I0HoQOuYdIO6S3hLuWoZgpDpwQZMzTFxgpkyT76g==",
+ "dev": true,
+ "dependencies": {
+ "foreground-child": "^3.1.0",
+ "jackspeak": "^4.0.1",
+ "minimatch": "^10.0.0",
+ "minipass": "^7.1.2",
+ "package-json-from-dist": "^1.0.0",
+ "path-scurry": "^2.0.0"
+ },
+ "bin": {
+ "glob": "dist/esm/bin.mjs"
+ },
+ "engines": {
+ "node": "20 || >=22"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/find-process/node_modules/glob/node_modules/minimatch": {
+ "version": "10.0.1",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.1.tgz",
+ "integrity": "sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^2.0.1"
+ },
+ "engines": {
+ "node": "20 || >=22"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/find-process/node_modules/globals": {
+ "version": "14.0.0",
+ "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz",
+ "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/find-process/node_modules/js-yaml": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
+ "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
+ "dev": true,
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/find-process/node_modules/locate-path": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
+ "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
+ "dev": true,
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/find-process/node_modules/minimatch": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
+ "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
+ "dev": true,
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/find-process/node_modules/minimatch/node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/find-process/node_modules/p-locate": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
+ "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+ "dev": true,
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/find-process/node_modules/rimraf": {
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-6.0.1.tgz",
+ "integrity": "sha512-9dkvaxAsk/xNXSJzMgFqqMCuFgt2+KsOFek3TMLfo8NCPfWpBmqwyNn5Y+NX56QUYfCtsyhF3ayiboEoUmJk/A==",
+ "dev": true,
+ "dependencies": {
+ "glob": "^11.0.0",
+ "package-json-from-dist": "^1.0.0"
+ },
+ "bin": {
+ "rimraf": "dist/esm/bin.mjs"
+ },
+ "engines": {
+ "node": "20 || >=22"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/find-root": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz",
+ "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng=="
+ },
+ "node_modules/find-up": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
+ "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
+ "dev": true,
+ "dependencies": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/flat": {
+ "version": "5.0.2",
+ "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz",
+ "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==",
+ "dev": true,
+ "bin": {
+ "flat": "cli.js"
+ }
+ },
+ "node_modules/flat-cache": {
+ "version": "3.2.0",
"resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz",
"integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==",
"dev": true,
@@ -12391,6 +12904,34 @@
"node": ">=0.10.0"
}
},
+ "node_modules/foreground-child": {
+ "version": "3.3.0",
+ "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.0.tgz",
+ "integrity": "sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==",
+ "dev": true,
+ "dependencies": {
+ "cross-spawn": "^7.0.0",
+ "signal-exit": "^4.0.1"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/foreground-child/node_modules/signal-exit": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+ "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+ "dev": true,
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
"node_modules/form-data": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.1.tgz",
@@ -12469,20 +13010,6 @@
"node": ">=0.10.0"
}
},
- "node_modules/fs-extra": {
- "version": "11.2.0",
- "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz",
- "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==",
- "dev": true,
- "dependencies": {
- "graceful-fs": "^4.2.0",
- "jsonfile": "^6.0.1",
- "universalify": "^2.0.0"
- },
- "engines": {
- "node": ">=14.14"
- }
- },
"node_modules/fs-monkey": {
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.6.tgz",
@@ -12659,15 +13186,14 @@
}
},
"node_modules/get-uri": {
- "version": "6.0.3",
- "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.3.tgz",
- "integrity": "sha512-BzUrJBS9EcUb4cFol8r4W3v1cPsSyajLSthNkz5BxbpDcHN5tIrM10E2eNvfnvBn3DaT3DUgx0OpsBKkaOpanw==",
+ "version": "6.0.4",
+ "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.4.tgz",
+ "integrity": "sha512-E1b1lFFLvLgak2whF2xDBcOy6NLVGZBqqjJjsIhvopKfWWEi64pLVTWWehV8KlLerZkfNTA95sTe2OdJKm1OzQ==",
"dev": true,
"dependencies": {
"basic-ftp": "^5.0.2",
"data-uri-to-buffer": "^6.0.2",
- "debug": "^4.3.4",
- "fs-extra": "^11.2.0"
+ "debug": "^4.3.4"
},
"engines": {
"node": ">= 14"
@@ -12771,6 +13297,18 @@
"node": ">=0.10.0"
}
},
+ "node_modules/global-prefix/node_modules/which": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+ "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+ "dev": true,
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "which": "bin/which"
+ }
+ },
"node_modules/globals": {
"version": "11.12.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
@@ -13426,10 +13964,16 @@
"integrity": "sha512-W7+sO6/yhxy83L0G7xR8YAc5Z5QFtYEXXRV6EaE8tuYBZJnA3gVgp3q7X7muhLZVodeb9UfvjSbwt9VJwjIYAg==",
"dev": true
},
+ "node_modules/immediate": {
+ "version": "3.0.6",
+ "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz",
+ "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==",
+ "dev": true
+ },
"node_modules/immutable": {
- "version": "5.0.2",
- "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.0.2.tgz",
- "integrity": "sha512-1NU7hWZDkV7hJ4PJ9dur9gTNQ4ePNPN4k9/0YhwjzykTi/+3Q5pF93YU5QoVj8BuOnhLgaY8gs0U2pj4kSYVcw==",
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.0.3.tgz",
+ "integrity": "sha512-P8IdPQHq3lA1xVeBRi5VPqUm5HDgKnx0Ru51wZz5mjxHr5n3RWhjIpOFU7ybkUxfB+5IToy+OLaHYDBIWsv+uw==",
"dev": true
},
"node_modules/import-fresh": {
@@ -13585,21 +14129,17 @@
}
},
"node_modules/intl-messageformat": {
- "version": "4.4.0",
- "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-4.4.0.tgz",
- "integrity": "sha512-z+Bj2rS3LZSYU4+sNitdHrwnBhr0wO80ZJSW8EzKDBowwUe3Q/UsvgCGjrwa+HPzoGCLEb9HAjfJgo4j2Sac8w==",
+ "version": "10.7.11",
+ "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-10.7.11.tgz",
+ "integrity": "sha512-IB2N1tmI24k2EFH3PWjU7ivJsnWyLwOWOva0jnXFa29WzB6fb0JZ5EMQGu+XN5lDtjHYFo0/UooP67zBwUg7rQ==",
"dev": true,
"dependencies": {
- "intl-messageformat-parser": "^1.8.1"
+ "@formatjs/ecma402-abstract": "2.3.2",
+ "@formatjs/fast-memoize": "2.2.6",
+ "@formatjs/icu-messageformat-parser": "2.9.8",
+ "tslib": "2"
}
},
- "node_modules/intl-messageformat-parser": {
- "version": "1.8.1",
- "resolved": "https://registry.npmjs.org/intl-messageformat-parser/-/intl-messageformat-parser-1.8.1.tgz",
- "integrity": "sha512-IMSCKVf0USrM/959vj3xac7s8f87sc+80Y/ipBzdKy4ifBv5Gsj2tZ41EAaURVg01QU71fYr77uA8Meh6kELbg==",
- "deprecated": "We've written a new parser that's 6x faster and is backwards compatible. Please use @formatjs/icu-messageformat-parser",
- "dev": true
- },
"node_modules/invariant": {
"version": "2.2.4",
"resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
@@ -14321,6 +14861,21 @@
"node": ">= 0.4"
}
},
+ "node_modules/jackspeak": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.0.2.tgz",
+ "integrity": "sha512-bZsjR/iRjl1Nk1UkjGpAzLNfQtzuijhn2g+pbZb98HQ1Gk8vM9hfbxeMBP+M2/UUdwj0RqGG3mlvk2MsAqwvEw==",
+ "dev": true,
+ "dependencies": {
+ "@isaacs/cliui": "^8.0.2"
+ },
+ "engines": {
+ "node": "20 || >=22"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
"node_modules/jest": {
"version": "29.7.0",
"resolved": "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz",
@@ -14471,18 +15026,18 @@
}
},
"node_modules/jest-dev-server": {
- "version": "9.0.2",
- "resolved": "https://registry.npmjs.org/jest-dev-server/-/jest-dev-server-9.0.2.tgz",
- "integrity": "sha512-Zc/JB0IlNNrpXkhBw+h86cGrde/Mey52KvF+FER2eyrtYJTHObOwW7Iarxm3rPyTKby5+3Y2QZtl8pRz/5GCxg==",
+ "version": "10.1.4",
+ "resolved": "https://registry.npmjs.org/jest-dev-server/-/jest-dev-server-10.1.4.tgz",
+ "integrity": "sha512-bGQ6sedNGtT6AFHhCVqGTXMPz7UyJi/ZrhNBgyqsP0XU9N8acCEIfqZEA22rOaZ+NdEVsaltk6tL7UT6aXfI7w==",
"dev": true,
"dependencies": {
"chalk": "^4.1.2",
"cwd": "^0.10.0",
"find-process": "^1.4.7",
"prompts": "^2.4.2",
- "spawnd": "^9.0.2",
+ "spawnd": "^10.1.4",
"tree-kill": "^1.2.2",
- "wait-on": "^7.2.0"
+ "wait-on": "^8.0.1"
},
"engines": {
"node": ">=16"
@@ -15085,18 +15640,6 @@
"integrity": "sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA==",
"dev": true
},
- "node_modules/jsonfile": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz",
- "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==",
- "dev": true,
- "dependencies": {
- "universalify": "^2.0.0"
- },
- "optionalDependencies": {
- "graceful-fs": "^4.1.6"
- }
- },
"node_modules/jsx-ast-utils": {
"version": "3.3.5",
"resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz",
@@ -15152,9 +15695,9 @@
}
},
"node_modules/known-css-properties": {
- "version": "0.34.0",
- "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.34.0.tgz",
- "integrity": "sha512-tBECoUqNFbyAY4RrbqsBQqDFpGXAEbdD5QKr8kACx3+rnArmuuR22nKQWKazvp07N9yjTyDZaw/20UIH8tL9DQ==",
+ "version": "0.35.0",
+ "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.35.0.tgz",
+ "integrity": "sha512-a/RAk2BfKk+WFGhhOCAYqSiFLc34k8Mt/6NWRI4joER0EYUzXIcFivjjnoD3+XU1DggLn/tZc3DOAgke7l8a4A==",
"dev": true
},
"node_modules/language-subtag-registry": {
@@ -15236,296 +15779,89 @@
"url": "https://github.com/sponsors/dmonad"
}
},
- "node_modules/lighthouse": {
- "version": "10.4.0",
- "resolved": "https://registry.npmjs.org/lighthouse/-/lighthouse-10.4.0.tgz",
- "integrity": "sha512-XQWHEWkJ8YxSPsxttBJORy5+hQrzbvGkYfeP3fJjyYKioWkF2MXfFqNK4ZuV4jL8pBu7Z91qnQP6In0bq1yXww==",
- "dev": true,
- "dependencies": {
- "@sentry/node": "^6.17.4",
- "axe-core": "4.7.2",
- "chrome-launcher": "^0.15.2",
- "configstore": "^5.0.1",
- "csp_evaluator": "1.1.1",
- "devtools-protocol": "0.0.1155343",
- "enquirer": "^2.3.6",
- "http-link-header": "^1.1.1",
- "intl-messageformat": "^4.4.0",
- "jpeg-js": "^0.4.4",
- "js-library-detector": "^6.6.0",
- "lighthouse-logger": "^1.4.1",
- "lighthouse-stack-packs": "1.11.0",
- "lodash": "^4.17.21",
- "lookup-closest-locale": "6.2.0",
- "metaviewport-parser": "0.3.0",
- "open": "^8.4.0",
- "parse-cache-control": "1.0.1",
- "ps-list": "^8.0.0",
- "puppeteer-core": "^20.8.0",
- "robots-parser": "^3.0.0",
- "semver": "^5.3.0",
- "speedline-core": "^1.4.3",
- "third-party-web": "^0.23.3",
- "ws": "^7.0.0",
- "yargs": "^17.3.1",
- "yargs-parser": "^21.0.0"
- },
- "bin": {
- "chrome-debug": "core/scripts/manual-chrome-launcher.js",
- "lighthouse": "cli/index.js",
- "smokehouse": "cli/test/smokehouse/frontends/smokehouse-bin.js"
- },
- "engines": {
- "node": ">=16.16"
- }
- },
- "node_modules/lighthouse-logger": {
- "version": "1.4.2",
- "resolved": "https://registry.npmjs.org/lighthouse-logger/-/lighthouse-logger-1.4.2.tgz",
- "integrity": "sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==",
- "dev": true,
- "dependencies": {
- "debug": "^2.6.9",
- "marky": "^1.2.2"
- }
- },
- "node_modules/lighthouse-logger/node_modules/debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dev": true,
- "dependencies": {
- "ms": "2.0.0"
- }
- },
- "node_modules/lighthouse-logger/node_modules/ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
- "dev": true
- },
- "node_modules/lighthouse-stack-packs": {
- "version": "1.11.0",
- "resolved": "https://registry.npmjs.org/lighthouse-stack-packs/-/lighthouse-stack-packs-1.11.0.tgz",
- "integrity": "sha512-sRr0z1S/I26VffRLq9KJsKtLk856YrJlNGmcJmbLX8dFn3MuzVPUbstuChEhqnSxZb8TZmVfthuXuwhG9vRoSw==",
- "dev": true
- },
- "node_modules/lighthouse/node_modules/@puppeteer/browsers": {
- "version": "1.4.6",
- "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-1.4.6.tgz",
- "integrity": "sha512-x4BEjr2SjOPowNeiguzjozQbsc6h437ovD/wu+JpaenxVLm3jkgzHY2xOslMTp50HoTvQreMjiexiGQw1sqZlQ==",
- "dev": true,
- "dependencies": {
- "debug": "4.3.4",
- "extract-zip": "2.0.1",
- "progress": "2.0.3",
- "proxy-agent": "6.3.0",
- "tar-fs": "3.0.4",
- "unbzip2-stream": "1.4.3",
- "yargs": "17.7.1"
- },
- "bin": {
- "browsers": "lib/cjs/main-cli.js"
- },
- "engines": {
- "node": ">=16.3.0"
- },
- "peerDependencies": {
- "typescript": ">= 4.7.4"
- },
- "peerDependenciesMeta": {
- "typescript": {
- "optional": true
- }
- }
- },
- "node_modules/lighthouse/node_modules/agent-base": {
- "version": "7.1.1",
- "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz",
- "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==",
- "dev": true,
- "dependencies": {
- "debug": "^4.3.4"
- },
- "engines": {
- "node": ">= 14"
- }
- },
- "node_modules/lighthouse/node_modules/axe-core": {
- "version": "4.7.2",
- "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.2.tgz",
- "integrity": "sha512-zIURGIS1E1Q4pcrMjp+nnEh+16G56eG/MUllJH8yEvw7asDo7Ac9uhC9KIH5jzpITueEZolfYglnCGIuSBz39g==",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/lighthouse/node_modules/debug": {
- "version": "4.3.4",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz",
- "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==",
- "dev": true,
- "dependencies": {
- "ms": "2.1.2"
- },
- "engines": {
- "node": ">=6.0"
- },
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
- }
- },
- "node_modules/lighthouse/node_modules/extract-zip": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz",
- "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==",
- "dev": true,
- "dependencies": {
- "debug": "^4.1.1",
- "get-stream": "^5.1.0",
- "yauzl": "^2.10.0"
- },
- "bin": {
- "extract-zip": "cli.js"
- },
- "engines": {
- "node": ">= 10.17.0"
- },
- "optionalDependencies": {
- "@types/yauzl": "^2.9.1"
- }
- },
- "node_modules/lighthouse/node_modules/http-proxy-agent": {
- "version": "7.0.2",
- "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz",
- "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==",
- "dev": true,
- "dependencies": {
- "agent-base": "^7.1.0",
- "debug": "^4.3.4"
- },
- "engines": {
- "node": ">= 14"
- }
- },
- "node_modules/lighthouse/node_modules/https-proxy-agent": {
- "version": "7.0.5",
- "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz",
- "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==",
- "dev": true,
- "dependencies": {
- "agent-base": "^7.0.2",
- "debug": "4"
- },
- "engines": {
- "node": ">= 14"
- }
- },
- "node_modules/lighthouse/node_modules/lru-cache": {
- "version": "7.18.3",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz",
- "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==",
- "dev": true,
- "engines": {
- "node": ">=12"
- }
- },
- "node_modules/lighthouse/node_modules/mitt": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.0.tgz",
- "integrity": "sha512-7dX2/10ITVyqh4aOSVI9gdape+t9l2/8QxHrFmUXu4EEUpdlxl6RudZUPZoc+zuY2hk1j7XxVroIVIan/pD/SQ==",
- "dev": true
- },
- "node_modules/lighthouse/node_modules/ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
- "dev": true
+ "node_modules/lie": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz",
+ "integrity": "sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==",
+ "dev": true,
+ "dependencies": {
+ "immediate": "~3.0.5"
+ }
},
- "node_modules/lighthouse/node_modules/proxy-agent": {
- "version": "6.3.0",
- "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.3.0.tgz",
- "integrity": "sha512-0LdR757eTj/JfuU7TL2YCuAZnxWXu3tkJbg4Oq3geW/qFNT/32T0sp2HnZ9O0lMR4q3vwAt0+xCA8SR0WAD0og==",
+ "node_modules/lighthouse": {
+ "version": "12.3.0",
+ "resolved": "https://registry.npmjs.org/lighthouse/-/lighthouse-12.3.0.tgz",
+ "integrity": "sha512-OaLE8DasnwQkn2CBo2lKtD+IQv42mNP3T+Vaw29I++rAh0Zpgc6SM15usdIYyzhRMR5EWFxze5Fyb+HENJSh2A==",
"dev": true,
"dependencies": {
- "agent-base": "^7.0.2",
- "debug": "^4.3.4",
- "http-proxy-agent": "^7.0.0",
- "https-proxy-agent": "^7.0.0",
- "lru-cache": "^7.14.1",
- "pac-proxy-agent": "^7.0.0",
- "proxy-from-env": "^1.1.0",
- "socks-proxy-agent": "^8.0.1"
+ "@paulirish/trace_engine": "0.0.39",
+ "@sentry/node": "^7.0.0",
+ "axe-core": "^4.10.2",
+ "chrome-launcher": "^1.1.2",
+ "configstore": "^5.0.1",
+ "csp_evaluator": "1.1.1",
+ "devtools-protocol": "0.0.1312386",
+ "enquirer": "^2.3.6",
+ "http-link-header": "^1.1.1",
+ "intl-messageformat": "^10.5.3",
+ "jpeg-js": "^0.4.4",
+ "js-library-detector": "^6.7.0",
+ "lighthouse-logger": "^2.0.1",
+ "lighthouse-stack-packs": "1.12.2",
+ "lodash-es": "^4.17.21",
+ "lookup-closest-locale": "6.2.0",
+ "metaviewport-parser": "0.3.0",
+ "open": "^8.4.0",
+ "parse-cache-control": "1.0.1",
+ "puppeteer-core": "^23.10.4",
+ "robots-parser": "^3.0.1",
+ "semver": "^5.3.0",
+ "speedline-core": "^1.4.3",
+ "third-party-web": "^0.26.1",
+ "tldts-icann": "^6.1.16",
+ "ws": "^7.0.0",
+ "yargs": "^17.3.1",
+ "yargs-parser": "^21.0.0"
+ },
+ "bin": {
+ "chrome-debug": "core/scripts/manual-chrome-launcher.js",
+ "lighthouse": "cli/index.js",
+ "smokehouse": "cli/test/smokehouse/frontends/smokehouse-bin.js"
},
"engines": {
- "node": ">= 14"
+ "node": ">=18.16"
}
},
- "node_modules/lighthouse/node_modules/puppeteer-core": {
- "version": "20.9.0",
- "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-20.9.0.tgz",
- "integrity": "sha512-H9fYZQzMTRrkboEfPmf7m3CLDN6JvbxXA3qTtS+dFt27tR+CsFHzPsT6pzp6lYL6bJbAPaR0HaPO6uSi+F94Pg==",
+ "node_modules/lighthouse-logger": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/lighthouse-logger/-/lighthouse-logger-2.0.1.tgz",
+ "integrity": "sha512-ioBrW3s2i97noEmnXxmUq7cjIcVRjT5HBpAYy8zE11CxU9HqlWHHeRxfeN1tn8F7OEMVPIC9x1f8t3Z7US9ehQ==",
"dev": true,
"dependencies": {
- "@puppeteer/browsers": "1.4.6",
- "chromium-bidi": "0.4.16",
- "cross-fetch": "4.0.0",
- "debug": "4.3.4",
- "devtools-protocol": "0.0.1147663",
- "ws": "8.13.0"
- },
- "engines": {
- "node": ">=16.3.0"
- },
- "peerDependencies": {
- "typescript": ">= 4.7.4"
- },
- "peerDependenciesMeta": {
- "typescript": {
- "optional": true
- }
+ "debug": "^2.6.9",
+ "marky": "^1.2.2"
}
},
- "node_modules/lighthouse/node_modules/puppeteer-core/node_modules/chromium-bidi": {
- "version": "0.4.16",
- "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.4.16.tgz",
- "integrity": "sha512-7ZbXdWERxRxSwo3txsBjjmc/NLxqb1Bk30mRb0BMS4YIaiV6zvKZqL/UAH+DdqcDYayDWk2n/y8klkBDODrPvA==",
+ "node_modules/lighthouse-logger/node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
"dev": true,
"dependencies": {
- "mitt": "3.0.0"
- },
- "peerDependencies": {
- "devtools-protocol": "*"
+ "ms": "2.0.0"
}
},
- "node_modules/lighthouse/node_modules/puppeteer-core/node_modules/devtools-protocol": {
- "version": "0.0.1147663",
- "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1147663.tgz",
- "integrity": "sha512-hyWmRrexdhbZ1tcJUGpO95ivbRhWXz++F4Ko+n21AY5PNln2ovoJw+8ZMNDTtip+CNFQfrtLVh/w4009dXO/eQ==",
+ "node_modules/lighthouse-logger/node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
"dev": true
},
- "node_modules/lighthouse/node_modules/puppeteer-core/node_modules/ws": {
- "version": "8.13.0",
- "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz",
- "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==",
- "dev": true,
- "engines": {
- "node": ">=10.0.0"
- },
- "peerDependencies": {
- "bufferutil": "^4.0.1",
- "utf-8-validate": ">=5.0.2"
- },
- "peerDependenciesMeta": {
- "bufferutil": {
- "optional": true
- },
- "utf-8-validate": {
- "optional": true
- }
- }
+ "node_modules/lighthouse-stack-packs": {
+ "version": "1.12.2",
+ "resolved": "https://registry.npmjs.org/lighthouse-stack-packs/-/lighthouse-stack-packs-1.12.2.tgz",
+ "integrity": "sha512-Ug8feS/A+92TMTCK6yHYLwaFMuelK/hAKRMdldYkMNwv+d9PtWxjXEg6rwKtsUXTADajhdrhXyuNCJ5/sfmPFw==",
+ "dev": true
},
"node_modules/lighthouse/node_modules/semver": {
"version": "5.7.2",
@@ -15536,17 +15872,6 @@
"semver": "bin/semver"
}
},
- "node_modules/lighthouse/node_modules/tar-fs": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.4.tgz",
- "integrity": "sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==",
- "dev": true,
- "dependencies": {
- "mkdirp-classic": "^0.5.2",
- "pump": "^3.0.0",
- "tar-stream": "^3.1.5"
- }
- },
"node_modules/lighthouse/node_modules/ws": {
"version": "7.5.10",
"resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz",
@@ -15568,24 +15893,6 @@
}
}
},
- "node_modules/lighthouse/node_modules/yargs": {
- "version": "17.7.1",
- "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz",
- "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==",
- "dev": true,
- "dependencies": {
- "cliui": "^8.0.1",
- "escalade": "^3.1.1",
- "get-caller-file": "^2.0.5",
- "require-directory": "^2.1.1",
- "string-width": "^4.2.3",
- "y18n": "^5.0.5",
- "yargs-parser": "^21.1.1"
- },
- "engines": {
- "node": ">=12"
- }
- },
"node_modules/lilconfig": {
"version": "3.1.2",
"resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.2.tgz",
@@ -15646,6 +15953,15 @@
"node": ">=8.9.0"
}
},
+ "node_modules/localforage": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/localforage/-/localforage-1.10.0.tgz",
+ "integrity": "sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==",
+ "dev": true,
+ "dependencies": {
+ "lie": "3.1.1"
+ }
+ },
"node_modules/locate-path": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
@@ -15664,6 +15980,12 @@
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
"dev": true
},
+ "node_modules/lodash-es": {
+ "version": "4.17.21",
+ "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz",
+ "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==",
+ "dev": true
+ },
"node_modules/lodash.debounce": {
"version": "4.0.8",
"resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
@@ -15710,6 +16032,19 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/loglevel": {
+ "version": "1.9.2",
+ "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.9.2.tgz",
+ "integrity": "sha512-HgMmCqIJSAKqo68l0rS2AanEWfkxaZ5wNiEFb5ggm08lDs9Xl2KxBlX3PTcaD2chBM1gXAYf491/M2Rv8Jwayg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 0.6.0"
+ },
+ "funding": {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/loglevel"
+ }
+ },
"node_modules/lookup-closest-locale": {
"version": "6.2.0",
"resolved": "https://registry.npmjs.org/lookup-closest-locale/-/lookup-closest-locale-6.2.0.tgz",
@@ -15744,12 +16079,6 @@
"node": ">=8"
}
},
- "node_modules/lru_map": {
- "version": "0.3.3",
- "resolved": "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz",
- "integrity": "sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==",
- "dev": true
- },
"node_modules/lru-cache": {
"version": "5.1.1",
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz",
@@ -15980,9 +16309,9 @@
}
},
"node_modules/mdn-data": {
- "version": "2.12.1",
- "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.1.tgz",
- "integrity": "sha512-rsfnCbOHjqrhWxwt5/wtSLzpoKTzW7OXdT5lLOIH1OTYhWu9rRJveGq0sKvDZODABH7RX+uoR+DYcpFnq4Tf6Q==",
+ "version": "2.12.2",
+ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz",
+ "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==",
"dev": true
},
"node_modules/mdurl": {
@@ -16279,11 +16608,19 @@
"node": ">=0.10.0"
}
},
+ "node_modules/minipass": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
+ "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==",
+ "dev": true,
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ }
+ },
"node_modules/mitt": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz",
- "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==",
- "dev": true
+ "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw=="
},
"node_modules/mixin-object": {
"version": "2.0.1",
@@ -16307,6 +16644,14 @@
"node": ">=0.10.0"
}
},
+ "node_modules/mixpanel-browser": {
+ "version": "2.58.0",
+ "resolved": "https://registry.npmjs.org/mixpanel-browser/-/mixpanel-browser-2.58.0.tgz",
+ "integrity": "sha512-ZayNE4augjSJh5RxYKRPhFe1jzS9HZnoowvZaN4DaUeCezbLGVck46L+N9X8VLtK74UgLUYfehPgCr41rtgpRA==",
+ "dependencies": {
+ "rrweb": "2.0.0-alpha.13"
+ }
+ },
"node_modules/mkdirp": {
"version": "0.5.6",
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
@@ -16319,12 +16664,6 @@
"mkdirp": "bin/cmd.js"
}
},
- "node_modules/mkdirp-classic": {
- "version": "0.5.3",
- "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz",
- "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==",
- "dev": true
- },
"node_modules/moment": {
"version": "2.30.1",
"resolved": "https://registry.npmjs.org/moment/-/moment-2.30.1.tgz",
@@ -16383,9 +16722,9 @@
"dev": true
},
"node_modules/nanoid": {
- "version": "3.3.7",
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz",
- "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
+ "version": "3.3.8",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz",
+ "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==",
"funding": [
{
"type": "github",
@@ -16445,48 +16784,6 @@
"dev": true,
"optional": true
},
- "node_modules/node-fetch": {
- "version": "2.7.0",
- "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz",
- "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==",
- "dev": true,
- "dependencies": {
- "whatwg-url": "^5.0.0"
- },
- "engines": {
- "node": "4.x || >=6.0.0"
- },
- "peerDependencies": {
- "encoding": "^0.1.0"
- },
- "peerDependenciesMeta": {
- "encoding": {
- "optional": true
- }
- }
- },
- "node_modules/node-fetch/node_modules/tr46": {
- "version": "0.0.3",
- "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
- "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==",
- "dev": true
- },
- "node_modules/node-fetch/node_modules/webidl-conversions": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
- "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==",
- "dev": true
- },
- "node_modules/node-fetch/node_modules/whatwg-url": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz",
- "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==",
- "dev": true,
- "dependencies": {
- "tr46": "~0.0.3",
- "webidl-conversions": "^3.0.0"
- }
- },
"node_modules/node-forge": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz",
@@ -17167,32 +17464,29 @@
}
},
"node_modules/pac-proxy-agent": {
- "version": "7.0.2",
- "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.0.2.tgz",
- "integrity": "sha512-BFi3vZnO9X5Qt6NRz7ZOaPja3ic0PhlsmCRYLOpN11+mWBCR6XJDqW5RF3j8jm4WGGQZtBA+bTfxYzeKW73eHg==",
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.1.0.tgz",
+ "integrity": "sha512-Z5FnLVVZSnX7WjBg0mhDtydeRZ1xMcATZThjySQUHqr+0ksP8kqaw23fNKkaaN/Z8gwLUs/W7xdl0I75eP2Xyw==",
"dev": true,
"dependencies": {
"@tootallnate/quickjs-emscripten": "^0.23.0",
- "agent-base": "^7.0.2",
+ "agent-base": "^7.1.2",
"debug": "^4.3.4",
"get-uri": "^6.0.1",
"http-proxy-agent": "^7.0.0",
- "https-proxy-agent": "^7.0.5",
+ "https-proxy-agent": "^7.0.6",
"pac-resolver": "^7.0.1",
- "socks-proxy-agent": "^8.0.4"
+ "socks-proxy-agent": "^8.0.5"
},
"engines": {
"node": ">= 14"
}
},
"node_modules/pac-proxy-agent/node_modules/agent-base": {
- "version": "7.1.1",
- "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz",
- "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==",
+ "version": "7.1.3",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz",
+ "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==",
"dev": true,
- "dependencies": {
- "debug": "^4.3.4"
- },
"engines": {
"node": ">= 14"
}
@@ -17211,12 +17505,12 @@
}
},
"node_modules/pac-proxy-agent/node_modules/https-proxy-agent": {
- "version": "7.0.5",
- "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz",
- "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==",
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz",
+ "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==",
"dev": true,
"dependencies": {
- "agent-base": "^7.0.2",
+ "agent-base": "^7.1.2",
"debug": "4"
},
"engines": {
@@ -17236,6 +17530,12 @@
"node": ">= 14"
}
},
+ "node_modules/package-json-from-dist": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz",
+ "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==",
+ "dev": true
+ },
"node_modules/param-case": {
"version": "3.0.4",
"resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz",
@@ -17370,6 +17670,31 @@
"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
"integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw=="
},
+ "node_modules/path-scurry": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-2.0.0.tgz",
+ "integrity": "sha512-ypGJsmGtdXUOeM5u93TyeIEfEhM6s+ljAhrk5vAvSx8uyY/02OvrZnA0YNGUrPXfpJMgI1ODd3nwz8Npx4O4cg==",
+ "dev": true,
+ "dependencies": {
+ "lru-cache": "^11.0.0",
+ "minipass": "^7.1.2"
+ },
+ "engines": {
+ "node": "20 || >=22"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/path-scurry/node_modules/lru-cache": {
+ "version": "11.0.2",
+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-11.0.2.tgz",
+ "integrity": "sha512-123qHRfJBmo2jXDbo/a5YOQrJoHF/GNQTLzQ5+IdK5pWpceK17yRc6ozlWd25FxvGKQbIUs91fDFkXmDHTKcyA==",
+ "dev": true,
+ "engines": {
+ "node": "20 || >=22"
+ }
+ },
"node_modules/path-to-regexp": {
"version": "6.3.0",
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.3.0.tgz",
@@ -17543,13 +17868,13 @@
}
},
"node_modules/playwright": {
- "version": "1.48.2",
- "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.48.2.tgz",
- "integrity": "sha512-NjYvYgp4BPmiwfe31j4gHLa3J7bD2WiBz8Lk2RoSsmX38SVIARZ18VYjxLjAcDsAhA+F4iSEXTSGgjua0rrlgQ==",
+ "version": "1.49.1",
+ "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.49.1.tgz",
+ "integrity": "sha512-VYL8zLoNTBxVOrJBbDuRgDWa3i+mfQgDTrL8Ah9QXZ7ax4Dsj0MSq5bYgytRnDVVe+njoKnfsYkH3HzqVj5UZA==",
"dev": true,
"peer": true,
"dependencies": {
- "playwright-core": "1.48.2"
+ "playwright-core": "1.49.1"
},
"bin": {
"playwright": "cli.js"
@@ -17562,9 +17887,9 @@
}
},
"node_modules/playwright-core": {
- "version": "1.48.2",
- "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.48.2.tgz",
- "integrity": "sha512-sjjw+qrLFlriJo64du+EK0kJgZzoQPsabGF4lBvsid+3CNIZIYLgnMj9V6JY5VhM2Peh20DJWIVpVljLLnlawA==",
+ "version": "1.49.1",
+ "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.49.1.tgz",
+ "integrity": "sha512-BzmpVcs4kE2CH15rWfzpjzVGhWERJfmnXmniSyKeRZUs9Ws65m+RGIi7mjJK/euCegfn3i7jvqWeWyHe9y3Vgg==",
"dev": true,
"peer": true,
"bin": {
@@ -17738,23 +18063,6 @@
"postcss": "^8.4.31"
}
},
- "node_modules/postcss-import": {
- "version": "16.1.0",
- "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-16.1.0.tgz",
- "integrity": "sha512-7hsAZ4xGXl4MW+OKEWCnF6T5jqBw80/EE9aXg1r2yyn1RsVEU8EtKXbijEODa+rg7iih4bKf7vlvTGYR4CnPNg==",
- "dev": true,
- "dependencies": {
- "postcss-value-parser": "^4.0.0",
- "read-cache": "^1.0.0",
- "resolve": "^1.1.7"
- },
- "engines": {
- "node": ">=18.0.0"
- },
- "peerDependencies": {
- "postcss": "^8.0.0"
- }
- },
"node_modules/postcss-loader": {
"version": "6.2.1",
"resolved": "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.2.1.tgz",
@@ -18412,32 +18720,29 @@
}
},
"node_modules/proxy-agent": {
- "version": "6.4.0",
- "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.4.0.tgz",
- "integrity": "sha512-u0piLU+nCOHMgGjRbimiXmA9kM/L9EHh3zL81xCdp7m+Y2pHIsnmbdDoEDoAz5geaonNR6q6+yOPQs6n4T6sBQ==",
+ "version": "6.5.0",
+ "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.5.0.tgz",
+ "integrity": "sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==",
"dev": true,
"dependencies": {
- "agent-base": "^7.0.2",
+ "agent-base": "^7.1.2",
"debug": "^4.3.4",
"http-proxy-agent": "^7.0.1",
- "https-proxy-agent": "^7.0.3",
+ "https-proxy-agent": "^7.0.6",
"lru-cache": "^7.14.1",
- "pac-proxy-agent": "^7.0.1",
+ "pac-proxy-agent": "^7.1.0",
"proxy-from-env": "^1.1.0",
- "socks-proxy-agent": "^8.0.2"
+ "socks-proxy-agent": "^8.0.5"
},
"engines": {
"node": ">= 14"
}
},
"node_modules/proxy-agent/node_modules/agent-base": {
- "version": "7.1.1",
- "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz",
- "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==",
+ "version": "7.1.3",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz",
+ "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==",
"dev": true,
- "dependencies": {
- "debug": "^4.3.4"
- },
"engines": {
"node": ">= 14"
}
@@ -18456,12 +18761,12 @@
}
},
"node_modules/proxy-agent/node_modules/https-proxy-agent": {
- "version": "7.0.5",
- "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz",
- "integrity": "sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==",
+ "version": "7.0.6",
+ "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz",
+ "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==",
"dev": true,
"dependencies": {
- "agent-base": "^7.0.2",
+ "agent-base": "^7.1.2",
"debug": "4"
},
"engines": {
@@ -18483,24 +18788,6 @@
"integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==",
"dev": true
},
- "node_modules/ps-list": {
- "version": "8.1.1",
- "resolved": "https://registry.npmjs.org/ps-list/-/ps-list-8.1.1.tgz",
- "integrity": "sha512-OPS9kEJYVmiO48u/B9qneqhkMvgCxT+Tm28VCEJpheTpl8cJ0ffZRRNgS5mrQRTrX5yRTpaJ+hRDeefXYmmorQ==",
- "dev": true,
- "engines": {
- "node": "^12.20.0 || ^14.13.1 || >=16.0.0"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/pseudomap": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
- "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==",
- "dev": true
- },
"node_modules/psl": {
"version": "1.10.0",
"resolved": "https://registry.npmjs.org/psl/-/psl-1.10.0.tgz",
@@ -18530,15 +18817,15 @@
}
},
"node_modules/puppeteer-core": {
- "version": "23.7.1",
- "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-23.7.1.tgz",
- "integrity": "sha512-Om/qCZhd+HLoAr7GltrRAZpS3uOXwHu7tXAoDbNcJADHjG2zeAlDArgyIPXYGG4QB/EQUHk13Q6RklNxGM73Pg==",
+ "version": "23.11.1",
+ "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-23.11.1.tgz",
+ "integrity": "sha512-3HZ2/7hdDKZvZQ7dhhITOUg4/wOrDRjyK2ZBllRB0ZCOi9u0cwq1ACHDjBB+nX+7+kltHjQvBRdeY7+W0T+7Gg==",
"dev": true,
"dependencies": {
- "@puppeteer/browsers": "2.4.1",
- "chromium-bidi": "0.8.0",
- "debug": "^4.3.7",
- "devtools-protocol": "0.0.1354347",
+ "@puppeteer/browsers": "2.6.1",
+ "chromium-bidi": "0.11.0",
+ "debug": "^4.4.0",
+ "devtools-protocol": "0.0.1367902",
"typed-query-selector": "^2.12.0",
"ws": "^8.18.0"
},
@@ -18547,9 +18834,9 @@
}
},
"node_modules/puppeteer-core/node_modules/devtools-protocol": {
- "version": "0.0.1354347",
- "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1354347.tgz",
- "integrity": "sha512-BlmkSqV0V84E2WnEnoPnwyix57rQxAM5SKJjf4TbYOCGLAWtz8CDH8RIaGOjPgPCXo2Mce3kxSY497OySidY3Q==",
+ "version": "0.0.1367902",
+ "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1367902.tgz",
+ "integrity": "sha512-XxtPuC3PGakY6PD7dG66/o8KwJ/LkH2/EKe19Dcw58w53dv4/vSQEkn/SzuyhHE2q4zPgCkxQBxus3VV4ql+Pg==",
"dev": true
},
"node_modules/pure-rand": {
@@ -18840,24 +19127,6 @@
"react-dom": ">=16.6.0"
}
},
- "node_modules/read-cache": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
- "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==",
- "dev": true,
- "dependencies": {
- "pify": "^2.3.0"
- }
- },
- "node_modules/read-cache/node_modules/pify": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
- "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==",
- "dev": true,
- "engines": {
- "node": ">=0.10.0"
- }
- },
"node_modules/read-pkg": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz",
@@ -19303,75 +19572,53 @@
"node": ">=10.0.0"
}
},
- "node_modules/rtlcss": {
- "version": "3.5.0",
- "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-3.5.0.tgz",
- "integrity": "sha512-wzgMaMFHQTnyi9YOwsx9LjOxYXJPzS8sYnFaKm6R5ysvTkwzHiB0vxnbHwchHQT65PTdBjDG21/kQBWI7q9O7A==",
- "dev": true,
- "dependencies": {
- "find-up": "^5.0.0",
- "picocolors": "^1.0.0",
- "postcss": "^8.3.11",
- "strip-json-comments": "^3.1.1"
- },
- "bin": {
- "rtlcss": "bin/rtlcss.js"
- }
- },
- "node_modules/rtlcss-webpack-plugin": {
- "version": "4.0.7",
- "resolved": "https://registry.npmjs.org/rtlcss-webpack-plugin/-/rtlcss-webpack-plugin-4.0.7.tgz",
- "integrity": "sha512-ouSbJtgcLBBQIsMgarxsDnfgRqm/AS4BKls/mz/Xb6HSl+PdEzefTR+Wz5uWQx4odoX0g261Z7yb3QBz0MTm0g==",
- "dev": true,
+ "node_modules/rrdom": {
+ "version": "2.0.0-alpha.18",
+ "resolved": "https://registry.npmjs.org/rrdom/-/rrdom-2.0.0-alpha.18.tgz",
+ "integrity": "sha512-fSFzFFxbqAViITyYVA4Z0o5G6p1nEqEr/N8vdgSKie9Rn0FJxDSNJgjV0yiCIzcDs0QR+hpvgFhpbdZ6JIr5Nw==",
"dependencies": {
- "babel-runtime": "~6.25.0",
- "rtlcss": "^3.5.0"
+ "rrweb-snapshot": "^2.0.0-alpha.18"
}
},
- "node_modules/rtlcss/node_modules/find-up": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz",
- "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==",
- "dev": true,
+ "node_modules/rrweb": {
+ "version": "2.0.0-alpha.13",
+ "resolved": "https://registry.npmjs.org/rrweb/-/rrweb-2.0.0-alpha.13.tgz",
+ "integrity": "sha512-a8GXOCnzWHNaVZPa7hsrLZtNZ3CGjiL+YrkpLo0TfmxGLhjNZbWY2r7pE06p+FcjFNlgUVTmFrSJbK3kO7yxvw==",
"dependencies": {
- "locate-path": "^6.0.0",
- "path-exists": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "@rrweb/types": "^2.0.0-alpha.13",
+ "@types/css-font-loading-module": "0.0.7",
+ "@xstate/fsm": "^1.4.0",
+ "base64-arraybuffer": "^1.0.1",
+ "fflate": "^0.4.4",
+ "mitt": "^3.0.0",
+ "rrdom": "^2.0.0-alpha.13",
+ "rrweb-snapshot": "^2.0.0-alpha.13"
}
},
- "node_modules/rtlcss/node_modules/locate-path": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz",
- "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==",
- "dev": true,
+ "node_modules/rrweb-snapshot": {
+ "version": "2.0.0-alpha.18",
+ "resolved": "https://registry.npmjs.org/rrweb-snapshot/-/rrweb-snapshot-2.0.0-alpha.18.tgz",
+ "integrity": "sha512-hBHZL/NfgQX6wO1D9mpwqFu1NJPpim+moIcKhFEjVTZVRUfCln+LOugRc4teVTCISYHN8Cw5e2iNTWCSm+SkoA==",
"dependencies": {
- "p-locate": "^5.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "postcss": "^8.4.38"
}
},
- "node_modules/rtlcss/node_modules/p-locate": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz",
- "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==",
+ "node_modules/rtlcss": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-4.3.0.tgz",
+ "integrity": "sha512-FI+pHEn7Wc4NqKXMXFM+VAYKEj/mRIcW4h24YVwVtyjI+EqGrLc2Hx/Ny0lrZ21cBWU2goLy36eqMcNj3AQJig==",
"dev": true,
"dependencies": {
- "p-limit": "^3.0.2"
+ "escalade": "^3.1.1",
+ "picocolors": "^1.0.0",
+ "postcss": "^8.4.21",
+ "strip-json-comments": "^3.1.1"
},
- "engines": {
- "node": ">=10"
+ "bin": {
+ "rtlcss": "bin/rtlcss.js"
},
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
+ "engines": {
+ "node": ">=12.0.0"
}
},
"node_modules/run-async": {
@@ -19519,9 +19766,9 @@
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
},
"node_modules/sass": {
- "version": "1.80.7",
- "resolved": "https://registry.npmjs.org/sass/-/sass-1.80.7.tgz",
- "integrity": "sha512-MVWvN0u5meytrSjsU7AWsbhoXi1sc58zADXFllfZzbsBT1GHjjar6JwBINYPRrkx/zqnQ6uqbQuHgE95O+C+eQ==",
+ "version": "1.83.0",
+ "resolved": "https://registry.npmjs.org/sass/-/sass-1.83.0.tgz",
+ "integrity": "sha512-qsSxlayzoOjdvXMVLkzF84DJFc2HZEL/rFyGIKbbilYtAvlCxyuzUeff9LawTn4btVnLKg75Z8MMr1lxU1lfGw==",
"dev": true,
"dependencies": {
"chokidar": "^4.0.0",
@@ -19539,30 +19786,29 @@
}
},
"node_modules/sass-loader": {
- "version": "12.6.0",
- "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.6.0.tgz",
- "integrity": "sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA==",
+ "version": "16.0.4",
+ "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-16.0.4.tgz",
+ "integrity": "sha512-LavLbgbBGUt3wCiYzhuLLu65+fWXaXLmq7YxivLhEqmiupCFZ5sKUAipK3do6V80YSU0jvSxNhEdT13IXNr3rg==",
"dev": true,
"dependencies": {
- "klona": "^2.0.4",
"neo-async": "^2.6.2"
},
"engines": {
- "node": ">= 12.13.0"
+ "node": ">= 18.12.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/webpack"
},
"peerDependencies": {
- "fibers": ">= 3.1.0",
- "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0",
+ "@rspack/core": "0.x || 1.x",
+ "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0",
"sass": "^1.3.0",
"sass-embedded": "*",
"webpack": "^5.0.0"
},
"peerDependenciesMeta": {
- "fibers": {
+ "@rspack/core": {
"optional": true
},
"node-sass": {
@@ -19573,6 +19819,9 @@
},
"sass-embedded": {
"optional": true
+ },
+ "webpack": {
+ "optional": true
}
}
},
@@ -19934,24 +20183,24 @@
}
},
"node_modules/shebang-command": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
- "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==",
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
+ "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
"dev": true,
"dependencies": {
- "shebang-regex": "^1.0.0"
+ "shebang-regex": "^3.0.0"
},
"engines": {
- "node": ">=0.10.0"
+ "node": ">=8"
}
},
"node_modules/shebang-regex": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
- "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==",
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
+ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
"dev": true,
"engines": {
- "node": ">=0.10.0"
+ "node": ">=8"
}
},
"node_modules/shell-quote": {
@@ -20347,12 +20596,12 @@
}
},
"node_modules/socks-proxy-agent": {
- "version": "8.0.4",
- "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.4.tgz",
- "integrity": "sha512-GNAq/eg8Udq2x0eNiFkr9gRg5bA7PXEWagQdeRX4cPSG+X/8V38v637gim9bjFptMk1QWsCTr0ttrJEiXbNnRw==",
+ "version": "8.0.5",
+ "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz",
+ "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==",
"dev": true,
"dependencies": {
- "agent-base": "^7.1.1",
+ "agent-base": "^7.1.2",
"debug": "^4.3.4",
"socks": "^2.8.3"
},
@@ -20361,13 +20610,10 @@
}
},
"node_modules/socks-proxy-agent/node_modules/agent-base": {
- "version": "7.1.1",
- "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz",
- "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==",
+ "version": "7.1.3",
+ "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz",
+ "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==",
"dev": true,
- "dependencies": {
- "debug": "^4.3.4"
- },
"engines": {
"node": ">= 14"
}
@@ -20429,9 +20675,9 @@
}
},
"node_modules/spawnd": {
- "version": "9.0.2",
- "resolved": "https://registry.npmjs.org/spawnd/-/spawnd-9.0.2.tgz",
- "integrity": "sha512-nl8DVHEDQ57IcKakzpjanspVChkMpGLuVwMR/eOn9cXE55Qr6luD2Kn06sA0ootRMdgrU4tInN6lA6ohTNvysw==",
+ "version": "10.1.4",
+ "resolved": "https://registry.npmjs.org/spawnd/-/spawnd-10.1.4.tgz",
+ "integrity": "sha512-drqHc0mKJmtMsiGMOCwzlc5eZ0RPtRvT7tQAluW2A0qUc0G7TQ8KLcn3E6K5qzkLkH2UkS3nYQiVGULvvsD9dw==",
"dev": true,
"dependencies": {
"signal-exit": "^4.1.0",
@@ -20595,9 +20841,9 @@
}
},
"node_modules/streamx": {
- "version": "2.20.1",
- "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.20.1.tgz",
- "integrity": "sha512-uTa0mU6WUC65iUvzKH4X9hEdvSW7rbPxPtwfWiLMSj3qTdQbAiUboZTxauKfpFuGIGa1C2BYijZ7wgdUXICJhA==",
+ "version": "2.21.1",
+ "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.21.1.tgz",
+ "integrity": "sha512-PhP9wUnFLa+91CPy3N6tiQsK+gnYyUNuk15S3YG/zjYE7RuPeCjJngqnzpC31ow0lzBHQ+QGO4cNJnd0djYUsw==",
"dev": true,
"dependencies": {
"fast-fifo": "^1.3.2",
@@ -20648,6 +20894,27 @@
"node": ">=8"
}
},
+ "node_modules/string-width-cjs": {
+ "name": "string-width",
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "dev": true,
+ "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",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "dev": true
+ },
"node_modules/string-width/node_modules/emoji-regex": {
"version": "8.0.0",
"resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
@@ -20765,6 +21032,19 @@
"node": ">=8"
}
},
+ "node_modules/strip-ansi-cjs": {
+ "name": "strip-ansi",
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "dev": true,
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
"node_modules/strip-bom": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz",
@@ -20869,9 +21149,9 @@
}
},
"node_modules/stylelint": {
- "version": "16.10.0",
- "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.10.0.tgz",
- "integrity": "sha512-z/8X2rZ52dt2c0stVwI9QL2AFJhLhbPkyfpDFcizs200V/g7v+UYY6SNcB9hKOLcDDX/yGLDsY/pX08sLkz9xQ==",
+ "version": "16.12.0",
+ "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.12.0.tgz",
+ "integrity": "sha512-F8zZ3L/rBpuoBZRvI4JVT20ZanPLXfQLzMOZg1tzPflRVh9mKpOZ8qcSIhh1my3FjAjZWG4T2POwGnmn6a6hbg==",
"dev": true,
"funding": [
{
@@ -20884,16 +21164,16 @@
}
],
"dependencies": {
- "@csstools/css-parser-algorithms": "^3.0.1",
- "@csstools/css-tokenizer": "^3.0.1",
- "@csstools/media-query-list-parser": "^3.0.1",
- "@csstools/selector-specificity": "^4.0.0",
+ "@csstools/css-parser-algorithms": "^3.0.4",
+ "@csstools/css-tokenizer": "^3.0.3",
+ "@csstools/media-query-list-parser": "^4.0.2",
+ "@csstools/selector-specificity": "^5.0.0",
"@dual-bundle/import-meta-resolve": "^4.1.0",
"balanced-match": "^2.0.0",
"colord": "^2.9.3",
"cosmiconfig": "^9.0.0",
"css-functions-list": "^3.2.3",
- "css-tree": "^3.0.0",
+ "css-tree": "^3.0.1",
"debug": "^4.3.7",
"fast-glob": "^3.3.2",
"fastest-levenshtein": "^1.0.16",
@@ -20905,22 +21185,22 @@
"ignore": "^6.0.2",
"imurmurhash": "^0.1.4",
"is-plain-object": "^5.0.0",
- "known-css-properties": "^0.34.0",
+ "known-css-properties": "^0.35.0",
"mathml-tag-names": "^2.1.3",
"meow": "^13.2.0",
"micromatch": "^4.0.8",
"normalize-path": "^3.0.0",
- "picocolors": "^1.0.1",
- "postcss": "^8.4.47",
+ "picocolors": "^1.1.1",
+ "postcss": "^8.4.49",
"postcss-resolve-nested-selector": "^0.1.6",
"postcss-safe-parser": "^7.0.1",
- "postcss-selector-parser": "^6.1.2",
+ "postcss-selector-parser": "^7.0.0",
"postcss-value-parser": "^4.2.0",
"resolve-from": "^5.0.0",
"string-width": "^4.2.3",
"supports-hyperlinks": "^3.1.0",
"svg-tags": "^1.0.0",
- "table": "^6.8.2",
+ "table": "^6.9.0",
"write-file-atomic": "^5.0.1"
},
"bin": {
@@ -20976,9 +21256,9 @@
}
},
"node_modules/stylelint-scss": {
- "version": "6.9.0",
- "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-6.9.0.tgz",
- "integrity": "sha512-oWOR+g6ccagfrENecImGmorWWjVyWpt2R8bmkhOW8FkNNPGStZPQMqb8QWMW4Lwu9TyPqmyjHkkAsy3weqsnNw==",
+ "version": "6.10.0",
+ "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-6.10.0.tgz",
+ "integrity": "sha512-y03if6Qw9xBMoVaf7tzp5BbnYhYvudIKzURkhSHzcHG0bW0fAYvQpTUVJOe7DyhHaxeThBil4ObEMvGbV7+M+w==",
"dev": true,
"dependencies": {
"css-tree": "^3.0.1",
@@ -20987,7 +21267,7 @@
"mdn-data": "^2.12.2",
"postcss-media-query-parser": "^0.2.3",
"postcss-resolve-nested-selector": "^0.1.6",
- "postcss-selector-parser": "^6.1.2",
+ "postcss-selector-parser": "^7.0.0",
"postcss-value-parser": "^4.2.0"
},
"engines": {
@@ -20997,17 +21277,63 @@
"stylelint": "^16.0.2"
}
},
- "node_modules/stylelint-scss/node_modules/known-css-properties": {
- "version": "0.35.0",
- "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.35.0.tgz",
- "integrity": "sha512-a/RAk2BfKk+WFGhhOCAYqSiFLc34k8Mt/6NWRI4joER0EYUzXIcFivjjnoD3+XU1DggLn/tZc3DOAgke7l8a4A==",
- "dev": true
+ "node_modules/stylelint-scss/node_modules/postcss-selector-parser": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz",
+ "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==",
+ "dev": true,
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
},
- "node_modules/stylelint-scss/node_modules/mdn-data": {
- "version": "2.12.2",
- "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz",
- "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==",
- "dev": true
+ "node_modules/stylelint/node_modules/@csstools/media-query-list-parser": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.2.tgz",
+ "integrity": "sha512-EUos465uvVvMJehckATTlNqGj4UJWkTmdWuDMjqvSUkjGpmOyFZBVwb4knxCm/k2GMTXY+c/5RkdndzFYWeX5A==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "@csstools/css-parser-algorithms": "^3.0.4",
+ "@csstools/css-tokenizer": "^3.0.3"
+ }
+ },
+ "node_modules/stylelint/node_modules/@csstools/selector-specificity": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz",
+ "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/csstools"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/csstools"
+ }
+ ],
+ "engines": {
+ "node": ">=18"
+ },
+ "peerDependencies": {
+ "postcss-selector-parser": "^7.0.0"
+ }
},
"node_modules/stylelint/node_modules/argparse": {
"version": "2.0.1",
@@ -21140,6 +21466,19 @@
"url": "https://github.com/sponsors/sindresorhus"
}
},
+ "node_modules/stylelint/node_modules/postcss-selector-parser": {
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz",
+ "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==",
+ "dev": true,
+ "dependencies": {
+ "cssesc": "^3.0.0",
+ "util-deprecate": "^1.0.2"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
"node_modules/stylelint/node_modules/signal-exit": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
@@ -21152,6 +21491,18 @@
"url": "https://github.com/sponsors/isaacs"
}
},
+ "node_modules/stylelint/node_modules/which": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
+ "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+ "dev": true,
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "which": "bin/which"
+ }
+ },
"node_modules/stylelint/node_modules/write-file-atomic": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz",
@@ -21308,9 +21659,9 @@
}
},
"node_modules/table": {
- "version": "6.8.2",
- "resolved": "https://registry.npmjs.org/table/-/table-6.8.2.tgz",
- "integrity": "sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==",
+ "version": "6.9.0",
+ "resolved": "https://registry.npmjs.org/table/-/table-6.9.0.tgz",
+ "integrity": "sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==",
"dev": true,
"dependencies": {
"ajv": "^8.0.1",
@@ -21577,10 +21928,13 @@
}
},
"node_modules/text-decoder": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.1.tgz",
- "integrity": "sha512-x9v3H/lTKIJKQQe7RPQkLfKAnc9lUTkWDypIQgTzPJAq+5/GCDHonmshfvlsNSj58yyshbIJJDLmU15qNERrXQ==",
- "dev": true
+ "version": "1.2.3",
+ "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.2.3.tgz",
+ "integrity": "sha512-3/o9z3X0X0fTupwsYvR03pJ/DjWuqqrfwBgTQzdWDiQSm9KitAyz/9WqsT2JQW7KV2m+bC2ol/zqpW37NHxLaA==",
+ "dev": true,
+ "dependencies": {
+ "b4a": "^1.6.4"
+ }
},
"node_modules/text-table": {
"version": "0.2.0",
@@ -21589,9 +21943,9 @@
"dev": true
},
"node_modules/third-party-web": {
- "version": "0.23.4",
- "resolved": "https://registry.npmjs.org/third-party-web/-/third-party-web-0.23.4.tgz",
- "integrity": "sha512-kwYnSZRhEvv0SBW2fp8SBBKRglMoBjV8xz6C31m0ewqOtknB5UL+Ihg+M81hyFY5ldkZuGWPb+e4GVDkzf/gYg==",
+ "version": "0.26.2",
+ "resolved": "https://registry.npmjs.org/third-party-web/-/third-party-web-0.26.2.tgz",
+ "integrity": "sha512-taJ0Us0lKoYBqcbccMuDElSUPOxmBfwlHe1OkHQ3KFf+RwovvBHdXhbFk9XJVQE2vHzxbTwvwg5GFsT9hbDokQ==",
"dev": true
},
"node_modules/through": {
@@ -21611,6 +21965,21 @@
"resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz",
"integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q=="
},
+ "node_modules/tldts-core": {
+ "version": "6.1.70",
+ "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.70.tgz",
+ "integrity": "sha512-RNnIXDB1FD4T9cpQRErEqw6ZpjLlGdMOitdV+0xtbsnwr4YFka1zpc7D4KD+aAn8oSG5JyFrdasZTE04qDE9Yg==",
+ "dev": true
+ },
+ "node_modules/tldts-icann": {
+ "version": "6.1.70",
+ "resolved": "https://registry.npmjs.org/tldts-icann/-/tldts-icann-6.1.70.tgz",
+ "integrity": "sha512-sGnxNnxb/03iSROBEBiXGX49DMEktxWVUoTeHWekJOOrFfNRWfyAcOWphuRDau2jZrshvMhQPf3azYHyxV04/w==",
+ "dev": true,
+ "dependencies": {
+ "tldts-core": "^6.1.70"
+ }
+ },
"node_modules/tmp": {
"version": "0.0.33",
"resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz",
@@ -22071,15 +22440,6 @@
"node": ">=8"
}
},
- "node_modules/universalify": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz",
- "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==",
- "dev": true,
- "engines": {
- "node": ">= 10.0.0"
- }
- },
"node_modules/unpipe": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
@@ -22199,12 +22559,6 @@
"requires-port": "^1.0.0"
}
},
- "node_modules/urlpattern-polyfill": {
- "version": "10.0.0",
- "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.0.0.tgz",
- "integrity": "sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==",
- "dev": true
- },
"node_modules/use-callback-ref": {
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.2.tgz",
@@ -22225,6 +22579,17 @@
}
}
},
+ "node_modules/use-debounce": {
+ "version": "10.0.4",
+ "resolved": "https://registry.npmjs.org/use-debounce/-/use-debounce-10.0.4.tgz",
+ "integrity": "sha512-6Cf7Yr7Wk7Kdv77nnJMf6de4HuDE4dTxKij+RqE9rufDsI6zsbjyAxcH5y2ueJCQAnfgKbzXbZHYlkFwmBlWkw==",
+ "engines": {
+ "node": ">= 16.0.0"
+ },
+ "peerDependencies": {
+ "react": "*"
+ }
+ },
"node_modules/use-memo-one": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/use-memo-one/-/use-memo-one-1.1.3.tgz",
@@ -22353,13 +22718,13 @@
}
},
"node_modules/wait-on": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-7.2.0.tgz",
- "integrity": "sha512-wCQcHkRazgjG5XoAq9jbTMLpNIjoSlZslrJ2+N9MxDsGEv1HnFoVjOCexL0ESva7Y9cu350j+DWADdk54s4AFQ==",
+ "version": "8.0.1",
+ "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-8.0.1.tgz",
+ "integrity": "sha512-1wWQOyR2LVVtaqrcIL2+OM+x7bkpmzVROa0Nf6FryXkS+er5Sa1kzFGjzZRqLnHa3n1rACFLeTwUqE1ETL9Mig==",
"dev": true,
"dependencies": {
- "axios": "^1.6.1",
- "joi": "^17.11.0",
+ "axios": "^1.7.7",
+ "joi": "^17.13.3",
"lodash": "^4.17.21",
"minimist": "^1.2.8",
"rxjs": "^7.8.1"
@@ -22436,16 +22801,16 @@
}
},
"node_modules/webpack": {
- "version": "5.96.1",
- "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.96.1.tgz",
- "integrity": "sha512-l2LlBSvVZGhL4ZrPwyr8+37AunkcYj5qh8o6u2/2rzoPc8gxFJkLj1WxNgooi9pnoc06jh0BjuXnamM4qlujZA==",
+ "version": "5.97.1",
+ "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.97.1.tgz",
+ "integrity": "sha512-EksG6gFY3L1eFMROS/7Wzgrii5mBAFe4rIr3r2BTfo7bcc+DWwFZ4OJ/miOuHJO/A85HwyI4eQ0F6IKXesO7Fg==",
"dev": true,
"dependencies": {
"@types/eslint-scope": "^3.7.7",
"@types/estree": "^1.0.6",
- "@webassemblyjs/ast": "^1.12.1",
- "@webassemblyjs/wasm-edit": "^1.12.1",
- "@webassemblyjs/wasm-parser": "^1.12.1",
+ "@webassemblyjs/ast": "^1.14.1",
+ "@webassemblyjs/wasm-edit": "^1.14.1",
+ "@webassemblyjs/wasm-parser": "^1.14.1",
"acorn": "^8.14.0",
"browserslist": "^4.24.0",
"chrome-trace-event": "^1.0.2",
@@ -22591,56 +22956,6 @@
"node": ">=14"
}
},
- "node_modules/webpack-cli/node_modules/cross-spawn": {
- "version": "7.0.5",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.5.tgz",
- "integrity": "sha512-ZVJrKKYunU38/76t0RMOulHOnUcbU9GbpWKAOZ0mhjr7CX6FVrH+4FrAapSOekrgFQ3f/8gwMEuIft0aKq6Hug==",
- "dev": true,
- "dependencies": {
- "path-key": "^3.1.0",
- "shebang-command": "^2.0.0",
- "which": "^2.0.1"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/webpack-cli/node_modules/shebang-command": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
- "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
- "dev": true,
- "dependencies": {
- "shebang-regex": "^3.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/webpack-cli/node_modules/shebang-regex": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
- "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
- "dev": true,
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/webpack-cli/node_modules/which": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
- "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
- "dev": true,
- "dependencies": {
- "isexe": "^2.0.0"
- },
- "bin": {
- "node-which": "bin/node-which"
- },
- "engines": {
- "node": ">= 8"
- }
- },
"node_modules/webpack-dev-middleware": {
"version": "5.3.4",
"resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz",
@@ -22917,15 +23232,18 @@
}
},
"node_modules/which": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
- "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
+ "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
"dev": true,
"dependencies": {
"isexe": "^2.0.0"
},
"bin": {
- "which": "bin/which"
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
}
},
"node_modules/which-boxed-primitive": {
@@ -23050,6 +23368,24 @@
"url": "https://github.com/chalk/wrap-ansi?sponsor=1"
}
},
+ "node_modules/wrap-ansi-cjs": {
+ "name": "wrap-ansi",
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "dev": true,
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
"node_modules/wrappy": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
diff --git a/package.json b/package.json
index 924ed2b2..e90a55fc 100644
--- a/package.json
+++ b/package.json
@@ -50,7 +50,9 @@
"clipboard-copy": "^4.0.1",
"html-react-parser": "^5.2.2",
"husky": "^9.1.6",
+ "mixpanel-browser": "^2.58.0",
"prop-types": "^15.8.1",
- "react-colorful": "^5.6.1"
+ "react-colorful": "^5.6.1",
+ "use-debounce": "^10.0.4"
}
}
diff --git a/webpack.config.js b/webpack.config.js
index 415bf6cf..934cbead 100644
--- a/webpack.config.js
+++ b/webpack.config.js
@@ -35,6 +35,10 @@ module.exports = {
__dirname,
'modules/settings/assets/js/pages/',
),
+ '@ea11y/services': path.resolve(
+ __dirname,
+ 'modules/settings/assets/js/services',
+ ),
},
extensions: ['.js', '.jsx'],
},
From 6a08e4e3017ede65b2c82a4ffe08b4daf5930a04 Mon Sep 17 00:00:00 2001
From: VasylD
Date: Thu, 16 Jan 2025 16:23:44 +0200
Subject: [PATCH 028/290] [APP-830] Add user to init Mixpanel (#136)
* [APP-830] Add mixpanel events
* Merge branch 'develop' into feature/APP-830-add-mixpanel
# Conflicts:
# .gitignore
# modules/settings/assets/js/components/sidebar-menu/index.js
# modules/settings/assets/js/pages/accessibility-statement.js
* Merge branch 'develop' into feature/APP-830-add-mixpanel
# Conflicts:
# .gitignore
# modules/settings/assets/js/components/sidebar-menu/index.js
# modules/settings/assets/js/pages/accessibility-statement.js
* Merge branch 'develop' into feature/APP-830-add-mixpanel
# Conflicts:
# .gitignore
# modules/settings/assets/js/components/sidebar-menu/index.js
# modules/settings/assets/js/pages/accessibility-statement.js
* Merge branch 'develop' into feature/APP-830-add-mixpanel
# Conflicts:
# .gitignore
# modules/settings/assets/js/components/sidebar-menu/index.js
# modules/settings/assets/js/pages/accessibility-statement.js
* Merge branch 'develop' into feature/APP-830-add-mixpanel
# Conflicts:
# .gitignore
# modules/settings/assets/js/components/sidebar-menu/index.js
# modules/settings/assets/js/pages/accessibility-statement.js
* Merge branch 'develop' into feature/APP-830-add-mixpanel
# Conflicts:
# .gitignore
# modules/settings/assets/js/components/sidebar-menu/index.js
# modules/settings/assets/js/pages/accessibility-statement.js
* [APP-830] Add user to init Mixpanel
* [APP-830] Add user to init Mixpanel
* [APP-830] Add user to init Mixpanel
---
modules/settings/assets/js/app.js | 7 +--
.../assets/js/services/mixpanel-service.js | 48 ++++++++++---------
modules/settings/module.php | 7 ++-
3 files changed, 32 insertions(+), 30 deletions(-)
diff --git a/modules/settings/assets/js/app.js b/modules/settings/assets/js/app.js
index 7104567a..51bfd15c 100644
--- a/modules/settings/assets/js/app.js
+++ b/modules/settings/assets/js/app.js
@@ -28,9 +28,10 @@ const App = () => {
const { selectedMenu } = useSettings();
useEffect(() => {
- mixpanelService.init();
- mixpanelService.sendEvent('Page View', {
- page: 'Button',
+ mixpanelService.init().then(() => {
+ mixpanelService.sendEvent('Page View', {
+ page: 'Button',
+ });
});
}, []);
diff --git a/modules/settings/assets/js/services/mixpanel-service.js b/modules/settings/assets/js/services/mixpanel-service.js
index 5652eeb0..dc28bb6b 100644
--- a/modules/settings/assets/js/services/mixpanel-service.js
+++ b/modules/settings/assets/js/services/mixpanel-service.js
@@ -1,41 +1,43 @@
import mixpanel from 'mixpanel-browser';
-export const SHARE_USAGE_DATA = 'share_usage_data';
+const SHARE_USAGE_DATA = 'share_usage_data';
+const MIXPANEL_TOKEN = '150605b3b9f979922f2ac5a52e2dcfe9';
-const init = () => {
+const init = async () => {
const { ea11ySettingsData } = window;
+ const plan = ea11ySettingsData?.planData?.plan;
- if (
- !ea11ySettingsData.mixpanelToken ||
- !ea11ySettingsData?.planData?.scopes?.includes(SHARE_USAGE_DATA)
- ) {
+ if (!ea11ySettingsData?.planData?.scopes?.includes(SHARE_USAGE_DATA)) {
return;
}
- mixpanel.init(ea11ySettingsData.mixpanelToken, {
- debug: false,
+ await mixpanel.init(MIXPANEL_TOKEN, {
+ debug: ea11ySettingsData.pluginEnv === 'dev',
track_pageview: false,
persistence: 'localStorage',
});
+
+ mixpanel.register({
+ productName: 'app_access',
+ environment: ea11ySettingsData.pluginEnv,
+ });
+
+ mixpanel.identify(ea11ySettingsData?.clientId);
+
+ const userData = {
+ $email: ea11ySettingsData?.planData?.user?.email,
+ $user_id: ea11ySettingsData?.clientId,
+ $subscription_type: plan?.name,
+ $subscription_id: plan?.subscription_id,
+ $subscription_status: plan?.status,
+ };
+
+ mixpanel.people?.set_once(userData);
};
const sendEvent = (name, event) => {
- const { ea11ySettingsData } = window;
- const plan = ea11ySettingsData?.planData?.plan;
if (mixpanel.__loaded) {
- mixpanel.track(name, {
- ...event,
- productName: 'app_access',
- subscription: {
- subscriptionId: plan?.subscription_id,
- name: plan?.name,
- status: plan?.status,
- },
- userData: {
- id: ea11ySettingsData?.clientId,
- email: ea11ySettingsData?.planData?.user?.email,
- },
- });
+ mixpanel.track(name, event);
}
};
diff --git a/modules/settings/module.php b/modules/settings/module.php
index 3c849782..17c27a87 100644
--- a/modules/settings/module.php
+++ b/modules/settings/module.php
@@ -22,7 +22,6 @@ class Module extends Module_Base {
const SETTING_BASE_SLUG = 'accessibility-settings'; //TODO: Change this later
const SETTING_CAPABILITY = 'manage_options';
const SETTING_PAGE_SLUG = 'toplevel_page_' . self::SETTING_BASE_SLUG;
- const MIXPANEL_TOKEN = '150605b3b9f979922f2ac5a52e2dcfe9';
public function get_name(): string {
return 'settings';
@@ -89,7 +88,7 @@ public function enqueue_scripts( $hook ) : void {
'wpRestNonce' => wp_create_nonce( 'wp_rest' ),
'planData' => Settings::get( Settings::PLAN_DATA ),
'clientId' => Data::get_client_id(),
- 'mixpanelToken' => self::get_mixpanel_token(),
+ 'pluginEnv' => self::get_plugin_env(),
]
);
}
@@ -98,8 +97,8 @@ public function enqueue_scripts( $hook ) : void {
* Get Mixpanel project Token
* @return string
*/
- private static function get_mixpanel_token() : string {
- return apply_filters( 'ea11y_mixpanel_token', self::MIXPANEL_TOKEN );
+ private static function get_plugin_env() : string {
+ return apply_filters( 'ea11y_plugin_env', 'production' );
}
public static function routes_list() : array {
From 2d3584684c162238fbed217d4cb08157a4952ec0 Mon Sep 17 00:00:00 2001
From: VasylD
Date: Thu, 16 Jan 2025 20:43:09 +0200
Subject: [PATCH 029/290] [APP-830] rename events (#137)
---
modules/settings/assets/js/app.js | 2 +-
.../settings/assets/js/components/admin-top-bar/index.js | 2 +-
.../assets/js/components/alignment-matrix-control/index.js | 2 +-
modules/settings/assets/js/components/bottom-bar/index.js | 4 ++--
modules/settings/assets/js/components/color-picker/index.js | 2 +-
modules/settings/assets/js/components/icon-select/index.js | 2 +-
modules/settings/assets/js/components/icon-size/index.js | 2 +-
.../settings/assets/js/components/my-account-menu/index.js | 6 +++---
.../settings/assets/js/components/position-control/index.js | 6 +++---
.../assets/js/components/post-connect-modal/index.js | 2 +-
modules/settings/assets/js/components/sidebar-menu/index.js | 4 ++--
.../assets/js/components/statement-generator/index.js | 2 +-
.../settings/assets/js/layouts/position-settings-desktop.js | 4 ++--
.../settings/assets/js/layouts/position-settings-mobile.js | 4 ++--
modules/settings/assets/js/layouts/statement-link.js | 4 ++--
modules/settings/assets/js/pages/accessibility-statement.js | 4 ++--
modules/settings/assets/js/pages/icon-settings.js | 2 +-
modules/settings/assets/js/pages/menu.js | 2 +-
18 files changed, 28 insertions(+), 28 deletions(-)
diff --git a/modules/settings/assets/js/app.js b/modules/settings/assets/js/app.js
index 51bfd15c..c9cdeea9 100644
--- a/modules/settings/assets/js/app.js
+++ b/modules/settings/assets/js/app.js
@@ -29,7 +29,7 @@ const App = () => {
useEffect(() => {
mixpanelService.init().then(() => {
- mixpanelService.sendEvent('Page View', {
+ mixpanelService.sendEvent('page_view', {
page: 'Button',
});
});
diff --git a/modules/settings/assets/js/components/admin-top-bar/index.js b/modules/settings/assets/js/components/admin-top-bar/index.js
index 2bd451ab..36b59bfb 100644
--- a/modules/settings/assets/js/components/admin-top-bar/index.js
+++ b/modules/settings/assets/js/components/admin-top-bar/index.js
@@ -25,7 +25,7 @@ const AdminTopBar = () => {
sx={{ display: 'inline-flex', alignItems: 'center', gap: 1 }}
aria-label={__('Help', 'pojo-accessibility')}
onClick={() =>
- mixpanelService.sendEvent('Help button clicked', {
+ mixpanelService.sendEvent('help_button_clicked', {
source: 'Header',
})
}
diff --git a/modules/settings/assets/js/components/alignment-matrix-control/index.js b/modules/settings/assets/js/components/alignment-matrix-control/index.js
index 58669ef6..f65b6b80 100644
--- a/modules/settings/assets/js/components/alignment-matrix-control/index.js
+++ b/modules/settings/assets/js/components/alignment-matrix-control/index.js
@@ -16,7 +16,7 @@ const AlignmentMatrixControl = ({ mode }) => {
const handleChange = (event) => {
updateIconPosition(mode, 'position', event.target.value);
- mixpanelService.sendEvent('Position button clicked', {
+ mixpanelService.sendEvent('position_button_clicked', {
buttonData: {
mode,
value: event.target.value,
diff --git a/modules/settings/assets/js/components/bottom-bar/index.js b/modules/settings/assets/js/components/bottom-bar/index.js
index 174107ab..5aeee26e 100644
--- a/modules/settings/assets/js/components/bottom-bar/index.js
+++ b/modules/settings/assets/js/components/bottom-bar/index.js
@@ -24,7 +24,7 @@ const BottomBar = () => {
});
success('Settings saved!');
setHasChanges(false);
- mixpanelService.sendEvent('Save button clicked', {
+ mixpanelService.sendEvent('save_button_clicked', {
savedData: {
ea11y_widget_menu_settings: widgetMenuSettings,
},
@@ -47,7 +47,7 @@ const BottomBar = () => {
success('Settings saved!');
setHasChanges(false);
- mixpanelService.sendEvent('Save button clicked', {
+ mixpanelService.sendEvent('save_button_clicked', {
savedData: {
style: iconDesign,
position: iconPosition,
diff --git a/modules/settings/assets/js/components/color-picker/index.js b/modules/settings/assets/js/components/color-picker/index.js
index 2a141b12..bd5ca97f 100644
--- a/modules/settings/assets/js/components/color-picker/index.js
+++ b/modules/settings/assets/js/components/color-picker/index.js
@@ -13,7 +13,7 @@ import './style.css';
const ColorPicker = () => {
const { iconDesign, updateIconDesign } = useIconDesign();
const debounced = useDebouncedCallback((value) => {
- mixpanelService.sendEvent('Color Changed', {
+ mixpanelService.sendEvent('color_changed', {
color: value,
});
}, 1000);
diff --git a/modules/settings/assets/js/components/icon-select/index.js b/modules/settings/assets/js/components/icon-select/index.js
index 0379b5b1..7ae6dd28 100644
--- a/modules/settings/assets/js/components/icon-select/index.js
+++ b/modules/settings/assets/js/components/icon-select/index.js
@@ -37,7 +37,7 @@ const IconSelect = (props) => {
const selectIcon = (icon) => () => {
updateIconDesign({ icon });
- mixpanelService.sendEvent('Icon type selected', {
+ mixpanelService.sendEvent('icon_type_selected', {
iconType: icon,
});
};
diff --git a/modules/settings/assets/js/components/icon-size/index.js b/modules/settings/assets/js/components/icon-size/index.js
index 6ece59b4..1b57dcdc 100644
--- a/modules/settings/assets/js/components/icon-size/index.js
+++ b/modules/settings/assets/js/components/icon-size/index.js
@@ -42,7 +42,7 @@ const IconSize = (props) => {
const selectIconSize = (size) => () => {
updateIconDesign({ size });
- mixpanelService.sendEvent('Size type clicked', {
+ mixpanelService.sendEvent('size_type_clicked', {
size,
});
};
diff --git a/modules/settings/assets/js/components/my-account-menu/index.js b/modules/settings/assets/js/components/my-account-menu/index.js
index 74fde2e0..efc86bb9 100644
--- a/modules/settings/assets/js/components/my-account-menu/index.js
+++ b/modules/settings/assets/js/components/my-account-menu/index.js
@@ -47,7 +47,7 @@ const MyAccountMenu = () => {
await save({
ea11y_close_post_connect_modal: false,
});
- mixpanelService.sendEvent('Menu button click', {
+ mixpanelService.sendEvent('menu_button_clicked', {
buttonName: 'Switch account',
});
} catch (e) {
@@ -60,7 +60,7 @@ const MyAccountMenu = () => {
const redirectToBilling = () => {
window.open(BILLING_LINK, '_blank').focus();
- mixpanelService.sendEvent('Menu button click', {
+ mixpanelService.sendEvent('menu_button_clicked', {
buttonName: 'Billing',
});
};
@@ -69,7 +69,7 @@ const MyAccountMenu = () => {
<>
{
- mixpanelService.sendEvent('Menu button click', {
+ mixpanelService.sendEvent('menu_button_clicked', {
buttonName: 'My Account',
});
}}
diff --git a/modules/settings/assets/js/components/position-control/index.js b/modules/settings/assets/js/components/position-control/index.js
index 4243075e..f2dc8fb8 100644
--- a/modules/settings/assets/js/components/position-control/index.js
+++ b/modules/settings/assets/js/components/position-control/index.js
@@ -64,7 +64,7 @@ const PositionControl = ({ type, disabled, mode }) => {
units[index],
);
popupState.close();
- mixpanelService.sendEvent('Handle Unit Changed', {
+ mixpanelService.sendEvent('handle_unit_changed', {
positionData: {
mode,
type,
@@ -82,7 +82,7 @@ const PositionControl = ({ type, disabled, mode }) => {
event.target.value,
iconPosition[mode]?.exactPosition[type]?.unit,
);
- mixpanelService.sendEvent('Handle Value Changed', {
+ mixpanelService.sendEvent('handle_value_changed', {
positionData: {
mode,
type,
@@ -100,7 +100,7 @@ const PositionControl = ({ type, disabled, mode }) => {
iconPosition[mode]?.exactPosition[type]?.value,
iconPosition[mode]?.exactPosition[type]?.unit,
);
- mixpanelService.sendEvent('Handle Direction Changed', {
+ mixpanelService.sendEvent('handle_direction_changed', {
positionData: {
mode,
type,
diff --git a/modules/settings/assets/js/components/post-connect-modal/index.js b/modules/settings/assets/js/components/post-connect-modal/index.js
index 851d7865..17fd4a12 100644
--- a/modules/settings/assets/js/components/post-connect-modal/index.js
+++ b/modules/settings/assets/js/components/post-connect-modal/index.js
@@ -14,7 +14,7 @@ const PostConnectModal = () => {
useEffect(() => {
if (isOpen) {
- mixpanelService.sendEvent('Connect success');
+ mixpanelService.sendEvent('connect_success');
}
}, [isOpen]);
diff --git a/modules/settings/assets/js/components/sidebar-menu/index.js b/modules/settings/assets/js/components/sidebar-menu/index.js
index ea31a068..0ebec911 100644
--- a/modules/settings/assets/js/components/sidebar-menu/index.js
+++ b/modules/settings/assets/js/components/sidebar-menu/index.js
@@ -20,7 +20,7 @@ const SidebarMenu = () => {
setSelectedMenu({ parent: parentKey, child: null });
}
- mixpanelService.sendEvent('Menu button click', {
+ mixpanelService.sendEvent('menu_button_clicked', {
buttonName: itemName,
});
};
@@ -30,7 +30,7 @@ const SidebarMenu = () => {
...prev,
[itemKey]: !prev[itemKey], // Toggle the expanded state for the clicked item
}));
- mixpanelService.sendEvent('Menu button click', {
+ mixpanelService.sendEvent('menu_button_clicked', {
buttonName: itemName,
});
};
diff --git a/modules/settings/assets/js/components/statement-generator/index.js b/modules/settings/assets/js/components/statement-generator/index.js
index b2afe388..4575fb00 100644
--- a/modules/settings/assets/js/components/statement-generator/index.js
+++ b/modules/settings/assets/js/components/statement-generator/index.js
@@ -129,7 +129,7 @@ const StatementGenerator = ({ open, close }) => {
await close();
await success('Page created');
- mixpanelService.sendEvent('Statement page created');
+ mixpanelService.sendEvent('statement_page_created');
} catch (e) {
error('Error while creating page');
console.error(e);
diff --git a/modules/settings/assets/js/layouts/position-settings-desktop.js b/modules/settings/assets/js/layouts/position-settings-desktop.js
index dbddd04d..6d2381b5 100644
--- a/modules/settings/assets/js/layouts/position-settings-desktop.js
+++ b/modules/settings/assets/js/layouts/position-settings-desktop.js
@@ -12,7 +12,7 @@ const PositionSettingsDesktop = () => {
const toggleVisibility = (device) => {
updateIconPosition(device, 'hidden', !iconPosition[device].hidden);
- mixpanelService.sendEvent('Toggle clicked', {
+ mixpanelService.sendEvent('toggle_clicked', {
toggleData: {
state: !iconPosition[device].hidden,
type: 'Hide on desktop',
@@ -27,7 +27,7 @@ const PositionSettingsDesktop = () => {
'enableExactPosition',
!iconPosition[device].enableExactPosition,
);
- mixpanelService.sendEvent('Toggle clicked', {
+ mixpanelService.sendEvent('toggle_clicked', {
toggleData: {
state: !iconPosition[device].enableExactPosition,
type: 'Exact position',
diff --git a/modules/settings/assets/js/layouts/position-settings-mobile.js b/modules/settings/assets/js/layouts/position-settings-mobile.js
index f2aa52ec..27d48ce5 100644
--- a/modules/settings/assets/js/layouts/position-settings-mobile.js
+++ b/modules/settings/assets/js/layouts/position-settings-mobile.js
@@ -12,7 +12,7 @@ const PositionSettingsMobile = () => {
const toggleVisibility = (device) => {
updateIconPosition(device, 'hidden', !iconPosition[device].hidden);
- mixpanelService.sendEvent('Toggle clicked', {
+ mixpanelService.sendEvent('toggle_clicked', {
toggleData: {
state: !iconPosition[device].hidden,
type: 'Hide on mobile',
@@ -27,7 +27,7 @@ const PositionSettingsMobile = () => {
'enableExactPosition',
!iconPosition[device].enableExactPosition,
);
- mixpanelService.sendEvent('Toggle clicked', {
+ mixpanelService.sendEvent('toggle_clicked', {
toggleData: {
state: !iconPosition[device].enableExactPosition,
type: 'Exact position',
diff --git a/modules/settings/assets/js/layouts/statement-link.js b/modules/settings/assets/js/layouts/statement-link.js
index b28d301d..ebc4c953 100644
--- a/modules/settings/assets/js/layouts/statement-link.js
+++ b/modules/settings/assets/js/layouts/statement-link.js
@@ -73,7 +73,7 @@ const StatementLink = () => {
link: page[0]?.link,
});
- mixpanelService.sendEvent('Statement page selected', {
+ mixpanelService.sendEvent('statement_page_selected', {
page: page[0]?.link,
});
}
@@ -84,7 +84,7 @@ const StatementLink = () => {
...accessibilityStatementData,
hideLink: !accessibilityStatementData.hideLink,
});
- mixpanelService.sendEvent('Toggle clicked', {
+ mixpanelService.sendEvent('toggle_clicked', {
toggleData: {
state: !accessibilityStatementData.hideLink,
type: 'Hide link',
diff --git a/modules/settings/assets/js/pages/accessibility-statement.js b/modules/settings/assets/js/pages/accessibility-statement.js
index 7943e03b..26280d55 100644
--- a/modules/settings/assets/js/pages/accessibility-statement.js
+++ b/modules/settings/assets/js/pages/accessibility-statement.js
@@ -53,7 +53,7 @@ const AccessibilityStatement = () => {
const [showStatementLink, setShowStatementLink] = useState(false);
useEffect(() => {
- mixpanelService.sendEvent('Page View', {
+ mixpanelService.sendEvent('page_view', {
page: 'Accessibility statement',
});
}, []);
@@ -68,7 +68,7 @@ const AccessibilityStatement = () => {
const onStatementOptionClick = (option) => () => {
setStatementOption(option);
- mixpanelService.sendEvent('Statement flow selected', {
+ mixpanelService.sendEvent('statement_flow_selected', {
flowType: option,
});
};
diff --git a/modules/settings/assets/js/pages/icon-settings.js b/modules/settings/assets/js/pages/icon-settings.js
index d0fb32c8..9b3661c8 100644
--- a/modules/settings/assets/js/pages/icon-settings.js
+++ b/modules/settings/assets/js/pages/icon-settings.js
@@ -8,7 +8,7 @@ import { __ } from '@wordpress/i18n';
const IconSettings = () => {
useEffect(() => {
- mixpanelService.sendEvent('Page View', {
+ mixpanelService.sendEvent('page_view', {
page: 'Button',
});
}, []);
diff --git a/modules/settings/assets/js/pages/menu.js b/modules/settings/assets/js/pages/menu.js
index 06e37370..1f24332a 100644
--- a/modules/settings/assets/js/pages/menu.js
+++ b/modules/settings/assets/js/pages/menu.js
@@ -8,7 +8,7 @@ import { __ } from '@wordpress/i18n';
const Menu = () => {
useEffect(() => {
- mixpanelService.sendEvent('Page View', {
+ mixpanelService.sendEvent('page_view', {
page: 'Capabilities',
});
}, []);
From 0040584359ae6bf788b87ec87b31cefa13ed22c2 Mon Sep 17 00:00:00 2001
From: Raz Ohad
Date: Sun, 19 Jan 2025 12:59:51 +0200
Subject: [PATCH 030/290] Connect and Preview Fixes (#139)
* updated connect admin page
* Use unified widget URL instead of hardcoded Js to support envs
* Removed enqueue of fictional widget.js and reuse settings `admin` handle
---
modules/connect/classes/config.php | 2 +-
.../assets/js/components/widget-loader/index.js | 3 +--
modules/settings/classes/settings.php | 2 +-
modules/settings/module.php | 15 ++++++++++-----
modules/widget/module.php | 14 +++-----------
5 files changed, 16 insertions(+), 20 deletions(-)
diff --git a/modules/connect/classes/config.php b/modules/connect/classes/config.php
index 83fb6f54..b7d97225 100644
--- a/modules/connect/classes/config.php
+++ b/modules/connect/classes/config.php
@@ -14,7 +14,7 @@ class Config {
const APP_PREFIX = 'ea11y';
const APP_REST_NAMESPACE = 'ea11y';
const BASE_URL = 'https://my.elementor.com/connect';
- const ADMIN_PAGE = 'accessibility-settings-2';
+ const ADMIN_PAGE = 'accessibility-settings';
const APP_TYPE = 'app_access';
const SCOPES = 'openid offline_access share_usage_data';
const STATE_NONCE = 'ea11y_auth_nonce';
diff --git a/modules/settings/assets/js/components/widget-loader/index.js b/modules/settings/assets/js/components/widget-loader/index.js
index 1c9d3168..d5002332 100644
--- a/modules/settings/assets/js/components/widget-loader/index.js
+++ b/modules/settings/assets/js/components/widget-loader/index.js
@@ -1,6 +1,5 @@
import { useSettings } from '@ea11y/hooks';
import { useEffect } from '@wordpress/element';
-import { WIDGET_URL } from '../../constants/index';
const WidgetLoader = ({ src, onLoad, onError }) => {
const { planData } = useSettings();
@@ -25,7 +24,7 @@ const WidgetLoader = ({ src, onLoad, onError }) => {
if (src) {
script.src = src;
} else {
- script.src = `${WIDGET_URL}?api_key=${planData?.public_api_key}`;
+ script.src = `${window?.ea11ySettingsData?.widgetUrl}?api_key=${planData?.public_api_key}`;
}
script.async = true;
diff --git a/modules/settings/classes/settings.php b/modules/settings/classes/settings.php
index 42589bc9..535fc4c8 100644
--- a/modules/settings/classes/settings.php
+++ b/modules/settings/classes/settings.php
@@ -33,7 +33,7 @@ public static function get( string $option_name ) {
*
* @return bool
*/
- public static function set( string $option_name, $value ): bool {
+ public static function set( string $option_name, $value ) : bool {
return update_option( $option_name, $value, false );
}
}
diff --git a/modules/settings/module.php b/modules/settings/module.php
index 17c27a87..f792a89d 100644
--- a/modules/settings/module.php
+++ b/modules/settings/module.php
@@ -2,13 +2,17 @@
namespace EA11y\Modules\Settings;
-use EA11y\Classes\Module_Base;
-use EA11y\Classes\Utils;
+use EA11y\Classes\{
+ Module_Base,
+ Utils,
+ Logger
+};
+use EA11y\Modules\Connect\Classes\{
+ Config, Data
+};
use EA11y\Modules\Connect\Module as Connect;
-use EA11y\Modules\Connect\Classes\Config;
-use EA11y\Modules\Connect\Classes\Data;
-use EA11y\Classes\Logger;
use EA11y\Modules\Settings\Classes\Settings;
+use EA11y\Modules\Widget\Module as WidgetModule;
use Throwable;
use Exception;
@@ -89,6 +93,7 @@ public function enqueue_scripts( $hook ) : void {
'planData' => Settings::get( Settings::PLAN_DATA ),
'clientId' => Data::get_client_id(),
'pluginEnv' => self::get_plugin_env(),
+ 'widgetUrl' => WidgetModule::get_widget_url(),
]
);
}
diff --git a/modules/widget/module.php b/modules/widget/module.php
index 84c74f59..955230f0 100644
--- a/modules/widget/module.php
+++ b/modules/widget/module.php
@@ -38,7 +38,7 @@ public function enqueue_accessibility_widget () : void {
wp_enqueue_script(
'ea11y-widget',
- $this->get_widget_url() .'?api_key=' . $plan_data->public_api_key,
+ self::get_widget_url() .'?api_key=' . $plan_data->public_api_key,
[],
EA11Y_VERSION,
true
@@ -60,7 +60,7 @@ public function enqueue_accessibility_widget () : void {
* Get widget URL
* @return string
*/
- private function get_widget_url() : string {
+ public static function get_widget_url() : string {
return apply_filters( 'ea11y_widget_url', '' ); // TODO: add public url
}
@@ -117,16 +117,8 @@ public function enqueue_accessibility_widget_admin ( $hook ) : void {
return;
}
- wp_enqueue_script(
- 'ea11y-widget',
- EA11Y_ASSETS_URL . '/js/widget.js',
- [],
- EA11Y_VERSION,
- true
- );
-
wp_localize_script(
- 'ea11y-widget',
+ 'admin', // use admin settings script
'ea11yWidget',
[
'iconSettings' => $this->get_widget_icon_settings(),
From 82499ee78c0ab42f3cca2ebb28877e7cc146c2ec Mon Sep 17 00:00:00 2001
From: Pavlo Kniazevych <139438463+pkniazevych@users.noreply.github.com>
Date: Sun, 19 Jan 2025 13:11:09 +0200
Subject: [PATCH 031/290] Fix: Fix the QA bugs [n/a] (#138)
* New: Finish the BE integration [n/a]
* Fix: Fix some bugs [n/a]
---
assets/images/widget-icon-controls.svg | 1 -
assets/images/widget-icon-eye.svg | 1 -
assets/images/widget-icon-person.svg | 1 -
assets/images/widget-icon-text.svg | 1 -
modules/settings/assets/css/style.css | 4 +
.../js/components/admin-top-bar/index.js | 21 ++--
.../js/components/connect-modal/check-icon.js | 12 ++
.../js/components/connect-modal/index.js | 112 ++++++++++--------
.../assets/js/components/icon-size/index.js | 7 +-
.../js/components/my-account-menu/index.js | 39 +++++-
.../js/components/position-control/index.js | 16 ++-
.../js/components/post-connect-modal/index.js | 54 +++++----
.../js/components/sidebar-app-bar/index.js | 28 ++++-
.../js/components/sidebar-menu/index.js | 12 +-
.../assets/js/components/sidebar-menu/menu.js | 4 +-
.../js/components/widget-loader/index.js | 1 +
.../settings/assets/js/hooks/use-settings.js | 8 +-
.../assets/js/icons/connect-modal-icon.js | 22 ++--
.../assets/js/icons/elementor-logo.js | 37 +++---
.../js/icons/post-connect-modal-icon.js | 16 +--
modules/settings/assets/js/layouts/sidebar.js | 4 +-
.../settings/components/settings-pointer.php | 8 +-
modules/settings/module.php | 8 +-
modules/widget/module.php | 24 +---
24 files changed, 261 insertions(+), 180 deletions(-)
delete mode 100644 assets/images/widget-icon-controls.svg
delete mode 100644 assets/images/widget-icon-eye.svg
delete mode 100644 assets/images/widget-icon-person.svg
delete mode 100644 assets/images/widget-icon-text.svg
create mode 100644 modules/settings/assets/js/components/connect-modal/check-icon.js
diff --git a/assets/images/widget-icon-controls.svg b/assets/images/widget-icon-controls.svg
deleted file mode 100644
index 38fab3c1..00000000
--- a/assets/images/widget-icon-controls.svg
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/assets/images/widget-icon-eye.svg b/assets/images/widget-icon-eye.svg
deleted file mode 100644
index ebf058d4..00000000
--- a/assets/images/widget-icon-eye.svg
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/assets/images/widget-icon-person.svg b/assets/images/widget-icon-person.svg
deleted file mode 100644
index 4aac00c2..00000000
--- a/assets/images/widget-icon-person.svg
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/assets/images/widget-icon-text.svg b/assets/images/widget-icon-text.svg
deleted file mode 100644
index c5e1e18b..00000000
--- a/assets/images/widget-icon-text.svg
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/modules/settings/assets/css/style.css b/modules/settings/assets/css/style.css
index 98716854..5a87d0e1 100644
--- a/modules/settings/assets/css/style.css
+++ b/modules/settings/assets/css/style.css
@@ -1,3 +1,7 @@
+#wpbody-content {
+ padding-bottom: 0;
+}
+
body {
background: #fff;
}
diff --git a/modules/settings/assets/js/components/admin-top-bar/index.js b/modules/settings/assets/js/components/admin-top-bar/index.js
index 36b59bfb..6d208100 100644
--- a/modules/settings/assets/js/components/admin-top-bar/index.js
+++ b/modules/settings/assets/js/components/admin-top-bar/index.js
@@ -2,21 +2,24 @@ import HelpIcon from '@elementor/icons/HelpIcon';
import AppBar from '@elementor/ui/AppBar';
import Link from '@elementor/ui/Link';
import Toolbar from '@elementor/ui/Toolbar';
+import { styled } from '@elementor/ui/styles';
import { mixpanelService } from '@ea11y/services';
import { __ } from '@wordpress/i18n';
import { HELP_LINK } from '../../constants';
+const StyledToolbar = styled(Toolbar)`
+ justify-content: end;
+ align-items: center;
+ flex-direction: row;
+ background-color: ${({ theme }) => theme.palette.background.default};
+ gap: 10px;
+ border-bottom: 1px solid ${({ theme }) => theme.palette.divider};
+`;
+
const AdminTopBar = () => {
- const toolBarStyle = {
- justifyContent: 'end',
- alignItems: 'center',
- backgroundColor: 'background.default',
- gap: '10px',
- borderBottom: '1px solid rgba(0, 0, 0, 0.12)',
- };
return (
-
+
{
>
-
+
);
};
diff --git a/modules/settings/assets/js/components/connect-modal/check-icon.js b/modules/settings/assets/js/components/connect-modal/check-icon.js
new file mode 100644
index 00000000..e261224d
--- /dev/null
+++ b/modules/settings/assets/js/components/connect-modal/check-icon.js
@@ -0,0 +1,12 @@
+import { CircleCheckFilledIcon } from '@elementor/icons';
+import ListItemIcon from '@elementor/ui/ListItemIcon';
+
+const ConnectModalCheckIcon = () => {
+ return (
+
+
+
+ );
+};
+
+export default ConnectModalCheckIcon;
diff --git a/modules/settings/assets/js/components/connect-modal/index.js b/modules/settings/assets/js/components/connect-modal/index.js
index 243db861..3e23ff32 100644
--- a/modules/settings/assets/js/components/connect-modal/index.js
+++ b/modules/settings/assets/js/components/connect-modal/index.js
@@ -4,46 +4,57 @@ import Button from '@elementor/ui/Button';
import Grid from '@elementor/ui/Grid';
import List from '@elementor/ui/List';
import ListItem from '@elementor/ui/ListItem';
-import ListItemIcon from '@elementor/ui/ListItemIcon';
import ListItemText from '@elementor/ui/ListItemText';
import Modal from '@elementor/ui/Modal';
import Typography from '@elementor/ui/Typography';
+import { styled } from '@elementor/ui/styles';
+import ConnectModalCheckIcon from '@ea11y/components/connect-modal/check-icon';
import { useAuth, useModal } from '@ea11y/hooks';
import { ConnectModalIcon } from '@ea11y/icons';
import { __ } from '@wordpress/i18n';
-function ConnectModal() {
+const StyledGrid = styled(Grid)`
+ display: flex;
+ flex-direction: column;
+ justify-content: center;
+ align-items: center;
+
+ position: absolute;
+ top: 50%;
+ left: 50%;
+ transform: translate(-50%, -50%);
+
+ width: 600px;
+ max-width: 95%;
+ height: 552px;
+ gap: 0;
+ background-color: ${({ theme }) => theme.palette.background.paper};
+ padding: ${({ theme }) => theme.spacing(5)};
+ text-align: center;
+ border-radius: 4px;
+`;
+
+const StyledListItemText = styled(ListItemText)`
+ margin: 0;
+ padding: 0;
+
+ color: ${({ theme }) => theme.palette.text.secondary};
+`;
+
+const StyledListItem = styled(ListItem)`
+ margin: 8px;
+ padding: 0;
+`;
+
+const ConnectModal = () => {
const { isOpen } = useModal();
const { redirectToConnect } = useAuth();
- const ListItemStyle = { margin: '8px', padding: 0 };
- const ListItemTextStyle = { color: 'text.secondary', margin: 0, padding: 0 };
- const listIconColor = 'info.main';
-
return (
-
+
+
{__("Let's improve your site's accessibility", 'pojo-accessibility')}
+
{__(
- 'Make your site more inclusive with One Click Accessibility.',
+ 'Make your site more inclusive with Web accessibility.',
'pojo-accessibility',
)}
+
-
-
-
-
-
+
+
+
-
-
-
-
-
-
+
+
+
+
+
-
-
-
-
-
-
+
+
+
+
+
-
+
+
-
+
);
-}
+};
export default ConnectModal;
diff --git a/modules/settings/assets/js/components/icon-size/index.js b/modules/settings/assets/js/components/icon-size/index.js
index 1b57dcdc..a6532596 100644
--- a/modules/settings/assets/js/components/icon-size/index.js
+++ b/modules/settings/assets/js/components/icon-size/index.js
@@ -18,15 +18,16 @@ const StyledPaper = styled(Paper)`
gap: 12px;
align-items: center;
justify-content: center;
- padding: 16px
+ padding: 16px;
min-width: 10px;
width: 100px;
min-height: 100px;
border-radius: ${({ theme }) => theme.shape.borderRadius};
box-shadow: ${({ theme }) => theme.shadows[0]};
cursor: pointer;
+
:hover {
- box-shadow: 0px 0px 15px 0px rgba(37, 99, 235, 0.15);
+ box-shadow: 0 0 15px 0 rgba(37, 99, 235, 0.15);
border-color: ${({ theme }) => theme.palette.info.main};
}
`;
@@ -54,6 +55,7 @@ const IconSize = (props) => {
{__('Size', 'pojo-accessibility')}
+
{
width: 'auto',
},
})}
+
{
const { openSidebar, planData } = useSettings();
const { save } = useStorage();
const { error } = useToastNotification();
+
const accountMenuState = usePopupState({
variant: 'popover',
popupId: 'myAccountMenu',
@@ -34,9 +40,11 @@ const MyAccountMenu = () => {
if (email === undefined || email === null) {
return '';
}
+
if (email.length <= maxLength) {
return email;
}
+
return email.slice(0, maxLength - 3) + '...';
};
@@ -44,9 +52,11 @@ const MyAccountMenu = () => {
try {
await API.disconnect();
await API.redirectToConnect();
+
await save({
ea11y_close_post_connect_modal: false,
});
+
mixpanelService.sendEvent('menu_button_clicked', {
buttonName: 'Switch account',
});
@@ -54,12 +64,14 @@ const MyAccountMenu = () => {
error(
__('Failed to switch account. Please try again.', 'pojo-accessibility'),
);
+
console.error(e);
}
};
const redirectToBilling = () => {
window.open(BILLING_LINK, '_blank').focus();
+
mixpanelService.sendEvent('menu_button_clicked', {
buttonName: 'Billing',
});
@@ -76,20 +88,33 @@ const MyAccountMenu = () => {
>
-
+
+
+
-
+ {accountMenuState.isOpen ? (
+
+ ) : (
+
+ )}
+
{
+
{planData?.user?.email.length < 24 ? (
@@ -127,17 +153,22 @@ const MyAccountMenu = () => {
)}
+
+
{__('Switch account', 'pojo-accessibility')}
+
+
{__('Billing', 'pojo-accessibility')}
+
{
},
});
};
+
const handlePositionChange = (event) => {
updateExactPosition(
mode,
@@ -92,6 +96,7 @@ const PositionControl = ({ type, disabled, mode }) => {
},
});
};
+
const handlePositionDirection = (event) => {
updateExactPosition(
mode,
@@ -110,6 +115,7 @@ const PositionControl = ({ type, disabled, mode }) => {
},
});
};
+
return (
{
>
{units[unitsIndex]}
+
{units.map((unit, index) => (
{
),
}}
/>
+
theme.palette.background.paper};
+ padding: 20px;
+ text-align: center;
+ border-radius: 4px;
+`;
+
const PostConnectModal = () => {
const { isOpen, close } = useModal();
const { save } = useStorage();
@@ -22,40 +43,24 @@ const PostConnectModal = () => {
await save({
ea11y_close_post_connect_modal: true,
});
+
close();
};
return (
-
+
+
- {__("You're all set", 'site-mailer')}
+ {__("You're all set", 'pojo-accessibility')}
+
{
marginBottom={5}
>
{__(
- 'The One Click Accessibility widget is now active and ready to use on your site!',
- 'site-mailer',
+ 'Web accessibility is now connected and ready to use on your site.',
+ 'pojo-accessibility',
)}
+
{
>
{__('Done', 'pojo-accessibility')}
-
+
);
};
diff --git a/modules/settings/assets/js/components/sidebar-app-bar/index.js b/modules/settings/assets/js/components/sidebar-app-bar/index.js
index 2bda36c6..826873ed 100644
--- a/modules/settings/assets/js/components/sidebar-app-bar/index.js
+++ b/modules/settings/assets/js/components/sidebar-app-bar/index.js
@@ -3,29 +3,45 @@ import Box from '@elementor/ui/Box';
import IconButton from '@elementor/ui/IconButton';
import Toolbar from '@elementor/ui/Toolbar';
import Typography from '@elementor/ui/Typography';
+import { styled } from '@elementor/ui/styles';
import { useSettings } from '@ea11y/hooks';
import { ElementorLogo, SquareRoundedChevronsLeft } from '@ea11y/icons';
import { __ } from '@wordpress/i18n';
+const StyledHeading = styled(Box)`
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ padding: ${({ theme }) => theme.spacing(0.5)};
+ padding-top: 0;
+`;
+
const SidebarAppBar = () => {
const { openSidebar, setOpenSidebar } = useSettings();
return (
-
-
-
+
+
+
+
- {__('Web Accessibility', 'pojo-accessibility')}
+ {__('Web accessibility', 'pojo-accessibility')}
-
+
+
setOpenSidebar(!openSidebar)}
+ size="small"
>
{
};
return (
-
+
{Object.entries(MenuItems).map(([key, item]) => (
@@ -53,6 +53,7 @@ const SidebarMenu = () => {
}
>
{item.icon}
+
{item?.children && (
{
}}
>
)}
+
{item?.children && expandedItems[key] && openSidebar && (
{Object.entries(item?.children).map(([childKey, child]) => (
-
+
,
+ icon: ,
children: {
iconSettings: {
name: __('Button', 'pojo-accessibility'),
@@ -25,6 +25,6 @@ export const MenuItems = {
name: __('Accessibility statement', 'pojo-accessibility'),
key: 'accessibility-statement',
page: ,
- icon: ,
+ icon: ,
},
};
diff --git a/modules/settings/assets/js/components/widget-loader/index.js b/modules/settings/assets/js/components/widget-loader/index.js
index d5002332..c0ceb963 100644
--- a/modules/settings/assets/js/components/widget-loader/index.js
+++ b/modules/settings/assets/js/components/widget-loader/index.js
@@ -3,6 +3,7 @@ import { useEffect } from '@wordpress/element';
const WidgetLoader = ({ src, onLoad, onError }) => {
const { planData } = useSettings();
+
useEffect(() => {
const handleScriptLoad = () => {
console.log('External script loaded!');
diff --git a/modules/settings/assets/js/hooks/use-settings.js b/modules/settings/assets/js/hooks/use-settings.js
index 3c75f072..dd639d33 100644
--- a/modules/settings/assets/js/hooks/use-settings.js
+++ b/modules/settings/assets/js/hooks/use-settings.js
@@ -70,12 +70,12 @@ export const SettingsProvider = ({ children }) => {
enableExactPosition: false,
exactPosition: {
horizontal: {
- direction: 'to-left',
+ direction: 'left',
value: 10,
unit: 'px',
},
vertical: {
- direction: 'higher',
+ direction: 'top',
value: 10,
unit: 'px',
},
@@ -87,12 +87,12 @@ export const SettingsProvider = ({ children }) => {
enableExactPosition: false,
exactPosition: {
horizontal: {
- direction: 'to-right',
+ direction: 'right',
value: 10,
unit: 'px',
},
vertical: {
- direction: 'lower',
+ direction: 'bottom',
value: 10,
unit: 'px',
},
diff --git a/modules/settings/assets/js/icons/connect-modal-icon.js b/modules/settings/assets/js/icons/connect-modal-icon.js
index ef2054bf..e0951faf 100644
--- a/modules/settings/assets/js/icons/connect-modal-icon.js
+++ b/modules/settings/assets/js/icons/connect-modal-icon.js
@@ -12,29 +12,27 @@ const ConnectModalIcon = () => {
xmlns="http://www.w3.org/2000/svg"
xmlnsXlink="http://www.w3.org/1999/xlink"
>
-
diff --git a/modules/settings/assets/js/icons/elementor-logo.js b/modules/settings/assets/js/icons/elementor-logo.js
index 4afefe69..d245767e 100644
--- a/modules/settings/assets/js/icons/elementor-logo.js
+++ b/modules/settings/assets/js/icons/elementor-logo.js
@@ -1,22 +1,27 @@
import SvgIcon from '@elementor/ui/SvgIcon';
-const ElementorLogo = ({ size }) => {
+const ElementorLogo = () => {
return (
-
-
-
-
-
-
-
-
-
-
+
+
+
+
);
};
diff --git a/modules/settings/assets/js/icons/post-connect-modal-icon.js b/modules/settings/assets/js/icons/post-connect-modal-icon.js
index a8a12621..b3a503ee 100644
--- a/modules/settings/assets/js/icons/post-connect-modal-icon.js
+++ b/modules/settings/assets/js/icons/post-connect-modal-icon.js
@@ -16,25 +16,25 @@ const PostConnectModalIcon = () => {
x="0.5"
width="375"
height="166.071"
- fill="url(#pattern0_5222_19237)"
+ fill="url(#pattern0_5984_53896)"
/>
diff --git a/modules/settings/assets/js/layouts/sidebar.js b/modules/settings/assets/js/layouts/sidebar.js
index e53afb00..3aaea04c 100644
--- a/modules/settings/assets/js/layouts/sidebar.js
+++ b/modules/settings/assets/js/layouts/sidebar.js
@@ -20,7 +20,8 @@ const Sidebar = () => {
transition: 'all 0.3s',
height: '100%',
justifyContent: 'space-between',
- padding: 2,
+ padding: 1.5,
+ paddingTop: 0,
},
}}
>
@@ -28,6 +29,7 @@ const Sidebar = () => {
+
);
diff --git a/modules/settings/components/settings-pointer.php b/modules/settings/components/settings-pointer.php
index f2f3273d..fda85aab 100644
--- a/modules/settings/components/settings-pointer.php
+++ b/modules/settings/components/settings-pointer.php
@@ -25,7 +25,7 @@ public function admin_print_script() {
wp_enqueue_style( 'wp-pointer' );
wp_enqueue_script( 'wp-util' );
- $pointer_content = '' . esc_html__( 'One Click Accessibility', 'pojo-accessibility' ) . ' ';
+ $pointer_content = '' . esc_html__( 'Web accessibility', 'pojo-accessibility' ) . ' ';
$pointer_content .= '' . esc_html__( "Start setting up and customizing your site's accessibility widget.", 'pojo-accessibility' ) . '
';
$pointer_content .= sprintf(
@@ -54,8 +54,7 @@ public function admin_print_script() {
}
jQuery( document ).ready( function( $ ) {
- //TODO: Update page URL
- $( '#toplevel_page_accessibility-settings-2' ).pointer( {
+ $( '#toplevel_page_accessibility-settings' ).pointer( {
content: '',
pointerClass: 'ea11y-settings-pointer',
position: {
@@ -78,10 +77,9 @@ public function admin_print_script() {
}
false,
'exactPosition' => [
'horizontal' => [
- 'direction' => 'to-left',
+ 'direction' => 'left',
'value' => 10,
'unit' => 'px',
],
'vertical' => [
- 'direction' => 'higher',
+ 'direction' => 'top',
'value' => 10,
'unit' => 'px',
],
@@ -224,12 +224,12 @@ private function set_default_settings() : void {
'enableExactPosition' => false,
'exactPosition' => [
'horizontal' => [
- 'direction' => 'to-right',
+ 'direction' => 'right',
'value' => 10,
'unit' => 'px',
],
'vertical' => [
- 'direction' => 'lower',
+ 'direction' => 'bottom',
'value' => 10,
'unit' => 'px',
],
diff --git a/modules/widget/module.php b/modules/widget/module.php
index 955230f0..0bac945c 100644
--- a/modules/widget/module.php
+++ b/modules/widget/module.php
@@ -51,7 +51,6 @@ public function enqueue_accessibility_widget () : void {
'iconSettings' => get_option( 'ea11y_widget_icon_settings' ),
'toolsSettings' => get_option( 'ea11y_widget_menu_settings' ),
'accessibilityStatementURL' => $this->get_accessibility_statement_url(),
- 'widgetIconURL' => $this->get_widget_icon_url(),
]
);
}
@@ -64,35 +63,17 @@ public static function get_widget_url() : string {
return apply_filters( 'ea11y_widget_url', '' ); // TODO: add public url
}
- /**
- * Get widget icon URL
- * @return string
- */
- public function get_widget_icon_url() : string {
- $option = get_option( 'ea11y_widget_icon_settings' );
-
- if ( ! $option ) {
- return 'person';
- }
-
- $slug = 'person';
-
- if ( $option['style']['icon'] ) {
- $slug = $option['style']['icon'];
- }
-
- return EA11Y_ASSETS_URL . 'images/widget-icon-' . $slug . '.svg';
- }
-
/**
* Get accessibility statement URL
* @return string
*/
public function get_accessibility_statement_url() : string {
$option = get_option( 'ea11y_accessibility_statement_data' );
+
if ( ! empty( $option ) && ! $option['hideLink'] ) {
return $option['link'];
}
+
return '';
}
@@ -126,7 +107,6 @@ public function enqueue_accessibility_widget_admin ( $hook ) : void {
'preview' => true,
'previewContainer' => '#ea11y-widget-preview--container',
'apiKey' => $plan_data->public_api_key,
- 'widgetIconURL' => $this->get_widget_icon_url(),
'accessibilityStatementURL' => $this->get_accessibility_statement_url(),
]
);
From 95e39f4bfdd83cf3ff5701b8e7953b6d2f877f55 Mon Sep 17 00:00:00 2001
From: Raz Ohad
Date: Sun, 19 Jan 2025 18:20:32 +0200
Subject: [PATCH 032/290] upgrade flow UI and design tweaks [app-949] (#141)
* Updated Learn More links with UTM's
* Tweaked Pointer strings Icon and CTA
* dismissible notice strings
* sticky notice strings
* updated upgrade flow design for pointer, notices, introduction modal, and confirmation modal
* added build script
---
assets/images/logo.svg | 6 +
bin/build | 33 ++++
modules/legacy/components/upgrade.php | 149 ++++++++++++++++--
.../notices/dismissible-deprecated-nag.php | 6 +-
.../legacy/notices/sticky-deprecated-nag.php | 8 +-
.../js/components/connect-modal/index.js | 1 -
6 files changed, 180 insertions(+), 23 deletions(-)
create mode 100644 assets/images/logo.svg
create mode 100755 bin/build
diff --git a/assets/images/logo.svg b/assets/images/logo.svg
new file mode 100644
index 00000000..ed9d68d2
--- /dev/null
+++ b/assets/images/logo.svg
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/bin/build b/bin/build
new file mode 100755
index 00000000..1558c65e
--- /dev/null
+++ b/bin/build
@@ -0,0 +1,33 @@
+#!/bin/sh
+echo "Web Accessibility build script:"
+echo "basename: [$(basename "$0")]"
+echo "dirname : [$(dirname "$0")]"
+echo "pwd : [$(pwd)]"
+BUILD_FILE="pojo-accessibility.zip"
+
+#change working dir to the directory containing your package.json and composer.json
+cd "$(dirname "$0")"
+cd ..
+
+# Remove old build file
+echo "Removing old build file..."
+rm -f $BUILD_FILE
+
+# Run npm install
+echo "Running npm install..."
+npm install
+
+# Run npm build
+echo "Running npm install..."
+npm run build
+
+# Run composer install
+echo "Running composer install..."
+composer install --no-dev
+
+# Pack everything excluding dev stuff
+echo "Packing everything excluding .git folder into a zip file..."
+zip -r pojo-accessibility.zip . -x "*.bpg.json" -x "*.babelrc" -x "*ruleset.xml" -x "*webpack.config.js" -x "*phpunit.xml.dist" -x "*.git*" -x "*.DS_Store" -x "node_modules/*" -x "*.gitignore" -x "*.gitmodules" -x "*.editorconfig" -x "*.gitattributes" -x "*.eslintrc" -x "*.eslintignore" -x "*.phpcs.xml.dist" -x "*.phpunit.xml.d" -x "*coverage/*" -x "*assets/dev*" -x ".phpunit.result*" -x "bin*" -x "*tests/*" -x "package.json" -x "composer.json" -x "composer.lock" -x "package-lock.json"
+
+#
+echo "Done."
diff --git a/modules/legacy/components/upgrade.php b/modules/legacy/components/upgrade.php
index 73ed5f54..9a2c95bf 100644
--- a/modules/legacy/components/upgrade.php
+++ b/modules/legacy/components/upgrade.php
@@ -48,10 +48,17 @@ public static function is_legacy_page() : bool {
/**
* get_learn_more_link
+ *
+ * @param $campaign
+ *
* @return string
*/
- public static function get_learn_more_link() : string {
- return 'https://www.pojo.me/accessibility/';
+ public static function get_learn_more_link( $campaign ) : string {
+ return add_query_arg([
+ 'utm_source' => 'acc-switch',
+ 'utm_medium' => 'wp-dash',
+ 'utm_campaign' => $campaign,
+ ], 'https://go.elementor.com/acc-notice-switch-oc/' );
}
/**
@@ -73,7 +80,7 @@ public function add_deprecated_notice_to_customizer_section_description(): strin
$content = sprintf(
'%s
%s
%s
',
esc_html__( 'New! Switch to our updated accessibility widget for better features and control.', 'pojo-accessibility' ),
- self::get_learn_more_link(),
+ self::get_learn_more_link( 'acc-notice-switch-custom' ),
esc_html__( 'Learn More', 'pojo-accessibility' ),
self::get_switch_now_link(),
esc_html__( 'Switch Now', 'pojo-accessibility' )
@@ -116,8 +123,8 @@ public function maybe_add_introduction_modal() {
VIDEO
-
-
+
+
@@ -129,10 +136,10 @@ public function maybe_add_introduction_modal() {
-
+
@@ -177,26 +184,75 @@ public function maybe_add_introduction_modal() {
.video-wrapper {
position: relative;
padding-bottom: 56.25%;
- padding-top: 25px;
+ padding-top: 9px;
height: 0;
overflow: hidden;
}
.modal-content-wrap {
padding: 0 9px;
}
+ .intro-description{
+ padding: 0;margin-top: 8px;margin-bottom: 24px;
+ font-family: Roboto;
+ color: #69727D;
+ font-size: 16px;
+ font-style: normal;
+ font-weight: 400;
+ line-height: 150%; /* 24px */
+ letter-spacing: 0.15px;
+ }
+ .benefits{
+ padding-inline-start: 24px;
+ }
.benefits li{
- list-style-image: url('data:image/svg+xml;base64,Cjxzdmcgd2lkdGg9IjIwIiBoZWlnaHQ9IjIwIiB2aWV3Qm94PSIwIDAgMjAgMjAiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxnIGlkPSJDaXJjbGVDaGVja0ZpbGxlZCI+CjxwYXRoIGlkPSJWZWN0b3IiIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMTAgMS44NzVDOC45MzMwMSAxLjg3NSA3Ljg3NjQ3IDIuMDg1MTYgNi44OTA3IDIuNDkzNDhDNS45MDQ5MyAyLjkwMTggNS4wMDkyMyAzLjUwMDI4IDQuMjU0NzYgNC4yNTQ3NkMzLjUwMDI4IDUuMDA5MjMgMi45MDE4IDUuOTA0OTMgMi40OTM0OCA2Ljg5MDdDMi4wODUxNiA3Ljg3NjQ3IDEuODc1IDguOTMzMDEgMS44NzUgMTBDMS44NzUgMTEuMDY3IDIuMDg1MTYgMTIuMTIzNSAyLjQ5MzQ4IDEzLjEwOTNDMi45MDE4IDE0LjA5NTEgMy41MDAyOCAxNC45OTA4IDQuMjU0NzYgMTUuNzQ1MkM1LjAwOTIzIDE2LjQ5OTcgNS45MDQ5MyAxNy4wOTgyIDYuODkwNyAxNy41MDY1QzcuODc2NDcgMTcuOTE0OCA4LjkzMzAxIDE4LjEyNSAxMCAxOC4xMjVDMTEuMDY3IDE4LjEyNSAxMi4xMjM1IDE3LjkxNDggMTMuMTA5MyAxNy41MDY1QzE0LjA5NTEgMTcuMDk4MiAxNC45OTA4IDE2LjQ5OTcgMTUuNzQ1MiAxNS43NDUyQzE2LjQ5OTcgMTQuOTkwOCAxNy4wOTgyIDE0LjA5NTEgMTcuNTA2NSAxMy4xMDkzQzE3LjkxNDggMTIuMTIzNSAxOC4xMjUgMTEuMDY3IDE4LjEyNSAxMEMxOC4xMjUgOC45MzMwMSAxNy45MTQ4IDcuODc2NDcgMTcuNTA2NSA2Ljg5MDdDMTcuMDk4MiA1LjkwNDkzIDE2LjQ5OTcgNS4wMDkyMyAxNS43NDUyIDQuMjU0NzZDMTQuOTkwOCAzLjUwMDI4IDE0LjA5NTEgMi45MDE4IDEzLjEwOTMgMi40OTM0OEMxMi4xMjM1IDIuMDg1MTYgMTEuMDY3IDEuODc1IDEwIDEuODc1Wk0xMy41MzQ2IDguMzgwMjRDMTMuNzc4NyA4LjEzNjE2IDEzLjc3ODcgNy43NDA0MyAxMy41MzQ2IDcuNDk2MzVDMTMuMjkwNSA3LjI1MjI4IDEyLjg5NDggNy4yNTIyOCAxMi42NTA3IDcuNDk2MzVMOC45NjkyNSAxMS4xNzc4TDcuMzQ5NDkgOS41NTgwNUM3LjEwNTQyIDkuMzEzOTggNi43MDk2OSA5LjMxMzk4IDYuNDY1NjEgOS41NTgwNUM2LjIyMTUzIDkuODAyMTMgNi4yMjE1MyAxMC4xOTc5IDYuNDY1NjEgMTAuNDQxOUw4LjUyNzMxIDEyLjUwMzZDOC42NDQ1MiAxMi42MjA4IDguODAzNDkgMTIuNjg2NyA4Ljk2OTI1IDEyLjY4NjdDOS4xMzUwMSAxMi42ODY3IDkuMjkzOTggMTIuNjIwOCA5LjQxMTE5IDEyLjUwMzZMMTMuNTM0NiA4LjM4MDI0WiIgZmlsbD0iIzI1NjNFQiIvPgo8L2c+Cjwvc3ZnPgo=');/
+ list-style-image: url('data:image/svg+xml;base64,Cjxzdmcgd2lkdGg9IjIwIiBoZWlnaHQ9IjIwIiB2aWV3Qm94PSIwIDAgMjAgMjAiIGZpbGw9Im5vbmUiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+CjxnIGlkPSJDaXJjbGVDaGVja0ZpbGxlZCI+CjxwYXRoIGlkPSJWZWN0b3IiIGZpbGwtcnVsZT0iZXZlbm9kZCIgY2xpcC1ydWxlPSJldmVub2RkIiBkPSJNMTAgMS44NzVDOC45MzMwMSAxLjg3NSA3Ljg3NjQ3IDIuMDg1MTYgNi44OTA3IDIuNDkzNDhDNS45MDQ5MyAyLjkwMTggNS4wMDkyMyAzLjUwMDI4IDQuMjU0NzYgNC4yNTQ3NkMzLjUwMDI4IDUuMDA5MjMgMi45MDE4IDUuOTA0OTMgMi40OTM0OCA2Ljg5MDdDMi4wODUxNiA3Ljg3NjQ3IDEuODc1IDguOTMzMDEgMS44NzUgMTBDMS44NzUgMTEuMDY3IDIuMDg1MTYgMTIuMTIzNSAyLjQ5MzQ4IDEzLjEwOTNDMi45MDE4IDE0LjA5NTEgMy41MDAyOCAxNC45OTA4IDQuMjU0NzYgMTUuNzQ1MkM1LjAwOTIzIDE2LjQ5OTcgNS45MDQ5MyAxNy4wOTgyIDYuODkwNyAxNy41MDY1QzcuODc2NDcgMTcuOTE0OCA4LjkzMzAxIDE4LjEyNSAxMCAxOC4xMjVDMTEuMDY3IDE4LjEyNSAxMi4xMjM1IDE3LjkxNDggMTMuMTA5MyAxNy41MDY1QzE0LjA5NTEgMTcuMDk4MiAxNC45OTA4IDE2LjQ5OTcgMTUuNzQ1MiAxNS43NDUyQzE2LjQ5OTcgMTQuOTkwOCAxNy4wOTgyIDE0LjA5NTEgMTcuNTA2NSAxMy4xMDkzQzE3LjkxNDggMTIuMTIzNSAxOC4xMjUgMTEuMDY3IDE4LjEyNSAxMEMxOC4xMjUgOC45MzMwMSAxNy45MTQ4IDcuODc2NDcgMTcuNTA2NSA2Ljg5MDdDMTcuMDk4MiA1LjkwNDkzIDE2LjQ5OTcgNS4wMDkyMyAxNS43NDUyIDQuMjU0NzZDMTQuOTkwOCAzLjUwMDI4IDE0LjA5NTEgMi45MDE4IDEzLjEwOTMgMi40OTM0OEMxMi4xMjM1IDIuMDg1MTYgMTEuMDY3IDEuODc1IDEwIDEuODc1Wk0xMy41MzQ2IDguMzgwMjRDMTMuNzc4NyA4LjEzNjE2IDEzLjc3ODcgNy43NDA0MyAxMy41MzQ2IDcuNDk2MzVDMTMuMjkwNSA3LjI1MjI4IDEyLjg5NDggNy4yNTIyOCAxMi42NTA3IDcuNDk2MzVMOC45NjkyNSAxMS4xNzc4TDcuMzQ5NDkgOS41NTgwNUM3LjEwNTQyIDkuMzEzOTggNi43MDk2OSA5LjMxMzk4IDYuNDY1NjEgOS41NTgwNUM2LjIyMTUzIDkuODAyMTMgNi4yMjE1MyAxMC4xOTc5IDYuNDY1NjEgMTAuNDQxOUw4LjUyNzMxIDEyLjUwMzZDOC42NDQ1MiAxMi42MjA4IDguODAzNDkgMTIuNjg2NyA4Ljk2OTI1IDEyLjY4NjdDOS4xMzUwMSAxMi42ODY3IDkuMjkzOTggMTIuNjIwOCA5LjQxMTE5IDEyLjUwMzZMMTMuNTM0NiA4LjM4MDI0WiIgZmlsbD0iIzI1NjNFQiIvPgo8L2c+Cjwvc3ZnPgo=');
+ font-family: Roboto;
+ font-size: 16px;
+ font-style: normal;
+ font-weight: 400;
+ line-height: 150%; /* 24px */
+ letter-spacing: 0.15px;
+ color: #69727D;
}
li::marker{
font-size: 1.5em;
line-height: 0.1em;
}
+ .intor-learn-more{
+ margin-top: 16px;
+ font-family: Roboto;
+ font-size: 16px;
+ font-style: normal;
+ font-weight: 400;
+ line-height: 150%; /* 24px */
+ letter-spacing: 0.15px;
+ color: #2563EB;
+ }
.footer-actions {
display: flex;
gap: 20px;
justify-content: end;
padding: 24px;
}
+ .close-button {
+ font-family: Roboto;
+ font-size: 15px;
+ font-style: normal;
+ font-weight: 500;
+ line-height: 24px; /* 160% */
+ letter-spacing: 0.4px;
+ color: #515962;
+ }
+ .switch-now {
+ background: #2563EB;
+ border-radius: 4px;
+ font-family: Roboto;
+ font-size: 15px;
+ font-style: normal;
+ font-weight: 500;
+ line-height: 24px; /* 160% */
+ letter-spacing: 0.4px;
+ }
-
add icons here!!!
-
-
+
+
+
-
-
+
+
@@ -364,7 +392,7 @@ public function maybe_add_confirmation_modal() {
onLoad(
() => setTimeout( () => {
const modal = document.querySelector( `[data-modal-slug="${ modalID }"]` );
- tb_show( '', `/?TB_inline&inlineId=${ modalID }&height=320&width=552&modal=true` );
+ tb_show( '', `/?TB_inline&inlineId=${ modalID }&height=330&width=552&modal=true` );
const closeButton = modal.querySelector( 'a.close-button' );
const upgradeButton = modal.querySelector( 'a.upgrade-now' );
const close = () => {
@@ -398,42 +426,34 @@ public function maybe_add_confirmation_modal() {
' . esc_html__( 'Accessibility', 'pojo-accessibility' ) . '';
- $pointer_content .= '
' . esc_html__( "Our new, improved accessibility plugin is now available! Web Accessibility is packed with advanced styling options, improved feature controls, and so much more.", 'pojo-accessibility' ) . '
';
+ $pointer_content .= '
' . esc_html__( 'Our new, improved accessibility plugin is now available! Web Accessibility is packed with advanced styling options, improved feature controls, and so much more.', 'pojo-accessibility' ) . '
';
$pointer_content .= sprintf(
'
%s
',
From 1d067ca90db518a40f7d68f9b31b89fedbdbbb28 Mon Sep 17 00:00:00 2001
From: VasylD
Date: Wed, 29 Jan 2025 14:50:52 +0200
Subject: [PATCH 045/290] [APP-912] add default settings for RTL (#152)
* [APP-912] add default settings for RTL
* [APP-912] add default settings for RTL
* [APP-912] add default settings for RTL
---
.../assets/js/components/alignment-matrix-control/index.js | 1 +
modules/settings/module.php | 6 +++---
2 files changed, 4 insertions(+), 3 deletions(-)
diff --git a/modules/settings/assets/js/components/alignment-matrix-control/index.js b/modules/settings/assets/js/components/alignment-matrix-control/index.js
index f65b6b80..3448ea36 100644
--- a/modules/settings/assets/js/components/alignment-matrix-control/index.js
+++ b/modules/settings/assets/js/components/alignment-matrix-control/index.js
@@ -57,6 +57,7 @@ const AlignmentMatrixControl = ({ mode }) => {
false,
'exactPosition' => [
'horizontal' => [
- 'direction' => 'left',
+ 'direction' => 'right',
'value' => 10,
'unit' => 'px',
],
@@ -217,7 +217,7 @@ private function set_default_settings() : void {
'unit' => 'px',
],
],
- 'position' => 'top-left',
+ 'position' => is_rtl() ? 'bottom-left' : 'bottom-right',
],
'mobile' => [
'hidden' => false,
@@ -234,7 +234,7 @@ private function set_default_settings() : void {
'unit' => 'px',
],
],
- 'position' => 'top-left',
+ 'position' => is_rtl() ? 'bottom-left' : 'bottom-right',
],
];
From 61a9a89435a571a714a7c7a48436c8bfb757519d Mon Sep 17 00:00:00 2001
From: Nirbhay Singh <121793120+nirbhayel@users.noreply.github.com>
Date: Thu, 30 Jan 2025 11:41:17 +0530
Subject: [PATCH 046/290] [APP-1026] Remove HTML breaking
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='50' height='50' viewBox='0 0 78 78' preserveAspectRatio='xMidYMid meet' fill='none'%3E%3Crect width='50' height='50' fill='%23FF7BE5' rx='25'/%3E%3Cpath fill='%23fff' d='M25.258 17.523a2.928 2.928 0 1 0 0-5.856 2.928 2.928 0 0 0 0 5.856Z'/%3E%3Cpath fill='%23fff' d='M29.556 18.338a43.34 43.34 0 0 1-8.77 0l-6.528-1.027a1.701 1.701 0 0 0-1.758 1.701c0 .921.58 1.58 1.652 1.701l7.417.978-.61 15.147a1.556 1.556 0 0 0 3.11.116l.49-6.498a.784.784 0 0 1 1.565 0l.49 6.498a1.556 1.556 0 0 0 3.11-.117l-.542-13.34c0-.974.775-1.776 1.75-1.808l5.426-.976c1.08-.192 1.652-.78 1.652-1.7 0-.965-.796-1.734-1.758-1.704l-6.704 1.026.008.003Z'/%3E%3Cpath fill='%23FF7BE5' d='m18.32 22.387-3.103-1.517c6.766.767 7.427 1.133 10.547 1.2-3.223.177-6.048.55-7.443.315v.002Z'/%3E%3C/svg%3E");
}
Date: Thu, 30 Jan 2025 23:11:13 +0200
Subject: [PATCH 047/290] Bug/app 1003 (#157)
* Fix: Add missed translations [n/a]
* Fix: Refresh the plan data on page load [n/a]
* New: Add loader to the settings [n/a]
---
modules/settings/assets/js/app.js | 46 +++++++++++++------
.../components/statement-generator/index.js | 4 +-
modules/settings/assets/js/constants/index.js | 6 ++-
.../assets/js/hooks/use-saved-settings.js | 17 ++++++-
.../assets/js/layouts/statement-link.js | 4 +-
.../settings/assets/js/page-content-loader.js | 44 ++++++++++++++++++
modules/settings/assets/js/page-content.js | 11 +++++
.../settings/assets/js/pages/icon-settings.js | 15 +++++-
modules/settings/module.php | 25 +++++++++-
package-lock.json | 13 ++++++
package.json | 1 +
11 files changed, 164 insertions(+), 22 deletions(-)
create mode 100644 modules/settings/assets/js/page-content-loader.js
create mode 100644 modules/settings/assets/js/page-content.js
diff --git a/modules/settings/assets/js/app.js b/modules/settings/assets/js/app.js
index c9cdeea9..5bc7663b 100644
--- a/modules/settings/assets/js/app.js
+++ b/modules/settings/assets/js/app.js
@@ -2,7 +2,7 @@ import '../css/style.css';
import Box from '@elementor/ui/Box';
import DirectionProvider from '@elementor/ui/DirectionProvider';
import Grid from '@elementor/ui/Grid';
-import { ThemeProvider } from '@elementor/ui/styles';
+import { styled, ThemeProvider } from '@elementor/ui/styles';
import {
ConnectModal,
Notifications,
@@ -19,9 +19,26 @@ import { Sidebar } from '@ea11y/layouts';
import { mixpanelService } from '@ea11y/services';
import { useEffect } from '@wordpress/element';
import { usePluginSettingsContext } from './contexts/plugin-settings';
+import PageContent from './page-content';
+
+const StyledContainer = styled(Box)`
+ width: 100%;
+
+ display: flex;
+ flex-direction: column;
+ justify-content: start;
+`;
+
+const StyledGrid = styled(Grid)`
+ height: 100%;
+
+ display: flex;
+ flex-direction: row;
+`;
const App = () => {
- useSavedSettings();
+ const { hasFinishedResolution, loading } = useSavedSettings();
+
const { isConnected, isRTL, closePostConnectModal } =
usePluginSettingsContext();
const { notificationMessage, notificationType } = useNotificationSettings();
@@ -35,28 +52,31 @@ const App = () => {
});
}, []);
- // Accessing the selected menu item
const selectedParent = MenuItems[selectedMenu.parent];
const selectedChild = selectedMenu.child
? selectedParent.children[selectedMenu.child]
: null;
+
return (
{isConnected !== undefined && !isConnected && }
{isConnected && !closePostConnectModal && }
-
+
+
-
+
+
- {selectedChild ? selectedChild.page : selectedParent?.page}
-
-
+
+
+
+
+
diff --git a/modules/settings/assets/js/components/statement-generator/index.js b/modules/settings/assets/js/components/statement-generator/index.js
index 9d8101a1..fa3d6e3b 100644
--- a/modules/settings/assets/js/components/statement-generator/index.js
+++ b/modules/settings/assets/js/components/statement-generator/index.js
@@ -124,11 +124,11 @@ const StatementGenerator = ({ open, close }) => {
window.ea11yWidget.accessibilityStatementURL = response.link;
}
await close();
- await success('Page created');
+ await success('Page created', 'pojo-accessibility');
mixpanelService.sendEvent('statement_page_created');
} catch (e) {
- error('Error while creating page');
+ error('Error while creating page', 'pojo-accessibility');
console.error(e);
}
};
diff --git a/modules/settings/assets/js/constants/index.js b/modules/settings/assets/js/constants/index.js
index 3df31794..23e4a651 100644
--- a/modules/settings/assets/js/constants/index.js
+++ b/modules/settings/assets/js/constants/index.js
@@ -1,3 +1,7 @@
export const HELP_LINK = 'https://go.elementor.com/';
export const UPGRADE_LINK = 'https://go.elementor.com/';
-export const BILLING_LINK = 'https://my.elementor.com/';
+
+export const SKELETON_OPTIONS = Object.freeze({
+ SPEED: 2,
+ FOREGROUND_COLOR: '#D9D9D9',
+});
diff --git a/modules/settings/assets/js/hooks/use-saved-settings.js b/modules/settings/assets/js/hooks/use-saved-settings.js
index bdec61cb..322f359b 100644
--- a/modules/settings/assets/js/hooks/use-saved-settings.js
+++ b/modules/settings/assets/js/hooks/use-saved-settings.js
@@ -1,9 +1,11 @@
import { useSettings } from '@ea11y/hooks';
import { store as coreDataStore } from '@wordpress/core-data';
import { useSelect } from '@wordpress/data';
-import { useEffect } from '@wordpress/element';
+import { useEffect, useState } from '@wordpress/element';
export const useSavedSettings = () => {
+ const [isLoading, setIsLoading] = useState(true);
+
const {
setWidgetMenuSettings,
setHideMinimumOptionAlert,
@@ -17,6 +19,10 @@ export const useSavedSettings = () => {
const result = useSelect((select) => {
return {
data: select(coreDataStore).getEntityRecord('root', 'site'),
+ isResolving: select(coreDataStore).isResolving('getEntityRecord', [
+ 'root',
+ 'site',
+ ]),
hasFinishedResolution: select(coreDataStore).hasFinishedResolution(
'getEntityRecord',
['root', 'site'],
@@ -24,6 +30,10 @@ export const useSavedSettings = () => {
};
}, []);
+ useEffect(() => {
+ setIsLoading(result.isResolving);
+ }, [result]);
+
useEffect(() => {
if (result.hasFinishedResolution) {
if (result?.data?.ea11y_widget_menu_settings) {
@@ -60,4 +70,9 @@ export const useSavedSettings = () => {
}
}
}, [result.hasFinishedResolution]);
+
+ return {
+ loading: isLoading,
+ hasFinishedResolution: result.hasFinishedResolution,
+ };
};
diff --git a/modules/settings/assets/js/layouts/statement-link.js b/modules/settings/assets/js/layouts/statement-link.js
index 21b2752e..9bd8fe88 100644
--- a/modules/settings/assets/js/layouts/statement-link.js
+++ b/modules/settings/assets/js/layouts/statement-link.js
@@ -107,11 +107,11 @@ const StatementLink = () => {
ea11y_accessibility_statement_data: accessibilityStatementData,
});
- await success('Changes saved');
+ await success('Changes saved', 'pojo-accessibility');
setDisabled(true);
} catch (e) {
- error('Failed to save settings!');
+ error('Failed to save settings!', 'pojo-accessibility');
console.error(e);
}
diff --git a/modules/settings/assets/js/page-content-loader.js b/modules/settings/assets/js/page-content-loader.js
new file mode 100644
index 00000000..e4996341
--- /dev/null
+++ b/modules/settings/assets/js/page-content-loader.js
@@ -0,0 +1,44 @@
+import Container from '@elementor/ui/Container';
+import { styled } from '@elementor/ui/styles';
+import PropTypes from 'prop-types';
+import ContentLoader from 'react-content-loader';
+import { memo } from '@wordpress/element';
+import { SKELETON_OPTIONS } from './constants';
+
+const StyledContainer = styled(Container)`
+ overflow: auto;
+ max-height: 100%;
+ padding: ${({ theme }) => theme.spacing(4)};
+`;
+
+const Skeleton = memo(() => {
+ return (
+
+
+
+ );
+});
+
+const SettingsLoader = memo(({ children }) => {
+ return (
+
+
+
+ {children}
+
+ );
+});
+
+SettingsLoader.propTypes = {
+ children: PropTypes.node,
+};
+
+export default SettingsLoader;
diff --git a/modules/settings/assets/js/page-content.js b/modules/settings/assets/js/page-content.js
new file mode 100644
index 00000000..12820ba6
--- /dev/null
+++ b/modules/settings/assets/js/page-content.js
@@ -0,0 +1,11 @@
+import SettingsLoader from './page-content-loader';
+
+const PageContent = ({ isLoading, page }) => {
+ if (isLoading) {
+ return ;
+ }
+
+ return page;
+};
+
+export default PageContent;
diff --git a/modules/settings/assets/js/pages/icon-settings.js b/modules/settings/assets/js/pages/icon-settings.js
index 9b3661c8..bc4fa1eb 100644
--- a/modules/settings/assets/js/pages/icon-settings.js
+++ b/modules/settings/assets/js/pages/icon-settings.js
@@ -1,26 +1,37 @@
import Container from '@elementor/ui/Container';
import Typography from '@elementor/ui/Typography';
+import { styled } from '@elementor/ui/styles';
import { BottomBar } from '@ea11y/components';
import { IconDesignSettings, PositionSettings } from '@ea11y/layouts';
import { mixpanelService } from '@ea11y/services';
import { useEffect } from '@wordpress/element';
import { __ } from '@wordpress/i18n';
+const StyledContainer = styled(Container)`
+ overflow: auto;
+ max-height: 100%;
+ padding: ${({ theme }) => theme.spacing(4)};
+`;
+
const IconSettings = () => {
useEffect(() => {
mixpanelService.sendEvent('page_view', {
page: 'Button',
});
}, []);
+
return (
<>
-
+
{__('Button', 'pojo-accessibility')}
+
+
-
+
+
>
);
diff --git a/modules/settings/module.php b/modules/settings/module.php
index 76823b53..4edd6d76 100644
--- a/modules/settings/module.php
+++ b/modules/settings/module.php
@@ -76,6 +76,8 @@ public function enqueue_scripts( $hook ) : void {
return;
}
+ self::refresh_plan_data();
+
wp_enqueue_style(
'ea11y-admin-fonts',
'https://fonts.googleapis.com/css2?family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,100;1,300;1,400;1,500;1,700;1,900&display=swap',
@@ -98,6 +100,28 @@ public function enqueue_scripts( $hook ) : void {
);
}
+ public static function refresh_plan_data() {
+ $plan_data = Settings::get( Settings::PLAN_DATA );
+
+ $response = Utils::get_api_client()->make_request(
+ 'GET',
+ 'site/info',
+ [ 'api_key' => $plan_data->public_api_key ]
+ );
+
+ if ( ! empty( $response->site_url ) && Data::get_home_url() !== $response->site_url ) {
+ Data::set_home_url( $response->site_url );
+ }
+
+ if ( ! is_wp_error( $response ) ) {
+ Settings::set( Settings::PLAN_DATA, $response );
+ Settings::set( Settings::IS_VALID_PLAN_DATA, true );
+ } else {
+ Logger::error( esc_html( $response->get_error_message() ) );
+ Settings::set( Settings::IS_VALID_PLAN_DATA, false );
+ }
+ }
+
/**
* Get Mixpanel project Token
* @return string
@@ -117,7 +141,6 @@ public static function routes_list() : array {
* @return array
*/
public static function get_plugin_settings(): array {
-
return [
'isConnected' => Connect::is_connected(),
'closePostConnectModal' => Settings::get( Settings::CLOSE_POST_CONNECT_MODAL ),
diff --git a/package-lock.json b/package-lock.json
index f78897d3..b9242967 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -23,6 +23,7 @@
"mixpanel-browser": "^2.58.0",
"prop-types": "^15.8.1",
"react-colorful": "^5.6.1",
+ "react-content-loader": "^7.0.2",
"use-debounce": "^10.0.4"
},
"devDependencies": {
@@ -19000,6 +19001,18 @@
"react-dom": ">=16.8.0"
}
},
+ "node_modules/react-content-loader": {
+ "version": "7.0.2",
+ "resolved": "https://registry.npmjs.org/react-content-loader/-/react-content-loader-7.0.2.tgz",
+ "integrity": "sha512-773S98JTyC8VB2nu7LXUhpHx8tZMieGxMcx3qTe7IkohT6Br7d9AXnIXs/wQ6IhlUdKQcw6JLKk1QKigYCWDRA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "peerDependencies": {
+ "react": ">=16.0.0"
+ }
+ },
"node_modules/react-dom": {
"version": "18.3.1",
"resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz",
diff --git a/package.json b/package.json
index e90a55fc..1890cc8b 100644
--- a/package.json
+++ b/package.json
@@ -53,6 +53,7 @@
"mixpanel-browser": "^2.58.0",
"prop-types": "^15.8.1",
"react-colorful": "^5.6.1",
+ "react-content-loader": "^7.0.2",
"use-debounce": "^10.0.4"
}
}
From fe388d29df784eef823515ed01ab0b1af1fc3c86 Mon Sep 17 00:00:00 2001
From: Nirbhay Singh <121793120+nirbhayel@users.noreply.github.com>
Date: Sat, 1 Feb 2025 10:39:59 +0530
Subject: [PATCH 048/290] update: delete lock key after each check (#160)
---
modules/connect/classes/service.php | 3 +++
1 file changed, 3 insertions(+)
diff --git a/modules/connect/classes/service.php b/modules/connect/classes/service.php
index 88180c45..576c19ed 100644
--- a/modules/connect/classes/service.php
+++ b/modules/connect/classes/service.php
@@ -271,6 +271,7 @@ public static function refresh_token() {
if ( ! empty( $last_token ) && $last_token === $current_refresh_token ) {
sleep( 1 );
+ delete_option( $lock_key );
return;
}
@@ -278,10 +279,12 @@ public static function refresh_token() {
$locked = Data::insert_option_uniquely( $lock_key, $current_refresh_token );
if ( ! $locked ) {
sleep( 1 );
+ delete_option( $lock_key );
return;
}
self::get_token( GrantTypes::REFRESH_TOKEN, $current_refresh_token );
+ delete_option( $lock_key );
}
/**
From ebb2792ad39551214b628452bfde87570569e4d9 Mon Sep 17 00:00:00 2001
From: Pavlo Kniazevych <139438463+pkniazevych@users.noreply.github.com>
Date: Sat, 1 Feb 2025 19:14:11 +0200
Subject: [PATCH 049/290] New: Update dashboard icon size [n/a] (#158)
* New: Update dashboard icon size [n/a]
* Fix: Fix widget previews [n/a]
---
assets/css/admin.css | 5 ++++-
modules/settings/classes/settings.php | 14 ++++++++++++-
modules/settings/module.php | 2 +-
modules/widget/module.php | 29 +++++++++++++++------------
4 files changed, 34 insertions(+), 16 deletions(-)
diff --git a/assets/css/admin.css b/assets/css/admin.css
index 68566a17..71f955b3 100644
--- a/assets/css/admin.css
+++ b/assets/css/admin.css
@@ -1,5 +1,8 @@
#adminmenu .toplevel_page_accessibility-settings .wp-menu-image img {
- padding: 5px 0 0;
+ width: 18px;
+ height: 18px;
+ padding: 8px 0 0 3px;
+
opacity: 1;
filter: none;
}
diff --git a/modules/settings/classes/settings.php b/modules/settings/classes/settings.php
index 535fc4c8..498055b2 100644
--- a/modules/settings/classes/settings.php
+++ b/modules/settings/classes/settings.php
@@ -22,7 +22,19 @@ class Settings {
* @return mixed
*/
public static function get( string $option_name ) {
- return get_option( $option_name );
+ switch ( $option_name ) {
+ case self::PLAN_DATA:
+ $value = get_option( $option_name );
+
+ if ( is_string( $value ) ) {
+ return json_decode( $value );
+ }
+
+ return $value;
+
+ default:
+ return get_option( $option_name );
+ }
}
/**
diff --git a/modules/settings/module.php b/modules/settings/module.php
index 4edd6d76..4f40ac26 100644
--- a/modules/settings/module.php
+++ b/modules/settings/module.php
@@ -114,7 +114,7 @@ public static function refresh_plan_data() {
}
if ( ! is_wp_error( $response ) ) {
- Settings::set( Settings::PLAN_DATA, $response );
+ Settings::set( Settings::PLAN_DATA, json_decode( $response ) );
Settings::set( Settings::IS_VALID_PLAN_DATA, true );
} else {
Logger::error( esc_html( $response->get_error_message() ) );
diff --git a/modules/widget/module.php b/modules/widget/module.php
index 51f6aaaf..b3c365e9 100644
--- a/modules/widget/module.php
+++ b/modules/widget/module.php
@@ -25,7 +25,6 @@ public function get_name(): string {
* @throws Exception
*/
public function enqueue_accessibility_widget() : void {
-
if ( ! Connect::is_connected() ) {
return;
}
@@ -98,18 +97,22 @@ public function enqueue_accessibility_widget_admin( $hook ) : void {
return;
}
- wp_localize_script(
- 'admin', // use admin settings script
- 'ea11yWidget',
- [
- 'iconSettings' => $this->get_widget_icon_settings(),
- 'toolsSettings' => get_option( 'ea11y_widget_menu_settings' ),
- 'preview' => true,
- 'previewContainer' => '#ea11y-widget-preview--container',
- 'apiKey' => $plan_data->public_api_key,
- 'accessibilityStatementURL' => $this->get_accessibility_statement_url(),
- ]
- );
+ $widget_state = [
+ 'iconSettings' => $this->get_widget_icon_settings(),
+ 'toolsSettings' => get_option( 'ea11y_widget_menu_settings' ),
+ 'preview' => true,
+ 'previewContainer' => '#ea11y-widget-preview--container',
+ 'apiKey' => $plan_data->public_api_key,
+ 'accessibilityStatementURL' => $this->get_accessibility_statement_url(),
+ ];
+
+ ?>
+
+
+
+
Date: Wed, 5 Feb 2025 18:50:27 +0530
Subject: [PATCH 050/290] [APP-1018] Help menu change (#155)
* update: remove accessibility word from menu items
* update: remove top bar
* update: add help button to the sidebar
* update: re-add spacing in styled css code
* update: create styled components
---
modules/settings/assets/js/app.js | 3 --
.../js/components/my-account-menu/index.js | 45 +++++++++++++++----
.../assets/js/components/sidebar-menu/menu.js | 4 +-
.../settings/assets/js/pages/icon-settings.js | 14 ++++--
4 files changed, 50 insertions(+), 16 deletions(-)
diff --git a/modules/settings/assets/js/app.js b/modules/settings/assets/js/app.js
index 5bc7663b..4ab78f37 100644
--- a/modules/settings/assets/js/app.js
+++ b/modules/settings/assets/js/app.js
@@ -7,7 +7,6 @@ import {
ConnectModal,
Notifications,
MenuItems,
- AdminTopBar,
PostConnectModal,
} from '@ea11y/components';
import {
@@ -67,8 +66,6 @@ const App = () => {
-
-
`${theme.spacing(1)} ${theme.spacing(3)}`};
+`;
const MyAccountMenu = () => {
const { openSidebar, planData } = useSettings();
@@ -63,6 +76,13 @@ const MyAccountMenu = () => {
}
};
+ const handleHelpButtonClick = () => {
+ mixpanelService.sendEvent('help_button_clicked', {
+ source: 'Header',
+ });
+ window.open(HELP_LINK, '_blank');
+ };
+
return (
<>
{
});
}}
>
-
+
+
+
+
+
+
+
+
+
+
+
@@ -98,7 +127,7 @@ const MyAccountMenu = () => {
)}
-
+
,
children: {
@@ -22,7 +22,7 @@ export const MenuItems = {
},
},
accessibilityStatement: {
- name: __('Accessibility statement', 'pojo-accessibility'),
+ name: __('Statement', 'pojo-accessibility'),
key: 'accessibility-statement',
page: ,
icon: ,
diff --git a/modules/settings/assets/js/pages/icon-settings.js b/modules/settings/assets/js/pages/icon-settings.js
index bc4fa1eb..1af0d3ef 100644
--- a/modules/settings/assets/js/pages/icon-settings.js
+++ b/modules/settings/assets/js/pages/icon-settings.js
@@ -1,3 +1,4 @@
+import Box from '@elementor/ui/Box';
import Container from '@elementor/ui/Container';
import Typography from '@elementor/ui/Typography';
import { styled } from '@elementor/ui/styles';
@@ -7,6 +8,14 @@ import { mixpanelService } from '@ea11y/services';
import { useEffect } from '@wordpress/element';
import { __ } from '@wordpress/i18n';
+const StyledBox = styled(Box)`
+ display: flex;
+ flex-direction: column;
+ justify-content: space-between;
+ align-items: center;
+ height: 100%;
+`;
+
const StyledContainer = styled(Container)`
overflow: auto;
max-height: 100%;
@@ -21,7 +30,7 @@ const IconSettings = () => {
}, []);
return (
- <>
+
{__('Button', 'pojo-accessibility')}
@@ -31,9 +40,8 @@ const IconSettings = () => {
-
- >
+
);
};
From f772be8da41a59370705870fd08c57db992b771d Mon Sep 17 00:00:00 2001
From: Raz Ohad
Date: Wed, 5 Feb 2025 15:25:30 +0200
Subject: [PATCH 051/290] [APP-973] Add an UTM for users upgrading from one
click to the new widget (#165)
---
modules/connect/module.php | 22 ++++++++++++++++++++++
modules/legacy/components/upgrade.php | 10 ++++++++++
2 files changed, 32 insertions(+)
diff --git a/modules/connect/module.php b/modules/connect/module.php
index 3c38df37..dfb41af5 100644
--- a/modules/connect/module.php
+++ b/modules/connect/module.php
@@ -54,9 +54,31 @@ public static function is_connected() : bool {
return ! ! Data::get_access_token() && Utils::is_valid_home_url();
}
+ public function authorize_url( $authorize_url ) {
+ $utm_params = [];
+
+ $a11y_campaign = get_transient( 'elementor_ea11y_campaign' );
+ if ( false === $a11y_campaign ) {
+ return $authorize_url;
+ }
+
+ foreach ( [ 'source', 'medium', 'campaign' ] as $key ) {
+ if ( ! empty( $a11y_campaign[ $key ] ) ) {
+ $utm_params[ 'utm_' . $key ] = $a11y_campaign[ $key ];
+ }
+ }
+
+ if ( ! empty( $utm_params ) ) {
+ $authorize_url = add_query_arg( $utm_params, $authorize_url );
+ }
+
+ return $authorize_url;
+ }
+
public function __construct() {
$this->register_components();
$this->register_routes();
+ add_filter( 'ea11y_connect_authorize_url', [ $this, 'authorize_url' ] );
}
}
diff --git a/modules/legacy/components/upgrade.php b/modules/legacy/components/upgrade.php
index b0956845..47f07cb0 100644
--- a/modules/legacy/components/upgrade.php
+++ b/modules/legacy/components/upgrade.php
@@ -535,6 +535,16 @@ public function handle_ajax_upgrade() {
}
self::upgrade();
+
+ // store upgrade campaign data
+ $campaign_data = [
+ 'source' => 'one-click-upgrade',
+ 'campaign' => 'a11y-upgrade',
+ 'medium' => 'wp-dash',
+ ];
+
+ set_transient( 'elementor_ea11y_campaign', $campaign_data, 30 * DAY_IN_SECONDS );
+
wp_send_json_success( [] );
}
From dccb071a671d33bc9bd040efcebd4444ebedde81 Mon Sep 17 00:00:00 2001
From: Nirbhay Singh <121793120+nirbhayel@users.noreply.github.com>
Date: Wed, 5 Feb 2025 19:04:30 +0530
Subject: [PATCH 052/290] update: ui of the statement preview (#166)
---
.../assets/js/components/html-to-typography/index.js | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/modules/settings/assets/js/components/html-to-typography/index.js b/modules/settings/assets/js/components/html-to-typography/index.js
index ba6ccdd7..17f36be1 100644
--- a/modules/settings/assets/js/components/html-to-typography/index.js
+++ b/modules/settings/assets/js/components/html-to-typography/index.js
@@ -10,6 +10,15 @@ const HtmlToTypography = ({ htmlString, replacements }) => {
Object.keys(replacements).forEach((key) => {
const placeholder = `{${key}}`; // Create placeholder format (e.g., {company_name})
const value = replacements[key]; // Get the replacement value
+
+ // Show placeholders in the preview until user fills in details.
+ if (replacements[key] === '') {
+ const preparedText = `[${key?.split('_').join(' ')}]`;
+ updatedText = updatedText.replace(
+ new RegExp(placeholder, 'g'),
+ preparedText,
+ );
+ }
updatedText = updatedText.replace(new RegExp(placeholder, 'g'), value);
});
@@ -41,6 +50,7 @@ const HtmlToTypography = ({ htmlString, replacements }) => {
component={tagName}
marginBottom={1}
sx={node.attribs.class ? { textAlign: 'center' } : {}} //for correct render on preview
+ color={tagName === 'p' ? 'text.secondary' : 'text.primary'}
>
{node.children && node.children.map((child) => transform(child))}
From 5ad4b60364b3b61d6cf6fd10ba820cd32d5f66b8 Mon Sep 17 00:00:00 2001
From: VasylD
Date: Wed, 5 Feb 2025 15:40:42 +0200
Subject: [PATCH 053/290] [APP-1011][APP-1013] focus outline and sitemap
settings (#161)
* [APP-1011][APP-1013] focus outline and sitemap settings
* [APP-1011][APP-1013] focus outline and sitemap settings
* [APP-1011][APP-1013] focus outline and sitemap settings
* [APP-1011][APP-1013] focus outline and sitemap settings
---
.../assets/js/components/bottom-bar/index.js | 5 +-
.../js/components/sitemap-settings/index.js | 138 ++++++++++++++++++
.../assets/js/constants/menu-settings.js | 10 ++
.../settings/assets/js/hooks/use-settings.js | 11 ++
.../settings/assets/js/icons/focus-icon.js | 22 +++
.../settings/assets/js/icons/sitemap-icon.js | 16 ++
.../assets/js/layouts/menu-settings.js | 38 ++++-
modules/settings/assets/js/utils/index.js | 6 +
modules/settings/module.php | 7 +
9 files changed, 244 insertions(+), 9 deletions(-)
create mode 100644 modules/settings/assets/js/components/sitemap-settings/index.js
create mode 100644 modules/settings/assets/js/icons/focus-icon.js
create mode 100644 modules/settings/assets/js/icons/sitemap-icon.js
diff --git a/modules/settings/assets/js/components/bottom-bar/index.js b/modules/settings/assets/js/components/bottom-bar/index.js
index 2f88f25b..f4de3130 100644
--- a/modules/settings/assets/js/components/bottom-bar/index.js
+++ b/modules/settings/assets/js/components/bottom-bar/index.js
@@ -21,6 +21,7 @@ const BottomBar = () => {
iconDesign,
iconPosition,
hasChanges,
+ hasError,
setHasChanges,
} = useSettings();
const { save } = useStorage();
@@ -66,7 +67,9 @@ const BottomBar = () => {
variant="contained"
color="info"
onClick={saveSettings}
- disabled={!hasChanges}
+ disabled={
+ !hasChanges || Object.keys(hasError).some((key) => hasError[key])
+ }
>
{__('Save changes', 'pojo-accessibility')}
diff --git a/modules/settings/assets/js/components/sitemap-settings/index.js b/modules/settings/assets/js/components/sitemap-settings/index.js
new file mode 100644
index 00000000..2356d4b7
--- /dev/null
+++ b/modules/settings/assets/js/components/sitemap-settings/index.js
@@ -0,0 +1,138 @@
+import { InfoCircleIcon } from '@elementor/icons';
+import {
+ Accordion,
+ AccordionDetails,
+ AccordionSummary,
+ AccordionSummaryIcon,
+} from '@elementor/ui';
+import Box from '@elementor/ui/Box';
+import FormLabel from '@elementor/ui/FormLabel';
+import Infotip from '@elementor/ui/Infotip';
+import ListItemText from '@elementor/ui/ListItemText';
+import TextField from '@elementor/ui/TextField';
+import Typography from '@elementor/ui/Typography';
+import { styled } from '@elementor/ui/styles';
+import { useSettings } from '@ea11y/hooks';
+import { __ } from '@wordpress/i18n';
+import { validateUrl } from '../../utils';
+
+const SitemapSettings = ({ sitemap }) => {
+ const {
+ widgetMenuSettings,
+ setWidgetMenuSettings,
+ setHasChanges,
+ hasError,
+ setHasError,
+ } = useSettings();
+
+ const onEditSitemap = (event) => {
+ setWidgetMenuSettings({
+ ...widgetMenuSettings,
+ sitemap: {
+ enabled: true,
+ url: event.target.value,
+ },
+ });
+ const isValid = validateUrl(event.target.value);
+
+ setHasError({
+ ...hasError,
+ sitemap: !isValid,
+ });
+ setHasChanges(isValid);
+ };
+
+ return (
+
+
+
+
+
+ {__('Sitemap URL')}
+
+
+ {__(
+ 'You need to add a link to activate this',
+ 'pojo-accessibility',
+ )}
+
+ }
+ placement="right"
+ arrow={true}
+ >
+
+
+
+
+
+ {hasError.sitemap && (
+
+ {__('Please enter valid URL!', 'pojo-accessibility')}
+
+ )}
+
+
+
+
+ );
+};
+
+const StyledAccordion = styled(Accordion)`
+ border: none;
+ width: 100%;
+`;
+
+const StyledAccordionSummary = styled(AccordionSummary)`
+ padding: 0;
+ min-height: auto;
+ justify-content: left;
+ &.Mui-expanded {
+ min-height: auto;
+ }
+
+ & .MuiAccordionSummary-content,
+ & .MuiAccordionSummary-content.Mui-expanded {
+ margin: 0 !important;
+ align-items: center;
+ flex-grow: 0;
+ }
+`;
+
+const StyledBox = styled(Box)`
+ display: flex;
+ gap: 16px;
+ align-items: flex-start;
+`;
+
+const StyledFormLabel = styled(FormLabel)`
+ display: flex;
+ align-items: center;
+ gap: 8px;
+ white-space: nowrap;
+ padding-top: 4px;
+`;
+
+const StyledAccordionDetails = styled(AccordionDetails)`
+ padding: 5px 45px 5px 0;
+`;
+
+export default SitemapSettings;
diff --git a/modules/settings/assets/js/constants/menu-settings.js b/modules/settings/assets/js/constants/menu-settings.js
index 86d01eed..5c4cb456 100644
--- a/modules/settings/assets/js/constants/menu-settings.js
+++ b/modules/settings/assets/js/constants/menu-settings.js
@@ -11,6 +11,8 @@ import {
HideImagesIcon,
PauseAnimationsIcon,
} from '@ea11y/icons';
+import FocusIcon from '@ea11y/icons/focus-icon';
+import SitemapIcon from '@ea11y/icons/sitemap-icon';
import { __ } from '@wordpress/i18n';
const iconStyle = { color: 'black' };
@@ -57,6 +59,10 @@ export const MENU_SETTINGS = {
title: __('Page structure', 'pojo-accessibility'),
icon: ,
},
+ sitemap: {
+ title: __('Sitemap', 'pojo-accessibility'),
+ icon: ,
+ },
'reading-mask': {
title: __('Reading mask', 'pojo-accessibility'),
icon: ,
@@ -73,6 +79,10 @@ export const MENU_SETTINGS = {
title: __('Highlight links', 'pojo-accessibility'),
icon: ,
},
+ 'focus-outline': {
+ title: __('Orientation', 'pojo-accessibility'),
+ icon: ,
+ },
},
},
};
diff --git a/modules/settings/assets/js/hooks/use-settings.js b/modules/settings/assets/js/hooks/use-settings.js
index 7b8afa5d..af9a3132 100644
--- a/modules/settings/assets/js/hooks/use-settings.js
+++ b/modules/settings/assets/js/hooks/use-settings.js
@@ -38,6 +38,9 @@ export const SettingsProvider = ({ children }) => {
'page-structure': {
enabled: true,
},
+ sitemap: {
+ enabled: true,
+ },
'reading-mask': {
enabled: true,
},
@@ -50,12 +53,18 @@ export const SettingsProvider = ({ children }) => {
'highlight-links': {
enabled: true,
},
+ 'focus-outline': {
+ enabled: true,
+ },
});
const [planData, setPlanData] = useState(null);
// Track settings changes to enable/disable Save Changes button
const [hasChanges, setHasChanges] = useState(false);
+ const [hasError, setHasError] = useState({
+ sitemap: false,
+ });
const [hideMinimumOptionAlert, setHideMinimumOptionAlert] = useState(false);
const [iconDesign, setIconDesign] = useState({
icon: 'person',
@@ -138,6 +147,8 @@ export const SettingsProvider = ({ children }) => {
setIconDesign,
hasChanges,
setHasChanges,
+ hasError,
+ setHasError,
planData,
setPlanData,
companyData,
diff --git a/modules/settings/assets/js/icons/focus-icon.js b/modules/settings/assets/js/icons/focus-icon.js
new file mode 100644
index 00000000..e3ba0260
--- /dev/null
+++ b/modules/settings/assets/js/icons/focus-icon.js
@@ -0,0 +1,22 @@
+import SvgIcon from '@elementor/ui/SvgIcon';
+
+const FocusIcon = (props, { size }) => {
+ return (
+
+
+
+
+
+
+ );
+};
+
+export default FocusIcon;
diff --git a/modules/settings/assets/js/icons/sitemap-icon.js b/modules/settings/assets/js/icons/sitemap-icon.js
new file mode 100644
index 00000000..f7b3ecee
--- /dev/null
+++ b/modules/settings/assets/js/icons/sitemap-icon.js
@@ -0,0 +1,16 @@
+import SvgIcon from '@elementor/ui/SvgIcon';
+
+const SitemapIcon = (props, { size }) => {
+ return (
+
+
+
+ );
+};
+
+export default SitemapIcon;
diff --git a/modules/settings/assets/js/layouts/menu-settings.js b/modules/settings/assets/js/layouts/menu-settings.js
index d90441de..adb432b6 100644
--- a/modules/settings/assets/js/layouts/menu-settings.js
+++ b/modules/settings/assets/js/layouts/menu-settings.js
@@ -1,4 +1,4 @@
-import { CardActions } from '@elementor/ui';
+import { CardActions, ListItemSecondaryAction } from '@elementor/ui';
import Alert from '@elementor/ui/Alert';
import Box from '@elementor/ui/Box';
import Card from '@elementor/ui/Card';
@@ -13,11 +13,13 @@ import Switch from '@elementor/ui/Switch';
import Typography from '@elementor/ui/Typography';
import { styled } from '@elementor/ui/styles';
import { BottomBar } from '@ea11y/components';
+import SitemapSettings from '@ea11y/components/sitemap-settings';
import { useSettings, useStorage } from '@ea11y/hooks';
import { mixpanelService } from '@ea11y/services';
import { useEffect, useState } from '@wordpress/element';
import { __ } from '@wordpress/i18n';
import { MENU_SETTINGS } from '../constants/menu-settings';
+import { validateUrl } from '../utils';
const StyledSwitch = styled(Switch)`
input {
@@ -51,6 +53,8 @@ const MenuSettings = () => {
widgetMenuSettings,
setWidgetMenuSettings,
setHasChanges,
+ hasError,
+ setHasError,
hideMinimumOptionAlert,
setHideMinimumOptionAlert,
} = useSettings();
@@ -74,10 +78,20 @@ const MenuSettings = () => {
const newSettings = {
...prevSettings,
[option]: {
+ ...prevSettings[option],
enabled: !prevSettings[option]?.enabled,
},
};
+ if (option === 'sitemap') {
+ setHasError({
+ ...hasError,
+ sitemap: !prevSettings[option]?.enabled
+ ? !validateUrl(prevSettings[option]?.url)
+ : false,
+ });
+ }
+
setHasChanges(true);
if (window?.ea11yWidget?.toolsSettings && window?.ea11yWidget?.widget) {
@@ -143,11 +157,11 @@ const MenuSettings = () => {
)}
-
+
{Object.entries(MENU_SETTINGS).map(([parentKey, parentItem], i) => {
return (
-
+
{parentItem.title}
@@ -160,10 +174,21 @@ const MenuSettings = () => {
([childKey, childValue]) => {
return (
+ {childKey === 'sitemap' ? (
+
+ ) : (
+ <>
+ {childValue.icon}
+
+ >
+ )}
+
+
{
: false
}
/>
- }
- >
- {childValue.icon}
-
+
);
},
diff --git a/modules/settings/assets/js/utils/index.js b/modules/settings/assets/js/utils/index.js
index 3a67ddcc..4f3f256c 100644
--- a/modules/settings/assets/js/utils/index.js
+++ b/modules/settings/assets/js/utils/index.js
@@ -19,3 +19,9 @@ export const injectTemplateVars = (message, components) => {
}
});
};
+
+export const validateUrl = (url) => {
+ const pattern =
+ /^(https?):\/\/([a-zA-Z0-9-]+\.)+[a-zA-Z]{2,}(:\d{1,5})?(\/.*)?$/i;
+ return pattern.test(url);
+};
diff --git a/modules/settings/module.php b/modules/settings/module.php
index 4f40ac26..8c129a52 100644
--- a/modules/settings/module.php
+++ b/modules/settings/module.php
@@ -210,6 +210,10 @@ private function set_default_settings() : void {
'page-structure' => [
'enabled' => true,
],
+ 'sitemap' => [
+ 'enabled' => false,
+ 'url' => home_url( '/wp-sitemap.xml' ),
+ ],
'reading-mask' => [
'enabled' => true,
],
@@ -222,6 +226,9 @@ private function set_default_settings() : void {
'highlight-links' => [
'enabled' => true,
],
+ 'focus-outline' => [
+ 'enabled' => true,
+ ],
];
$widget_icon_settings = [
From 6c765adfd2496714dcf9f9446f779ad68232bc03 Mon Sep 17 00:00:00 2001
From: Nirbhay Singh <121793120+nirbhayel@users.noreply.github.com>
Date: Wed, 5 Feb 2025 19:12:38 +0530
Subject: [PATCH 054/290] update: video link (#167)
---
modules/legacy/components/upgrade.php | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/modules/legacy/components/upgrade.php b/modules/legacy/components/upgrade.php
index 47f07cb0..d445d6bb 100644
--- a/modules/legacy/components/upgrade.php
+++ b/modules/legacy/components/upgrade.php
@@ -169,11 +169,11 @@ public function maybe_add_introduction_modal() {
VIDEO
+ referrerpolicy="strict-origin-when-cross-origin" allowfullscreen
+ >
From c067ae8b4b2b40da223c0af422be5f5074b4c73d Mon Sep 17 00:00:00 2001
From: Nirbhay Singh <121793120+nirbhayel@users.noreply.github.com>
Date: Thu, 6 Feb 2025 14:50:07 +0530
Subject: [PATCH 055/290] [APP-1051] Fix layout on the small and medium devices
(#156)
* fix: layout on the small and medium devices
* update: change components to styled components
* refactor: position settings wrapper into a separate component
---
.../settings/assets/js/components/index.js | 1 +
.../position-settings-wrapper/index.js | 21 +++++++++++++++++++
.../assets/js/layouts/icon-design-settings.js | 16 ++++++++++++--
.../js/layouts/position-settings-desktop.js | 16 +++++++-------
.../js/layouts/position-settings-mobile.js | 15 +++++++------
5 files changed, 50 insertions(+), 19 deletions(-)
create mode 100644 modules/settings/assets/js/components/position-settings-wrapper/index.js
diff --git a/modules/settings/assets/js/components/index.js b/modules/settings/assets/js/components/index.js
index d7134f21..8e1ba164 100644
--- a/modules/settings/assets/js/components/index.js
+++ b/modules/settings/assets/js/components/index.js
@@ -18,3 +18,4 @@ export { default as HtmlToTypography } from './html-to-typography';
export { default as WidgetLoader } from './widget-loader';
export { default as CopyLink } from './copy-link';
export { default as GeneratedPageInfoTipCard } from './generated-page-infotip-card';
+export { default as PositionSettingsWrapper } from './position-settings-wrapper';
diff --git a/modules/settings/assets/js/components/position-settings-wrapper/index.js b/modules/settings/assets/js/components/position-settings-wrapper/index.js
new file mode 100644
index 00000000..cb27976e
--- /dev/null
+++ b/modules/settings/assets/js/components/position-settings-wrapper/index.js
@@ -0,0 +1,21 @@
+import Box from '@elementor/ui/Box';
+import { styled } from '@elementor/ui/styles';
+
+const StyledBox = styled(Box)`
+ display: grid;
+ justify-content: space-evenly;
+
+ gap: ${({ theme }) => theme.spacing(5)};
+ padding: ${({ theme }) => theme.spacing(2)};
+
+ grid-template-columns: repeat(2, 1fr);
+ ${({ theme }) => theme.breakpoints.down('lg')} {
+ grid-template-columns: repeat(1, 1fr);
+ }
+`;
+
+const PositionSettingsWrapper = ({ children }) => {
+ return {children} ;
+};
+
+export default PositionSettingsWrapper;
diff --git a/modules/settings/assets/js/layouts/icon-design-settings.js b/modules/settings/assets/js/layouts/icon-design-settings.js
index f5b9beec..7bf1bbb6 100644
--- a/modules/settings/assets/js/layouts/icon-design-settings.js
+++ b/modules/settings/assets/js/layouts/icon-design-settings.js
@@ -1,9 +1,21 @@
import Box from '@elementor/ui/Box';
import Grid from '@elementor/ui/Grid';
import Typography from '@elementor/ui/Typography';
+import { styled } from '@elementor/ui/styles';
import { ColorPicker, IconSelect, IconSize } from '@ea11y/components';
import { __ } from '@wordpress/i18n';
+const StyledGrid = styled(Grid)`
+ display: grid;
+ gap: ${({ theme }) => theme.spacing(5)};
+ padding: ${({ theme }) => theme.spacing(2)};
+ grid-template-columns: repeat(2, 1fr);
+
+ ${({ theme }) => theme.breakpoints.down('lg')} {
+ grid-template-columns: repeat(1, 1fr);
+ }
+`;
+
const IconDesignSettings = (props) => {
return (
@@ -20,7 +32,7 @@ const IconDesignSettings = (props) => {
-
+
@@ -29,7 +41,7 @@ const IconDesignSettings = (props) => {
-
+
);
};
diff --git a/modules/settings/assets/js/layouts/position-settings-desktop.js b/modules/settings/assets/js/layouts/position-settings-desktop.js
index 9b7c5045..30104354 100644
--- a/modules/settings/assets/js/layouts/position-settings-desktop.js
+++ b/modules/settings/assets/js/layouts/position-settings-desktop.js
@@ -2,7 +2,11 @@ import Box from '@elementor/ui/Box';
import FormControlLabel from '@elementor/ui/FormControlLabel';
import Switch from '@elementor/ui/Switch';
import Typography from '@elementor/ui/Typography';
-import { AlignmentMatrixControl, PositionControl } from '@ea11y/components';
+import {
+ AlignmentMatrixControl,
+ PositionControl,
+ PositionSettingsWrapper,
+} from '@ea11y/components';
import { useIconPosition } from '@ea11y/hooks';
import { mixpanelService } from '@ea11y/services';
import { __ } from '@wordpress/i18n';
@@ -61,13 +65,7 @@ const PositionSettingsDesktop = () => {
checked={iconPosition.desktop.hidden}
/>
{!iconPosition.desktop.hidden && (
-
+
@@ -99,7 +97,7 @@ const PositionSettingsDesktop = () => {
disabled={!iconPosition.desktop?.enableExactPosition}
/>
-
+
)}
>
);
diff --git a/modules/settings/assets/js/layouts/position-settings-mobile.js b/modules/settings/assets/js/layouts/position-settings-mobile.js
index d5774deb..a8238a1d 100644
--- a/modules/settings/assets/js/layouts/position-settings-mobile.js
+++ b/modules/settings/assets/js/layouts/position-settings-mobile.js
@@ -2,7 +2,11 @@ import Box from '@elementor/ui/Box';
import FormControlLabel from '@elementor/ui/FormControlLabel';
import Switch from '@elementor/ui/Switch';
import Typography from '@elementor/ui/Typography';
-import { AlignmentMatrixControl, PositionControl } from '@ea11y/components';
+import {
+ AlignmentMatrixControl,
+ PositionControl,
+ PositionSettingsWrapper,
+} from '@ea11y/components';
import { useIconPosition } from '@ea11y/hooks';
import { mixpanelService } from '@ea11y/services';
import { __ } from '@wordpress/i18n';
@@ -59,12 +63,7 @@ const PositionSettingsMobile = () => {
checked={iconPosition.mobile.hidden}
/>
{!iconPosition.mobile.hidden && (
-
+
{
disabled={!iconPosition.mobile?.enableExactPosition}
/>
-
+
)}
>
);
From 92ca3db6d6d5a4199fe8a613f4c658e3ef78cb6a Mon Sep 17 00:00:00 2001
From: VasylD
Date: Fri, 7 Feb 2025 15:07:08 +0200
Subject: [PATCH 056/290] [APP-1012][APP-1085] Add skip to content settings and
event for Mixpanel (#169)
* [APP-1012][APP-1085] Add skip to content settings and event for Mixpanel
* [APP-1012][APP-1085] Add skip to content settings and event for Mixpanel
* [APP-1012][APP-1085] Add skip to content settings and event for Mixpanel
* [APP-1012][APP-1085] Add skip to content settings and event for Mixpanel
---
.../js/components/sitemap-settings/index.js | 24 ++-
.../skip-to-content-settings/index.js | 203 ++++++++++++++++++
.../assets/js/constants/menu-settings.js | 2 +-
.../assets/js/hooks/use-saved-settings.js | 5 +
.../settings/assets/js/hooks/use-settings.js | 12 +-
.../assets/js/layouts/menu-settings.js | 2 +-
modules/settings/assets/js/pages/menu.js | 3 +
modules/settings/assets/js/utils/index.js | 5 +
modules/settings/classes/settings.php | 21 +-
modules/settings/module.php | 56 +++--
modules/widget/module.php | 44 ++--
11 files changed, 327 insertions(+), 50 deletions(-)
create mode 100644 modules/settings/assets/js/components/skip-to-content-settings/index.js
diff --git a/modules/settings/assets/js/components/sitemap-settings/index.js b/modules/settings/assets/js/components/sitemap-settings/index.js
index 2356d4b7..7f0e7dc5 100644
--- a/modules/settings/assets/js/components/sitemap-settings/index.js
+++ b/modules/settings/assets/js/components/sitemap-settings/index.js
@@ -13,6 +13,7 @@ import TextField from '@elementor/ui/TextField';
import Typography from '@elementor/ui/Typography';
import { styled } from '@elementor/ui/styles';
import { useSettings } from '@ea11y/hooks';
+import { mixpanelService } from '@ea11y/services';
import { __ } from '@wordpress/i18n';
import { validateUrl } from '../../utils';
@@ -20,6 +21,7 @@ const SitemapSettings = ({ sitemap }) => {
const {
widgetMenuSettings,
setWidgetMenuSettings,
+ hasChanges,
setHasChanges,
hasError,
setHasError,
@@ -42,6 +44,15 @@ const SitemapSettings = ({ sitemap }) => {
setHasChanges(isValid);
};
+ const onBlur = () => {
+ if (hasChanges) {
+ mixpanelService.sendEvent('field_content_updated', {
+ fieldName: 'sitemap-url',
+ value: widgetMenuSettings.sitemap?.url,
+ });
+ }
+ };
+
return (