From 0c32cdc6ef77e5124adda98033d9dbabed70d9ab Mon Sep 17 00:00:00 2001 From: Jonny Harris Date: Tue, 19 Jun 2018 14:33:24 +0100 Subject: [PATCH 01/79] Added fixes for composer file so can now be used to load plugin. --- composer.json | 37 +++++++++++++++++++++++++++---------- 1 file changed, 27 insertions(+), 10 deletions(-) diff --git a/composer.json b/composer.json index 15c51bc..ff86bc6 100644 --- a/composer.json +++ b/composer.json @@ -1,12 +1,29 @@ { - "config": { - "vendor-dir": "includes/vendor" - }, - "require": { - "firebase/php-jwt": "^5.0.0" - }, - "require-dev": { - "phpunit/phpunit": "^5.2", - "guzzlehttp/guzzle": "^6.1" - } + "name": "tmeister/wp-api-jwt-auth", + "description": "A simple plugin to add JSON Web Token (JWT) Authentication to WP REST API.", + "homepage": "https://github.com/Tmeister/wp-api-jwt-auth/", + "type": "wordpress-plugin", + "license": "GPL-2.0+", + "authors": [ + { + "name": "Enrique Chavez", + "homepage": "https://enriquechavez.co/" + } + ], + "support": { + "issues": "https://github.com/Tmeister/wp-api-jwt-auth/issues", + "source": "https://github.com/Tmeister/wp-api-jwt-auth/" + }, + "config": { + "vendor-dir": "includes/vendor" + }, + "require": { + "php": ">=5.3", + "composer/installers": "~1.0", + "firebase/php-jwt": "^5.0.0" + }, + "require-dev": { + "phpunit/phpunit": "^5.2", + "guzzlehttp/guzzle": "^6.1" + } } From 3d61a660ade3637c79dd8f5acbdeaa0b0a30e798 Mon Sep 17 00:00:00 2001 From: Enrique Chavez Date: Wed, 7 Nov 2018 10:12:14 -0600 Subject: [PATCH 02/79] Add Gutenberg compatibility - Fixed Maximun recursion error - Fix #126 --- .gitignore | 1 + README.md | 10 ++++---- includes/class-jwt-auth.php | 31 +++++++++++++++++++----- jwt-auth.php | 2 +- public/class-jwt-auth-public.php | 41 ++++++++++++++++---------------- readme.txt | 4 ++-- 6 files changed, 54 insertions(+), 35 deletions(-) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..600d2d3 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.vscode \ No newline at end of file diff --git a/README.md b/README.md index 40e6f29..e24747d 100644 --- a/README.md +++ b/README.md @@ -16,7 +16,7 @@ So, to use the **wp-api-jwt-auth** you need to install and activate [WP REST API **Minimum PHP version: 5.3.0** -### Enable PHP HTTP Authorization Header +### Enable PHP HTTP Authorization Header #### Shared Hosts @@ -84,10 +84,10 @@ When the plugin is activated, a new namespace is added. Also, two new endpoints are added to this namespace. -Endpoint | HTTP Verb ---- | --- -*/wp-json/jwt-auth/v1/token* | POST -*/wp-json/jwt-auth/v1/token/validate* | POST +| Endpoint | HTTP Verb | +| ------------------------------------- | --------- | +| */wp-json/jwt-auth/v1/token* | POST | +| */wp-json/jwt-auth/v1/token/validate* | POST | ## Usage ### /wp-json/jwt-auth/v1/token diff --git a/includes/class-jwt-auth.php b/includes/class-jwt-auth.php index 8cd4645..411d9f7 100755 --- a/includes/class-jwt-auth.php +++ b/includes/class-jwt-auth.php @@ -93,25 +93,25 @@ private function load_dependencies() /** * Load dependecies managed by composer. */ - require_once plugin_dir_path(dirname(__FILE__)).'includes/vendor/autoload.php'; + require_once plugin_dir_path(dirname(__FILE__)) . 'includes/vendor/autoload.php'; /** * The class responsible for orchestrating the actions and filters of the * core plugin. */ - require_once plugin_dir_path(dirname(__FILE__)).'includes/class-jwt-auth-loader.php'; + require_once plugin_dir_path(dirname(__FILE__)) . 'includes/class-jwt-auth-loader.php'; /** * The class responsible for defining internationalization functionality * of the plugin. */ - require_once plugin_dir_path(dirname(__FILE__)).'includes/class-jwt-auth-i18n.php'; + require_once plugin_dir_path(dirname(__FILE__)) . 'includes/class-jwt-auth-i18n.php'; /** * The class responsible for defining all actions that occur in the public-facing * side of the site. */ - require_once plugin_dir_path(dirname(__FILE__)).'public/class-jwt-auth-public.php'; + require_once plugin_dir_path(dirname(__FILE__)) . 'public/class-jwt-auth-public.php'; $this->loader = new Jwt_Auth_Loader(); } @@ -141,8 +141,27 @@ private function define_public_hooks() $plugin_public = new Jwt_Auth_Public($this->get_plugin_name(), $this->get_version()); $this->loader->add_action('rest_api_init', $plugin_public, 'add_api_routes'); $this->loader->add_filter('rest_api_init', $plugin_public, 'add_cors_support'); - $this->loader->add_filter('determine_current_user', $plugin_public, 'determine_current_user', 10); - $this->loader->add_filter( 'rest_pre_dispatch', $plugin_public, 'rest_pre_dispatch', 10, 2 ); + $this->loader->add_filter('rest_pre_dispatch', $plugin_public, 'rest_pre_dispatch', 10, 2); + /** + * Gutenberg fix + * Now with Gutenberg the WP API usage is masive and most of the call are in the admin. + * The JWT token should be used only when the user is not logged in, aka remote calls. + * This validation search for the WordPress logged in cookie if exists the filter on + * the determine_current_user hook is not applied. + * + * @since 1.2.5 + */ + $is_user_logged_in = false; + foreach ($_COOKIE as $name => $value) { + if (strpos($name, 'wordpress_logged_in_') === 0) { + $is_user_logged_in = true; + break; + } + } + if (!$is_user_logged_in) { + $this->loader->add_filter('determine_current_user', $plugin_public, 'determine_current_user', 10); + + } } /** diff --git a/jwt-auth.php b/jwt-auth.php index 0b6ec53..641637e 100755 --- a/jwt-auth.php +++ b/jwt-auth.php @@ -15,7 +15,7 @@ * Plugin Name: JWT Authentication for WP-API * Plugin URI: https://enriquechavez.co * Description: Extends the WP REST API using JSON Web Tokens Authentication as an authentication method. - * Version: 1.2.4 + * Version: 1.2.5 * Author: Enrique Chavez * Author URI: https://enriquechavez.co * License: GPL-2.0+ diff --git a/public/class-jwt-auth-public.php b/public/class-jwt-auth-public.php index 2b00733..859ab76 100755 --- a/public/class-jwt-auth-public.php +++ b/public/class-jwt-auth-public.php @@ -64,7 +64,7 @@ public function __construct($plugin_name, $version) { $this->plugin_name = $plugin_name; $this->version = $version; - $this->namespace = $this->plugin_name.'/v'.intval($this->version); + $this->namespace = $this->plugin_name . '/v' . intval($this->version); } /** @@ -125,7 +125,7 @@ public function generate_token($request) if (is_wp_error($user)) { $error_code = $user->get_error_code(); return new WP_Error( - '[jwt_auth] '.$error_code, + '[jwt_auth] ' . $error_code, $user->get_error_message($error_code), array( 'status' => 403, @@ -184,7 +184,7 @@ public function determine_current_user($user) **/ $rest_api_slug = rest_get_url_prefix(); $valid_api_uri = strpos($_SERVER['REQUEST_URI'], $rest_api_slug); - if(!$valid_api_uri){ + if (!$valid_api_uri) { return $user; } @@ -226,12 +226,11 @@ public function validate_token($output = true) * Looking for the HTTP_AUTHORIZATION header, if not present just * return the user. */ - $auth = isset($_SERVER['HTTP_AUTHORIZATION']) ? $_SERVER['HTTP_AUTHORIZATION'] : false; - + $auth = isset($_SERVER['HTTP_AUTHORIZATION']) ? $_SERVER['HTTP_AUTHORIZATION'] : false; /* Double check for different auth header string (server dependent) */ if (!$auth) { - $auth = isset($_SERVER['REDIRECT_HTTP_AUTHORIZATION']) ? $_SERVER['REDIRECT_HTTP_AUTHORIZATION'] : false; + $auth = isset($_SERVER['REDIRECT_HTTP_AUTHORIZATION']) ? $_SERVER['REDIRECT_HTTP_AUTHORIZATION'] : false; } if (!$auth) { @@ -301,22 +300,22 @@ public function validate_token($output = true) return $token; } /** If the output is true return an answer to the request to show it */ - return array( - 'code' => 'jwt_auth_valid_token', - 'data' => array( - 'status' => 200, - ), - ); - } catch (Exception $e) { + return array( + 'code' => 'jwt_auth_valid_token', + 'data' => array( + 'status' => 200, + ), + ); + } catch (Exception $e) { /** Something is wrong trying to decode the token, send back the error */ - return new WP_Error( - 'jwt_auth_invalid_token', - $e->getMessage(), - array( - 'status' => 403, - ) - ); - } + return new WP_Error( + 'jwt_auth_invalid_token', + $e->getMessage(), + array( + 'status' => 403, + ) + ); + } } /** diff --git a/readme.txt b/readme.txt index db92f6f..d993dd9 100755 --- a/readme.txt +++ b/readme.txt @@ -4,9 +4,9 @@ Contributors: tmeister Donate link: https://enriquechavez.co Tags: wp-json, jwt, json web authentication, wp-api Requires at least: 4.2 -Tested up to: 4.8.1 +Tested up to: 5.0 Requires PHP: 5.3.0 -Stable tag: 1.2.4 +Stable tag: 1.2.5 License: GPLv2 or later License URI: http://www.gnu.org/licenses/gpl-2.0.html From afd96f959766dd2b81098cd3f22a48d0eb0b42b6 Mon Sep 17 00:00:00 2001 From: Enrique Chavez Date: Wed, 7 Nov 2018 10:44:19 -0600 Subject: [PATCH 03/79] Add Changelog Info --- readme.txt | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/readme.txt b/readme.txt index d993dd9..b047d12 100755 --- a/readme.txt +++ b/readme.txt @@ -341,6 +341,10 @@ $data = array( ###Please read how to configured the plugin https://wordpress.org/plugins/jwt-authentication-for-wp-rest-api/ == Changelog == += 1.2.5 = +* Add Gutenberg Compatibility +* More info (https://github.com/Tmeister/wp-api-jwt-auth/issues/126) + = 1.2.4 = * Update firebase/php-jwt to v5.0.0 ( https://github.com/firebase/php-jwt ) * Add Requires PHP Tag From c19bef401e64f7ba7654f66e04368fd727eab53c Mon Sep 17 00:00:00 2001 From: Andrzej Piotrowski Date: Thu, 7 Feb 2019 17:15:27 +0100 Subject: [PATCH 04/79] remove gutenberg hack which does not solve root of the problem --- includes/class-jwt-auth.php | 21 +-------------------- 1 file changed, 1 insertion(+), 20 deletions(-) diff --git a/includes/class-jwt-auth.php b/includes/class-jwt-auth.php index 411d9f7..f2d8705 100755 --- a/includes/class-jwt-auth.php +++ b/includes/class-jwt-auth.php @@ -142,26 +142,7 @@ private function define_public_hooks() $this->loader->add_action('rest_api_init', $plugin_public, 'add_api_routes'); $this->loader->add_filter('rest_api_init', $plugin_public, 'add_cors_support'); $this->loader->add_filter('rest_pre_dispatch', $plugin_public, 'rest_pre_dispatch', 10, 2); - /** - * Gutenberg fix - * Now with Gutenberg the WP API usage is masive and most of the call are in the admin. - * The JWT token should be used only when the user is not logged in, aka remote calls. - * This validation search for the WordPress logged in cookie if exists the filter on - * the determine_current_user hook is not applied. - * - * @since 1.2.5 - */ - $is_user_logged_in = false; - foreach ($_COOKIE as $name => $value) { - if (strpos($name, 'wordpress_logged_in_') === 0) { - $is_user_logged_in = true; - break; - } - } - if (!$is_user_logged_in) { - $this->loader->add_filter('determine_current_user', $plugin_public, 'determine_current_user', 10); - - } + $this->loader->add_filter('determine_current_user', $plugin_public, 'determine_current_user', 10); } /** From 2f25794bc61e7053553fef042b72893ed93fc644 Mon Sep 17 00:00:00 2001 From: Andrzej Piotrowski Date: Thu, 7 Feb 2019 17:26:41 +0100 Subject: [PATCH 05/79] do not use translations in token validation which runs on 'determine_current_user' hook, translation functions attempt to get user preferences resulting in run this hook again, what causes infinite loop --- public/class-jwt-auth-public.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/public/class-jwt-auth-public.php b/public/class-jwt-auth-public.php index 859ab76..bcfe2e1 100755 --- a/public/class-jwt-auth-public.php +++ b/public/class-jwt-auth-public.php @@ -236,7 +236,7 @@ public function validate_token($output = true) if (!$auth) { return new WP_Error( 'jwt_auth_no_auth_header', - __('Authorization header not found.', 'wp-api-jwt-auth'), + 'Authorization header not found.', array( 'status' => 403, ) @@ -251,7 +251,7 @@ public function validate_token($output = true) if (!$token) { return new WP_Error( 'jwt_auth_bad_auth_header', - __('Authorization header malformed.', 'wp-api-jwt-auth'), + 'Authorization header malformed.', array( 'status' => 403, ) @@ -263,7 +263,7 @@ public function validate_token($output = true) if (!$secret_key) { return new WP_Error( 'jwt_auth_bad_config', - __('JWT is not configurated properly, please contact the admin', 'wp-api-jwt-auth'), + 'JWT is not configurated properly, please contact the admin', array( 'status' => 403, ) @@ -278,7 +278,7 @@ public function validate_token($output = true) /** The iss do not match, return error */ return new WP_Error( 'jwt_auth_bad_iss', - __('The iss do not match with this server', 'wp-api-jwt-auth'), + 'The iss do not match with this server', array( 'status' => 403, ) @@ -289,7 +289,7 @@ public function validate_token($output = true) /** No user id in the token, abort!! */ return new WP_Error( 'jwt_auth_bad_request', - __('User ID not found in the token', 'wp-api-jwt-auth'), + 'User ID not found in the token', array( 'status' => 403, ) From df4f153749be5382ffa87fd79ef8cc5b8302a1e4 Mon Sep 17 00:00:00 2001 From: Enrique Chavez Date: Tue, 5 Mar 2019 17:50:02 -0600 Subject: [PATCH 06/79] Cookies && Token compatibility - Fix the root problem with gutenberg infinite loops and allow the token validation/generation if the WP cookie exists. - More info (https://github.com/Tmeister/wp-api-jwt-auth/pull/138) - Props: https://github.com/andrzejpiotrowski --- jwt-auth.php | 2 +- readme.txt | 13 ++++++++++--- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/jwt-auth.php b/jwt-auth.php index 641637e..3b5878a 100755 --- a/jwt-auth.php +++ b/jwt-auth.php @@ -15,7 +15,7 @@ * Plugin Name: JWT Authentication for WP-API * Plugin URI: https://enriquechavez.co * Description: Extends the WP REST API using JSON Web Tokens Authentication as an authentication method. - * Version: 1.2.5 + * Version: 1.2.6 * Author: Enrique Chavez * Author URI: https://enriquechavez.co * License: GPL-2.0+ diff --git a/readme.txt b/readme.txt index b047d12..fa45072 100755 --- a/readme.txt +++ b/readme.txt @@ -1,12 +1,12 @@ === JWT Authentication for WP REST API === Contributors: tmeister -Donate link: https://enriquechavez.co +Donate link: https://www.paypal.me/wpchavez Tags: wp-json, jwt, json web authentication, wp-api Requires at least: 4.2 -Tested up to: 5.0 +Tested up to: 5.1 Requires PHP: 5.3.0 -Stable tag: 1.2.5 +Stable tag: 1.2.6 License: GPLv2 or later License URI: http://www.gnu.org/licenses/gpl-2.0.html @@ -341,6 +341,13 @@ $data = array( ###Please read how to configured the plugin https://wordpress.org/plugins/jwt-authentication-for-wp-rest-api/ == Changelog == += 1.2.6 = +* Cookies && Token compatibility +* Fix the root problem with gutenberg infinite loops and allow the token validation/generation if the WP cookie exists. +* More info (https://github.com/Tmeister/wp-api-jwt-auth/pull/138) +* Props: https://github.com/andrzejpiotrowski + + = 1.2.5 = * Add Gutenberg Compatibility * More info (https://github.com/Tmeister/wp-api-jwt-auth/issues/126) From 96cd170a27b56aa1c1efbd11b415d5118d06715f Mon Sep 17 00:00:00 2001 From: Enrique Chavez Date: Thu, 5 Mar 2020 21:57:52 -0600 Subject: [PATCH 07/79] Create FUNDING.yml --- .github/FUNDING.yml | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 .github/FUNDING.yml diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 0000000..4b3694b --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,3 @@ +# These are supported funding model platforms + +patreon: tcoding From 1545143666166845475534cd56520d723cbffbf8 Mon Sep 17 00:00:00 2001 From: Enrique Chavez Date: Tue, 9 Feb 2021 19:22:25 -0600 Subject: [PATCH 08/79] Update Tested up to version --- readme.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/readme.txt b/readme.txt index fa45072..ed6b841 100755 --- a/readme.txt +++ b/readme.txt @@ -4,7 +4,7 @@ Contributors: tmeister Donate link: https://www.paypal.me/wpchavez Tags: wp-json, jwt, json web authentication, wp-api Requires at least: 4.2 -Tested up to: 5.1 +Tested up to: 5.6.1 Requires PHP: 5.3.0 Stable tag: 1.2.6 License: GPLv2 or later From fe525f03f86c8eb3cf4c620fd6bcd20b4aaa77e1 Mon Sep 17 00:00:00 2001 From: Enrique Chavez Date: Fri, 8 Jul 2022 15:29:53 -0500 Subject: [PATCH 09/79] Update txt file Tested up to bumped to 6.0 --- readme.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/readme.txt b/readme.txt index ed6b841..86c5b0d 100755 --- a/readme.txt +++ b/readme.txt @@ -4,7 +4,7 @@ Contributors: tmeister Donate link: https://www.paypal.me/wpchavez Tags: wp-json, jwt, json web authentication, wp-api Requires at least: 4.2 -Tested up to: 5.6.1 +Tested up to: 6.0 Requires PHP: 5.3.0 Stable tag: 1.2.6 License: GPLv2 or later From a295379a9c93180daff228ce2050a376dc17acab Mon Sep 17 00:00:00 2001 From: Enrique Chavez Date: Fri, 8 Jul 2022 15:34:49 -0500 Subject: [PATCH 10/79] Add dependabot.yml --- .github/dependabot.yml | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 .github/dependabot.yml diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..98f1e2b --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,11 @@ +# To get started with Dependabot version updates, you'll need to specify which +# package ecosystems to update and where the package manifests are located. +# Please see the documentation for all configuration options: +# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates + +version: 2 +updates: + - package-ecosystem: "composer" + directory: "/" + schedule: + interval: "weekly" From b0ab637cb00f2e41a39a22b0d69acd290bfb39ef Mon Sep 17 00:00:00 2001 From: bradmkjr Date: Wed, 17 Aug 2022 09:54:58 -0600 Subject: [PATCH 11/79] Update class-jwt-auth-public.php --- public/class-jwt-auth-public.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/public/class-jwt-auth-public.php b/public/class-jwt-auth-public.php index bcfe2e1..52bf64b 100755 --- a/public/class-jwt-auth-public.php +++ b/public/class-jwt-auth-public.php @@ -184,7 +184,8 @@ public function determine_current_user($user) **/ $rest_api_slug = rest_get_url_prefix(); $valid_api_uri = strpos($_SERVER['REQUEST_URI'], $rest_api_slug); - if (!$valid_api_uri) { + // if already valid user or invalid url, don't attempt to validate token + if ( !$valid_api_uri || $user ) { return $user; } From 95c3ca09c6c78e65e1b01fc6773d4bd1f95a9b8e Mon Sep 17 00:00:00 2001 From: 5baddi Date: Sat, 27 Aug 2022 14:02:22 +0100 Subject: [PATCH 12/79] fix: missing required `permission_callback` argument --- public/class-jwt-auth-public.php | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/public/class-jwt-auth-public.php b/public/class-jwt-auth-public.php index bcfe2e1..007da76 100755 --- a/public/class-jwt-auth-public.php +++ b/public/class-jwt-auth-public.php @@ -73,13 +73,15 @@ public function __construct($plugin_name, $version) public function add_api_routes() { register_rest_route($this->namespace, 'token', array( - 'methods' => 'POST', - 'callback' => array($this, 'generate_token'), + 'methods' => 'POST', + 'callback' => array($this, 'generate_token'), + 'permission_callback' => '__return_true', )); register_rest_route($this->namespace, 'token/validate', array( - 'methods' => 'POST', - 'callback' => array($this, 'validate_token'), + 'methods' => 'POST', + 'callback' => array($this, 'validate_token'), + 'permission_callback' => '__return_true', )); } From 7756bdae68fe4110bdd07724c30437bc1aead108 Mon Sep 17 00:00:00 2001 From: Tmeister Date: Tue, 20 Sep 2022 20:53:57 -0500 Subject: [PATCH 13/79] Update firebase/php-jw to the latest version 6.3 - Update encode and decode function to use the new arguments - Add a new filter to change the algorithm used, default HS256 --- composer.json | 11 +- composer.lock | 1697 ++--------------- includes/vendor/autoload.php | 5 + includes/vendor/composer/ClassLoader.php | 165 +- .../vendor/composer/InstalledVersions.php | 352 ++++ .../vendor/composer/autoload_classmap.php | 3 +- .../vendor/composer/autoload_namespaces.php | 2 +- includes/vendor/composer/autoload_psr4.php | 3 +- includes/vendor/composer/autoload_real.php | 30 +- includes/vendor/composer/autoload_static.php | 13 + includes/vendor/composer/installed.json | 273 ++- includes/vendor/composer/installed.php | 53 + .../workflows/continuous-integration.yml | 76 + .../installers/.github/workflows/lint.yml | 30 + .../installers/.github/workflows/phpstan.yml | 51 + includes/vendor/composer/installers/LICENSE | 19 + .../vendor/composer/installers/composer.json | 122 ++ .../composer/installers/phpstan.neon.dist | 10 + .../src/Composer/Installers/AglInstaller.php | 21 + .../Composer/Installers/AimeosInstaller.php | 9 + .../Installers/AnnotateCmsInstaller.php | 11 + .../Composer/Installers/AsgardInstaller.php | 49 + .../Composer/Installers/AttogramInstaller.php | 9 + .../src/Composer/Installers/BaseInstaller.php | 137 ++ .../Composer/Installers/BitrixInstaller.php | 126 ++ .../Composer/Installers/BonefishInstaller.php | 9 + .../Composer/Installers/CakePHPInstaller.php | 66 + .../src/Composer/Installers/ChefInstaller.php | 11 + .../Composer/Installers/CiviCrmInstaller.php | 9 + .../Installers/ClanCatsFrameworkInstaller.php | 10 + .../Composer/Installers/CockpitInstaller.php | 32 + .../Installers/CodeIgniterInstaller.php | 11 + .../Installers/Concrete5Installer.php | 13 + .../Composer/Installers/CraftInstaller.php | 35 + .../Composer/Installers/CroogoInstaller.php | 21 + .../Composer/Installers/DecibelInstaller.php | 10 + .../Composer/Installers/DframeInstaller.php | 10 + .../Composer/Installers/DokuWikiInstaller.php | 50 + .../Composer/Installers/DolibarrInstaller.php | 16 + .../Composer/Installers/DrupalInstaller.php | 22 + .../src/Composer/Installers/ElggInstaller.php | 9 + .../Composer/Installers/EliasisInstaller.php | 12 + .../Installers/ExpressionEngineInstaller.php | 29 + .../Installers/EzPlatformInstaller.php | 10 + .../src/Composer/Installers/FuelInstaller.php | 11 + .../Composer/Installers/FuelphpInstaller.php | 9 + .../src/Composer/Installers/GravInstaller.php | 30 + .../Composer/Installers/HuradInstaller.php | 25 + .../Composer/Installers/ImageCMSInstaller.php | 11 + .../src/Composer/Installers/Installer.php | 298 +++ .../src/Composer/Installers/ItopInstaller.php | 9 + .../Composer/Installers/JoomlaInstaller.php | 15 + .../Composer/Installers/KanboardInstaller.php | 18 + .../Composer/Installers/KirbyInstaller.php | 11 + .../Composer/Installers/KnownInstaller.php | 11 + .../Composer/Installers/KodiCMSInstaller.php | 10 + .../Composer/Installers/KohanaInstaller.php | 9 + .../LanManagementSystemInstaller.php | 27 + .../Composer/Installers/LaravelInstaller.php | 9 + .../Composer/Installers/LavaLiteInstaller.php | 10 + .../Composer/Installers/LithiumInstaller.php | 10 + .../Installers/MODULEWorkInstaller.php | 9 + .../Composer/Installers/MODXEvoInstaller.php | 16 + .../Composer/Installers/MagentoInstaller.php | 11 + .../Composer/Installers/MajimaInstaller.php | 37 + .../src/Composer/Installers/MakoInstaller.php | 9 + .../Composer/Installers/MantisBTInstaller.php | 23 + .../Composer/Installers/MauticInstaller.php | 48 + .../src/Composer/Installers/MayaInstaller.php | 33 + .../Installers/MediaWikiInstaller.php | 51 + .../Composer/Installers/MiaoxingInstaller.php | 10 + .../Installers/MicroweberInstaller.php | 119 ++ .../src/Composer/Installers/ModxInstaller.php | 12 + .../Composer/Installers/MoodleInstaller.php | 59 + .../Composer/Installers/OctoberInstaller.php | 48 + .../Composer/Installers/OntoWikiInstaller.php | 24 + .../Composer/Installers/OsclassInstaller.php | 14 + .../src/Composer/Installers/OxidInstaller.php | 59 + .../src/Composer/Installers/PPIInstaller.php | 9 + .../Composer/Installers/PantheonInstaller.php | 12 + .../Composer/Installers/PhiftyInstaller.php | 11 + .../Composer/Installers/PhpBBInstaller.php | 11 + .../Composer/Installers/PimcoreInstaller.php | 21 + .../Composer/Installers/PiwikInstaller.php | 32 + .../Installers/PlentymarketsInstaller.php | 29 + .../src/Composer/Installers/Plugin.php | 27 + .../Composer/Installers/PortoInstaller.php | 9 + .../Installers/PrestashopInstaller.php | 10 + .../Installers/ProcessWireInstaller.php | 22 + .../Composer/Installers/PuppetInstaller.php | 11 + .../Composer/Installers/PxcmsInstaller.php | 63 + .../Composer/Installers/RadPHPInstaller.php | 24 + .../Composer/Installers/ReIndexInstaller.php | 10 + .../Composer/Installers/Redaxo5Installer.php | 10 + .../Composer/Installers/RedaxoInstaller.php | 10 + .../Installers/RoundcubeInstaller.php | 22 + .../src/Composer/Installers/SMFInstaller.php | 10 + .../Composer/Installers/ShopwareInstaller.php | 60 + .../Installers/SilverStripeInstaller.php | 35 + .../Installers/SiteDirectInstaller.php | 25 + .../Composer/Installers/StarbugInstaller.php | 12 + .../Composer/Installers/SyDESInstaller.php | 47 + .../Composer/Installers/SyliusInstaller.php | 9 + .../Composer/Installers/Symfony1Installer.php | 26 + .../Composer/Installers/TYPO3CmsInstaller.php | 16 + .../Installers/TYPO3FlowInstaller.php | 38 + .../src/Composer/Installers/TaoInstaller.php | 30 + .../Installers/TastyIgniterInstaller.php | 32 + .../Composer/Installers/TheliaInstaller.php | 12 + .../src/Composer/Installers/TuskInstaller.php | 14 + .../Installers/UserFrostingInstaller.php | 9 + .../Composer/Installers/VanillaInstaller.php | 10 + .../Composer/Installers/VgmcpInstaller.php | 49 + .../Composer/Installers/WHMCSInstaller.php | 21 + .../Composer/Installers/WinterInstaller.php | 58 + .../Composer/Installers/WolfCMSInstaller.php | 9 + .../Installers/WordPressInstaller.php | 12 + .../Composer/Installers/YawikInstaller.php | 32 + .../src/Composer/Installers/ZendInstaller.php | 11 + .../Composer/Installers/ZikulaInstaller.php | 10 + .../composer/installers/src/bootstrap.php | 13 + includes/vendor/composer/platform_check.php | 26 + includes/vendor/firebase/php-jwt/LICENSE | 2 +- includes/vendor/firebase/php-jwt/README.md | 221 ++- .../vendor/firebase/php-jwt/composer.json | 16 +- .../php-jwt/src/BeforeValidException.php | 2 +- .../firebase/php-jwt/src/CachedKeySet.php | 229 +++ .../firebase/php-jwt/src/ExpiredException.php | 2 +- includes/vendor/firebase/php-jwt/src/JWK.php | 322 ++++ includes/vendor/firebase/php-jwt/src/JWT.php | 526 +++-- includes/vendor/firebase/php-jwt/src/Key.php | 64 + .../php-jwt/src/SignatureInvalidException.php | 2 +- public/class-jwt-auth-public.php | 54 +- 133 files changed, 5347 insertions(+), 1829 deletions(-) create mode 100644 includes/vendor/composer/InstalledVersions.php create mode 100644 includes/vendor/composer/installed.php create mode 100644 includes/vendor/composer/installers/.github/workflows/continuous-integration.yml create mode 100644 includes/vendor/composer/installers/.github/workflows/lint.yml create mode 100644 includes/vendor/composer/installers/.github/workflows/phpstan.yml create mode 100644 includes/vendor/composer/installers/LICENSE create mode 100644 includes/vendor/composer/installers/composer.json create mode 100644 includes/vendor/composer/installers/phpstan.neon.dist create mode 100644 includes/vendor/composer/installers/src/Composer/Installers/AglInstaller.php create mode 100644 includes/vendor/composer/installers/src/Composer/Installers/AimeosInstaller.php create mode 100644 includes/vendor/composer/installers/src/Composer/Installers/AnnotateCmsInstaller.php create mode 100644 includes/vendor/composer/installers/src/Composer/Installers/AsgardInstaller.php create mode 100644 includes/vendor/composer/installers/src/Composer/Installers/AttogramInstaller.php create mode 100644 includes/vendor/composer/installers/src/Composer/Installers/BaseInstaller.php create mode 100644 includes/vendor/composer/installers/src/Composer/Installers/BitrixInstaller.php create mode 100644 includes/vendor/composer/installers/src/Composer/Installers/BonefishInstaller.php create mode 100644 includes/vendor/composer/installers/src/Composer/Installers/CakePHPInstaller.php create mode 100644 includes/vendor/composer/installers/src/Composer/Installers/ChefInstaller.php create mode 100644 includes/vendor/composer/installers/src/Composer/Installers/CiviCrmInstaller.php create mode 100644 includes/vendor/composer/installers/src/Composer/Installers/ClanCatsFrameworkInstaller.php create mode 100644 includes/vendor/composer/installers/src/Composer/Installers/CockpitInstaller.php create mode 100644 includes/vendor/composer/installers/src/Composer/Installers/CodeIgniterInstaller.php create mode 100644 includes/vendor/composer/installers/src/Composer/Installers/Concrete5Installer.php create mode 100644 includes/vendor/composer/installers/src/Composer/Installers/CraftInstaller.php create mode 100644 includes/vendor/composer/installers/src/Composer/Installers/CroogoInstaller.php create mode 100644 includes/vendor/composer/installers/src/Composer/Installers/DecibelInstaller.php create mode 100644 includes/vendor/composer/installers/src/Composer/Installers/DframeInstaller.php create mode 100644 includes/vendor/composer/installers/src/Composer/Installers/DokuWikiInstaller.php create mode 100644 includes/vendor/composer/installers/src/Composer/Installers/DolibarrInstaller.php create mode 100644 includes/vendor/composer/installers/src/Composer/Installers/DrupalInstaller.php create mode 100644 includes/vendor/composer/installers/src/Composer/Installers/ElggInstaller.php create mode 100644 includes/vendor/composer/installers/src/Composer/Installers/EliasisInstaller.php create mode 100644 includes/vendor/composer/installers/src/Composer/Installers/ExpressionEngineInstaller.php create mode 100644 includes/vendor/composer/installers/src/Composer/Installers/EzPlatformInstaller.php create mode 100644 includes/vendor/composer/installers/src/Composer/Installers/FuelInstaller.php create mode 100644 includes/vendor/composer/installers/src/Composer/Installers/FuelphpInstaller.php create mode 100644 includes/vendor/composer/installers/src/Composer/Installers/GravInstaller.php create mode 100644 includes/vendor/composer/installers/src/Composer/Installers/HuradInstaller.php create mode 100644 includes/vendor/composer/installers/src/Composer/Installers/ImageCMSInstaller.php create mode 100644 includes/vendor/composer/installers/src/Composer/Installers/Installer.php create mode 100644 includes/vendor/composer/installers/src/Composer/Installers/ItopInstaller.php create mode 100644 includes/vendor/composer/installers/src/Composer/Installers/JoomlaInstaller.php create mode 100644 includes/vendor/composer/installers/src/Composer/Installers/KanboardInstaller.php create mode 100644 includes/vendor/composer/installers/src/Composer/Installers/KirbyInstaller.php create mode 100644 includes/vendor/composer/installers/src/Composer/Installers/KnownInstaller.php create mode 100644 includes/vendor/composer/installers/src/Composer/Installers/KodiCMSInstaller.php create mode 100644 includes/vendor/composer/installers/src/Composer/Installers/KohanaInstaller.php create mode 100644 includes/vendor/composer/installers/src/Composer/Installers/LanManagementSystemInstaller.php create mode 100644 includes/vendor/composer/installers/src/Composer/Installers/LaravelInstaller.php create mode 100644 includes/vendor/composer/installers/src/Composer/Installers/LavaLiteInstaller.php create mode 100644 includes/vendor/composer/installers/src/Composer/Installers/LithiumInstaller.php create mode 100644 includes/vendor/composer/installers/src/Composer/Installers/MODULEWorkInstaller.php create mode 100644 includes/vendor/composer/installers/src/Composer/Installers/MODXEvoInstaller.php create mode 100644 includes/vendor/composer/installers/src/Composer/Installers/MagentoInstaller.php create mode 100644 includes/vendor/composer/installers/src/Composer/Installers/MajimaInstaller.php create mode 100644 includes/vendor/composer/installers/src/Composer/Installers/MakoInstaller.php create mode 100644 includes/vendor/composer/installers/src/Composer/Installers/MantisBTInstaller.php create mode 100644 includes/vendor/composer/installers/src/Composer/Installers/MauticInstaller.php create mode 100644 includes/vendor/composer/installers/src/Composer/Installers/MayaInstaller.php create mode 100644 includes/vendor/composer/installers/src/Composer/Installers/MediaWikiInstaller.php create mode 100644 includes/vendor/composer/installers/src/Composer/Installers/MiaoxingInstaller.php create mode 100644 includes/vendor/composer/installers/src/Composer/Installers/MicroweberInstaller.php create mode 100644 includes/vendor/composer/installers/src/Composer/Installers/ModxInstaller.php create mode 100644 includes/vendor/composer/installers/src/Composer/Installers/MoodleInstaller.php create mode 100644 includes/vendor/composer/installers/src/Composer/Installers/OctoberInstaller.php create mode 100644 includes/vendor/composer/installers/src/Composer/Installers/OntoWikiInstaller.php create mode 100644 includes/vendor/composer/installers/src/Composer/Installers/OsclassInstaller.php create mode 100644 includes/vendor/composer/installers/src/Composer/Installers/OxidInstaller.php create mode 100644 includes/vendor/composer/installers/src/Composer/Installers/PPIInstaller.php create mode 100644 includes/vendor/composer/installers/src/Composer/Installers/PantheonInstaller.php create mode 100644 includes/vendor/composer/installers/src/Composer/Installers/PhiftyInstaller.php create mode 100644 includes/vendor/composer/installers/src/Composer/Installers/PhpBBInstaller.php create mode 100644 includes/vendor/composer/installers/src/Composer/Installers/PimcoreInstaller.php create mode 100644 includes/vendor/composer/installers/src/Composer/Installers/PiwikInstaller.php create mode 100644 includes/vendor/composer/installers/src/Composer/Installers/PlentymarketsInstaller.php create mode 100644 includes/vendor/composer/installers/src/Composer/Installers/Plugin.php create mode 100644 includes/vendor/composer/installers/src/Composer/Installers/PortoInstaller.php create mode 100644 includes/vendor/composer/installers/src/Composer/Installers/PrestashopInstaller.php create mode 100644 includes/vendor/composer/installers/src/Composer/Installers/ProcessWireInstaller.php create mode 100644 includes/vendor/composer/installers/src/Composer/Installers/PuppetInstaller.php create mode 100644 includes/vendor/composer/installers/src/Composer/Installers/PxcmsInstaller.php create mode 100644 includes/vendor/composer/installers/src/Composer/Installers/RadPHPInstaller.php create mode 100644 includes/vendor/composer/installers/src/Composer/Installers/ReIndexInstaller.php create mode 100644 includes/vendor/composer/installers/src/Composer/Installers/Redaxo5Installer.php create mode 100644 includes/vendor/composer/installers/src/Composer/Installers/RedaxoInstaller.php create mode 100644 includes/vendor/composer/installers/src/Composer/Installers/RoundcubeInstaller.php create mode 100644 includes/vendor/composer/installers/src/Composer/Installers/SMFInstaller.php create mode 100644 includes/vendor/composer/installers/src/Composer/Installers/ShopwareInstaller.php create mode 100644 includes/vendor/composer/installers/src/Composer/Installers/SilverStripeInstaller.php create mode 100644 includes/vendor/composer/installers/src/Composer/Installers/SiteDirectInstaller.php create mode 100644 includes/vendor/composer/installers/src/Composer/Installers/StarbugInstaller.php create mode 100644 includes/vendor/composer/installers/src/Composer/Installers/SyDESInstaller.php create mode 100644 includes/vendor/composer/installers/src/Composer/Installers/SyliusInstaller.php create mode 100644 includes/vendor/composer/installers/src/Composer/Installers/Symfony1Installer.php create mode 100644 includes/vendor/composer/installers/src/Composer/Installers/TYPO3CmsInstaller.php create mode 100644 includes/vendor/composer/installers/src/Composer/Installers/TYPO3FlowInstaller.php create mode 100644 includes/vendor/composer/installers/src/Composer/Installers/TaoInstaller.php create mode 100644 includes/vendor/composer/installers/src/Composer/Installers/TastyIgniterInstaller.php create mode 100644 includes/vendor/composer/installers/src/Composer/Installers/TheliaInstaller.php create mode 100644 includes/vendor/composer/installers/src/Composer/Installers/TuskInstaller.php create mode 100644 includes/vendor/composer/installers/src/Composer/Installers/UserFrostingInstaller.php create mode 100644 includes/vendor/composer/installers/src/Composer/Installers/VanillaInstaller.php create mode 100644 includes/vendor/composer/installers/src/Composer/Installers/VgmcpInstaller.php create mode 100644 includes/vendor/composer/installers/src/Composer/Installers/WHMCSInstaller.php create mode 100644 includes/vendor/composer/installers/src/Composer/Installers/WinterInstaller.php create mode 100644 includes/vendor/composer/installers/src/Composer/Installers/WolfCMSInstaller.php create mode 100644 includes/vendor/composer/installers/src/Composer/Installers/WordPressInstaller.php create mode 100644 includes/vendor/composer/installers/src/Composer/Installers/YawikInstaller.php create mode 100644 includes/vendor/composer/installers/src/Composer/Installers/ZendInstaller.php create mode 100644 includes/vendor/composer/installers/src/Composer/Installers/ZikulaInstaller.php create mode 100644 includes/vendor/composer/installers/src/bootstrap.php create mode 100644 includes/vendor/composer/platform_check.php create mode 100644 includes/vendor/firebase/php-jwt/src/CachedKeySet.php create mode 100644 includes/vendor/firebase/php-jwt/src/JWK.php create mode 100644 includes/vendor/firebase/php-jwt/src/Key.php diff --git a/composer.json b/composer.json index ff86bc6..00c5ed0 100644 --- a/composer.json +++ b/composer.json @@ -15,15 +15,14 @@ "source": "https://github.com/Tmeister/wp-api-jwt-auth/" }, "config": { - "vendor-dir": "includes/vendor" + "vendor-dir": "includes/vendor", + "allow-plugins": { + "composer/installers": true + } }, "require": { "php": ">=5.3", "composer/installers": "~1.0", - "firebase/php-jwt": "^5.0.0" - }, - "require-dev": { - "phpunit/phpunit": "^5.2", - "guzzlehttp/guzzle": "^6.1" + "firebase/php-jwt": "^6.3" } } diff --git a/composer.lock b/composer.lock index 1ea6c0e..80d0016 100644 --- a/composer.lock +++ b/composer.lock @@ -1,92 +1,50 @@ { "_readme": [ "This file locks the dependencies of your project to a known state", - "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "975fa7e89f33924a53e61aef52eaa5e3", + "content-hash": "2664848c237e209d59c46d6374795bfd", "packages": [ { - "name": "firebase/php-jwt", - "version": "v5.0.0", + "name": "composer/installers", + "version": "v1.12.0", "source": { "type": "git", - "url": "https://github.com/firebase/php-jwt.git", - "reference": "9984a4d3a32ae7673d6971ea00bae9d0a1abba0e" + "url": "https://github.com/composer/installers.git", + "reference": "d20a64ed3c94748397ff5973488761b22f6d3f19" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/firebase/php-jwt/zipball/9984a4d3a32ae7673d6971ea00bae9d0a1abba0e", - "reference": "9984a4d3a32ae7673d6971ea00bae9d0a1abba0e", + "url": "https://api.github.com/repos/composer/installers/zipball/d20a64ed3c94748397ff5973488761b22f6d3f19", + "reference": "d20a64ed3c94748397ff5973488761b22f6d3f19", "shasum": "" }, "require": { - "php": ">=5.3.0" - }, - "require-dev": { - "phpunit/phpunit": " 4.8.35" - }, - "type": "library", - "autoload": { - "psr-4": { - "Firebase\\JWT\\": "src" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Neuman Vong", - "email": "neuman+pear@twilio.com", - "role": "Developer" - }, - { - "name": "Anant Narayanan", - "email": "anant@php.net", - "role": "Developer" - } - ], - "description": "A simple library to encode and decode JSON Web Tokens (JWT) in PHP. Should conform to the current spec.", - "homepage": "https://github.com/firebase/php-jwt", - "time": "2017-06-27T22:17:23+00:00" - } - ], - "packages-dev": [ - { - "name": "doctrine/instantiator", - "version": "1.1.0", - "source": { - "type": "git", - "url": "https://github.com/doctrine/instantiator.git", - "reference": "185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/doctrine/instantiator/zipball/185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda", - "reference": "185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda", - "shasum": "" + "composer-plugin-api": "^1.0 || ^2.0" }, - "require": { - "php": "^7.1" + "replace": { + "roundcube/plugin-installer": "*", + "shama/baton": "*" }, "require-dev": { - "athletic/athletic": "~0.1.8", - "ext-pdo": "*", - "ext-phar": "*", - "phpunit/phpunit": "^6.2.3", - "squizlabs/php_codesniffer": "^3.0.2" + "composer/composer": "1.6.* || ^2.0", + "composer/semver": "^1 || ^3", + "phpstan/phpstan": "^0.12.55", + "phpstan/phpstan-phpunit": "^0.12.16", + "symfony/phpunit-bridge": "^4.2 || ^5", + "symfony/process": "^2.3" }, - "type": "library", + "type": "composer-plugin", "extra": { + "class": "Composer\\Installers\\Plugin", "branch-alias": { - "dev-master": "1.2.x-dev" + "dev-main": "1.x-dev" } }, "autoload": { "psr-4": { - "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" + "Composer\\Installers\\": "src/Composer/Installers" } }, "notification-url": "https://packagist.org/downloads/", @@ -95,1515 +53,182 @@ ], "authors": [ { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com", - "homepage": "http://ocramius.github.com/" - } - ], - "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", - "homepage": "https://github.com/doctrine/instantiator", - "keywords": [ - "constructor", - "instantiate" - ], - "time": "2017-07-22T11:58:36+00:00" + "name": "Kyle Robinson Young", + "email": "kyle@dontkry.com", + "homepage": "https://github.com/shama" + } + ], + "description": "A multi-framework Composer library installer", + "homepage": "https://composer.github.io/installers/", + "keywords": [ + "Craft", + "Dolibarr", + "Eliasis", + "Hurad", + "ImageCMS", + "Kanboard", + "Lan Management System", + "MODX Evo", + "MantisBT", + "Mautic", + "Maya", + "OXID", + "Plentymarkets", + "Porto", + "RadPHP", + "SMF", + "Starbug", + "Thelia", + "Whmcs", + "WolfCMS", + "agl", + "aimeos", + "annotatecms", + "attogram", + "bitrix", + "cakephp", + "chef", + "cockpit", + "codeigniter", + "concrete5", + "croogo", + "dokuwiki", + "drupal", + "eZ Platform", + "elgg", + "expressionengine", + "fuelphp", + "grav", + "installer", + "itop", + "joomla", + "known", + "kohana", + "laravel", + "lavalite", + "lithium", + "magento", + "majima", + "mako", + "mediawiki", + "miaoxing", + "modulework", + "modx", + "moodle", + "osclass", + "pantheon", + "phpbb", + "piwik", + "ppi", + "processwire", + "puppet", + "pxcms", + "reindex", + "roundcube", + "shopware", + "silverstripe", + "sydes", + "sylius", + "symfony", + "tastyigniter", + "typo3", + "wordpress", + "yawik", + "zend", + "zikula" + ], + "support": { + "issues": "https://github.com/composer/installers/issues", + "source": "https://github.com/composer/installers/tree/v1.12.0" + }, + "funding": [ + { + "url": "https://packagist.com/", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2021-09-13T08:19:44+00:00" }, { - "name": "guzzlehttp/guzzle", - "version": "6.3.0", + "name": "firebase/php-jwt", + "version": "v6.3.0", "source": { "type": "git", - "url": "https://github.com/guzzle/guzzle.git", - "reference": "f4db5a78a5ea468d4831de7f0bf9d9415e348699" + "url": "https://github.com/firebase/php-jwt.git", + "reference": "018dfc4e1da92ad8a1b90adc4893f476a3b41cb8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/guzzle/guzzle/zipball/f4db5a78a5ea468d4831de7f0bf9d9415e348699", - "reference": "f4db5a78a5ea468d4831de7f0bf9d9415e348699", + "url": "https://api.github.com/repos/firebase/php-jwt/zipball/018dfc4e1da92ad8a1b90adc4893f476a3b41cb8", + "reference": "018dfc4e1da92ad8a1b90adc4893f476a3b41cb8", "shasum": "" }, "require": { - "guzzlehttp/promises": "^1.0", - "guzzlehttp/psr7": "^1.4", - "php": ">=5.5" + "php": "^7.1||^8.0" }, "require-dev": { - "ext-curl": "*", - "phpunit/phpunit": "^4.0 || ^5.0", - "psr/log": "^1.0" + "guzzlehttp/guzzle": "^6.5||^7.4", + "phpspec/prophecy-phpunit": "^1.1", + "phpunit/phpunit": "^7.5||^9.5", + "psr/cache": "^1.0||^2.0", + "psr/http-client": "^1.0", + "psr/http-factory": "^1.0" }, "suggest": { - "psr/log": "Required for using the Log middleware" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "6.2-dev" - } - }, - "autoload": { - "files": [ - "src/functions_include.php" - ], - "psr-4": { - "GuzzleHttp\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - } - ], - "description": "Guzzle is a PHP HTTP client library", - "homepage": "http://guzzlephp.org/", - "keywords": [ - "client", - "curl", - "framework", - "http", - "http client", - "rest", - "web service" - ], - "time": "2017-06-22T18:50:49+00:00" - }, - { - "name": "guzzlehttp/promises", - "version": "v1.3.1", - "source": { - "type": "git", - "url": "https://github.com/guzzle/promises.git", - "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/guzzle/promises/zipball/a59da6cf61d80060647ff4d3eb2c03a2bc694646", - "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646", - "shasum": "" - }, - "require": { - "php": ">=5.5.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.0" + "paragonie/sodium_compat": "Support EdDSA (Ed25519) signatures when libsodium is not present" }, "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.4-dev" - } - }, "autoload": { "psr-4": { - "GuzzleHttp\\Promise\\": "src/" - }, - "files": [ - "src/functions_include.php" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" - } - ], - "description": "Guzzle promises library", - "keywords": [ - "promise" - ], - "time": "2016-12-20T10:07:11+00:00" - }, - { - "name": "guzzlehttp/psr7", - "version": "1.4.2", - "source": { - "type": "git", - "url": "https://github.com/guzzle/psr7.git", - "reference": "f5b8a8512e2b58b0071a7280e39f14f72e05d87c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/guzzle/psr7/zipball/f5b8a8512e2b58b0071a7280e39f14f72e05d87c", - "reference": "f5b8a8512e2b58b0071a7280e39f14f72e05d87c", - "shasum": "" - }, - "require": { - "php": ">=5.4.0", - "psr/http-message": "~1.0" - }, - "provide": { - "psr/http-message-implementation": "1.0" - }, - "require-dev": { - "phpunit/phpunit": "~4.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.4-dev" + "Firebase\\JWT\\": "src" } }, - "autoload": { - "psr-4": { - "GuzzleHttp\\Psr7\\": "src/" - }, - "files": [ - "src/functions_include.php" - ] - }, "notification-url": "https://packagist.org/downloads/", "license": [ - "MIT" + "BSD-3-Clause" ], "authors": [ { - "name": "Michael Dowling", - "email": "mtdowling@gmail.com", - "homepage": "https://github.com/mtdowling" + "name": "Neuman Vong", + "email": "neuman+pear@twilio.com", + "role": "Developer" }, { - "name": "Tobias Schultze", - "homepage": "https://github.com/Tobion" - } - ], - "description": "PSR-7 message implementation that also provides common utility methods", - "keywords": [ - "http", - "message", - "request", - "response", - "stream", - "uri", - "url" - ], - "time": "2017-03-20T17:10:46+00:00" - }, - { - "name": "myclabs/deep-copy", - "version": "1.6.1", - "source": { - "type": "git", - "url": "https://github.com/myclabs/DeepCopy.git", - "reference": "8e6e04167378abf1ddb4d3522d8755c5fd90d102" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/8e6e04167378abf1ddb4d3522d8755c5fd90d102", - "reference": "8e6e04167378abf1ddb4d3522d8755c5fd90d102", - "shasum": "" - }, - "require": { - "php": ">=5.4.0" - }, - "require-dev": { - "doctrine/collections": "1.*", - "phpunit/phpunit": "~4.1" - }, - "type": "library", - "autoload": { - "psr-4": { - "DeepCopy\\": "src/DeepCopy/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "description": "Create deep copies (clones) of your objects", - "homepage": "https://github.com/myclabs/DeepCopy", - "keywords": [ - "clone", - "copy", - "duplicate", - "object", - "object graph" - ], - "time": "2017-04-12T18:52:22+00:00" - }, - { - "name": "phpdocumentor/reflection-common", - "version": "1.0", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionCommon.git", - "reference": "144c307535e82c8fdcaacbcfc1d6d8eeb896687c" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/144c307535e82c8fdcaacbcfc1d6d8eeb896687c", - "reference": "144c307535e82c8fdcaacbcfc1d6d8eeb896687c", - "shasum": "" - }, - "require": { - "php": ">=5.5" - }, - "require-dev": { - "phpunit/phpunit": "^4.6" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": [ - "src" - ] - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Jaap van Otterdijk", - "email": "opensource@ijaap.nl" + "name": "Anant Narayanan", + "email": "anant@php.net", + "role": "Developer" } ], - "description": "Common reflection classes used by phpdocumentor to reflect the code structure", - "homepage": "http://www.phpdoc.org/", + "description": "A simple library to encode and decode JSON Web Tokens (JWT) in PHP. Should conform to the current spec.", + "homepage": "https://github.com/firebase/php-jwt", "keywords": [ - "FQSEN", - "phpDocumentor", - "phpdoc", - "reflection", - "static analysis" - ], - "time": "2015-12-27T11:43:31+00:00" - }, - { - "name": "phpdocumentor/reflection-docblock", - "version": "4.1.1", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", - "reference": "2d3d238c433cf69caeb4842e97a3223a116f94b2" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/2d3d238c433cf69caeb4842e97a3223a116f94b2", - "reference": "2d3d238c433cf69caeb4842e97a3223a116f94b2", - "shasum": "" - }, - "require": { - "php": "^7.0", - "phpdocumentor/reflection-common": "^1.0@dev", - "phpdocumentor/type-resolver": "^0.4.0", - "webmozart/assert": "^1.0" - }, - "require-dev": { - "mockery/mockery": "^0.9.4", - "phpunit/phpunit": "^4.4" - }, - "type": "library", - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": [ - "src/" - ] - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" - } - ], - "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", - "time": "2017-08-30T18:51:59+00:00" - }, - { - "name": "phpdocumentor/type-resolver", - "version": "0.4.0", - "source": { - "type": "git", - "url": "https://github.com/phpDocumentor/TypeResolver.git", - "reference": "9c977708995954784726e25d0cd1dddf4e65b0f7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/9c977708995954784726e25d0cd1dddf4e65b0f7", - "reference": "9c977708995954784726e25d0cd1dddf4e65b0f7", - "shasum": "" - }, - "require": { - "php": "^5.5 || ^7.0", - "phpdocumentor/reflection-common": "^1.0" - }, - "require-dev": { - "mockery/mockery": "^0.9.4", - "phpunit/phpunit": "^5.2||^4.8.24" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "phpDocumentor\\Reflection\\": [ - "src/" - ] - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Mike van Riel", - "email": "me@mikevanriel.com" - } + "jwt", + "php" ], - "time": "2017-07-14T14:27:02+00:00" - }, - { - "name": "phpspec/prophecy", - "version": "v1.7.2", - "source": { - "type": "git", - "url": "https://github.com/phpspec/prophecy.git", - "reference": "c9b8c6088acd19d769d4cc0ffa60a9fe34344bd6" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/c9b8c6088acd19d769d4cc0ffa60a9fe34344bd6", - "reference": "c9b8c6088acd19d769d4cc0ffa60a9fe34344bd6", - "shasum": "" - }, - "require": { - "doctrine/instantiator": "^1.0.2", - "php": "^5.3|^7.0", - "phpdocumentor/reflection-docblock": "^2.0|^3.0.2|^4.0", - "sebastian/comparator": "^1.1|^2.0", - "sebastian/recursion-context": "^1.0|^2.0|^3.0" + "support": { + "issues": "https://github.com/firebase/php-jwt/issues", + "source": "https://github.com/firebase/php-jwt/tree/v6.3.0" }, - "require-dev": { - "phpspec/phpspec": "^2.5|^3.2", - "phpunit/phpunit": "^4.8 || ^5.6.5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.7.x-dev" - } - }, - "autoload": { - "psr-0": { - "Prophecy\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Konstantin Kudryashov", - "email": "ever.zet@gmail.com", - "homepage": "http://everzet.com/" - }, - { - "name": "Marcello Duarte", - "email": "marcello.duarte@gmail.com" - } - ], - "description": "Highly opinionated mocking framework for PHP 5.3+", - "homepage": "https://github.com/phpspec/prophecy", - "keywords": [ - "Double", - "Dummy", - "fake", - "mock", - "spy", - "stub" - ], - "time": "2017-09-04T11:05:03+00:00" - }, - { - "name": "phpunit/php-code-coverage", - "version": "4.0.8", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "ef7b2f56815df854e66ceaee8ebe9393ae36a40d" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/ef7b2f56815df854e66ceaee8ebe9393ae36a40d", - "reference": "ef7b2f56815df854e66ceaee8ebe9393ae36a40d", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-xmlwriter": "*", - "php": "^5.6 || ^7.0", - "phpunit/php-file-iterator": "^1.3", - "phpunit/php-text-template": "^1.2", - "phpunit/php-token-stream": "^1.4.2 || ^2.0", - "sebastian/code-unit-reverse-lookup": "^1.0", - "sebastian/environment": "^1.3.2 || ^2.0", - "sebastian/version": "^1.0 || ^2.0" - }, - "require-dev": { - "ext-xdebug": "^2.1.4", - "phpunit/phpunit": "^5.7" - }, - "suggest": { - "ext-xdebug": "^2.5.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sb@sebastian-bergmann.de", - "role": "lead" - } - ], - "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", - "homepage": "https://github.com/sebastianbergmann/php-code-coverage", - "keywords": [ - "coverage", - "testing", - "xunit" - ], - "time": "2017-04-02T07:44:40+00:00" - }, - { - "name": "phpunit/php-file-iterator", - "version": "1.4.2", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "3cc8f69b3028d0f96a9078e6295d86e9bf019be5" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/3cc8f69b3028d0f96a9078e6295d86e9bf019be5", - "reference": "3cc8f69b3028d0f96a9078e6295d86e9bf019be5", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.4.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sb@sebastian-bergmann.de", - "role": "lead" - } - ], - "description": "FilterIterator implementation that filters files based on a list of suffixes.", - "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", - "keywords": [ - "filesystem", - "iterator" - ], - "time": "2016-10-03T07:40:28+00:00" - }, - { - "name": "phpunit/php-text-template", - "version": "1.2.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-text-template.git", - "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686", - "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "type": "library", - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Simple template engine.", - "homepage": "https://github.com/sebastianbergmann/php-text-template/", - "keywords": [ - "template" - ], - "time": "2015-06-21T13:50:34+00:00" - }, - { - "name": "phpunit/php-timer", - "version": "1.0.9", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-timer.git", - "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3dcf38ca72b158baf0bc245e9184d3fdffa9c46f", - "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f", - "shasum": "" - }, - "require": { - "php": "^5.3.3 || ^7.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sb@sebastian-bergmann.de", - "role": "lead" - } - ], - "description": "Utility class for timing", - "homepage": "https://github.com/sebastianbergmann/php-timer/", - "keywords": [ - "timer" - ], - "time": "2017-02-26T11:10:40+00:00" - }, - { - "name": "phpunit/php-token-stream", - "version": "2.0.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/php-token-stream.git", - "reference": "9a02332089ac48e704c70f6cefed30c224e3c0b0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/9a02332089ac48e704c70f6cefed30c224e3c0b0", - "reference": "9a02332089ac48e704c70f6cefed30c224e3c0b0", - "shasum": "" - }, - "require": { - "ext-tokenizer": "*", - "php": "^7.0" - }, - "require-dev": { - "phpunit/phpunit": "^6.2.4" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Wrapper around PHP's tokenizer extension.", - "homepage": "https://github.com/sebastianbergmann/php-token-stream/", - "keywords": [ - "tokenizer" - ], - "time": "2017-08-20T05:47:52+00:00" - }, - { - "name": "phpunit/phpunit", - "version": "5.7.21", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "3b91adfb64264ddec5a2dee9851f354aa66327db" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/3b91adfb64264ddec5a2dee9851f354aa66327db", - "reference": "3b91adfb64264ddec5a2dee9851f354aa66327db", - "shasum": "" - }, - "require": { - "ext-dom": "*", - "ext-json": "*", - "ext-libxml": "*", - "ext-mbstring": "*", - "ext-xml": "*", - "myclabs/deep-copy": "~1.3", - "php": "^5.6 || ^7.0", - "phpspec/prophecy": "^1.6.2", - "phpunit/php-code-coverage": "^4.0.4", - "phpunit/php-file-iterator": "~1.4", - "phpunit/php-text-template": "~1.2", - "phpunit/php-timer": "^1.0.6", - "phpunit/phpunit-mock-objects": "^3.2", - "sebastian/comparator": "^1.2.4", - "sebastian/diff": "^1.4.3", - "sebastian/environment": "^1.3.4 || ^2.0", - "sebastian/exporter": "~2.0", - "sebastian/global-state": "^1.1", - "sebastian/object-enumerator": "~2.0", - "sebastian/resource-operations": "~1.0", - "sebastian/version": "~1.0.3|~2.0", - "symfony/yaml": "~2.1|~3.0" - }, - "conflict": { - "phpdocumentor/reflection-docblock": "3.0.2" - }, - "require-dev": { - "ext-pdo": "*" - }, - "suggest": { - "ext-xdebug": "*", - "phpunit/php-invoker": "~1.1" - }, - "bin": [ - "phpunit" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "5.7.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "The PHP Unit Testing framework.", - "homepage": "https://phpunit.de/", - "keywords": [ - "phpunit", - "testing", - "xunit" - ], - "time": "2017-06-21T08:11:54+00:00" - }, - { - "name": "phpunit/phpunit-mock-objects", - "version": "3.4.4", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git", - "reference": "a23b761686d50a560cc56233b9ecf49597cc9118" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/a23b761686d50a560cc56233b9ecf49597cc9118", - "reference": "a23b761686d50a560cc56233b9ecf49597cc9118", - "shasum": "" - }, - "require": { - "doctrine/instantiator": "^1.0.2", - "php": "^5.6 || ^7.0", - "phpunit/php-text-template": "^1.2", - "sebastian/exporter": "^1.2 || ^2.0" - }, - "conflict": { - "phpunit/phpunit": "<5.4.0" - }, - "require-dev": { - "phpunit/phpunit": "^5.4" - }, - "suggest": { - "ext-soap": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.2.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sb@sebastian-bergmann.de", - "role": "lead" - } - ], - "description": "Mock Object library for PHPUnit", - "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/", - "keywords": [ - "mock", - "xunit" - ], - "time": "2017-06-30T09:13:00+00:00" - }, - { - "name": "psr/http-message", - "version": "1.0.1", - "source": { - "type": "git", - "url": "https://github.com/php-fig/http-message.git", - "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363", - "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Psr\\Http\\Message\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "PHP-FIG", - "homepage": "http://www.php-fig.org/" - } - ], - "description": "Common interface for HTTP messages", - "homepage": "https://github.com/php-fig/http-message", - "keywords": [ - "http", - "http-message", - "psr", - "psr-7", - "request", - "response" - ], - "time": "2016-08-06T14:39:51+00:00" - }, - { - "name": "sebastian/code-unit-reverse-lookup", - "version": "1.0.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", - "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", - "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18", - "shasum": "" - }, - "require": { - "php": "^5.6 || ^7.0" - }, - "require-dev": { - "phpunit/phpunit": "^5.7 || ^6.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Looks up which function or method a line of code belongs to", - "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", - "time": "2017-03-04T06:30:41+00:00" - }, - { - "name": "sebastian/comparator", - "version": "1.2.4", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/comparator.git", - "reference": "2b7424b55f5047b47ac6e5ccb20b2aea4011d9be" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/2b7424b55f5047b47ac6e5ccb20b2aea4011d9be", - "reference": "2b7424b55f5047b47ac6e5ccb20b2aea4011d9be", - "shasum": "" - }, - "require": { - "php": ">=5.3.3", - "sebastian/diff": "~1.2", - "sebastian/exporter": "~1.2 || ~2.0" - }, - "require-dev": { - "phpunit/phpunit": "~4.4" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.2.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Volker Dusch", - "email": "github@wallbash.com" - }, - { - "name": "Bernhard Schussek", - "email": "bschussek@2bepublished.at" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Provides the functionality to compare PHP values for equality", - "homepage": "http://www.github.com/sebastianbergmann/comparator", - "keywords": [ - "comparator", - "compare", - "equality" - ], - "time": "2017-01-29T09:50:25+00:00" - }, - { - "name": "sebastian/diff", - "version": "1.4.3", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/diff.git", - "reference": "7f066a26a962dbe58ddea9f72a4e82874a3975a4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/7f066a26a962dbe58ddea9f72a4e82874a3975a4", - "reference": "7f066a26a962dbe58ddea9f72a4e82874a3975a4", - "shasum": "" - }, - "require": { - "php": "^5.3.3 || ^7.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.4-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Kore Nordmann", - "email": "mail@kore-nordmann.de" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Diff implementation", - "homepage": "https://github.com/sebastianbergmann/diff", - "keywords": [ - "diff" - ], - "time": "2017-05-22T07:24:03+00:00" - }, - { - "name": "sebastian/environment", - "version": "2.0.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/environment.git", - "reference": "5795ffe5dc5b02460c3e34222fee8cbe245d8fac" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/5795ffe5dc5b02460c3e34222fee8cbe245d8fac", - "reference": "5795ffe5dc5b02460c3e34222fee8cbe245d8fac", - "shasum": "" - }, - "require": { - "php": "^5.6 || ^7.0" - }, - "require-dev": { - "phpunit/phpunit": "^5.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Provides functionality to handle HHVM/PHP environments", - "homepage": "http://www.github.com/sebastianbergmann/environment", - "keywords": [ - "Xdebug", - "environment", - "hhvm" - ], - "time": "2016-11-26T07:53:53+00:00" - }, - { - "name": "sebastian/exporter", - "version": "2.0.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/exporter.git", - "reference": "ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4", - "reference": "ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4", - "shasum": "" - }, - "require": { - "php": ">=5.3.3", - "sebastian/recursion-context": "~2.0" - }, - "require-dev": { - "ext-mbstring": "*", - "phpunit/phpunit": "~4.4" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Volker Dusch", - "email": "github@wallbash.com" - }, - { - "name": "Bernhard Schussek", - "email": "bschussek@2bepublished.at" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Adam Harvey", - "email": "aharvey@php.net" - } - ], - "description": "Provides the functionality to export PHP variables for visualization", - "homepage": "http://www.github.com/sebastianbergmann/exporter", - "keywords": [ - "export", - "exporter" - ], - "time": "2016-11-19T08:54:04+00:00" - }, - { - "name": "sebastian/global-state", - "version": "1.1.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/global-state.git", - "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bc37d50fea7d017d3d340f230811c9f1d7280af4", - "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "phpunit/phpunit": "~4.2" - }, - "suggest": { - "ext-uopz": "*" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Snapshotting of global state", - "homepage": "http://www.github.com/sebastianbergmann/global-state", - "keywords": [ - "global state" - ], - "time": "2015-10-12T03:26:01+00:00" - }, - { - "name": "sebastian/object-enumerator", - "version": "2.0.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/object-enumerator.git", - "reference": "1311872ac850040a79c3c058bea3e22d0f09cbb7" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/1311872ac850040a79c3c058bea3e22d0f09cbb7", - "reference": "1311872ac850040a79c3c058bea3e22d0f09cbb7", - "shasum": "" - }, - "require": { - "php": ">=5.6", - "sebastian/recursion-context": "~2.0" - }, - "require-dev": { - "phpunit/phpunit": "~5" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Traverses array structures and object graphs to enumerate all referenced objects", - "homepage": "https://github.com/sebastianbergmann/object-enumerator/", - "time": "2017-02-18T15:18:39+00:00" - }, - { - "name": "sebastian/recursion-context", - "version": "2.0.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/recursion-context.git", - "reference": "2c3ba150cbec723aa057506e73a8d33bdb286c9a" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/2c3ba150cbec723aa057506e73a8d33bdb286c9a", - "reference": "2c3ba150cbec723aa057506e73a8d33bdb286c9a", - "shasum": "" - }, - "require": { - "php": ">=5.3.3" - }, - "require-dev": { - "phpunit/phpunit": "~4.4" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Jeff Welch", - "email": "whatthejeff@gmail.com" - }, - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - }, - { - "name": "Adam Harvey", - "email": "aharvey@php.net" - } - ], - "description": "Provides functionality to recursively process PHP variables", - "homepage": "http://www.github.com/sebastianbergmann/recursion-context", - "time": "2016-11-19T07:33:16+00:00" - }, - { - "name": "sebastian/resource-operations", - "version": "1.0.0", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/resource-operations.git", - "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/ce990bb21759f94aeafd30209e8cfcdfa8bc3f52", - "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52", - "shasum": "" - }, - "require": { - "php": ">=5.6.0" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de" - } - ], - "description": "Provides a list of PHP built-in functions that operate on resources", - "homepage": "https://www.github.com/sebastianbergmann/resource-operations", - "time": "2015-07-28T20:34:47+00:00" - }, - { - "name": "sebastian/version", - "version": "2.0.1", - "source": { - "type": "git", - "url": "https://github.com/sebastianbergmann/version.git", - "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019", - "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019", - "shasum": "" - }, - "require": { - "php": ">=5.6" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.0.x-dev" - } - }, - "autoload": { - "classmap": [ - "src/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Sebastian Bergmann", - "email": "sebastian@phpunit.de", - "role": "lead" - } - ], - "description": "Library that helps with managing the version number of Git-hosted PHP projects", - "homepage": "https://github.com/sebastianbergmann/version", - "time": "2016-10-03T07:35:21+00:00" - }, - { - "name": "symfony/yaml", - "version": "v3.3.8", - "source": { - "type": "git", - "url": "https://github.com/symfony/yaml.git", - "reference": "1d8c2a99c80862bdc3af94c1781bf70f86bccac0" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/1d8c2a99c80862bdc3af94c1781bf70f86bccac0", - "reference": "1d8c2a99c80862bdc3af94c1781bf70f86bccac0", - "shasum": "" - }, - "require": { - "php": "^5.5.9|>=7.0.8" - }, - "require-dev": { - "symfony/console": "~2.8|~3.0" - }, - "suggest": { - "symfony/console": "For validating YAML files using the lint command" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.3-dev" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Component\\Yaml\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Symfony Yaml Component", - "homepage": "https://symfony.com/", - "time": "2017-07-29T21:54:42+00:00" - }, - { - "name": "webmozart/assert", - "version": "1.2.0", - "source": { - "type": "git", - "url": "https://github.com/webmozart/assert.git", - "reference": "2db61e59ff05fe5126d152bd0655c9ea113e550f" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/webmozart/assert/zipball/2db61e59ff05fe5126d152bd0655c9ea113e550f", - "reference": "2db61e59ff05fe5126d152bd0655c9ea113e550f", - "shasum": "" - }, - "require": { - "php": "^5.3.3 || ^7.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.6", - "sebastian/version": "^1.0.1" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "1.3-dev" - } - }, - "autoload": { - "psr-4": { - "Webmozart\\Assert\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Bernhard Schussek", - "email": "bschussek@gmail.com" - } - ], - "description": "Assertions to validate method input/output with nice error messages.", - "keywords": [ - "assert", - "check", - "validate" - ], - "time": "2016-11-23T20:04:58+00:00" + "time": "2022-07-15T16:48:45+00:00" } ], + "packages-dev": [], "aliases": [], "minimum-stability": "stable", "stability-flags": [], "prefer-stable": false, "prefer-lowest": false, - "platform": [], - "platform-dev": [] + "platform": { + "php": ">=5.3" + }, + "platform-dev": [], + "plugin-api-version": "2.3.0" } diff --git a/includes/vendor/autoload.php b/includes/vendor/autoload.php index 049f748..4e9f2cf 100644 --- a/includes/vendor/autoload.php +++ b/includes/vendor/autoload.php @@ -2,6 +2,11 @@ // autoload.php @generated by Composer +if (PHP_VERSION_ID < 50600) { + echo 'Composer 2.3.0 dropped support for autoloading on PHP <5.6 and you are running '.PHP_VERSION.', please upgrade PHP or use Composer 2.2 LTS via "composer self-update --2.2". Aborting.'.PHP_EOL; + exit(1); +} + require_once __DIR__ . '/composer/autoload_real.php'; return ComposerAutoloaderInit6ba6ee55693d165c056f65e51c5383a5::getLoader(); diff --git a/includes/vendor/composer/ClassLoader.php b/includes/vendor/composer/ClassLoader.php index 2c72175..afef3fa 100644 --- a/includes/vendor/composer/ClassLoader.php +++ b/includes/vendor/composer/ClassLoader.php @@ -37,57 +37,130 @@ * * @author Fabien Potencier * @author Jordi Boggiano - * @see http://www.php-fig.org/psr/psr-0/ - * @see http://www.php-fig.org/psr/psr-4/ + * @see https://www.php-fig.org/psr/psr-0/ + * @see https://www.php-fig.org/psr/psr-4/ */ class ClassLoader { + /** @var ?string */ + private $vendorDir; + // PSR-4 + /** + * @var array[] + * @psalm-var array> + */ private $prefixLengthsPsr4 = array(); + /** + * @var array[] + * @psalm-var array> + */ private $prefixDirsPsr4 = array(); + /** + * @var array[] + * @psalm-var array + */ private $fallbackDirsPsr4 = array(); // PSR-0 + /** + * @var array[] + * @psalm-var array> + */ private $prefixesPsr0 = array(); + /** + * @var array[] + * @psalm-var array + */ private $fallbackDirsPsr0 = array(); + /** @var bool */ private $useIncludePath = false; + + /** + * @var string[] + * @psalm-var array + */ private $classMap = array(); + + /** @var bool */ private $classMapAuthoritative = false; + + /** + * @var bool[] + * @psalm-var array + */ private $missingClasses = array(); + + /** @var ?string */ private $apcuPrefix; + /** + * @var self[] + */ + private static $registeredLoaders = array(); + + /** + * @param ?string $vendorDir + */ + public function __construct($vendorDir = null) + { + $this->vendorDir = $vendorDir; + } + + /** + * @return string[] + */ public function getPrefixes() { if (!empty($this->prefixesPsr0)) { - return call_user_func_array('array_merge', $this->prefixesPsr0); + return call_user_func_array('array_merge', array_values($this->prefixesPsr0)); } return array(); } + /** + * @return array[] + * @psalm-return array> + */ public function getPrefixesPsr4() { return $this->prefixDirsPsr4; } + /** + * @return array[] + * @psalm-return array + */ public function getFallbackDirs() { return $this->fallbackDirsPsr0; } + /** + * @return array[] + * @psalm-return array + */ public function getFallbackDirsPsr4() { return $this->fallbackDirsPsr4; } + /** + * @return string[] Array of classname => path + * @psalm-return array + */ public function getClassMap() { return $this->classMap; } /** - * @param array $classMap Class to filename map + * @param string[] $classMap Class to filename map + * @psalm-param array $classMap + * + * @return void */ public function addClassMap(array $classMap) { @@ -102,9 +175,11 @@ public function addClassMap(array $classMap) * Registers a set of PSR-0 directories for a given prefix, either * appending or prepending to the ones previously set for this prefix. * - * @param string $prefix The prefix - * @param array|string $paths The PSR-0 root directories - * @param bool $prepend Whether to prepend the directories + * @param string $prefix The prefix + * @param string[]|string $paths The PSR-0 root directories + * @param bool $prepend Whether to prepend the directories + * + * @return void */ public function add($prefix, $paths, $prepend = false) { @@ -147,11 +222,13 @@ public function add($prefix, $paths, $prepend = false) * Registers a set of PSR-4 directories for a given namespace, either * appending or prepending to the ones previously set for this namespace. * - * @param string $prefix The prefix/namespace, with trailing '\\' - * @param array|string $paths The PSR-4 base directories - * @param bool $prepend Whether to prepend the directories + * @param string $prefix The prefix/namespace, with trailing '\\' + * @param string[]|string $paths The PSR-4 base directories + * @param bool $prepend Whether to prepend the directories * * @throws \InvalidArgumentException + * + * @return void */ public function addPsr4($prefix, $paths, $prepend = false) { @@ -195,8 +272,10 @@ public function addPsr4($prefix, $paths, $prepend = false) * Registers a set of PSR-0 directories for a given prefix, * replacing any others previously set for this prefix. * - * @param string $prefix The prefix - * @param array|string $paths The PSR-0 base directories + * @param string $prefix The prefix + * @param string[]|string $paths The PSR-0 base directories + * + * @return void */ public function set($prefix, $paths) { @@ -211,10 +290,12 @@ public function set($prefix, $paths) * Registers a set of PSR-4 directories for a given namespace, * replacing any others previously set for this namespace. * - * @param string $prefix The prefix/namespace, with trailing '\\' - * @param array|string $paths The PSR-4 base directories + * @param string $prefix The prefix/namespace, with trailing '\\' + * @param string[]|string $paths The PSR-4 base directories * * @throws \InvalidArgumentException + * + * @return void */ public function setPsr4($prefix, $paths) { @@ -234,6 +315,8 @@ public function setPsr4($prefix, $paths) * Turns on searching the include path for class files. * * @param bool $useIncludePath + * + * @return void */ public function setUseIncludePath($useIncludePath) { @@ -256,6 +339,8 @@ public function getUseIncludePath() * that have not been registered with the class map. * * @param bool $classMapAuthoritative + * + * @return void */ public function setClassMapAuthoritative($classMapAuthoritative) { @@ -276,10 +361,12 @@ public function isClassMapAuthoritative() * APCu prefix to use to cache found/not-found classes, if the extension is enabled. * * @param string|null $apcuPrefix + * + * @return void */ public function setApcuPrefix($apcuPrefix) { - $this->apcuPrefix = function_exists('apcu_fetch') && ini_get('apc.enabled') ? $apcuPrefix : null; + $this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null; } /** @@ -296,25 +383,44 @@ public function getApcuPrefix() * Registers this instance as an autoloader. * * @param bool $prepend Whether to prepend the autoloader or not + * + * @return void */ public function register($prepend = false) { spl_autoload_register(array($this, 'loadClass'), true, $prepend); + + if (null === $this->vendorDir) { + return; + } + + if ($prepend) { + self::$registeredLoaders = array($this->vendorDir => $this) + self::$registeredLoaders; + } else { + unset(self::$registeredLoaders[$this->vendorDir]); + self::$registeredLoaders[$this->vendorDir] = $this; + } } /** * Unregisters this instance as an autoloader. + * + * @return void */ public function unregister() { spl_autoload_unregister(array($this, 'loadClass')); + + if (null !== $this->vendorDir) { + unset(self::$registeredLoaders[$this->vendorDir]); + } } /** * Loads the given class or interface. * * @param string $class The name of the class - * @return bool|null True if loaded, null otherwise + * @return true|null True if loaded, null otherwise */ public function loadClass($class) { @@ -323,6 +429,8 @@ public function loadClass($class) return true; } + + return null; } /** @@ -367,6 +475,21 @@ public function findFile($class) return $file; } + /** + * Returns the currently registered loaders indexed by their corresponding vendor directories. + * + * @return self[] + */ + public static function getRegisteredLoaders() + { + return self::$registeredLoaders; + } + + /** + * @param string $class + * @param string $ext + * @return string|false + */ private function findFileWithExtension($class, $ext) { // PSR-4 lookup @@ -377,11 +500,11 @@ private function findFileWithExtension($class, $ext) $subPath = $class; while (false !== $lastPos = strrpos($subPath, '\\')) { $subPath = substr($subPath, 0, $lastPos); - $search = $subPath.'\\'; + $search = $subPath . '\\'; if (isset($this->prefixDirsPsr4[$search])) { + $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1); foreach ($this->prefixDirsPsr4[$search] as $dir) { - $length = $this->prefixLengthsPsr4[$first][$search]; - if (file_exists($file = $dir . DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $length))) { + if (file_exists($file = $dir . $pathEnd)) { return $file; } } @@ -438,6 +561,10 @@ private function findFileWithExtension($class, $ext) * Scope isolated include. * * Prevents access to $this/self from included files. + * + * @param string $file + * @return void + * @private */ function includeFile($file) { diff --git a/includes/vendor/composer/InstalledVersions.php b/includes/vendor/composer/InstalledVersions.php new file mode 100644 index 0000000..c6b54af --- /dev/null +++ b/includes/vendor/composer/InstalledVersions.php @@ -0,0 +1,352 @@ + + * Jordi Boggiano + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Composer; + +use Composer\Autoload\ClassLoader; +use Composer\Semver\VersionParser; + +/** + * This class is copied in every Composer installed project and available to all + * + * See also https://getcomposer.org/doc/07-runtime.md#installed-versions + * + * To require its presence, you can require `composer-runtime-api ^2.0` + * + * @final + */ +class InstalledVersions +{ + /** + * @var mixed[]|null + * @psalm-var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array}|array{}|null + */ + private static $installed; + + /** + * @var bool|null + */ + private static $canGetVendors; + + /** + * @var array[] + * @psalm-var array}> + */ + private static $installedByVendor = array(); + + /** + * Returns a list of all package names which are present, either by being installed, replaced or provided + * + * @return string[] + * @psalm-return list + */ + public static function getInstalledPackages() + { + $packages = array(); + foreach (self::getInstalled() as $installed) { + $packages[] = array_keys($installed['versions']); + } + + if (1 === \count($packages)) { + return $packages[0]; + } + + return array_keys(array_flip(\call_user_func_array('array_merge', $packages))); + } + + /** + * Returns a list of all package names with a specific type e.g. 'library' + * + * @param string $type + * @return string[] + * @psalm-return list + */ + public static function getInstalledPackagesByType($type) + { + $packagesByType = array(); + + foreach (self::getInstalled() as $installed) { + foreach ($installed['versions'] as $name => $package) { + if (isset($package['type']) && $package['type'] === $type) { + $packagesByType[] = $name; + } + } + } + + return $packagesByType; + } + + /** + * Checks whether the given package is installed + * + * This also returns true if the package name is provided or replaced by another package + * + * @param string $packageName + * @param bool $includeDevRequirements + * @return bool + */ + public static function isInstalled($packageName, $includeDevRequirements = true) + { + foreach (self::getInstalled() as $installed) { + if (isset($installed['versions'][$packageName])) { + return $includeDevRequirements || empty($installed['versions'][$packageName]['dev_requirement']); + } + } + + return false; + } + + /** + * Checks whether the given package satisfies a version constraint + * + * e.g. If you want to know whether version 2.3+ of package foo/bar is installed, you would call: + * + * Composer\InstalledVersions::satisfies(new VersionParser, 'foo/bar', '^2.3') + * + * @param VersionParser $parser Install composer/semver to have access to this class and functionality + * @param string $packageName + * @param string|null $constraint A version constraint to check for, if you pass one you have to make sure composer/semver is required by your package + * @return bool + */ + public static function satisfies(VersionParser $parser, $packageName, $constraint) + { + $constraint = $parser->parseConstraints($constraint); + $provided = $parser->parseConstraints(self::getVersionRanges($packageName)); + + return $provided->matches($constraint); + } + + /** + * Returns a version constraint representing all the range(s) which are installed for a given package + * + * It is easier to use this via isInstalled() with the $constraint argument if you need to check + * whether a given version of a package is installed, and not just whether it exists + * + * @param string $packageName + * @return string Version constraint usable with composer/semver + */ + public static function getVersionRanges($packageName) + { + foreach (self::getInstalled() as $installed) { + if (!isset($installed['versions'][$packageName])) { + continue; + } + + $ranges = array(); + if (isset($installed['versions'][$packageName]['pretty_version'])) { + $ranges[] = $installed['versions'][$packageName]['pretty_version']; + } + if (array_key_exists('aliases', $installed['versions'][$packageName])) { + $ranges = array_merge($ranges, $installed['versions'][$packageName]['aliases']); + } + if (array_key_exists('replaced', $installed['versions'][$packageName])) { + $ranges = array_merge($ranges, $installed['versions'][$packageName]['replaced']); + } + if (array_key_exists('provided', $installed['versions'][$packageName])) { + $ranges = array_merge($ranges, $installed['versions'][$packageName]['provided']); + } + + return implode(' || ', $ranges); + } + + throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); + } + + /** + * @param string $packageName + * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present + */ + public static function getVersion($packageName) + { + foreach (self::getInstalled() as $installed) { + if (!isset($installed['versions'][$packageName])) { + continue; + } + + if (!isset($installed['versions'][$packageName]['version'])) { + return null; + } + + return $installed['versions'][$packageName]['version']; + } + + throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); + } + + /** + * @param string $packageName + * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present + */ + public static function getPrettyVersion($packageName) + { + foreach (self::getInstalled() as $installed) { + if (!isset($installed['versions'][$packageName])) { + continue; + } + + if (!isset($installed['versions'][$packageName]['pretty_version'])) { + return null; + } + + return $installed['versions'][$packageName]['pretty_version']; + } + + throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); + } + + /** + * @param string $packageName + * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as reference + */ + public static function getReference($packageName) + { + foreach (self::getInstalled() as $installed) { + if (!isset($installed['versions'][$packageName])) { + continue; + } + + if (!isset($installed['versions'][$packageName]['reference'])) { + return null; + } + + return $installed['versions'][$packageName]['reference']; + } + + throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); + } + + /** + * @param string $packageName + * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as install path. Packages of type metapackages also have a null install path. + */ + public static function getInstallPath($packageName) + { + foreach (self::getInstalled() as $installed) { + if (!isset($installed['versions'][$packageName])) { + continue; + } + + return isset($installed['versions'][$packageName]['install_path']) ? $installed['versions'][$packageName]['install_path'] : null; + } + + throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); + } + + /** + * @return array + * @psalm-return array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool} + */ + public static function getRootPackage() + { + $installed = self::getInstalled(); + + return $installed[0]['root']; + } + + /** + * Returns the raw installed.php data for custom implementations + * + * @deprecated Use getAllRawData() instead which returns all datasets for all autoloaders present in the process. getRawData only returns the first dataset loaded, which may not be what you expect. + * @return array[] + * @psalm-return array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array} + */ + public static function getRawData() + { + @trigger_error('getRawData only returns the first dataset loaded, which may not be what you expect. Use getAllRawData() instead which returns all datasets for all autoloaders present in the process.', E_USER_DEPRECATED); + + if (null === self::$installed) { + // only require the installed.php file if this file is loaded from its dumped location, + // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937 + if (substr(__DIR__, -8, 1) !== 'C') { + self::$installed = include __DIR__ . '/installed.php'; + } else { + self::$installed = array(); + } + } + + return self::$installed; + } + + /** + * Returns the raw data of all installed.php which are currently loaded for custom implementations + * + * @return array[] + * @psalm-return list}> + */ + public static function getAllRawData() + { + return self::getInstalled(); + } + + /** + * Lets you reload the static array from another file + * + * This is only useful for complex integrations in which a project needs to use + * this class but then also needs to execute another project's autoloader in process, + * and wants to ensure both projects have access to their version of installed.php. + * + * A typical case would be PHPUnit, where it would need to make sure it reads all + * the data it needs from this class, then call reload() with + * `require $CWD/vendor/composer/installed.php` (or similar) as input to make sure + * the project in which it runs can then also use this class safely, without + * interference between PHPUnit's dependencies and the project's dependencies. + * + * @param array[] $data A vendor/composer/installed.php data set + * @return void + * + * @psalm-param array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array} $data + */ + public static function reload($data) + { + self::$installed = $data; + self::$installedByVendor = array(); + } + + /** + * @return array[] + * @psalm-return list}> + */ + private static function getInstalled() + { + if (null === self::$canGetVendors) { + self::$canGetVendors = method_exists('Composer\Autoload\ClassLoader', 'getRegisteredLoaders'); + } + + $installed = array(); + + if (self::$canGetVendors) { + foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) { + if (isset(self::$installedByVendor[$vendorDir])) { + $installed[] = self::$installedByVendor[$vendorDir]; + } elseif (is_file($vendorDir.'/composer/installed.php')) { + $installed[] = self::$installedByVendor[$vendorDir] = require $vendorDir.'/composer/installed.php'; + if (null === self::$installed && strtr($vendorDir.'/composer', '\\', '/') === strtr(__DIR__, '\\', '/')) { + self::$installed = $installed[count($installed) - 1]; + } + } + } + } + + if (null === self::$installed) { + // only require the installed.php file if this file is loaded from its dumped location, + // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937 + if (substr(__DIR__, -8, 1) !== 'C') { + self::$installed = require __DIR__ . '/installed.php'; + } else { + self::$installed = array(); + } + } + $installed[] = self::$installed; + + return $installed; + } +} diff --git a/includes/vendor/composer/autoload_classmap.php b/includes/vendor/composer/autoload_classmap.php index 71dd9c1..37e449b 100644 --- a/includes/vendor/composer/autoload_classmap.php +++ b/includes/vendor/composer/autoload_classmap.php @@ -2,8 +2,9 @@ // autoload_classmap.php @generated by Composer -$vendorDir = dirname(dirname(__FILE__)); +$vendorDir = dirname(__DIR__); $baseDir = dirname(dirname($vendorDir)); return array( + 'Composer\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php', ); diff --git a/includes/vendor/composer/autoload_namespaces.php b/includes/vendor/composer/autoload_namespaces.php index 4a9c20b..f1ae7a0 100644 --- a/includes/vendor/composer/autoload_namespaces.php +++ b/includes/vendor/composer/autoload_namespaces.php @@ -2,7 +2,7 @@ // autoload_namespaces.php @generated by Composer -$vendorDir = dirname(dirname(__FILE__)); +$vendorDir = dirname(__DIR__); $baseDir = dirname(dirname($vendorDir)); return array( diff --git a/includes/vendor/composer/autoload_psr4.php b/includes/vendor/composer/autoload_psr4.php index 91d582b..f8ff6f8 100644 --- a/includes/vendor/composer/autoload_psr4.php +++ b/includes/vendor/composer/autoload_psr4.php @@ -2,9 +2,10 @@ // autoload_psr4.php @generated by Composer -$vendorDir = dirname(dirname(__FILE__)); +$vendorDir = dirname(__DIR__); $baseDir = dirname(dirname($vendorDir)); return array( 'Firebase\\JWT\\' => array($vendorDir . '/firebase/php-jwt/src'), + 'Composer\\Installers\\' => array($vendorDir . '/composer/installers/src/Composer/Installers'), ); diff --git a/includes/vendor/composer/autoload_real.php b/includes/vendor/composer/autoload_real.php index 390d38a..3617d4b 100644 --- a/includes/vendor/composer/autoload_real.php +++ b/includes/vendor/composer/autoload_real.php @@ -13,37 +13,23 @@ public static function loadClassLoader($class) } } + /** + * @return \Composer\Autoload\ClassLoader + */ public static function getLoader() { if (null !== self::$loader) { return self::$loader; } + require __DIR__ . '/platform_check.php'; + spl_autoload_register(array('ComposerAutoloaderInit6ba6ee55693d165c056f65e51c5383a5', 'loadClassLoader'), true, true); - self::$loader = $loader = new \Composer\Autoload\ClassLoader(); + self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(__DIR__)); spl_autoload_unregister(array('ComposerAutoloaderInit6ba6ee55693d165c056f65e51c5383a5', 'loadClassLoader')); - $useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded()); - if ($useStaticLoader) { - require_once __DIR__ . '/autoload_static.php'; - - call_user_func(\Composer\Autoload\ComposerStaticInit6ba6ee55693d165c056f65e51c5383a5::getInitializer($loader)); - } else { - $map = require __DIR__ . '/autoload_namespaces.php'; - foreach ($map as $namespace => $path) { - $loader->set($namespace, $path); - } - - $map = require __DIR__ . '/autoload_psr4.php'; - foreach ($map as $namespace => $path) { - $loader->setPsr4($namespace, $path); - } - - $classMap = require __DIR__ . '/autoload_classmap.php'; - if ($classMap) { - $loader->addClassMap($classMap); - } - } + require __DIR__ . '/autoload_static.php'; + call_user_func(\Composer\Autoload\ComposerStaticInit6ba6ee55693d165c056f65e51c5383a5::getInitializer($loader)); $loader->register(true); diff --git a/includes/vendor/composer/autoload_static.php b/includes/vendor/composer/autoload_static.php index 301f2b6..5d0ae45 100644 --- a/includes/vendor/composer/autoload_static.php +++ b/includes/vendor/composer/autoload_static.php @@ -11,6 +11,10 @@ class ComposerStaticInit6ba6ee55693d165c056f65e51c5383a5 array ( 'Firebase\\JWT\\' => 13, ), + 'C' => + array ( + 'Composer\\Installers\\' => 20, + ), ); public static $prefixDirsPsr4 = array ( @@ -18,6 +22,14 @@ class ComposerStaticInit6ba6ee55693d165c056f65e51c5383a5 array ( 0 => __DIR__ . '/..' . '/firebase/php-jwt/src', ), + 'Composer\\Installers\\' => + array ( + 0 => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers', + ), + ); + + public static $classMap = array ( + 'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php', ); public static function getInitializer(ClassLoader $loader) @@ -25,6 +37,7 @@ public static function getInitializer(ClassLoader $loader) return \Closure::bind(function () use ($loader) { $loader->prefixLengthsPsr4 = ComposerStaticInit6ba6ee55693d165c056f65e51c5383a5::$prefixLengthsPsr4; $loader->prefixDirsPsr4 = ComposerStaticInit6ba6ee55693d165c056f65e51c5383a5::$prefixDirsPsr4; + $loader->classMap = ComposerStaticInit6ba6ee55693d165c056f65e51c5383a5::$classMap; }, null, ClassLoader::class); } diff --git a/includes/vendor/composer/installed.json b/includes/vendor/composer/installed.json index 5b2924c..7140d5a 100644 --- a/includes/vendor/composer/installed.json +++ b/includes/vendor/composer/installed.json @@ -1,50 +1,225 @@ -[ - { - "name": "firebase/php-jwt", - "version": "v5.0.0", - "version_normalized": "5.0.0.0", - "source": { - "type": "git", - "url": "https://github.com/firebase/php-jwt.git", - "reference": "9984a4d3a32ae7673d6971ea00bae9d0a1abba0e" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/firebase/php-jwt/zipball/9984a4d3a32ae7673d6971ea00bae9d0a1abba0e", - "reference": "9984a4d3a32ae7673d6971ea00bae9d0a1abba0e", - "shasum": "" - }, - "require": { - "php": ">=5.3.0" - }, - "require-dev": { - "phpunit/phpunit": " 4.8.35" - }, - "time": "2017-06-27T22:17:23+00:00", - "type": "library", - "installation-source": "dist", - "autoload": { - "psr-4": { - "Firebase\\JWT\\": "src" - } +{ + "packages": [ + { + "name": "composer/installers", + "version": "v1.12.0", + "version_normalized": "1.12.0.0", + "source": { + "type": "git", + "url": "https://github.com/composer/installers.git", + "reference": "d20a64ed3c94748397ff5973488761b22f6d3f19" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/installers/zipball/d20a64ed3c94748397ff5973488761b22f6d3f19", + "reference": "d20a64ed3c94748397ff5973488761b22f6d3f19", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.0 || ^2.0" + }, + "replace": { + "roundcube/plugin-installer": "*", + "shama/baton": "*" + }, + "require-dev": { + "composer/composer": "1.6.* || ^2.0", + "composer/semver": "^1 || ^3", + "phpstan/phpstan": "^0.12.55", + "phpstan/phpstan-phpunit": "^0.12.16", + "symfony/phpunit-bridge": "^4.2 || ^5", + "symfony/process": "^2.3" + }, + "time": "2021-09-13T08:19:44+00:00", + "type": "composer-plugin", + "extra": { + "class": "Composer\\Installers\\Plugin", + "branch-alias": { + "dev-main": "1.x-dev" + } + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Composer\\Installers\\": "src/Composer/Installers" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Kyle Robinson Young", + "email": "kyle@dontkry.com", + "homepage": "https://github.com/shama" + } + ], + "description": "A multi-framework Composer library installer", + "homepage": "https://composer.github.io/installers/", + "keywords": [ + "Craft", + "Dolibarr", + "Eliasis", + "Hurad", + "ImageCMS", + "Kanboard", + "Lan Management System", + "MODX Evo", + "MantisBT", + "Mautic", + "Maya", + "OXID", + "Plentymarkets", + "Porto", + "RadPHP", + "SMF", + "Starbug", + "Thelia", + "Whmcs", + "WolfCMS", + "agl", + "aimeos", + "annotatecms", + "attogram", + "bitrix", + "cakephp", + "chef", + "cockpit", + "codeigniter", + "concrete5", + "croogo", + "dokuwiki", + "drupal", + "eZ Platform", + "elgg", + "expressionengine", + "fuelphp", + "grav", + "installer", + "itop", + "joomla", + "known", + "kohana", + "laravel", + "lavalite", + "lithium", + "magento", + "majima", + "mako", + "mediawiki", + "miaoxing", + "modulework", + "modx", + "moodle", + "osclass", + "pantheon", + "phpbb", + "piwik", + "ppi", + "processwire", + "puppet", + "pxcms", + "reindex", + "roundcube", + "shopware", + "silverstripe", + "sydes", + "sylius", + "symfony", + "tastyigniter", + "typo3", + "wordpress", + "yawik", + "zend", + "zikula" + ], + "support": { + "issues": "https://github.com/composer/installers/issues", + "source": "https://github.com/composer/installers/tree/v1.12.0" + }, + "funding": [ + { + "url": "https://packagist.com/", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "install-path": "./installers" }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Neuman Vong", - "email": "neuman+pear@twilio.com", - "role": "Developer" - }, - { - "name": "Anant Narayanan", - "email": "anant@php.net", - "role": "Developer" - } - ], - "description": "A simple library to encode and decode JSON Web Tokens (JWT) in PHP. Should conform to the current spec.", - "homepage": "https://github.com/firebase/php-jwt" - } -] + { + "name": "firebase/php-jwt", + "version": "v6.3.0", + "version_normalized": "6.3.0.0", + "source": { + "type": "git", + "url": "https://github.com/firebase/php-jwt.git", + "reference": "018dfc4e1da92ad8a1b90adc4893f476a3b41cb8" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/firebase/php-jwt/zipball/018dfc4e1da92ad8a1b90adc4893f476a3b41cb8", + "reference": "018dfc4e1da92ad8a1b90adc4893f476a3b41cb8", + "shasum": "" + }, + "require": { + "php": "^7.1||^8.0" + }, + "require-dev": { + "guzzlehttp/guzzle": "^6.5||^7.4", + "phpspec/prophecy-phpunit": "^1.1", + "phpunit/phpunit": "^7.5||^9.5", + "psr/cache": "^1.0||^2.0", + "psr/http-client": "^1.0", + "psr/http-factory": "^1.0" + }, + "suggest": { + "paragonie/sodium_compat": "Support EdDSA (Ed25519) signatures when libsodium is not present" + }, + "time": "2022-07-15T16:48:45+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "Firebase\\JWT\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Neuman Vong", + "email": "neuman+pear@twilio.com", + "role": "Developer" + }, + { + "name": "Anant Narayanan", + "email": "anant@php.net", + "role": "Developer" + } + ], + "description": "A simple library to encode and decode JSON Web Tokens (JWT) in PHP. Should conform to the current spec.", + "homepage": "https://github.com/firebase/php-jwt", + "keywords": [ + "jwt", + "php" + ], + "support": { + "issues": "https://github.com/firebase/php-jwt/issues", + "source": "https://github.com/firebase/php-jwt/tree/v6.3.0" + }, + "install-path": "../firebase/php-jwt" + } + ], + "dev": true, + "dev-package-names": [] +} diff --git a/includes/vendor/composer/installed.php b/includes/vendor/composer/installed.php new file mode 100644 index 0000000..f87ae62 --- /dev/null +++ b/includes/vendor/composer/installed.php @@ -0,0 +1,53 @@ + array( + 'name' => 'tmeister/wp-api-jwt-auth', + 'pretty_version' => 'dev-develop', + 'version' => 'dev-develop', + 'reference' => 'a295379a9c93180daff228ce2050a376dc17acab', + 'type' => 'wordpress-plugin', + 'install_path' => __DIR__ . '/../../../', + 'aliases' => array(), + 'dev' => true, + ), + 'versions' => array( + 'composer/installers' => array( + 'pretty_version' => 'v1.12.0', + 'version' => '1.12.0.0', + 'reference' => 'd20a64ed3c94748397ff5973488761b22f6d3f19', + 'type' => 'composer-plugin', + 'install_path' => __DIR__ . '/./installers', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'firebase/php-jwt' => array( + 'pretty_version' => 'v6.3.0', + 'version' => '6.3.0.0', + 'reference' => '018dfc4e1da92ad8a1b90adc4893f476a3b41cb8', + 'type' => 'library', + 'install_path' => __DIR__ . '/../firebase/php-jwt', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'roundcube/plugin-installer' => array( + 'dev_requirement' => false, + 'replaced' => array( + 0 => '*', + ), + ), + 'shama/baton' => array( + 'dev_requirement' => false, + 'replaced' => array( + 0 => '*', + ), + ), + 'tmeister/wp-api-jwt-auth' => array( + 'pretty_version' => 'dev-develop', + 'version' => 'dev-develop', + 'reference' => 'a295379a9c93180daff228ce2050a376dc17acab', + 'type' => 'wordpress-plugin', + 'install_path' => __DIR__ . '/../../../', + 'aliases' => array(), + 'dev_requirement' => false, + ), + ), +); diff --git a/includes/vendor/composer/installers/.github/workflows/continuous-integration.yml b/includes/vendor/composer/installers/.github/workflows/continuous-integration.yml new file mode 100644 index 0000000..34b8f91 --- /dev/null +++ b/includes/vendor/composer/installers/.github/workflows/continuous-integration.yml @@ -0,0 +1,76 @@ +name: "Continuous Integration" + +on: + - push + - pull_request + +env: + COMPOSER_FLAGS: "--ansi --no-interaction --no-progress --prefer-dist" + SYMFONY_PHPUNIT_REMOVE_RETURN_TYPEHINT: "1" + +jobs: + tests: + name: "CI" + + runs-on: ubuntu-latest + + strategy: + matrix: + php-version: + - "5.3" + - "5.4" + - "5.5" + - "5.6" + - "7.0" + - "7.1" + - "7.2" + - "7.3" + - "7.4" + - "8.0" + - "8.1" + dependencies: [locked] + include: + - php-version: "5.3" + dependencies: lowest + - php-version: "8.1" + dependencies: lowest + + steps: + - name: "Checkout" + uses: "actions/checkout@v2" + + - name: "Install PHP" + uses: "shivammathur/setup-php@v2" + with: + coverage: "none" + php-version: "${{ matrix.php-version }}" + tools: composer:snapshot + + - name: Get composer cache directory + id: composercache + run: echo "::set-output name=dir::$(composer config cache-files-dir)" + + - name: Cache dependencies + uses: actions/cache@v2 + with: + path: ${{ steps.composercache.outputs.dir }} + key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }} + restore-keys: ${{ runner.os }}-composer- + + - name: "Handle lowest dependencies update" + if: "contains(matrix.dependencies, 'lowest')" + run: "echo \"COMPOSER_FLAGS=$COMPOSER_FLAGS --prefer-lowest\" >> $GITHUB_ENV" + + - name: "Upgrade phpunit-bridge if needed for php 8 lowest build" + if: "contains(matrix.php-version, '8.')" + run: | + composer require symfony/phpunit-bridge:^5.3.3 --dev --no-update + + - name: "Install latest dependencies" + run: | + # Remove PHPStan as it requires a newer PHP + composer remove phpstan/phpstan phpstan/phpstan-phpunit --dev --no-update + composer update ${{ env.COMPOSER_FLAGS }} + + - name: "Run tests" + run: "vendor/bin/simple-phpunit --verbose" diff --git a/includes/vendor/composer/installers/.github/workflows/lint.yml b/includes/vendor/composer/installers/.github/workflows/lint.yml new file mode 100644 index 0000000..81a1ac4 --- /dev/null +++ b/includes/vendor/composer/installers/.github/workflows/lint.yml @@ -0,0 +1,30 @@ +name: "PHP Lint" + +on: + - push + - pull_request + +jobs: + tests: + name: "Lint" + + runs-on: ubuntu-latest + + strategy: + matrix: + php-version: + - "5.3" + - "8.0" + + steps: + - name: "Checkout" + uses: "actions/checkout@v2" + + - name: "Install PHP" + uses: "shivammathur/setup-php@v2" + with: + coverage: "none" + php-version: "${{ matrix.php-version }}" + + - name: "Lint PHP files" + run: "find src/ -type f -name '*.php' -print0 | xargs -0 -L1 -P4 -- php -l -f" diff --git a/includes/vendor/composer/installers/.github/workflows/phpstan.yml b/includes/vendor/composer/installers/.github/workflows/phpstan.yml new file mode 100644 index 0000000..ac4c4a9 --- /dev/null +++ b/includes/vendor/composer/installers/.github/workflows/phpstan.yml @@ -0,0 +1,51 @@ +name: "PHPStan" + +on: + - push + - pull_request + +env: + COMPOSER_FLAGS: "--ansi --no-interaction --no-progress --prefer-dist" + SYMFONY_PHPUNIT_VERSION: "" + +jobs: + tests: + name: "PHPStan" + + runs-on: ubuntu-latest + + strategy: + matrix: + php-version: + # pinned to 7.4 because we need PHPUnit 7.5 which does not support PHP 8 + - "7.4" + + steps: + - name: "Checkout" + uses: "actions/checkout@v2" + + - name: "Install PHP" + uses: "shivammathur/setup-php@v2" + with: + coverage: "none" + php-version: "${{ matrix.php-version }}" + + - name: Get composer cache directory + id: composercache + run: echo "::set-output name=dir::$(composer config cache-files-dir)" + + - name: Cache dependencies + uses: actions/cache@v2 + with: + path: ${{ steps.composercache.outputs.dir }} + key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.json') }} + restore-keys: ${{ runner.os }}-composer- + + - name: "Install latest dependencies" + run: "composer update ${{ env.COMPOSER_FLAGS }}" + + - name: Run PHPStan + # Locked to phpunit 7.5 here as newer ones have void return types which break inheritance + run: | + composer require --dev phpunit/phpunit:^7.5.20 --with-all-dependencies ${{ env.COMPOSER_FLAGS }} + vendor/bin/phpstan analyse diff --git a/includes/vendor/composer/installers/LICENSE b/includes/vendor/composer/installers/LICENSE new file mode 100644 index 0000000..85f97fc --- /dev/null +++ b/includes/vendor/composer/installers/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2012 Kyle Robinson Young + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. \ No newline at end of file diff --git a/includes/vendor/composer/installers/composer.json b/includes/vendor/composer/installers/composer.json new file mode 100644 index 0000000..4a7fd3c --- /dev/null +++ b/includes/vendor/composer/installers/composer.json @@ -0,0 +1,122 @@ +{ + "name": "composer/installers", + "type": "composer-plugin", + "license": "MIT", + "description": "A multi-framework Composer library installer", + "keywords": [ + "installer", + "Aimeos", + "AGL", + "AnnotateCms", + "Attogram", + "Bitrix", + "CakePHP", + "Chef", + "Cockpit", + "CodeIgniter", + "concrete5", + "Craft", + "Croogo", + "DokuWiki", + "Dolibarr", + "Drupal", + "Elgg", + "Eliasis", + "ExpressionEngine", + "eZ Platform", + "FuelPHP", + "Grav", + "Hurad", + "ImageCMS", + "iTop", + "Joomla", + "Kanboard", + "Known", + "Kohana", + "Lan Management System", + "Laravel", + "Lavalite", + "Lithium", + "Magento", + "majima", + "Mako", + "MantisBT", + "Mautic", + "Maya", + "MODX", + "MODX Evo", + "MediaWiki", + "Miaoxing", + "OXID", + "osclass", + "MODULEWork", + "Moodle", + "Pantheon", + "Piwik", + "pxcms", + "phpBB", + "Plentymarkets", + "PPI", + "Puppet", + "Porto", + "ProcessWire", + "RadPHP", + "ReIndex", + "Roundcube", + "shopware", + "SilverStripe", + "SMF", + "Starbug", + "SyDES", + "Sylius", + "symfony", + "TastyIgniter", + "Thelia", + "TYPO3", + "WHMCS", + "WolfCMS", + "WordPress", + "YAWIK", + "Zend", + "Zikula" + ], + "homepage": "https://composer.github.io/installers/", + "authors": [ + { + "name": "Kyle Robinson Young", + "email": "kyle@dontkry.com", + "homepage": "https://github.com/shama" + } + ], + "autoload": { + "psr-4": { "Composer\\Installers\\": "src/Composer/Installers" } + }, + "autoload-dev": { + "psr-4": { "Composer\\Installers\\Test\\": "tests/Composer/Installers/Test" } + }, + "extra": { + "class": "Composer\\Installers\\Plugin", + "branch-alias": { + "dev-main": "1.x-dev" + } + }, + "replace": { + "shama/baton": "*", + "roundcube/plugin-installer": "*" + }, + "require": { + "composer-plugin-api": "^1.0 || ^2.0" + }, + "require-dev": { + "composer/composer": "1.6.* || ^2.0", + "composer/semver": "^1 || ^3", + "symfony/phpunit-bridge": "^4.2 || ^5", + "phpstan/phpstan": "^0.12.55", + "symfony/process": "^2.3", + "phpstan/phpstan-phpunit": "^0.12.16" + }, + "scripts": { + "test": "SYMFONY_PHPUNIT_REMOVE_RETURN_TYPEHINT=1 vendor/bin/simple-phpunit", + "phpstan": "vendor/bin/phpstan analyse" + } +} diff --git a/includes/vendor/composer/installers/phpstan.neon.dist b/includes/vendor/composer/installers/phpstan.neon.dist new file mode 100644 index 0000000..8e3d81e --- /dev/null +++ b/includes/vendor/composer/installers/phpstan.neon.dist @@ -0,0 +1,10 @@ +parameters: + level: 5 + paths: + - src + - tests + excludes_analyse: + - tests/Composer/Installers/Test/PolyfillTestCase.php + +includes: + - vendor/phpstan/phpstan-phpunit/extension.neon diff --git a/includes/vendor/composer/installers/src/Composer/Installers/AglInstaller.php b/includes/vendor/composer/installers/src/Composer/Installers/AglInstaller.php new file mode 100644 index 0000000..01b8a41 --- /dev/null +++ b/includes/vendor/composer/installers/src/Composer/Installers/AglInstaller.php @@ -0,0 +1,21 @@ + 'More/{$name}/', + ); + + /** + * Format package name to CamelCase + */ + public function inflectPackageVars($vars) + { + $vars['name'] = preg_replace_callback('/(?:^|_|-)(.?)/', function ($matches) { + return strtoupper($matches[1]); + }, $vars['name']); + + return $vars; + } +} diff --git a/includes/vendor/composer/installers/src/Composer/Installers/AimeosInstaller.php b/includes/vendor/composer/installers/src/Composer/Installers/AimeosInstaller.php new file mode 100644 index 0000000..79a0e95 --- /dev/null +++ b/includes/vendor/composer/installers/src/Composer/Installers/AimeosInstaller.php @@ -0,0 +1,9 @@ + 'ext/{$name}/', + ); +} diff --git a/includes/vendor/composer/installers/src/Composer/Installers/AnnotateCmsInstaller.php b/includes/vendor/composer/installers/src/Composer/Installers/AnnotateCmsInstaller.php new file mode 100644 index 0000000..89d7ad9 --- /dev/null +++ b/includes/vendor/composer/installers/src/Composer/Installers/AnnotateCmsInstaller.php @@ -0,0 +1,11 @@ + 'addons/modules/{$name}/', + 'component' => 'addons/components/{$name}/', + 'service' => 'addons/services/{$name}/', + ); +} diff --git a/includes/vendor/composer/installers/src/Composer/Installers/AsgardInstaller.php b/includes/vendor/composer/installers/src/Composer/Installers/AsgardInstaller.php new file mode 100644 index 0000000..22dad1b --- /dev/null +++ b/includes/vendor/composer/installers/src/Composer/Installers/AsgardInstaller.php @@ -0,0 +1,49 @@ + 'Modules/{$name}/', + 'theme' => 'Themes/{$name}/' + ); + + /** + * Format package name. + * + * For package type asgard-module, cut off a trailing '-plugin' if present. + * + * For package type asgard-theme, cut off a trailing '-theme' if present. + * + */ + public function inflectPackageVars($vars) + { + if ($vars['type'] === 'asgard-module') { + return $this->inflectPluginVars($vars); + } + + if ($vars['type'] === 'asgard-theme') { + return $this->inflectThemeVars($vars); + } + + return $vars; + } + + protected function inflectPluginVars($vars) + { + $vars['name'] = preg_replace('/-module$/', '', $vars['name']); + $vars['name'] = str_replace(array('-', '_'), ' ', $vars['name']); + $vars['name'] = str_replace(' ', '', ucwords($vars['name'])); + + return $vars; + } + + protected function inflectThemeVars($vars) + { + $vars['name'] = preg_replace('/-theme$/', '', $vars['name']); + $vars['name'] = str_replace(array('-', '_'), ' ', $vars['name']); + $vars['name'] = str_replace(' ', '', ucwords($vars['name'])); + + return $vars; + } +} diff --git a/includes/vendor/composer/installers/src/Composer/Installers/AttogramInstaller.php b/includes/vendor/composer/installers/src/Composer/Installers/AttogramInstaller.php new file mode 100644 index 0000000..d62fd8f --- /dev/null +++ b/includes/vendor/composer/installers/src/Composer/Installers/AttogramInstaller.php @@ -0,0 +1,9 @@ + 'modules/{$name}/', + ); +} diff --git a/includes/vendor/composer/installers/src/Composer/Installers/BaseInstaller.php b/includes/vendor/composer/installers/src/Composer/Installers/BaseInstaller.php new file mode 100644 index 0000000..70dde90 --- /dev/null +++ b/includes/vendor/composer/installers/src/Composer/Installers/BaseInstaller.php @@ -0,0 +1,137 @@ +composer = $composer; + $this->package = $package; + $this->io = $io; + } + + /** + * Return the install path based on package type. + * + * @param PackageInterface $package + * @param string $frameworkType + * @return string + */ + public function getInstallPath(PackageInterface $package, $frameworkType = '') + { + $type = $this->package->getType(); + + $prettyName = $this->package->getPrettyName(); + if (strpos($prettyName, '/') !== false) { + list($vendor, $name) = explode('/', $prettyName); + } else { + $vendor = ''; + $name = $prettyName; + } + + $availableVars = $this->inflectPackageVars(compact('name', 'vendor', 'type')); + + $extra = $package->getExtra(); + if (!empty($extra['installer-name'])) { + $availableVars['name'] = $extra['installer-name']; + } + + if ($this->composer->getPackage()) { + $extra = $this->composer->getPackage()->getExtra(); + if (!empty($extra['installer-paths'])) { + $customPath = $this->mapCustomInstallPaths($extra['installer-paths'], $prettyName, $type, $vendor); + if ($customPath !== false) { + return $this->templatePath($customPath, $availableVars); + } + } + } + + $packageType = substr($type, strlen($frameworkType) + 1); + $locations = $this->getLocations(); + if (!isset($locations[$packageType])) { + throw new \InvalidArgumentException(sprintf('Package type "%s" is not supported', $type)); + } + + return $this->templatePath($locations[$packageType], $availableVars); + } + + /** + * For an installer to override to modify the vars per installer. + * + * @param array $vars This will normally receive array{name: string, vendor: string, type: string} + * @return array + */ + public function inflectPackageVars($vars) + { + return $vars; + } + + /** + * Gets the installer's locations + * + * @return array map of package types => install path + */ + public function getLocations() + { + return $this->locations; + } + + /** + * Replace vars in a path + * + * @param string $path + * @param array $vars + * @return string + */ + protected function templatePath($path, array $vars = array()) + { + if (strpos($path, '{') !== false) { + extract($vars); + preg_match_all('@\{\$([A-Za-z0-9_]*)\}@i', $path, $matches); + if (!empty($matches[1])) { + foreach ($matches[1] as $var) { + $path = str_replace('{$' . $var . '}', $$var, $path); + } + } + } + + return $path; + } + + /** + * Search through a passed paths array for a custom install path. + * + * @param array $paths + * @param string $name + * @param string $type + * @param string $vendor = NULL + * @return string|false + */ + protected function mapCustomInstallPaths(array $paths, $name, $type, $vendor = NULL) + { + foreach ($paths as $path => $names) { + $names = (array) $names; + if (in_array($name, $names) || in_array('type:' . $type, $names) || in_array('vendor:' . $vendor, $names)) { + return $path; + } + } + + return false; + } +} diff --git a/includes/vendor/composer/installers/src/Composer/Installers/BitrixInstaller.php b/includes/vendor/composer/installers/src/Composer/Installers/BitrixInstaller.php new file mode 100644 index 0000000..e80cd1e --- /dev/null +++ b/includes/vendor/composer/installers/src/Composer/Installers/BitrixInstaller.php @@ -0,0 +1,126 @@ +.`. + * - `bitrix-d7-component` — copy the component to directory `bitrix/components//`. + * - `bitrix-d7-template` — copy the template to directory `bitrix/templates/_`. + * + * You can set custom path to directory with Bitrix kernel in `composer.json`: + * + * ```json + * { + * "extra": { + * "bitrix-dir": "s1/bitrix" + * } + * } + * ``` + * + * @author Nik Samokhvalov + * @author Denis Kulichkin + */ +class BitrixInstaller extends BaseInstaller +{ + protected $locations = array( + 'module' => '{$bitrix_dir}/modules/{$name}/', // deprecated, remove on the major release (Backward compatibility will be broken) + 'component' => '{$bitrix_dir}/components/{$name}/', // deprecated, remove on the major release (Backward compatibility will be broken) + 'theme' => '{$bitrix_dir}/templates/{$name}/', // deprecated, remove on the major release (Backward compatibility will be broken) + 'd7-module' => '{$bitrix_dir}/modules/{$vendor}.{$name}/', + 'd7-component' => '{$bitrix_dir}/components/{$vendor}/{$name}/', + 'd7-template' => '{$bitrix_dir}/templates/{$vendor}_{$name}/', + ); + + /** + * @var array Storage for informations about duplicates at all the time of installation packages. + */ + private static $checkedDuplicates = array(); + + /** + * {@inheritdoc} + */ + public function inflectPackageVars($vars) + { + if ($this->composer->getPackage()) { + $extra = $this->composer->getPackage()->getExtra(); + + if (isset($extra['bitrix-dir'])) { + $vars['bitrix_dir'] = $extra['bitrix-dir']; + } + } + + if (!isset($vars['bitrix_dir'])) { + $vars['bitrix_dir'] = 'bitrix'; + } + + return parent::inflectPackageVars($vars); + } + + /** + * {@inheritdoc} + */ + protected function templatePath($path, array $vars = array()) + { + $templatePath = parent::templatePath($path, $vars); + $this->checkDuplicates($templatePath, $vars); + + return $templatePath; + } + + /** + * Duplicates search packages. + * + * @param string $path + * @param array $vars + */ + protected function checkDuplicates($path, array $vars = array()) + { + $packageType = substr($vars['type'], strlen('bitrix') + 1); + $localDir = explode('/', $vars['bitrix_dir']); + array_pop($localDir); + $localDir[] = 'local'; + $localDir = implode('/', $localDir); + + $oldPath = str_replace( + array('{$bitrix_dir}', '{$name}'), + array($localDir, $vars['name']), + $this->locations[$packageType] + ); + + if (in_array($oldPath, static::$checkedDuplicates)) { + return; + } + + if ($oldPath !== $path && file_exists($oldPath) && $this->io && $this->io->isInteractive()) { + + $this->io->writeError(' Duplication of packages:'); + $this->io->writeError(' Package ' . $oldPath . ' will be called instead package ' . $path . ''); + + while (true) { + switch ($this->io->ask(' Delete ' . $oldPath . ' [y,n,?]? ', '?')) { + case 'y': + $fs = new Filesystem(); + $fs->removeDirectory($oldPath); + break 2; + + case 'n': + break 2; + + case '?': + default: + $this->io->writeError(array( + ' y - delete package ' . $oldPath . ' and to continue with the installation', + ' n - don\'t delete and to continue with the installation', + )); + $this->io->writeError(' ? - print help'); + break; + } + } + } + + static::$checkedDuplicates[] = $oldPath; + } +} diff --git a/includes/vendor/composer/installers/src/Composer/Installers/BonefishInstaller.php b/includes/vendor/composer/installers/src/Composer/Installers/BonefishInstaller.php new file mode 100644 index 0000000..da3aad2 --- /dev/null +++ b/includes/vendor/composer/installers/src/Composer/Installers/BonefishInstaller.php @@ -0,0 +1,9 @@ + 'Packages/{$vendor}/{$name}/' + ); +} diff --git a/includes/vendor/composer/installers/src/Composer/Installers/CakePHPInstaller.php b/includes/vendor/composer/installers/src/Composer/Installers/CakePHPInstaller.php new file mode 100644 index 0000000..1e2ddd0 --- /dev/null +++ b/includes/vendor/composer/installers/src/Composer/Installers/CakePHPInstaller.php @@ -0,0 +1,66 @@ + 'Plugin/{$name}/', + ); + + /** + * Format package name to CamelCase + */ + public function inflectPackageVars($vars) + { + if ($this->matchesCakeVersion('>=', '3.0.0')) { + return $vars; + } + + $nameParts = explode('/', $vars['name']); + foreach ($nameParts as &$value) { + $value = strtolower(preg_replace('/(?<=\\w)([A-Z])/', '_\\1', $value)); + $value = str_replace(array('-', '_'), ' ', $value); + $value = str_replace(' ', '', ucwords($value)); + } + $vars['name'] = implode('/', $nameParts); + + return $vars; + } + + /** + * Change the default plugin location when cakephp >= 3.0 + */ + public function getLocations() + { + if ($this->matchesCakeVersion('>=', '3.0.0')) { + $this->locations['plugin'] = $this->composer->getConfig()->get('vendor-dir') . '/{$vendor}/{$name}/'; + } + return $this->locations; + } + + /** + * Check if CakePHP version matches against a version + * + * @param string $matcher + * @param string $version + * @return bool + * @phpstan-param Constraint::STR_OP_* $matcher + */ + protected function matchesCakeVersion($matcher, $version) + { + $repositoryManager = $this->composer->getRepositoryManager(); + if (! $repositoryManager) { + return false; + } + + $repos = $repositoryManager->getLocalRepository(); + if (!$repos) { + return false; + } + + return $repos->findPackage('cakephp/cakephp', new Constraint($matcher, $version)) !== null; + } +} diff --git a/includes/vendor/composer/installers/src/Composer/Installers/ChefInstaller.php b/includes/vendor/composer/installers/src/Composer/Installers/ChefInstaller.php new file mode 100644 index 0000000..ab2f9aa --- /dev/null +++ b/includes/vendor/composer/installers/src/Composer/Installers/ChefInstaller.php @@ -0,0 +1,11 @@ + 'Chef/{$vendor}/{$name}/', + 'role' => 'Chef/roles/{$name}/', + ); +} + diff --git a/includes/vendor/composer/installers/src/Composer/Installers/CiviCrmInstaller.php b/includes/vendor/composer/installers/src/Composer/Installers/CiviCrmInstaller.php new file mode 100644 index 0000000..6673aea --- /dev/null +++ b/includes/vendor/composer/installers/src/Composer/Installers/CiviCrmInstaller.php @@ -0,0 +1,9 @@ + 'ext/{$name}/' + ); +} diff --git a/includes/vendor/composer/installers/src/Composer/Installers/ClanCatsFrameworkInstaller.php b/includes/vendor/composer/installers/src/Composer/Installers/ClanCatsFrameworkInstaller.php new file mode 100644 index 0000000..c887815 --- /dev/null +++ b/includes/vendor/composer/installers/src/Composer/Installers/ClanCatsFrameworkInstaller.php @@ -0,0 +1,10 @@ + 'CCF/orbit/{$name}/', + 'theme' => 'CCF/app/themes/{$name}/', + ); +} \ No newline at end of file diff --git a/includes/vendor/composer/installers/src/Composer/Installers/CockpitInstaller.php b/includes/vendor/composer/installers/src/Composer/Installers/CockpitInstaller.php new file mode 100644 index 0000000..053f3ff --- /dev/null +++ b/includes/vendor/composer/installers/src/Composer/Installers/CockpitInstaller.php @@ -0,0 +1,32 @@ + 'cockpit/modules/addons/{$name}/', + ); + + /** + * Format module name. + * + * Strip `module-` prefix from package name. + * + * {@inheritDoc} + */ + public function inflectPackageVars($vars) + { + if ($vars['type'] == 'cockpit-module') { + return $this->inflectModuleVars($vars); + } + + return $vars; + } + + public function inflectModuleVars($vars) + { + $vars['name'] = ucfirst(preg_replace('/cockpit-/i', '', $vars['name'])); + + return $vars; + } +} diff --git a/includes/vendor/composer/installers/src/Composer/Installers/CodeIgniterInstaller.php b/includes/vendor/composer/installers/src/Composer/Installers/CodeIgniterInstaller.php new file mode 100644 index 0000000..3b4a4ec --- /dev/null +++ b/includes/vendor/composer/installers/src/Composer/Installers/CodeIgniterInstaller.php @@ -0,0 +1,11 @@ + 'application/libraries/{$name}/', + 'third-party' => 'application/third_party/{$name}/', + 'module' => 'application/modules/{$name}/', + ); +} diff --git a/includes/vendor/composer/installers/src/Composer/Installers/Concrete5Installer.php b/includes/vendor/composer/installers/src/Composer/Installers/Concrete5Installer.php new file mode 100644 index 0000000..5c01baf --- /dev/null +++ b/includes/vendor/composer/installers/src/Composer/Installers/Concrete5Installer.php @@ -0,0 +1,13 @@ + 'concrete/', + 'block' => 'application/blocks/{$name}/', + 'package' => 'packages/{$name}/', + 'theme' => 'application/themes/{$name}/', + 'update' => 'updates/{$name}/', + ); +} diff --git a/includes/vendor/composer/installers/src/Composer/Installers/CraftInstaller.php b/includes/vendor/composer/installers/src/Composer/Installers/CraftInstaller.php new file mode 100644 index 0000000..d37a77a --- /dev/null +++ b/includes/vendor/composer/installers/src/Composer/Installers/CraftInstaller.php @@ -0,0 +1,35 @@ + 'craft/plugins/{$name}/', + ); + + /** + * Strip `craft-` prefix and/or `-plugin` suffix from package names + * + * @param array $vars + * + * @return array + */ + final public function inflectPackageVars($vars) + { + return $this->inflectPluginVars($vars); + } + + private function inflectPluginVars($vars) + { + $vars['name'] = preg_replace('/-' . self::NAME_SUFFIX . '$/i', '', $vars['name']); + $vars['name'] = preg_replace('/^' . self::NAME_PREFIX . '-/i', '', $vars['name']); + + return $vars; + } +} diff --git a/includes/vendor/composer/installers/src/Composer/Installers/CroogoInstaller.php b/includes/vendor/composer/installers/src/Composer/Installers/CroogoInstaller.php new file mode 100644 index 0000000..d94219d --- /dev/null +++ b/includes/vendor/composer/installers/src/Composer/Installers/CroogoInstaller.php @@ -0,0 +1,21 @@ + 'Plugin/{$name}/', + 'theme' => 'View/Themed/{$name}/', + ); + + /** + * Format package name to CamelCase + */ + public function inflectPackageVars($vars) + { + $vars['name'] = strtolower(str_replace(array('-', '_'), ' ', $vars['name'])); + $vars['name'] = str_replace(' ', '', ucwords($vars['name'])); + + return $vars; + } +} diff --git a/includes/vendor/composer/installers/src/Composer/Installers/DecibelInstaller.php b/includes/vendor/composer/installers/src/Composer/Installers/DecibelInstaller.php new file mode 100644 index 0000000..f4837a6 --- /dev/null +++ b/includes/vendor/composer/installers/src/Composer/Installers/DecibelInstaller.php @@ -0,0 +1,10 @@ + 'app/{$name}/', + ); +} diff --git a/includes/vendor/composer/installers/src/Composer/Installers/DframeInstaller.php b/includes/vendor/composer/installers/src/Composer/Installers/DframeInstaller.php new file mode 100644 index 0000000..7078816 --- /dev/null +++ b/includes/vendor/composer/installers/src/Composer/Installers/DframeInstaller.php @@ -0,0 +1,10 @@ + 'modules/{$vendor}/{$name}/', + ); +} diff --git a/includes/vendor/composer/installers/src/Composer/Installers/DokuWikiInstaller.php b/includes/vendor/composer/installers/src/Composer/Installers/DokuWikiInstaller.php new file mode 100644 index 0000000..cfd638d --- /dev/null +++ b/includes/vendor/composer/installers/src/Composer/Installers/DokuWikiInstaller.php @@ -0,0 +1,50 @@ + 'lib/plugins/{$name}/', + 'template' => 'lib/tpl/{$name}/', + ); + + /** + * Format package name. + * + * For package type dokuwiki-plugin, cut off a trailing '-plugin', + * or leading dokuwiki_ if present. + * + * For package type dokuwiki-template, cut off a trailing '-template' if present. + * + */ + public function inflectPackageVars($vars) + { + + if ($vars['type'] === 'dokuwiki-plugin') { + return $this->inflectPluginVars($vars); + } + + if ($vars['type'] === 'dokuwiki-template') { + return $this->inflectTemplateVars($vars); + } + + return $vars; + } + + protected function inflectPluginVars($vars) + { + $vars['name'] = preg_replace('/-plugin$/', '', $vars['name']); + $vars['name'] = preg_replace('/^dokuwiki_?-?/', '', $vars['name']); + + return $vars; + } + + protected function inflectTemplateVars($vars) + { + $vars['name'] = preg_replace('/-template$/', '', $vars['name']); + $vars['name'] = preg_replace('/^dokuwiki_?-?/', '', $vars['name']); + + return $vars; + } + +} diff --git a/includes/vendor/composer/installers/src/Composer/Installers/DolibarrInstaller.php b/includes/vendor/composer/installers/src/Composer/Installers/DolibarrInstaller.php new file mode 100644 index 0000000..21f7e8e --- /dev/null +++ b/includes/vendor/composer/installers/src/Composer/Installers/DolibarrInstaller.php @@ -0,0 +1,16 @@ + + */ +class DolibarrInstaller extends BaseInstaller +{ + //TODO: Add support for scripts and themes + protected $locations = array( + 'module' => 'htdocs/custom/{$name}/', + ); +} diff --git a/includes/vendor/composer/installers/src/Composer/Installers/DrupalInstaller.php b/includes/vendor/composer/installers/src/Composer/Installers/DrupalInstaller.php new file mode 100644 index 0000000..7328239 --- /dev/null +++ b/includes/vendor/composer/installers/src/Composer/Installers/DrupalInstaller.php @@ -0,0 +1,22 @@ + 'core/', + 'module' => 'modules/{$name}/', + 'theme' => 'themes/{$name}/', + 'library' => 'libraries/{$name}/', + 'profile' => 'profiles/{$name}/', + 'database-driver' => 'drivers/lib/Drupal/Driver/Database/{$name}/', + 'drush' => 'drush/{$name}/', + 'custom-theme' => 'themes/custom/{$name}/', + 'custom-module' => 'modules/custom/{$name}/', + 'custom-profile' => 'profiles/custom/{$name}/', + 'drupal-multisite' => 'sites/{$name}/', + 'console' => 'console/{$name}/', + 'console-language' => 'console/language/{$name}/', + 'config' => 'config/sync/', + ); +} diff --git a/includes/vendor/composer/installers/src/Composer/Installers/ElggInstaller.php b/includes/vendor/composer/installers/src/Composer/Installers/ElggInstaller.php new file mode 100644 index 0000000..c0bb609 --- /dev/null +++ b/includes/vendor/composer/installers/src/Composer/Installers/ElggInstaller.php @@ -0,0 +1,9 @@ + 'mod/{$name}/', + ); +} diff --git a/includes/vendor/composer/installers/src/Composer/Installers/EliasisInstaller.php b/includes/vendor/composer/installers/src/Composer/Installers/EliasisInstaller.php new file mode 100644 index 0000000..6f3dc97 --- /dev/null +++ b/includes/vendor/composer/installers/src/Composer/Installers/EliasisInstaller.php @@ -0,0 +1,12 @@ + 'components/{$name}/', + 'module' => 'modules/{$name}/', + 'plugin' => 'plugins/{$name}/', + 'template' => 'templates/{$name}/', + ); +} diff --git a/includes/vendor/composer/installers/src/Composer/Installers/ExpressionEngineInstaller.php b/includes/vendor/composer/installers/src/Composer/Installers/ExpressionEngineInstaller.php new file mode 100644 index 0000000..d5321a8 --- /dev/null +++ b/includes/vendor/composer/installers/src/Composer/Installers/ExpressionEngineInstaller.php @@ -0,0 +1,29 @@ + 'system/expressionengine/third_party/{$name}/', + 'theme' => 'themes/third_party/{$name}/', + ); + + private $ee3Locations = array( + 'addon' => 'system/user/addons/{$name}/', + 'theme' => 'themes/user/{$name}/', + ); + + public function getInstallPath(PackageInterface $package, $frameworkType = '') + { + + $version = "{$frameworkType}Locations"; + $this->locations = $this->$version; + + return parent::getInstallPath($package, $frameworkType); + } +} diff --git a/includes/vendor/composer/installers/src/Composer/Installers/EzPlatformInstaller.php b/includes/vendor/composer/installers/src/Composer/Installers/EzPlatformInstaller.php new file mode 100644 index 0000000..f30ebcc --- /dev/null +++ b/includes/vendor/composer/installers/src/Composer/Installers/EzPlatformInstaller.php @@ -0,0 +1,10 @@ + 'web/assets/ezplatform/', + 'assets' => 'web/assets/ezplatform/{$name}/', + ); +} diff --git a/includes/vendor/composer/installers/src/Composer/Installers/FuelInstaller.php b/includes/vendor/composer/installers/src/Composer/Installers/FuelInstaller.php new file mode 100644 index 0000000..6eba2e3 --- /dev/null +++ b/includes/vendor/composer/installers/src/Composer/Installers/FuelInstaller.php @@ -0,0 +1,11 @@ + 'fuel/app/modules/{$name}/', + 'package' => 'fuel/packages/{$name}/', + 'theme' => 'fuel/app/themes/{$name}/', + ); +} diff --git a/includes/vendor/composer/installers/src/Composer/Installers/FuelphpInstaller.php b/includes/vendor/composer/installers/src/Composer/Installers/FuelphpInstaller.php new file mode 100644 index 0000000..29d980b --- /dev/null +++ b/includes/vendor/composer/installers/src/Composer/Installers/FuelphpInstaller.php @@ -0,0 +1,9 @@ + 'components/{$name}/', + ); +} diff --git a/includes/vendor/composer/installers/src/Composer/Installers/GravInstaller.php b/includes/vendor/composer/installers/src/Composer/Installers/GravInstaller.php new file mode 100644 index 0000000..dbe63e0 --- /dev/null +++ b/includes/vendor/composer/installers/src/Composer/Installers/GravInstaller.php @@ -0,0 +1,30 @@ + 'user/plugins/{$name}/', + 'theme' => 'user/themes/{$name}/', + ); + + /** + * Format package name + * + * @param array $vars + * + * @return array + */ + public function inflectPackageVars($vars) + { + $restrictedWords = implode('|', array_keys($this->locations)); + + $vars['name'] = strtolower($vars['name']); + $vars['name'] = preg_replace('/^(?:grav-)?(?:(?:'.$restrictedWords.')-)?(.*?)(?:-(?:'.$restrictedWords.'))?$/ui', + '$1', + $vars['name'] + ); + + return $vars; + } +} diff --git a/includes/vendor/composer/installers/src/Composer/Installers/HuradInstaller.php b/includes/vendor/composer/installers/src/Composer/Installers/HuradInstaller.php new file mode 100644 index 0000000..8fe017f --- /dev/null +++ b/includes/vendor/composer/installers/src/Composer/Installers/HuradInstaller.php @@ -0,0 +1,25 @@ + 'plugins/{$name}/', + 'theme' => 'plugins/{$name}/', + ); + + /** + * Format package name to CamelCase + */ + public function inflectPackageVars($vars) + { + $nameParts = explode('/', $vars['name']); + foreach ($nameParts as &$value) { + $value = strtolower(preg_replace('/(?<=\\w)([A-Z])/', '_\\1', $value)); + $value = str_replace(array('-', '_'), ' ', $value); + $value = str_replace(' ', '', ucwords($value)); + } + $vars['name'] = implode('/', $nameParts); + return $vars; + } +} diff --git a/includes/vendor/composer/installers/src/Composer/Installers/ImageCMSInstaller.php b/includes/vendor/composer/installers/src/Composer/Installers/ImageCMSInstaller.php new file mode 100644 index 0000000..5e2142e --- /dev/null +++ b/includes/vendor/composer/installers/src/Composer/Installers/ImageCMSInstaller.php @@ -0,0 +1,11 @@ + 'templates/{$name}/', + 'module' => 'application/modules/{$name}/', + 'library' => 'application/libraries/{$name}/', + ); +} diff --git a/includes/vendor/composer/installers/src/Composer/Installers/Installer.php b/includes/vendor/composer/installers/src/Composer/Installers/Installer.php new file mode 100644 index 0000000..9c9c24f --- /dev/null +++ b/includes/vendor/composer/installers/src/Composer/Installers/Installer.php @@ -0,0 +1,298 @@ + 'AimeosInstaller', + 'asgard' => 'AsgardInstaller', + 'attogram' => 'AttogramInstaller', + 'agl' => 'AglInstaller', + 'annotatecms' => 'AnnotateCmsInstaller', + 'bitrix' => 'BitrixInstaller', + 'bonefish' => 'BonefishInstaller', + 'cakephp' => 'CakePHPInstaller', + 'chef' => 'ChefInstaller', + 'civicrm' => 'CiviCrmInstaller', + 'ccframework' => 'ClanCatsFrameworkInstaller', + 'cockpit' => 'CockpitInstaller', + 'codeigniter' => 'CodeIgniterInstaller', + 'concrete5' => 'Concrete5Installer', + 'craft' => 'CraftInstaller', + 'croogo' => 'CroogoInstaller', + 'dframe' => 'DframeInstaller', + 'dokuwiki' => 'DokuWikiInstaller', + 'dolibarr' => 'DolibarrInstaller', + 'decibel' => 'DecibelInstaller', + 'drupal' => 'DrupalInstaller', + 'elgg' => 'ElggInstaller', + 'eliasis' => 'EliasisInstaller', + 'ee3' => 'ExpressionEngineInstaller', + 'ee2' => 'ExpressionEngineInstaller', + 'ezplatform' => 'EzPlatformInstaller', + 'fuel' => 'FuelInstaller', + 'fuelphp' => 'FuelphpInstaller', + 'grav' => 'GravInstaller', + 'hurad' => 'HuradInstaller', + 'tastyigniter' => 'TastyIgniterInstaller', + 'imagecms' => 'ImageCMSInstaller', + 'itop' => 'ItopInstaller', + 'joomla' => 'JoomlaInstaller', + 'kanboard' => 'KanboardInstaller', + 'kirby' => 'KirbyInstaller', + 'known' => 'KnownInstaller', + 'kodicms' => 'KodiCMSInstaller', + 'kohana' => 'KohanaInstaller', + 'lms' => 'LanManagementSystemInstaller', + 'laravel' => 'LaravelInstaller', + 'lavalite' => 'LavaLiteInstaller', + 'lithium' => 'LithiumInstaller', + 'magento' => 'MagentoInstaller', + 'majima' => 'MajimaInstaller', + 'mantisbt' => 'MantisBTInstaller', + 'mako' => 'MakoInstaller', + 'maya' => 'MayaInstaller', + 'mautic' => 'MauticInstaller', + 'mediawiki' => 'MediaWikiInstaller', + 'miaoxing' => 'MiaoxingInstaller', + 'microweber' => 'MicroweberInstaller', + 'modulework' => 'MODULEWorkInstaller', + 'modx' => 'ModxInstaller', + 'modxevo' => 'MODXEvoInstaller', + 'moodle' => 'MoodleInstaller', + 'october' => 'OctoberInstaller', + 'ontowiki' => 'OntoWikiInstaller', + 'oxid' => 'OxidInstaller', + 'osclass' => 'OsclassInstaller', + 'pxcms' => 'PxcmsInstaller', + 'phpbb' => 'PhpBBInstaller', + 'pimcore' => 'PimcoreInstaller', + 'piwik' => 'PiwikInstaller', + 'plentymarkets'=> 'PlentymarketsInstaller', + 'ppi' => 'PPIInstaller', + 'puppet' => 'PuppetInstaller', + 'radphp' => 'RadPHPInstaller', + 'phifty' => 'PhiftyInstaller', + 'porto' => 'PortoInstaller', + 'processwire' => 'ProcessWireInstaller', + 'quicksilver' => 'PantheonInstaller', + 'redaxo' => 'RedaxoInstaller', + 'redaxo5' => 'Redaxo5Installer', + 'reindex' => 'ReIndexInstaller', + 'roundcube' => 'RoundcubeInstaller', + 'shopware' => 'ShopwareInstaller', + 'sitedirect' => 'SiteDirectInstaller', + 'silverstripe' => 'SilverStripeInstaller', + 'smf' => 'SMFInstaller', + 'starbug' => 'StarbugInstaller', + 'sydes' => 'SyDESInstaller', + 'sylius' => 'SyliusInstaller', + 'symfony1' => 'Symfony1Installer', + 'tao' => 'TaoInstaller', + 'thelia' => 'TheliaInstaller', + 'tusk' => 'TuskInstaller', + 'typo3-cms' => 'TYPO3CmsInstaller', + 'typo3-flow' => 'TYPO3FlowInstaller', + 'userfrosting' => 'UserFrostingInstaller', + 'vanilla' => 'VanillaInstaller', + 'whmcs' => 'WHMCSInstaller', + 'winter' => 'WinterInstaller', + 'wolfcms' => 'WolfCMSInstaller', + 'wordpress' => 'WordPressInstaller', + 'yawik' => 'YawikInstaller', + 'zend' => 'ZendInstaller', + 'zikula' => 'ZikulaInstaller', + 'prestashop' => 'PrestashopInstaller' + ); + + /** + * Installer constructor. + * + * Disables installers specified in main composer extra installer-disable + * list + * + * @param IOInterface $io + * @param Composer $composer + * @param string $type + * @param Filesystem|null $filesystem + * @param BinaryInstaller|null $binaryInstaller + */ + public function __construct( + IOInterface $io, + Composer $composer, + $type = 'library', + Filesystem $filesystem = null, + BinaryInstaller $binaryInstaller = null + ) { + parent::__construct($io, $composer, $type, $filesystem, + $binaryInstaller); + $this->removeDisabledInstallers(); + } + + /** + * {@inheritDoc} + */ + public function getInstallPath(PackageInterface $package) + { + $type = $package->getType(); + $frameworkType = $this->findFrameworkType($type); + + if ($frameworkType === false) { + throw new \InvalidArgumentException( + 'Sorry the package type of this package is not yet supported.' + ); + } + + $class = 'Composer\\Installers\\' . $this->supportedTypes[$frameworkType]; + $installer = new $class($package, $this->composer, $this->getIO()); + + return $installer->getInstallPath($package, $frameworkType); + } + + public function uninstall(InstalledRepositoryInterface $repo, PackageInterface $package) + { + $installPath = $this->getPackageBasePath($package); + $io = $this->io; + $outputStatus = function () use ($io, $installPath) { + $io->write(sprintf('Deleting %s - %s', $installPath, !file_exists($installPath) ? 'deleted' : 'not deleted')); + }; + + $promise = parent::uninstall($repo, $package); + + // Composer v2 might return a promise here + if ($promise instanceof PromiseInterface) { + return $promise->then($outputStatus); + } + + // If not, execute the code right away as parent::uninstall executed synchronously (composer v1, or v2 without async) + $outputStatus(); + + return null; + } + + /** + * {@inheritDoc} + */ + public function supports($packageType) + { + $frameworkType = $this->findFrameworkType($packageType); + + if ($frameworkType === false) { + return false; + } + + $locationPattern = $this->getLocationPattern($frameworkType); + + return preg_match('#' . $frameworkType . '-' . $locationPattern . '#', $packageType, $matches) === 1; + } + + /** + * Finds a supported framework type if it exists and returns it + * + * @param string $type + * @return string|false + */ + protected function findFrameworkType($type) + { + krsort($this->supportedTypes); + + foreach ($this->supportedTypes as $key => $val) { + if ($key === substr($type, 0, strlen($key))) { + return substr($type, 0, strlen($key)); + } + } + + return false; + } + + /** + * Get the second part of the regular expression to check for support of a + * package type + * + * @param string $frameworkType + * @return string + */ + protected function getLocationPattern($frameworkType) + { + $pattern = false; + if (!empty($this->supportedTypes[$frameworkType])) { + $frameworkClass = 'Composer\\Installers\\' . $this->supportedTypes[$frameworkType]; + /** @var BaseInstaller $framework */ + $framework = new $frameworkClass(null, $this->composer, $this->getIO()); + $locations = array_keys($framework->getLocations()); + $pattern = $locations ? '(' . implode('|', $locations) . ')' : false; + } + + return $pattern ? : '(\w+)'; + } + + /** + * Get I/O object + * + * @return IOInterface + */ + private function getIO() + { + return $this->io; + } + + /** + * Look for installers set to be disabled in composer's extra config and + * remove them from the list of supported installers. + * + * Globals: + * - true, "all", and "*" - disable all installers. + * - false - enable all installers (useful with + * wikimedia/composer-merge-plugin or similar) + * + * @return void + */ + protected function removeDisabledInstallers() + { + $extra = $this->composer->getPackage()->getExtra(); + + if (!isset($extra['installer-disable']) || $extra['installer-disable'] === false) { + // No installers are disabled + return; + } + + // Get installers to disable + $disable = $extra['installer-disable']; + + // Ensure $disabled is an array + if (!is_array($disable)) { + $disable = array($disable); + } + + // Check which installers should be disabled + $all = array(true, "all", "*"); + $intersect = array_intersect($all, $disable); + if (!empty($intersect)) { + // Disable all installers + $this->supportedTypes = array(); + } else { + // Disable specified installers + foreach ($disable as $key => $installer) { + if (is_string($installer) && key_exists($installer, $this->supportedTypes)) { + unset($this->supportedTypes[$installer]); + } + } + } + } +} diff --git a/includes/vendor/composer/installers/src/Composer/Installers/ItopInstaller.php b/includes/vendor/composer/installers/src/Composer/Installers/ItopInstaller.php new file mode 100644 index 0000000..c6c1b33 --- /dev/null +++ b/includes/vendor/composer/installers/src/Composer/Installers/ItopInstaller.php @@ -0,0 +1,9 @@ + 'extensions/{$name}/', + ); +} diff --git a/includes/vendor/composer/installers/src/Composer/Installers/JoomlaInstaller.php b/includes/vendor/composer/installers/src/Composer/Installers/JoomlaInstaller.php new file mode 100644 index 0000000..9ee7759 --- /dev/null +++ b/includes/vendor/composer/installers/src/Composer/Installers/JoomlaInstaller.php @@ -0,0 +1,15 @@ + 'components/{$name}/', + 'module' => 'modules/{$name}/', + 'template' => 'templates/{$name}/', + 'plugin' => 'plugins/{$name}/', + 'library' => 'libraries/{$name}/', + ); + + // TODO: Add inflector for mod_ and com_ names +} diff --git a/includes/vendor/composer/installers/src/Composer/Installers/KanboardInstaller.php b/includes/vendor/composer/installers/src/Composer/Installers/KanboardInstaller.php new file mode 100644 index 0000000..9cb7b8c --- /dev/null +++ b/includes/vendor/composer/installers/src/Composer/Installers/KanboardInstaller.php @@ -0,0 +1,18 @@ + 'plugins/{$name}/', + ); +} diff --git a/includes/vendor/composer/installers/src/Composer/Installers/KirbyInstaller.php b/includes/vendor/composer/installers/src/Composer/Installers/KirbyInstaller.php new file mode 100644 index 0000000..36b2f84 --- /dev/null +++ b/includes/vendor/composer/installers/src/Composer/Installers/KirbyInstaller.php @@ -0,0 +1,11 @@ + 'site/plugins/{$name}/', + 'field' => 'site/fields/{$name}/', + 'tag' => 'site/tags/{$name}/' + ); +} diff --git a/includes/vendor/composer/installers/src/Composer/Installers/KnownInstaller.php b/includes/vendor/composer/installers/src/Composer/Installers/KnownInstaller.php new file mode 100644 index 0000000..c5d08c5 --- /dev/null +++ b/includes/vendor/composer/installers/src/Composer/Installers/KnownInstaller.php @@ -0,0 +1,11 @@ + 'IdnoPlugins/{$name}/', + 'theme' => 'Themes/{$name}/', + 'console' => 'ConsolePlugins/{$name}/', + ); +} diff --git a/includes/vendor/composer/installers/src/Composer/Installers/KodiCMSInstaller.php b/includes/vendor/composer/installers/src/Composer/Installers/KodiCMSInstaller.php new file mode 100644 index 0000000..7143e23 --- /dev/null +++ b/includes/vendor/composer/installers/src/Composer/Installers/KodiCMSInstaller.php @@ -0,0 +1,10 @@ + 'cms/plugins/{$name}/', + 'media' => 'cms/media/vendor/{$name}/' + ); +} \ No newline at end of file diff --git a/includes/vendor/composer/installers/src/Composer/Installers/KohanaInstaller.php b/includes/vendor/composer/installers/src/Composer/Installers/KohanaInstaller.php new file mode 100644 index 0000000..dcd6d26 --- /dev/null +++ b/includes/vendor/composer/installers/src/Composer/Installers/KohanaInstaller.php @@ -0,0 +1,9 @@ + 'modules/{$name}/', + ); +} diff --git a/includes/vendor/composer/installers/src/Composer/Installers/LanManagementSystemInstaller.php b/includes/vendor/composer/installers/src/Composer/Installers/LanManagementSystemInstaller.php new file mode 100644 index 0000000..903143a --- /dev/null +++ b/includes/vendor/composer/installers/src/Composer/Installers/LanManagementSystemInstaller.php @@ -0,0 +1,27 @@ + 'plugins/{$name}/', + 'template' => 'templates/{$name}/', + 'document-template' => 'documents/templates/{$name}/', + 'userpanel-module' => 'userpanel/modules/{$name}/', + ); + + /** + * Format package name to CamelCase + */ + public function inflectPackageVars($vars) + { + $vars['name'] = strtolower(preg_replace('/(?<=\\w)([A-Z])/', '_\\1', $vars['name'])); + $vars['name'] = str_replace(array('-', '_'), ' ', $vars['name']); + $vars['name'] = str_replace(' ', '', ucwords($vars['name'])); + + return $vars; + } + +} diff --git a/includes/vendor/composer/installers/src/Composer/Installers/LaravelInstaller.php b/includes/vendor/composer/installers/src/Composer/Installers/LaravelInstaller.php new file mode 100644 index 0000000..be4d53a --- /dev/null +++ b/includes/vendor/composer/installers/src/Composer/Installers/LaravelInstaller.php @@ -0,0 +1,9 @@ + 'libraries/{$name}/', + ); +} diff --git a/includes/vendor/composer/installers/src/Composer/Installers/LavaLiteInstaller.php b/includes/vendor/composer/installers/src/Composer/Installers/LavaLiteInstaller.php new file mode 100644 index 0000000..412c0b5 --- /dev/null +++ b/includes/vendor/composer/installers/src/Composer/Installers/LavaLiteInstaller.php @@ -0,0 +1,10 @@ + 'packages/{$vendor}/{$name}/', + 'theme' => 'public/themes/{$name}/', + ); +} diff --git a/includes/vendor/composer/installers/src/Composer/Installers/LithiumInstaller.php b/includes/vendor/composer/installers/src/Composer/Installers/LithiumInstaller.php new file mode 100644 index 0000000..47bbd4c --- /dev/null +++ b/includes/vendor/composer/installers/src/Composer/Installers/LithiumInstaller.php @@ -0,0 +1,10 @@ + 'libraries/{$name}/', + 'source' => 'libraries/_source/{$name}/', + ); +} diff --git a/includes/vendor/composer/installers/src/Composer/Installers/MODULEWorkInstaller.php b/includes/vendor/composer/installers/src/Composer/Installers/MODULEWorkInstaller.php new file mode 100644 index 0000000..9c2e9fb --- /dev/null +++ b/includes/vendor/composer/installers/src/Composer/Installers/MODULEWorkInstaller.php @@ -0,0 +1,9 @@ + 'modules/{$name}/', + ); +} diff --git a/includes/vendor/composer/installers/src/Composer/Installers/MODXEvoInstaller.php b/includes/vendor/composer/installers/src/Composer/Installers/MODXEvoInstaller.php new file mode 100644 index 0000000..5a66460 --- /dev/null +++ b/includes/vendor/composer/installers/src/Composer/Installers/MODXEvoInstaller.php @@ -0,0 +1,16 @@ + 'assets/snippets/{$name}/', + 'plugin' => 'assets/plugins/{$name}/', + 'module' => 'assets/modules/{$name}/', + 'template' => 'assets/templates/{$name}/', + 'lib' => 'assets/lib/{$name}/' + ); +} diff --git a/includes/vendor/composer/installers/src/Composer/Installers/MagentoInstaller.php b/includes/vendor/composer/installers/src/Composer/Installers/MagentoInstaller.php new file mode 100644 index 0000000..cf18e94 --- /dev/null +++ b/includes/vendor/composer/installers/src/Composer/Installers/MagentoInstaller.php @@ -0,0 +1,11 @@ + 'app/design/frontend/{$name}/', + 'skin' => 'skin/frontend/default/{$name}/', + 'library' => 'lib/{$name}/', + ); +} diff --git a/includes/vendor/composer/installers/src/Composer/Installers/MajimaInstaller.php b/includes/vendor/composer/installers/src/Composer/Installers/MajimaInstaller.php new file mode 100644 index 0000000..e463756 --- /dev/null +++ b/includes/vendor/composer/installers/src/Composer/Installers/MajimaInstaller.php @@ -0,0 +1,37 @@ + 'plugins/{$name}/', + ); + + /** + * Transforms the names + * @param array $vars + * @return array + */ + public function inflectPackageVars($vars) + { + return $this->correctPluginName($vars); + } + + /** + * Change hyphenated names to camelcase + * @param array $vars + * @return array + */ + private function correctPluginName($vars) + { + $camelCasedName = preg_replace_callback('/(-[a-z])/', function ($matches) { + return strtoupper($matches[0][1]); + }, $vars['name']); + $vars['name'] = ucfirst($camelCasedName); + return $vars; + } +} diff --git a/includes/vendor/composer/installers/src/Composer/Installers/MakoInstaller.php b/includes/vendor/composer/installers/src/Composer/Installers/MakoInstaller.php new file mode 100644 index 0000000..ca3cfac --- /dev/null +++ b/includes/vendor/composer/installers/src/Composer/Installers/MakoInstaller.php @@ -0,0 +1,9 @@ + 'app/packages/{$name}/', + ); +} diff --git a/includes/vendor/composer/installers/src/Composer/Installers/MantisBTInstaller.php b/includes/vendor/composer/installers/src/Composer/Installers/MantisBTInstaller.php new file mode 100644 index 0000000..dadb1db --- /dev/null +++ b/includes/vendor/composer/installers/src/Composer/Installers/MantisBTInstaller.php @@ -0,0 +1,23 @@ + 'plugins/{$name}/', + ); + + /** + * Format package name to CamelCase + */ + public function inflectPackageVars($vars) + { + $vars['name'] = strtolower(preg_replace('/(?<=\\w)([A-Z])/', '_\\1', $vars['name'])); + $vars['name'] = str_replace(array('-', '_'), ' ', $vars['name']); + $vars['name'] = str_replace(' ', '', ucwords($vars['name'])); + + return $vars; + } +} diff --git a/includes/vendor/composer/installers/src/Composer/Installers/MauticInstaller.php b/includes/vendor/composer/installers/src/Composer/Installers/MauticInstaller.php new file mode 100644 index 0000000..c3dd2b6 --- /dev/null +++ b/includes/vendor/composer/installers/src/Composer/Installers/MauticInstaller.php @@ -0,0 +1,48 @@ + 'plugins/{$name}/', + 'theme' => 'themes/{$name}/', + 'core' => 'app/', + ); + + private function getDirectoryName() + { + $extra = $this->package->getExtra(); + if (!empty($extra['install-directory-name'])) { + return $extra['install-directory-name']; + } + + return $this->toCamelCase($this->package->getPrettyName()); + } + + /** + * @param string $packageName + * + * @return string + */ + private function toCamelCase($packageName) + { + return str_replace(' ', '', ucwords(str_replace('-', ' ', basename($packageName)))); + } + + /** + * Format package name of mautic-plugins to CamelCase + */ + public function inflectPackageVars($vars) + { + + if ($vars['type'] == 'mautic-plugin' || $vars['type'] == 'mautic-theme') { + $directoryName = $this->getDirectoryName(); + $vars['name'] = $directoryName; + } + + return $vars; + } + +} diff --git a/includes/vendor/composer/installers/src/Composer/Installers/MayaInstaller.php b/includes/vendor/composer/installers/src/Composer/Installers/MayaInstaller.php new file mode 100644 index 0000000..30a9167 --- /dev/null +++ b/includes/vendor/composer/installers/src/Composer/Installers/MayaInstaller.php @@ -0,0 +1,33 @@ + 'modules/{$name}/', + ); + + /** + * Format package name. + * + * For package type maya-module, cut off a trailing '-module' if present. + * + */ + public function inflectPackageVars($vars) + { + if ($vars['type'] === 'maya-module') { + return $this->inflectModuleVars($vars); + } + + return $vars; + } + + protected function inflectModuleVars($vars) + { + $vars['name'] = preg_replace('/-module$/', '', $vars['name']); + $vars['name'] = str_replace(array('-', '_'), ' ', $vars['name']); + $vars['name'] = str_replace(' ', '', ucwords($vars['name'])); + + return $vars; + } +} diff --git a/includes/vendor/composer/installers/src/Composer/Installers/MediaWikiInstaller.php b/includes/vendor/composer/installers/src/Composer/Installers/MediaWikiInstaller.php new file mode 100644 index 0000000..f5a8957 --- /dev/null +++ b/includes/vendor/composer/installers/src/Composer/Installers/MediaWikiInstaller.php @@ -0,0 +1,51 @@ + 'core/', + 'extension' => 'extensions/{$name}/', + 'skin' => 'skins/{$name}/', + ); + + /** + * Format package name. + * + * For package type mediawiki-extension, cut off a trailing '-extension' if present and transform + * to CamelCase keeping existing uppercase chars. + * + * For package type mediawiki-skin, cut off a trailing '-skin' if present. + * + */ + public function inflectPackageVars($vars) + { + + if ($vars['type'] === 'mediawiki-extension') { + return $this->inflectExtensionVars($vars); + } + + if ($vars['type'] === 'mediawiki-skin') { + return $this->inflectSkinVars($vars); + } + + return $vars; + } + + protected function inflectExtensionVars($vars) + { + $vars['name'] = preg_replace('/-extension$/', '', $vars['name']); + $vars['name'] = str_replace('-', ' ', $vars['name']); + $vars['name'] = str_replace(' ', '', ucwords($vars['name'])); + + return $vars; + } + + protected function inflectSkinVars($vars) + { + $vars['name'] = preg_replace('/-skin$/', '', $vars['name']); + + return $vars; + } + +} diff --git a/includes/vendor/composer/installers/src/Composer/Installers/MiaoxingInstaller.php b/includes/vendor/composer/installers/src/Composer/Installers/MiaoxingInstaller.php new file mode 100644 index 0000000..66d8369 --- /dev/null +++ b/includes/vendor/composer/installers/src/Composer/Installers/MiaoxingInstaller.php @@ -0,0 +1,10 @@ + 'plugins/{$name}/', + ); +} diff --git a/includes/vendor/composer/installers/src/Composer/Installers/MicroweberInstaller.php b/includes/vendor/composer/installers/src/Composer/Installers/MicroweberInstaller.php new file mode 100644 index 0000000..b7d9703 --- /dev/null +++ b/includes/vendor/composer/installers/src/Composer/Installers/MicroweberInstaller.php @@ -0,0 +1,119 @@ + 'userfiles/modules/{$install_item_dir}/', + 'module-skin' => 'userfiles/modules/{$install_item_dir}/templates/', + 'template' => 'userfiles/templates/{$install_item_dir}/', + 'element' => 'userfiles/elements/{$install_item_dir}/', + 'vendor' => 'vendor/{$install_item_dir}/', + 'components' => 'components/{$install_item_dir}/' + ); + + /** + * Format package name. + * + * For package type microweber-module, cut off a trailing '-module' if present + * + * For package type microweber-template, cut off a trailing '-template' if present. + * + */ + public function inflectPackageVars($vars) + { + + + if ($this->package->getTargetDir()) { + $vars['install_item_dir'] = $this->package->getTargetDir(); + } else { + $vars['install_item_dir'] = $vars['name']; + if ($vars['type'] === 'microweber-template') { + return $this->inflectTemplateVars($vars); + } + if ($vars['type'] === 'microweber-templates') { + return $this->inflectTemplatesVars($vars); + } + if ($vars['type'] === 'microweber-core') { + return $this->inflectCoreVars($vars); + } + if ($vars['type'] === 'microweber-adapter') { + return $this->inflectCoreVars($vars); + } + if ($vars['type'] === 'microweber-module') { + return $this->inflectModuleVars($vars); + } + if ($vars['type'] === 'microweber-modules') { + return $this->inflectModulesVars($vars); + } + if ($vars['type'] === 'microweber-skin') { + return $this->inflectSkinVars($vars); + } + if ($vars['type'] === 'microweber-element' or $vars['type'] === 'microweber-elements') { + return $this->inflectElementVars($vars); + } + } + + + return $vars; + } + + protected function inflectTemplateVars($vars) + { + $vars['install_item_dir'] = preg_replace('/-template$/', '', $vars['install_item_dir']); + $vars['install_item_dir'] = preg_replace('/template-$/', '', $vars['install_item_dir']); + + return $vars; + } + + protected function inflectTemplatesVars($vars) + { + $vars['install_item_dir'] = preg_replace('/-templates$/', '', $vars['install_item_dir']); + $vars['install_item_dir'] = preg_replace('/templates-$/', '', $vars['install_item_dir']); + + return $vars; + } + + protected function inflectCoreVars($vars) + { + $vars['install_item_dir'] = preg_replace('/-providers$/', '', $vars['install_item_dir']); + $vars['install_item_dir'] = preg_replace('/-provider$/', '', $vars['install_item_dir']); + $vars['install_item_dir'] = preg_replace('/-adapter$/', '', $vars['install_item_dir']); + + return $vars; + } + + protected function inflectModuleVars($vars) + { + $vars['install_item_dir'] = preg_replace('/-module$/', '', $vars['install_item_dir']); + $vars['install_item_dir'] = preg_replace('/module-$/', '', $vars['install_item_dir']); + + return $vars; + } + + protected function inflectModulesVars($vars) + { + $vars['install_item_dir'] = preg_replace('/-modules$/', '', $vars['install_item_dir']); + $vars['install_item_dir'] = preg_replace('/modules-$/', '', $vars['install_item_dir']); + + return $vars; + } + + protected function inflectSkinVars($vars) + { + $vars['install_item_dir'] = preg_replace('/-skin$/', '', $vars['install_item_dir']); + $vars['install_item_dir'] = preg_replace('/skin-$/', '', $vars['install_item_dir']); + + return $vars; + } + + protected function inflectElementVars($vars) + { + $vars['install_item_dir'] = preg_replace('/-elements$/', '', $vars['install_item_dir']); + $vars['install_item_dir'] = preg_replace('/elements-$/', '', $vars['install_item_dir']); + $vars['install_item_dir'] = preg_replace('/-element$/', '', $vars['install_item_dir']); + $vars['install_item_dir'] = preg_replace('/element-$/', '', $vars['install_item_dir']); + + return $vars; + } +} diff --git a/includes/vendor/composer/installers/src/Composer/Installers/ModxInstaller.php b/includes/vendor/composer/installers/src/Composer/Installers/ModxInstaller.php new file mode 100644 index 0000000..0ee140a --- /dev/null +++ b/includes/vendor/composer/installers/src/Composer/Installers/ModxInstaller.php @@ -0,0 +1,12 @@ + 'core/packages/{$name}/' + ); +} diff --git a/includes/vendor/composer/installers/src/Composer/Installers/MoodleInstaller.php b/includes/vendor/composer/installers/src/Composer/Installers/MoodleInstaller.php new file mode 100644 index 0000000..0531799 --- /dev/null +++ b/includes/vendor/composer/installers/src/Composer/Installers/MoodleInstaller.php @@ -0,0 +1,59 @@ + 'mod/{$name}/', + 'admin_report' => 'admin/report/{$name}/', + 'atto' => 'lib/editor/atto/plugins/{$name}/', + 'tool' => 'admin/tool/{$name}/', + 'assignment' => 'mod/assignment/type/{$name}/', + 'assignsubmission' => 'mod/assign/submission/{$name}/', + 'assignfeedback' => 'mod/assign/feedback/{$name}/', + 'auth' => 'auth/{$name}/', + 'availability' => 'availability/condition/{$name}/', + 'block' => 'blocks/{$name}/', + 'booktool' => 'mod/book/tool/{$name}/', + 'cachestore' => 'cache/stores/{$name}/', + 'cachelock' => 'cache/locks/{$name}/', + 'calendartype' => 'calendar/type/{$name}/', + 'fileconverter' => 'files/converter/{$name}/', + 'format' => 'course/format/{$name}/', + 'coursereport' => 'course/report/{$name}/', + 'customcertelement' => 'mod/customcert/element/{$name}/', + 'datafield' => 'mod/data/field/{$name}/', + 'datapreset' => 'mod/data/preset/{$name}/', + 'editor' => 'lib/editor/{$name}/', + 'enrol' => 'enrol/{$name}/', + 'filter' => 'filter/{$name}/', + 'gradeexport' => 'grade/export/{$name}/', + 'gradeimport' => 'grade/import/{$name}/', + 'gradereport' => 'grade/report/{$name}/', + 'gradingform' => 'grade/grading/form/{$name}/', + 'local' => 'local/{$name}/', + 'logstore' => 'admin/tool/log/store/{$name}/', + 'ltisource' => 'mod/lti/source/{$name}/', + 'ltiservice' => 'mod/lti/service/{$name}/', + 'message' => 'message/output/{$name}/', + 'mnetservice' => 'mnet/service/{$name}/', + 'plagiarism' => 'plagiarism/{$name}/', + 'portfolio' => 'portfolio/{$name}/', + 'qbehaviour' => 'question/behaviour/{$name}/', + 'qformat' => 'question/format/{$name}/', + 'qtype' => 'question/type/{$name}/', + 'quizaccess' => 'mod/quiz/accessrule/{$name}/', + 'quiz' => 'mod/quiz/report/{$name}/', + 'report' => 'report/{$name}/', + 'repository' => 'repository/{$name}/', + 'scormreport' => 'mod/scorm/report/{$name}/', + 'search' => 'search/engine/{$name}/', + 'theme' => 'theme/{$name}/', + 'tinymce' => 'lib/editor/tinymce/plugins/{$name}/', + 'profilefield' => 'user/profile/field/{$name}/', + 'webservice' => 'webservice/{$name}/', + 'workshopallocation' => 'mod/workshop/allocation/{$name}/', + 'workshopeval' => 'mod/workshop/eval/{$name}/', + 'workshopform' => 'mod/workshop/form/{$name}/' + ); +} diff --git a/includes/vendor/composer/installers/src/Composer/Installers/OctoberInstaller.php b/includes/vendor/composer/installers/src/Composer/Installers/OctoberInstaller.php new file mode 100644 index 0000000..489ef02 --- /dev/null +++ b/includes/vendor/composer/installers/src/Composer/Installers/OctoberInstaller.php @@ -0,0 +1,48 @@ + 'modules/{$name}/', + 'plugin' => 'plugins/{$vendor}/{$name}/', + 'theme' => 'themes/{$vendor}-{$name}/' + ); + + /** + * Format package name. + * + * For package type october-plugin, cut off a trailing '-plugin' if present. + * + * For package type october-theme, cut off a trailing '-theme' if present. + * + */ + public function inflectPackageVars($vars) + { + if ($vars['type'] === 'october-plugin') { + return $this->inflectPluginVars($vars); + } + + if ($vars['type'] === 'october-theme') { + return $this->inflectThemeVars($vars); + } + + return $vars; + } + + protected function inflectPluginVars($vars) + { + $vars['name'] = preg_replace('/^oc-|-plugin$/', '', $vars['name']); + $vars['vendor'] = preg_replace('/[^a-z0-9_]/i', '', $vars['vendor']); + + return $vars; + } + + protected function inflectThemeVars($vars) + { + $vars['name'] = preg_replace('/^oc-|-theme$/', '', $vars['name']); + $vars['vendor'] = preg_replace('/[^a-z0-9_]/i', '', $vars['vendor']); + + return $vars; + } +} diff --git a/includes/vendor/composer/installers/src/Composer/Installers/OntoWikiInstaller.php b/includes/vendor/composer/installers/src/Composer/Installers/OntoWikiInstaller.php new file mode 100644 index 0000000..5dd3438 --- /dev/null +++ b/includes/vendor/composer/installers/src/Composer/Installers/OntoWikiInstaller.php @@ -0,0 +1,24 @@ + 'extensions/{$name}/', + 'theme' => 'extensions/themes/{$name}/', + 'translation' => 'extensions/translations/{$name}/', + ); + + /** + * Format package name to lower case and remove ".ontowiki" suffix + */ + public function inflectPackageVars($vars) + { + $vars['name'] = strtolower($vars['name']); + $vars['name'] = preg_replace('/.ontowiki$/', '', $vars['name']); + $vars['name'] = preg_replace('/-theme$/', '', $vars['name']); + $vars['name'] = preg_replace('/-translation$/', '', $vars['name']); + + return $vars; + } +} diff --git a/includes/vendor/composer/installers/src/Composer/Installers/OsclassInstaller.php b/includes/vendor/composer/installers/src/Composer/Installers/OsclassInstaller.php new file mode 100644 index 0000000..3ca7954 --- /dev/null +++ b/includes/vendor/composer/installers/src/Composer/Installers/OsclassInstaller.php @@ -0,0 +1,14 @@ + 'oc-content/plugins/{$name}/', + 'theme' => 'oc-content/themes/{$name}/', + 'language' => 'oc-content/languages/{$name}/', + ); + +} diff --git a/includes/vendor/composer/installers/src/Composer/Installers/OxidInstaller.php b/includes/vendor/composer/installers/src/Composer/Installers/OxidInstaller.php new file mode 100644 index 0000000..1797a22 --- /dev/null +++ b/includes/vendor/composer/installers/src/Composer/Installers/OxidInstaller.php @@ -0,0 +1,59 @@ +.+)\/.+/'; + + protected $locations = array( + 'module' => 'modules/{$name}/', + 'theme' => 'application/views/{$name}/', + 'out' => 'out/{$name}/', + ); + + /** + * getInstallPath + * + * @param PackageInterface $package + * @param string $frameworkType + * @return string + */ + public function getInstallPath(PackageInterface $package, $frameworkType = '') + { + $installPath = parent::getInstallPath($package, $frameworkType); + $type = $this->package->getType(); + if ($type === 'oxid-module') { + $this->prepareVendorDirectory($installPath); + } + return $installPath; + } + + /** + * prepareVendorDirectory + * + * Makes sure there is a vendormetadata.php file inside + * the vendor folder if there is a vendor folder. + * + * @param string $installPath + * @return void + */ + protected function prepareVendorDirectory($installPath) + { + $matches = ''; + $hasVendorDirectory = preg_match(self::VENDOR_PATTERN, $installPath, $matches); + if (!$hasVendorDirectory) { + return; + } + + $vendorDirectory = $matches['vendor']; + $vendorPath = getcwd() . '/modules/' . $vendorDirectory; + if (!file_exists($vendorPath)) { + mkdir($vendorPath, 0755, true); + } + + $vendorMetaDataPath = $vendorPath . '/vendormetadata.php'; + touch($vendorMetaDataPath); + } +} diff --git a/includes/vendor/composer/installers/src/Composer/Installers/PPIInstaller.php b/includes/vendor/composer/installers/src/Composer/Installers/PPIInstaller.php new file mode 100644 index 0000000..170136f --- /dev/null +++ b/includes/vendor/composer/installers/src/Composer/Installers/PPIInstaller.php @@ -0,0 +1,9 @@ + 'modules/{$name}/', + ); +} diff --git a/includes/vendor/composer/installers/src/Composer/Installers/PantheonInstaller.php b/includes/vendor/composer/installers/src/Composer/Installers/PantheonInstaller.php new file mode 100644 index 0000000..439f61a --- /dev/null +++ b/includes/vendor/composer/installers/src/Composer/Installers/PantheonInstaller.php @@ -0,0 +1,12 @@ + */ + protected $locations = array( + 'script' => 'web/private/scripts/quicksilver/{$name}', + 'module' => 'web/private/scripts/quicksilver/{$name}', + ); +} diff --git a/includes/vendor/composer/installers/src/Composer/Installers/PhiftyInstaller.php b/includes/vendor/composer/installers/src/Composer/Installers/PhiftyInstaller.php new file mode 100644 index 0000000..4e59a8a --- /dev/null +++ b/includes/vendor/composer/installers/src/Composer/Installers/PhiftyInstaller.php @@ -0,0 +1,11 @@ + 'bundles/{$name}/', + 'library' => 'libraries/{$name}/', + 'framework' => 'frameworks/{$name}/', + ); +} diff --git a/includes/vendor/composer/installers/src/Composer/Installers/PhpBBInstaller.php b/includes/vendor/composer/installers/src/Composer/Installers/PhpBBInstaller.php new file mode 100644 index 0000000..deb2b77 --- /dev/null +++ b/includes/vendor/composer/installers/src/Composer/Installers/PhpBBInstaller.php @@ -0,0 +1,11 @@ + 'ext/{$vendor}/{$name}/', + 'language' => 'language/{$name}/', + 'style' => 'styles/{$name}/', + ); +} diff --git a/includes/vendor/composer/installers/src/Composer/Installers/PimcoreInstaller.php b/includes/vendor/composer/installers/src/Composer/Installers/PimcoreInstaller.php new file mode 100644 index 0000000..4781fa6 --- /dev/null +++ b/includes/vendor/composer/installers/src/Composer/Installers/PimcoreInstaller.php @@ -0,0 +1,21 @@ + 'plugins/{$name}/', + ); + + /** + * Format package name to CamelCase + */ + public function inflectPackageVars($vars) + { + $vars['name'] = strtolower(preg_replace('/(?<=\\w)([A-Z])/', '_\\1', $vars['name'])); + $vars['name'] = str_replace(array('-', '_'), ' ', $vars['name']); + $vars['name'] = str_replace(' ', '', ucwords($vars['name'])); + + return $vars; + } +} diff --git a/includes/vendor/composer/installers/src/Composer/Installers/PiwikInstaller.php b/includes/vendor/composer/installers/src/Composer/Installers/PiwikInstaller.php new file mode 100644 index 0000000..c17f457 --- /dev/null +++ b/includes/vendor/composer/installers/src/Composer/Installers/PiwikInstaller.php @@ -0,0 +1,32 @@ + 'plugins/{$name}/', + ); + + /** + * Format package name to CamelCase + * @param array $vars + * + * @return array + */ + public function inflectPackageVars($vars) + { + $vars['name'] = strtolower(preg_replace('/(?<=\\w)([A-Z])/', '_\\1', $vars['name'])); + $vars['name'] = str_replace(array('-', '_'), ' ', $vars['name']); + $vars['name'] = str_replace(' ', '', ucwords($vars['name'])); + + return $vars; + } +} diff --git a/includes/vendor/composer/installers/src/Composer/Installers/PlentymarketsInstaller.php b/includes/vendor/composer/installers/src/Composer/Installers/PlentymarketsInstaller.php new file mode 100644 index 0000000..903e55f --- /dev/null +++ b/includes/vendor/composer/installers/src/Composer/Installers/PlentymarketsInstaller.php @@ -0,0 +1,29 @@ + '{$name}/' + ); + + /** + * Remove hyphen, "plugin" and format to camelcase + * @param array $vars + * + * @return array + */ + public function inflectPackageVars($vars) + { + $vars['name'] = explode("-", $vars['name']); + foreach ($vars['name'] as $key => $name) { + $vars['name'][$key] = ucfirst($vars['name'][$key]); + if (strcasecmp($name, "Plugin") == 0) { + unset($vars['name'][$key]); + } + } + $vars['name'] = implode("",$vars['name']); + + return $vars; + } +} diff --git a/includes/vendor/composer/installers/src/Composer/Installers/Plugin.php b/includes/vendor/composer/installers/src/Composer/Installers/Plugin.php new file mode 100644 index 0000000..e60da0e --- /dev/null +++ b/includes/vendor/composer/installers/src/Composer/Installers/Plugin.php @@ -0,0 +1,27 @@ +installer = new Installer($io, $composer); + $composer->getInstallationManager()->addInstaller($this->installer); + } + + public function deactivate(Composer $composer, IOInterface $io) + { + $composer->getInstallationManager()->removeInstaller($this->installer); + } + + public function uninstall(Composer $composer, IOInterface $io) + { + } +} diff --git a/includes/vendor/composer/installers/src/Composer/Installers/PortoInstaller.php b/includes/vendor/composer/installers/src/Composer/Installers/PortoInstaller.php new file mode 100644 index 0000000..dbf85e6 --- /dev/null +++ b/includes/vendor/composer/installers/src/Composer/Installers/PortoInstaller.php @@ -0,0 +1,9 @@ + 'app/Containers/{$name}/', + ); +} diff --git a/includes/vendor/composer/installers/src/Composer/Installers/PrestashopInstaller.php b/includes/vendor/composer/installers/src/Composer/Installers/PrestashopInstaller.php new file mode 100644 index 0000000..4c8421e --- /dev/null +++ b/includes/vendor/composer/installers/src/Composer/Installers/PrestashopInstaller.php @@ -0,0 +1,10 @@ + 'modules/{$name}/', + 'theme' => 'themes/{$name}/', + ); +} diff --git a/includes/vendor/composer/installers/src/Composer/Installers/ProcessWireInstaller.php b/includes/vendor/composer/installers/src/Composer/Installers/ProcessWireInstaller.php new file mode 100644 index 0000000..e6834a0 --- /dev/null +++ b/includes/vendor/composer/installers/src/Composer/Installers/ProcessWireInstaller.php @@ -0,0 +1,22 @@ + 'site/modules/{$name}/', + ); + + /** + * Format package name to CamelCase + */ + public function inflectPackageVars($vars) + { + $vars['name'] = strtolower(preg_replace('/(?<=\\w)([A-Z])/', '_\\1', $vars['name'])); + $vars['name'] = str_replace(array('-', '_'), ' ', $vars['name']); + $vars['name'] = str_replace(' ', '', ucwords($vars['name'])); + + return $vars; + } +} diff --git a/includes/vendor/composer/installers/src/Composer/Installers/PuppetInstaller.php b/includes/vendor/composer/installers/src/Composer/Installers/PuppetInstaller.php new file mode 100644 index 0000000..77cc3dd --- /dev/null +++ b/includes/vendor/composer/installers/src/Composer/Installers/PuppetInstaller.php @@ -0,0 +1,11 @@ + 'modules/{$name}/', + ); +} diff --git a/includes/vendor/composer/installers/src/Composer/Installers/PxcmsInstaller.php b/includes/vendor/composer/installers/src/Composer/Installers/PxcmsInstaller.php new file mode 100644 index 0000000..6551058 --- /dev/null +++ b/includes/vendor/composer/installers/src/Composer/Installers/PxcmsInstaller.php @@ -0,0 +1,63 @@ + 'app/Modules/{$name}/', + 'theme' => 'themes/{$name}/', + ); + + /** + * Format package name. + * + * @param array $vars + * + * @return array + */ + public function inflectPackageVars($vars) + { + if ($vars['type'] === 'pxcms-module') { + return $this->inflectModuleVars($vars); + } + + if ($vars['type'] === 'pxcms-theme') { + return $this->inflectThemeVars($vars); + } + + return $vars; + } + + /** + * For package type pxcms-module, cut off a trailing '-plugin' if present. + * + * return string + */ + protected function inflectModuleVars($vars) + { + $vars['name'] = str_replace('pxcms-', '', $vars['name']); // strip out pxcms- just incase (legacy) + $vars['name'] = str_replace('module-', '', $vars['name']); // strip out module- + $vars['name'] = preg_replace('/-module$/', '', $vars['name']); // strip out -module + $vars['name'] = str_replace('-', '_', $vars['name']); // make -'s be _'s + $vars['name'] = ucwords($vars['name']); // make module name camelcased + + return $vars; + } + + + /** + * For package type pxcms-module, cut off a trailing '-plugin' if present. + * + * return string + */ + protected function inflectThemeVars($vars) + { + $vars['name'] = str_replace('pxcms-', '', $vars['name']); // strip out pxcms- just incase (legacy) + $vars['name'] = str_replace('theme-', '', $vars['name']); // strip out theme- + $vars['name'] = preg_replace('/-theme$/', '', $vars['name']); // strip out -theme + $vars['name'] = str_replace('-', '_', $vars['name']); // make -'s be _'s + $vars['name'] = ucwords($vars['name']); // make module name camelcased + + return $vars; + } +} diff --git a/includes/vendor/composer/installers/src/Composer/Installers/RadPHPInstaller.php b/includes/vendor/composer/installers/src/Composer/Installers/RadPHPInstaller.php new file mode 100644 index 0000000..0f78b5c --- /dev/null +++ b/includes/vendor/composer/installers/src/Composer/Installers/RadPHPInstaller.php @@ -0,0 +1,24 @@ + 'src/{$name}/' + ); + + /** + * Format package name to CamelCase + */ + public function inflectPackageVars($vars) + { + $nameParts = explode('/', $vars['name']); + foreach ($nameParts as &$value) { + $value = strtolower(preg_replace('/(?<=\\w)([A-Z])/', '_\\1', $value)); + $value = str_replace(array('-', '_'), ' ', $value); + $value = str_replace(' ', '', ucwords($value)); + } + $vars['name'] = implode('/', $nameParts); + return $vars; + } +} diff --git a/includes/vendor/composer/installers/src/Composer/Installers/ReIndexInstaller.php b/includes/vendor/composer/installers/src/Composer/Installers/ReIndexInstaller.php new file mode 100644 index 0000000..252c733 --- /dev/null +++ b/includes/vendor/composer/installers/src/Composer/Installers/ReIndexInstaller.php @@ -0,0 +1,10 @@ + 'themes/{$name}/', + 'plugin' => 'plugins/{$name}/' + ); +} diff --git a/includes/vendor/composer/installers/src/Composer/Installers/Redaxo5Installer.php b/includes/vendor/composer/installers/src/Composer/Installers/Redaxo5Installer.php new file mode 100644 index 0000000..23a2034 --- /dev/null +++ b/includes/vendor/composer/installers/src/Composer/Installers/Redaxo5Installer.php @@ -0,0 +1,10 @@ + 'redaxo/src/addons/{$name}/', + 'bestyle-plugin' => 'redaxo/src/addons/be_style/plugins/{$name}/' + ); +} diff --git a/includes/vendor/composer/installers/src/Composer/Installers/RedaxoInstaller.php b/includes/vendor/composer/installers/src/Composer/Installers/RedaxoInstaller.php new file mode 100644 index 0000000..0954457 --- /dev/null +++ b/includes/vendor/composer/installers/src/Composer/Installers/RedaxoInstaller.php @@ -0,0 +1,10 @@ + 'redaxo/include/addons/{$name}/', + 'bestyle-plugin' => 'redaxo/include/addons/be_style/plugins/{$name}/' + ); +} diff --git a/includes/vendor/composer/installers/src/Composer/Installers/RoundcubeInstaller.php b/includes/vendor/composer/installers/src/Composer/Installers/RoundcubeInstaller.php new file mode 100644 index 0000000..d8d795b --- /dev/null +++ b/includes/vendor/composer/installers/src/Composer/Installers/RoundcubeInstaller.php @@ -0,0 +1,22 @@ + 'plugins/{$name}/', + ); + + /** + * Lowercase name and changes the name to a underscores + * + * @param array $vars + * @return array + */ + public function inflectPackageVars($vars) + { + $vars['name'] = strtolower(str_replace('-', '_', $vars['name'])); + + return $vars; + } +} diff --git a/includes/vendor/composer/installers/src/Composer/Installers/SMFInstaller.php b/includes/vendor/composer/installers/src/Composer/Installers/SMFInstaller.php new file mode 100644 index 0000000..1acd3b1 --- /dev/null +++ b/includes/vendor/composer/installers/src/Composer/Installers/SMFInstaller.php @@ -0,0 +1,10 @@ + 'Sources/{$name}/', + 'theme' => 'Themes/{$name}/', + ); +} diff --git a/includes/vendor/composer/installers/src/Composer/Installers/ShopwareInstaller.php b/includes/vendor/composer/installers/src/Composer/Installers/ShopwareInstaller.php new file mode 100644 index 0000000..7d20d27 --- /dev/null +++ b/includes/vendor/composer/installers/src/Composer/Installers/ShopwareInstaller.php @@ -0,0 +1,60 @@ + 'engine/Shopware/Plugins/Local/Backend/{$name}/', + 'core-plugin' => 'engine/Shopware/Plugins/Local/Core/{$name}/', + 'frontend-plugin' => 'engine/Shopware/Plugins/Local/Frontend/{$name}/', + 'theme' => 'templates/{$name}/', + 'plugin' => 'custom/plugins/{$name}/', + 'frontend-theme' => 'themes/Frontend/{$name}/', + ); + + /** + * Transforms the names + * @param array $vars + * @return array + */ + public function inflectPackageVars($vars) + { + if ($vars['type'] === 'shopware-theme') { + return $this->correctThemeName($vars); + } + + return $this->correctPluginName($vars); + } + + /** + * Changes the name to a camelcased combination of vendor and name + * @param array $vars + * @return array + */ + private function correctPluginName($vars) + { + $camelCasedName = preg_replace_callback('/(-[a-z])/', function ($matches) { + return strtoupper($matches[0][1]); + }, $vars['name']); + + $vars['name'] = ucfirst($vars['vendor']) . ucfirst($camelCasedName); + + return $vars; + } + + /** + * Changes the name to a underscore separated name + * @param array $vars + * @return array + */ + private function correctThemeName($vars) + { + $vars['name'] = str_replace('-', '_', $vars['name']); + + return $vars; + } +} diff --git a/includes/vendor/composer/installers/src/Composer/Installers/SilverStripeInstaller.php b/includes/vendor/composer/installers/src/Composer/Installers/SilverStripeInstaller.php new file mode 100644 index 0000000..81910e9 --- /dev/null +++ b/includes/vendor/composer/installers/src/Composer/Installers/SilverStripeInstaller.php @@ -0,0 +1,35 @@ + '{$name}/', + 'theme' => 'themes/{$name}/', + ); + + /** + * Return the install path based on package type. + * + * Relies on built-in BaseInstaller behaviour with one exception: silverstripe/framework + * must be installed to 'sapphire' and not 'framework' if the version is <3.0.0 + * + * @param PackageInterface $package + * @param string $frameworkType + * @return string + */ + public function getInstallPath(PackageInterface $package, $frameworkType = '') + { + if ( + $package->getName() == 'silverstripe/framework' + && preg_match('/^\d+\.\d+\.\d+/', $package->getVersion()) + && version_compare($package->getVersion(), '2.999.999') < 0 + ) { + return $this->templatePath($this->locations['module'], array('name' => 'sapphire')); + } + + return parent::getInstallPath($package, $frameworkType); + } +} diff --git a/includes/vendor/composer/installers/src/Composer/Installers/SiteDirectInstaller.php b/includes/vendor/composer/installers/src/Composer/Installers/SiteDirectInstaller.php new file mode 100644 index 0000000..762d94c --- /dev/null +++ b/includes/vendor/composer/installers/src/Composer/Installers/SiteDirectInstaller.php @@ -0,0 +1,25 @@ + 'modules/{$vendor}/{$name}/', + 'plugin' => 'plugins/{$vendor}/{$name}/' + ); + + public function inflectPackageVars($vars) + { + return $this->parseVars($vars); + } + + protected function parseVars($vars) + { + $vars['vendor'] = strtolower($vars['vendor']) == 'sitedirect' ? 'SiteDirect' : $vars['vendor']; + $vars['name'] = str_replace(array('-', '_'), ' ', $vars['name']); + $vars['name'] = str_replace(' ', '', ucwords($vars['name'])); + + return $vars; + } +} diff --git a/includes/vendor/composer/installers/src/Composer/Installers/StarbugInstaller.php b/includes/vendor/composer/installers/src/Composer/Installers/StarbugInstaller.php new file mode 100644 index 0000000..a31c9fd --- /dev/null +++ b/includes/vendor/composer/installers/src/Composer/Installers/StarbugInstaller.php @@ -0,0 +1,12 @@ + 'modules/{$name}/', + 'theme' => 'themes/{$name}/', + 'custom-module' => 'app/modules/{$name}/', + 'custom-theme' => 'app/themes/{$name}/' + ); +} diff --git a/includes/vendor/composer/installers/src/Composer/Installers/SyDESInstaller.php b/includes/vendor/composer/installers/src/Composer/Installers/SyDESInstaller.php new file mode 100644 index 0000000..8626a9b --- /dev/null +++ b/includes/vendor/composer/installers/src/Composer/Installers/SyDESInstaller.php @@ -0,0 +1,47 @@ + 'app/modules/{$name}/', + 'theme' => 'themes/{$name}/', + ); + + /** + * Format module name. + * + * Strip `sydes-` prefix and a trailing '-theme' or '-module' from package name if present. + * + * {@inerhitDoc} + */ + public function inflectPackageVars($vars) + { + if ($vars['type'] == 'sydes-module') { + return $this->inflectModuleVars($vars); + } + + if ($vars['type'] === 'sydes-theme') { + return $this->inflectThemeVars($vars); + } + + return $vars; + } + + public function inflectModuleVars($vars) + { + $vars['name'] = preg_replace('/(^sydes-|-module$)/i', '', $vars['name']); + $vars['name'] = str_replace(array('-', '_'), ' ', $vars['name']); + $vars['name'] = str_replace(' ', '', ucwords($vars['name'])); + + return $vars; + } + + protected function inflectThemeVars($vars) + { + $vars['name'] = preg_replace('/(^sydes-|-theme$)/', '', $vars['name']); + $vars['name'] = strtolower($vars['name']); + + return $vars; + } +} diff --git a/includes/vendor/composer/installers/src/Composer/Installers/SyliusInstaller.php b/includes/vendor/composer/installers/src/Composer/Installers/SyliusInstaller.php new file mode 100644 index 0000000..4357a35 --- /dev/null +++ b/includes/vendor/composer/installers/src/Composer/Installers/SyliusInstaller.php @@ -0,0 +1,9 @@ + 'themes/{$name}/', + ); +} diff --git a/includes/vendor/composer/installers/src/Composer/Installers/Symfony1Installer.php b/includes/vendor/composer/installers/src/Composer/Installers/Symfony1Installer.php new file mode 100644 index 0000000..1675c4f --- /dev/null +++ b/includes/vendor/composer/installers/src/Composer/Installers/Symfony1Installer.php @@ -0,0 +1,26 @@ + + */ +class Symfony1Installer extends BaseInstaller +{ + protected $locations = array( + 'plugin' => 'plugins/{$name}/', + ); + + /** + * Format package name to CamelCase + */ + public function inflectPackageVars($vars) + { + $vars['name'] = preg_replace_callback('/(-[a-z])/', function ($matches) { + return strtoupper($matches[0][1]); + }, $vars['name']); + + return $vars; + } +} diff --git a/includes/vendor/composer/installers/src/Composer/Installers/TYPO3CmsInstaller.php b/includes/vendor/composer/installers/src/Composer/Installers/TYPO3CmsInstaller.php new file mode 100644 index 0000000..b1663e8 --- /dev/null +++ b/includes/vendor/composer/installers/src/Composer/Installers/TYPO3CmsInstaller.php @@ -0,0 +1,16 @@ + + */ +class TYPO3CmsInstaller extends BaseInstaller +{ + protected $locations = array( + 'extension' => 'typo3conf/ext/{$name}/', + ); +} diff --git a/includes/vendor/composer/installers/src/Composer/Installers/TYPO3FlowInstaller.php b/includes/vendor/composer/installers/src/Composer/Installers/TYPO3FlowInstaller.php new file mode 100644 index 0000000..42572f4 --- /dev/null +++ b/includes/vendor/composer/installers/src/Composer/Installers/TYPO3FlowInstaller.php @@ -0,0 +1,38 @@ + 'Packages/Application/{$name}/', + 'framework' => 'Packages/Framework/{$name}/', + 'plugin' => 'Packages/Plugins/{$name}/', + 'site' => 'Packages/Sites/{$name}/', + 'boilerplate' => 'Packages/Boilerplates/{$name}/', + 'build' => 'Build/{$name}/', + ); + + /** + * Modify the package name to be a TYPO3 Flow style key. + * + * @param array $vars + * @return array + */ + public function inflectPackageVars($vars) + { + $autoload = $this->package->getAutoload(); + if (isset($autoload['psr-0']) && is_array($autoload['psr-0'])) { + $namespace = key($autoload['psr-0']); + $vars['name'] = str_replace('\\', '.', $namespace); + } + if (isset($autoload['psr-4']) && is_array($autoload['psr-4'])) { + $namespace = key($autoload['psr-4']); + $vars['name'] = rtrim(str_replace('\\', '.', $namespace), '.'); + } + + return $vars; + } +} diff --git a/includes/vendor/composer/installers/src/Composer/Installers/TaoInstaller.php b/includes/vendor/composer/installers/src/Composer/Installers/TaoInstaller.php new file mode 100644 index 0000000..4f79a45 --- /dev/null +++ b/includes/vendor/composer/installers/src/Composer/Installers/TaoInstaller.php @@ -0,0 +1,30 @@ + '{$name}' + ); + + public function inflectPackageVars($vars) + { + $extra = $this->package->getExtra(); + + if (array_key_exists(self::EXTRA_TAO_EXTENSION_NAME, $extra)) { + $vars['name'] = $extra[self::EXTRA_TAO_EXTENSION_NAME]; + return $vars; + } + + $vars['name'] = str_replace('extension-', '', $vars['name']); + $vars['name'] = str_replace('-', ' ', $vars['name']); + $vars['name'] = lcfirst(str_replace(' ', '', ucwords($vars['name']))); + + return $vars; + } +} diff --git a/includes/vendor/composer/installers/src/Composer/Installers/TastyIgniterInstaller.php b/includes/vendor/composer/installers/src/Composer/Installers/TastyIgniterInstaller.php new file mode 100644 index 0000000..e20e65b --- /dev/null +++ b/includes/vendor/composer/installers/src/Composer/Installers/TastyIgniterInstaller.php @@ -0,0 +1,32 @@ + 'extensions/{$vendor}/{$name}/', + 'theme' => 'themes/{$name}/', + ); + + /** + * Format package name. + * + * Cut off leading 'ti-ext-' or 'ti-theme-' if present. + * Strip vendor name of characters that is not alphanumeric or an underscore + * + */ + public function inflectPackageVars($vars) + { + if ($vars['type'] === 'tastyigniter-extension') { + $vars['vendor'] = preg_replace('/[^a-z0-9_]/i', '', $vars['vendor']); + $vars['name'] = preg_replace('/^ti-ext-/', '', $vars['name']); + } + + if ($vars['type'] === 'tastyigniter-theme') { + $vars['name'] = preg_replace('/^ti-theme-/', '', $vars['name']); + } + + return $vars; + } +} \ No newline at end of file diff --git a/includes/vendor/composer/installers/src/Composer/Installers/TheliaInstaller.php b/includes/vendor/composer/installers/src/Composer/Installers/TheliaInstaller.php new file mode 100644 index 0000000..158af52 --- /dev/null +++ b/includes/vendor/composer/installers/src/Composer/Installers/TheliaInstaller.php @@ -0,0 +1,12 @@ + 'local/modules/{$name}/', + 'frontoffice-template' => 'templates/frontOffice/{$name}/', + 'backoffice-template' => 'templates/backOffice/{$name}/', + 'email-template' => 'templates/email/{$name}/', + ); +} diff --git a/includes/vendor/composer/installers/src/Composer/Installers/TuskInstaller.php b/includes/vendor/composer/installers/src/Composer/Installers/TuskInstaller.php new file mode 100644 index 0000000..7c0113b --- /dev/null +++ b/includes/vendor/composer/installers/src/Composer/Installers/TuskInstaller.php @@ -0,0 +1,14 @@ + + */ + class TuskInstaller extends BaseInstaller + { + protected $locations = array( + 'task' => '.tusk/tasks/{$name}/', + 'command' => '.tusk/commands/{$name}/', + 'asset' => 'assets/tusk/{$name}/', + ); + } diff --git a/includes/vendor/composer/installers/src/Composer/Installers/UserFrostingInstaller.php b/includes/vendor/composer/installers/src/Composer/Installers/UserFrostingInstaller.php new file mode 100644 index 0000000..fcb414a --- /dev/null +++ b/includes/vendor/composer/installers/src/Composer/Installers/UserFrostingInstaller.php @@ -0,0 +1,9 @@ + 'app/sprinkles/{$name}/', + ); +} diff --git a/includes/vendor/composer/installers/src/Composer/Installers/VanillaInstaller.php b/includes/vendor/composer/installers/src/Composer/Installers/VanillaInstaller.php new file mode 100644 index 0000000..24ca645 --- /dev/null +++ b/includes/vendor/composer/installers/src/Composer/Installers/VanillaInstaller.php @@ -0,0 +1,10 @@ + 'plugins/{$name}/', + 'theme' => 'themes/{$name}/', + ); +} diff --git a/includes/vendor/composer/installers/src/Composer/Installers/VgmcpInstaller.php b/includes/vendor/composer/installers/src/Composer/Installers/VgmcpInstaller.php new file mode 100644 index 0000000..7d90c5e --- /dev/null +++ b/includes/vendor/composer/installers/src/Composer/Installers/VgmcpInstaller.php @@ -0,0 +1,49 @@ + 'src/{$vendor}/{$name}/', + 'theme' => 'themes/{$name}/' + ); + + /** + * Format package name. + * + * For package type vgmcp-bundle, cut off a trailing '-bundle' if present. + * + * For package type vgmcp-theme, cut off a trailing '-theme' if present. + * + */ + public function inflectPackageVars($vars) + { + if ($vars['type'] === 'vgmcp-bundle') { + return $this->inflectPluginVars($vars); + } + + if ($vars['type'] === 'vgmcp-theme') { + return $this->inflectThemeVars($vars); + } + + return $vars; + } + + protected function inflectPluginVars($vars) + { + $vars['name'] = preg_replace('/-bundle$/', '', $vars['name']); + $vars['name'] = str_replace(array('-', '_'), ' ', $vars['name']); + $vars['name'] = str_replace(' ', '', ucwords($vars['name'])); + + return $vars; + } + + protected function inflectThemeVars($vars) + { + $vars['name'] = preg_replace('/-theme$/', '', $vars['name']); + $vars['name'] = str_replace(array('-', '_'), ' ', $vars['name']); + $vars['name'] = str_replace(' ', '', ucwords($vars['name'])); + + return $vars; + } +} diff --git a/includes/vendor/composer/installers/src/Composer/Installers/WHMCSInstaller.php b/includes/vendor/composer/installers/src/Composer/Installers/WHMCSInstaller.php new file mode 100644 index 0000000..b65dbba --- /dev/null +++ b/includes/vendor/composer/installers/src/Composer/Installers/WHMCSInstaller.php @@ -0,0 +1,21 @@ + 'modules/addons/{$vendor}_{$name}/', + 'fraud' => 'modules/fraud/{$vendor}_{$name}/', + 'gateways' => 'modules/gateways/{$vendor}_{$name}/', + 'notifications' => 'modules/notifications/{$vendor}_{$name}/', + 'registrars' => 'modules/registrars/{$vendor}_{$name}/', + 'reports' => 'modules/reports/{$vendor}_{$name}/', + 'security' => 'modules/security/{$vendor}_{$name}/', + 'servers' => 'modules/servers/{$vendor}_{$name}/', + 'social' => 'modules/social/{$vendor}_{$name}/', + 'support' => 'modules/support/{$vendor}_{$name}/', + 'templates' => 'templates/{$vendor}_{$name}/', + 'includes' => 'includes/{$vendor}_{$name}/' + ); +} diff --git a/includes/vendor/composer/installers/src/Composer/Installers/WinterInstaller.php b/includes/vendor/composer/installers/src/Composer/Installers/WinterInstaller.php new file mode 100644 index 0000000..cff1bf1 --- /dev/null +++ b/includes/vendor/composer/installers/src/Composer/Installers/WinterInstaller.php @@ -0,0 +1,58 @@ + 'modules/{$name}/', + 'plugin' => 'plugins/{$vendor}/{$name}/', + 'theme' => 'themes/{$name}/' + ); + + /** + * Format package name. + * + * For package type winter-plugin, cut off a trailing '-plugin' if present. + * + * For package type winter-theme, cut off a trailing '-theme' if present. + * + */ + public function inflectPackageVars($vars) + { + if ($vars['type'] === 'winter-module') { + return $this->inflectModuleVars($vars); + } + + if ($vars['type'] === 'winter-plugin') { + return $this->inflectPluginVars($vars); + } + + if ($vars['type'] === 'winter-theme') { + return $this->inflectThemeVars($vars); + } + + return $vars; + } + + protected function inflectModuleVars($vars) + { + $vars['name'] = preg_replace('/^wn-|-module$/', '', $vars['name']); + + return $vars; + } + + protected function inflectPluginVars($vars) + { + $vars['name'] = preg_replace('/^wn-|-plugin$/', '', $vars['name']); + $vars['vendor'] = preg_replace('/[^a-z0-9_]/i', '', $vars['vendor']); + + return $vars; + } + + protected function inflectThemeVars($vars) + { + $vars['name'] = preg_replace('/^wn-|-theme$/', '', $vars['name']); + + return $vars; + } +} diff --git a/includes/vendor/composer/installers/src/Composer/Installers/WolfCMSInstaller.php b/includes/vendor/composer/installers/src/Composer/Installers/WolfCMSInstaller.php new file mode 100644 index 0000000..cb38788 --- /dev/null +++ b/includes/vendor/composer/installers/src/Composer/Installers/WolfCMSInstaller.php @@ -0,0 +1,9 @@ + 'wolf/plugins/{$name}/', + ); +} diff --git a/includes/vendor/composer/installers/src/Composer/Installers/WordPressInstaller.php b/includes/vendor/composer/installers/src/Composer/Installers/WordPressInstaller.php new file mode 100644 index 0000000..91c46ad --- /dev/null +++ b/includes/vendor/composer/installers/src/Composer/Installers/WordPressInstaller.php @@ -0,0 +1,12 @@ + 'wp-content/plugins/{$name}/', + 'theme' => 'wp-content/themes/{$name}/', + 'muplugin' => 'wp-content/mu-plugins/{$name}/', + 'dropin' => 'wp-content/{$name}/', + ); +} diff --git a/includes/vendor/composer/installers/src/Composer/Installers/YawikInstaller.php b/includes/vendor/composer/installers/src/Composer/Installers/YawikInstaller.php new file mode 100644 index 0000000..27f429f --- /dev/null +++ b/includes/vendor/composer/installers/src/Composer/Installers/YawikInstaller.php @@ -0,0 +1,32 @@ + 'module/{$name}/', + ); + + /** + * Format package name to CamelCase + * @param array $vars + * + * @return array + */ + public function inflectPackageVars($vars) + { + $vars['name'] = strtolower(preg_replace('/(?<=\\w)([A-Z])/', '_\\1', $vars['name'])); + $vars['name'] = str_replace(array('-', '_'), ' ', $vars['name']); + $vars['name'] = str_replace(' ', '', ucwords($vars['name'])); + + return $vars; + } +} \ No newline at end of file diff --git a/includes/vendor/composer/installers/src/Composer/Installers/ZendInstaller.php b/includes/vendor/composer/installers/src/Composer/Installers/ZendInstaller.php new file mode 100644 index 0000000..bde9bc8 --- /dev/null +++ b/includes/vendor/composer/installers/src/Composer/Installers/ZendInstaller.php @@ -0,0 +1,11 @@ + 'library/{$name}/', + 'extra' => 'extras/library/{$name}/', + 'module' => 'module/{$name}/', + ); +} diff --git a/includes/vendor/composer/installers/src/Composer/Installers/ZikulaInstaller.php b/includes/vendor/composer/installers/src/Composer/Installers/ZikulaInstaller.php new file mode 100644 index 0000000..56cdf5d --- /dev/null +++ b/includes/vendor/composer/installers/src/Composer/Installers/ZikulaInstaller.php @@ -0,0 +1,10 @@ + 'modules/{$vendor}-{$name}/', + 'theme' => 'themes/{$vendor}-{$name}/' + ); +} diff --git a/includes/vendor/composer/installers/src/bootstrap.php b/includes/vendor/composer/installers/src/bootstrap.php new file mode 100644 index 0000000..0de276e --- /dev/null +++ b/includes/vendor/composer/installers/src/bootstrap.php @@ -0,0 +1,13 @@ += 70100)) { + $issues[] = 'Your Composer dependencies require a PHP version ">= 7.1.0". You are running ' . PHP_VERSION . '.'; +} + +if ($issues) { + if (!headers_sent()) { + header('HTTP/1.1 500 Internal Server Error'); + } + if (!ini_get('display_errors')) { + if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') { + fwrite(STDERR, 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . implode(PHP_EOL, $issues) . PHP_EOL.PHP_EOL); + } elseif (!headers_sent()) { + echo 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . str_replace('You are running '.PHP_VERSION.'.', '', implode(PHP_EOL, $issues)) . PHP_EOL.PHP_EOL; + } + } + trigger_error( + 'Composer detected issues in your platform: ' . implode(' ', $issues), + E_USER_ERROR + ); +} diff --git a/includes/vendor/firebase/php-jwt/LICENSE b/includes/vendor/firebase/php-jwt/LICENSE index cb0c49b..11c0146 100644 --- a/includes/vendor/firebase/php-jwt/LICENSE +++ b/includes/vendor/firebase/php-jwt/LICENSE @@ -13,7 +13,7 @@ modification, are permitted provided that the following conditions are met: disclaimer in the documentation and/or other materials provided with the distribution. - * Neither the name of Neuman Vong nor the names of other + * Neither the name of the copyright holder nor the names of other contributors may be used to endorse or promote products derived from this software without specific prior written permission. diff --git a/includes/vendor/firebase/php-jwt/README.md b/includes/vendor/firebase/php-jwt/README.md index b1a7a3a..fed1e95 100644 --- a/includes/vendor/firebase/php-jwt/README.md +++ b/includes/vendor/firebase/php-jwt/README.md @@ -1,4 +1,4 @@ -[![Build Status](https://travis-ci.org/firebase/php-jwt.png?branch=master)](https://travis-ci.org/firebase/php-jwt) +![Build Status](https://github.com/firebase/php-jwt/actions/workflows/tests.yml/badge.svg) [![Latest Stable Version](https://poser.pugx.org/firebase/php-jwt/v/stable)](https://packagist.org/packages/firebase/php-jwt) [![Total Downloads](https://poser.pugx.org/firebase/php-jwt/downloads)](https://packagist.org/packages/firebase/php-jwt) [![License](https://poser.pugx.org/firebase/php-jwt/license)](https://packagist.org/packages/firebase/php-jwt) @@ -16,19 +16,26 @@ Use composer to manage your dependencies and download PHP-JWT: composer require firebase/php-jwt ``` +Optionally, install the `paragonie/sodium_compat` package from composer if your +php is < 7.2 or does not have libsodium installed: + +```bash +composer require paragonie/sodium_compat +``` + Example ------- ```php - "http://example.org/", - "aud" => "http://example.com/", - "iat" => 1356999524, - "nbf" => 1357000000 -); +use Firebase\JWT\JWT; +use Firebase\JWT\Key; + +$key = 'example_key'; +$payload = [ + 'iss' => 'http://example.org/', + 'aud' => 'http://example.com/', + 'iat' => 1356999524, + 'nbf' => 1357000000 +]; /** * IMPORTANT: @@ -36,8 +43,8 @@ $token = array( * https://tools.ietf.org/html/draft-ietf-jose-json-web-algorithms-40 * for a list of spec-compliant algorithms. */ -$jwt = JWT::encode($token, $key); -$decoded = JWT::decode($jwt, $key, array('HS256')); +$jwt = JWT::encode($payload, $key, 'HS256'); +$decoded = JWT::decode($jwt, new Key($key, 'HS256')); print_r($decoded); @@ -56,15 +63,13 @@ $decoded_array = (array) $decoded; * Source: http://self-issued.info/docs/draft-ietf-oauth-json-web-token.html#nbfDef */ JWT::$leeway = 60; // $leeway in seconds -$decoded = JWT::decode($jwt, $key, array('HS256')); - -?> +$decoded = JWT::decode($jwt, new Key($key, 'HS256')); ``` Example with RS256 (openssl) ---------------------------- ```php - "example.org", - "aud" => "example.com", - "iat" => 1356999524, - "nbf" => 1357000000 -); +$payload = [ + 'iss' => 'example.org', + 'aud' => 'example.com', + 'iat' => 1356999524, + 'nbf' => 1357000000 +]; -$jwt = JWT::encode($token, $privateKey, 'RS256'); +$jwt = JWT::encode($payload, $privateKey, 'RS256'); echo "Encode:\n" . print_r($jwt, true) . "\n"; -$decoded = JWT::decode($jwt, $publicKey, array('RS256')); +$decoded = JWT::decode($jwt, new Key($publicKey, 'RS256')); /* NOTE: This will now be an object instead of an associative array. To get @@ -112,12 +117,174 @@ $decoded = JWT::decode($jwt, $publicKey, array('RS256')); $decoded_array = (array) $decoded; echo "Decode:\n" . print_r($decoded_array, true) . "\n"; -?> +``` + +Example with a passphrase +------------------------- + +```php +use Firebase\JWT\JWT; +use Firebase\JWT\Key; + +// Your passphrase +$passphrase = '[YOUR_PASSPHRASE]'; + +// Your private key file with passphrase +// Can be generated with "ssh-keygen -t rsa -m pem" +$privateKeyFile = '/path/to/key-with-passphrase.pem'; + +// Create a private key of type "resource" +$privateKey = openssl_pkey_get_private( + file_get_contents($privateKeyFile), + $passphrase +); + +$payload = [ + 'iss' => 'example.org', + 'aud' => 'example.com', + 'iat' => 1356999524, + 'nbf' => 1357000000 +]; + +$jwt = JWT::encode($payload, $privateKey, 'RS256'); +echo "Encode:\n" . print_r($jwt, true) . "\n"; + +// Get public key from the private key, or pull from from a file. +$publicKey = openssl_pkey_get_details($privateKey)['key']; + +$decoded = JWT::decode($jwt, new Key($publicKey, 'RS256')); +echo "Decode:\n" . print_r((array) $decoded, true) . "\n"; +``` + +Example with EdDSA (libsodium and Ed25519 signature) +---------------------------- +```php +use Firebase\JWT\JWT; +use Firebase\JWT\Key; + +// Public and private keys are expected to be Base64 encoded. The last +// non-empty line is used so that keys can be generated with +// sodium_crypto_sign_keypair(). The secret keys generated by other tools may +// need to be adjusted to match the input expected by libsodium. + +$keyPair = sodium_crypto_sign_keypair(); + +$privateKey = base64_encode(sodium_crypto_sign_secretkey($keyPair)); + +$publicKey = base64_encode(sodium_crypto_sign_publickey($keyPair)); + +$payload = [ + 'iss' => 'example.org', + 'aud' => 'example.com', + 'iat' => 1356999524, + 'nbf' => 1357000000 +]; + +$jwt = JWT::encode($payload, $privateKey, 'EdDSA'); +echo "Encode:\n" . print_r($jwt, true) . "\n"; + +$decoded = JWT::decode($jwt, new Key($publicKey, 'EdDSA')); +echo "Decode:\n" . print_r((array) $decoded, true) . "\n"; +```` + +Using JWKs +---------- + +```php +use Firebase\JWT\JWK; +use Firebase\JWT\JWT; + +// Set of keys. The "keys" key is required. For example, the JSON response to +// this endpoint: https://www.gstatic.com/iap/verify/public_key-jwk +$jwks = ['keys' => []]; + +// JWK::parseKeySet($jwks) returns an associative array of **kid** to Firebase\JWT\Key +// objects. Pass this as the second parameter to JWT::decode. +JWT::decode($payload, JWK::parseKeySet($jwks)); +``` + +Using Cached Key Sets +--------------------- + +The `CachedKeySet` class can be used to fetch and cache JWKS (JSON Web Key Sets) from a public URI. +This has the following advantages: + +1. The results are cached for performance. +2. If an unrecognized key is requested, the cache is refreshed, to accomodate for key rotation. +3. If rate limiting is enabled, the JWKS URI will not make more than 10 requests a second. + +```php +use Firebase\JWT\CachedKeySet; +use Firebase\JWT\JWT; + +// The URI for the JWKS you wish to cache the results from +$jwksUri = 'https://www.gstatic.com/iap/verify/public_key-jwk'; + +// Create an HTTP client (can be any PSR-7 compatible HTTP client) +$httpClient = new GuzzleHttp\Client(); + +// Create an HTTP request factory (can be any PSR-17 compatible HTTP request factory) +$httpFactory = new GuzzleHttp\Psr\HttpFactory(); + +// Create a cache item pool (can be any PSR-6 compatible cache item pool) +$cacheItemPool = Phpfastcache\CacheManager::getInstance('files'); + +$keySet = new CachedKeySet( + $jwksUri, + $httpClient, + $httpFactory, + $cacheItemPool, + null, // $expiresAfter int seconds to set the JWKS to expire + true // $rateLimit true to enable rate limit of 10 RPS on lookup of invalid keys +); + +$jwt = 'eyJhbGci...'; // Some JWT signed by a key from the $jwkUri above +$decoded = JWT::decode($jwt, $keySet); +``` + +Miscellaneous +------------- + +#### Casting to array + +The return value of `JWT::decode` is the generic PHP object `stdClass`. If you'd like to handle with arrays +instead, you can do the following: + +```php +// return type is stdClass +$decoded = JWT::decode($payload, $keys); + +// cast to array +$decoded = json_decode(json_encode($decoded), true); ``` Changelog --------- +#### 6.3.0 / 2022-07-15 + + - Added ES256 support to JWK parsing ([#399](https://github.com/firebase/php-jwt/pull/399)) + - Fixed potential caching error in `CachedKeySet` by caching jwks as strings ([#435](https://github.com/firebase/php-jwt/pull/435)) + +#### 6.2.0 / 2022-05-14 + + - Added `CachedKeySet` ([#397](https://github.com/firebase/php-jwt/pull/397)) + - Added `$defaultAlg` parameter to `JWT::parseKey` and `JWT::parseKeySet` ([#426](https://github.com/firebase/php-jwt/pull/426)). + +#### 6.1.0 / 2022-03-23 + + - Drop support for PHP 5.3, 5.4, 5.5, 5.6, and 7.0 + - Add parameter typing and return types where possible + +#### 6.0.0 / 2022-01-24 + + - **Backwards-Compatibility Breaking Changes**: See the [Release Notes](https://github.com/firebase/php-jwt/releases/tag/v6.0.0) for more information. + - New Key object to prevent key/algorithm type confusion (#365) + - Add JWK support (#273) + - Add ES256 support (#256) + - Add ES384 support (#324) + - Add Ed25519 support (#343) + #### 5.0.0 / 2017-06-26 - Support RS384 and RS512. See [#117](https://github.com/firebase/php-jwt/pull/117). Thanks [@joostfaassen](https://github.com/joostfaassen)! diff --git a/includes/vendor/firebase/php-jwt/composer.json b/includes/vendor/firebase/php-jwt/composer.json index b76ffd1..2a3cb2d 100644 --- a/includes/vendor/firebase/php-jwt/composer.json +++ b/includes/vendor/firebase/php-jwt/composer.json @@ -2,6 +2,10 @@ "name": "firebase/php-jwt", "description": "A simple library to encode and decode JSON Web Tokens (JWT) in PHP. Should conform to the current spec.", "homepage": "https://github.com/firebase/php-jwt", + "keywords": [ + "php", + "jwt" + ], "authors": [ { "name": "Neuman Vong", @@ -16,7 +20,10 @@ ], "license": "BSD-3-Clause", "require": { - "php": ">=5.3.0" + "php": "^7.1||^8.0" + }, + "suggest": { + "paragonie/sodium_compat": "Support EdDSA (Ed25519) signatures when libsodium is not present" }, "autoload": { "psr-4": { @@ -24,6 +31,11 @@ } }, "require-dev": { - "phpunit/phpunit": " 4.8.35" + "guzzlehttp/guzzle": "^6.5||^7.4", + "phpspec/prophecy-phpunit": "^1.1", + "phpunit/phpunit": "^7.5||^9.5", + "psr/cache": "^1.0||^2.0", + "psr/http-client": "^1.0", + "psr/http-factory": "^1.0" } } diff --git a/includes/vendor/firebase/php-jwt/src/BeforeValidException.php b/includes/vendor/firebase/php-jwt/src/BeforeValidException.php index a6ee2f7..c147852 100644 --- a/includes/vendor/firebase/php-jwt/src/BeforeValidException.php +++ b/includes/vendor/firebase/php-jwt/src/BeforeValidException.php @@ -1,7 +1,7 @@ + */ +class CachedKeySet implements ArrayAccess +{ + /** + * @var string + */ + private $jwksUri; + /** + * @var ClientInterface + */ + private $httpClient; + /** + * @var RequestFactoryInterface + */ + private $httpFactory; + /** + * @var CacheItemPoolInterface + */ + private $cache; + /** + * @var ?int + */ + private $expiresAfter; + /** + * @var ?CacheItemInterface + */ + private $cacheItem; + /** + * @var array + */ + private $keySet; + /** + * @var string + */ + private $cacheKey; + /** + * @var string + */ + private $cacheKeyPrefix = 'jwks'; + /** + * @var int + */ + private $maxKeyLength = 64; + /** + * @var bool + */ + private $rateLimit; + /** + * @var string + */ + private $rateLimitCacheKey; + /** + * @var int + */ + private $maxCallsPerMinute = 10; + /** + * @var string|null + */ + private $defaultAlg; + + public function __construct( + string $jwksUri, + ClientInterface $httpClient, + RequestFactoryInterface $httpFactory, + CacheItemPoolInterface $cache, + int $expiresAfter = null, + bool $rateLimit = false, + string $defaultAlg = null + ) { + $this->jwksUri = $jwksUri; + $this->httpClient = $httpClient; + $this->httpFactory = $httpFactory; + $this->cache = $cache; + $this->expiresAfter = $expiresAfter; + $this->rateLimit = $rateLimit; + $this->defaultAlg = $defaultAlg; + $this->setCacheKeys(); + } + + /** + * @param string $keyId + * @return Key + */ + public function offsetGet($keyId): Key + { + if (!$this->keyIdExists($keyId)) { + throw new OutOfBoundsException('Key ID not found'); + } + return $this->keySet[$keyId]; + } + + /** + * @param string $keyId + * @return bool + */ + public function offsetExists($keyId): bool + { + return $this->keyIdExists($keyId); + } + + /** + * @param string $offset + * @param Key $value + */ + public function offsetSet($offset, $value): void + { + throw new LogicException('Method not implemented'); + } + + /** + * @param string $offset + */ + public function offsetUnset($offset): void + { + throw new LogicException('Method not implemented'); + } + + private function keyIdExists(string $keyId): bool + { + if (null === $this->keySet) { + $item = $this->getCacheItem(); + // Try to load keys from cache + if ($item->isHit()) { + // item found! Return it + $jwks = $item->get(); + $this->keySet = JWK::parseKeySet(json_decode($jwks, true), $this->defaultAlg); + } + } + + if (!isset($this->keySet[$keyId])) { + if ($this->rateLimitExceeded()) { + return false; + } + $request = $this->httpFactory->createRequest('get', $this->jwksUri); + $jwksResponse = $this->httpClient->sendRequest($request); + $jwks = (string) $jwksResponse->getBody(); + $this->keySet = JWK::parseKeySet(json_decode($jwks, true), $this->defaultAlg); + + if (!isset($this->keySet[$keyId])) { + return false; + } + + $item = $this->getCacheItem(); + $item->set($jwks); + if ($this->expiresAfter) { + $item->expiresAfter($this->expiresAfter); + } + $this->cache->save($item); + } + + return true; + } + + private function rateLimitExceeded(): bool + { + if (!$this->rateLimit) { + return false; + } + + $cacheItem = $this->cache->getItem($this->rateLimitCacheKey); + if (!$cacheItem->isHit()) { + $cacheItem->expiresAfter(1); // # of calls are cached each minute + } + + $callsPerMinute = (int) $cacheItem->get(); + if (++$callsPerMinute > $this->maxCallsPerMinute) { + return true; + } + $cacheItem->set($callsPerMinute); + $this->cache->save($cacheItem); + return false; + } + + private function getCacheItem(): CacheItemInterface + { + if (\is_null($this->cacheItem)) { + $this->cacheItem = $this->cache->getItem($this->cacheKey); + } + + return $this->cacheItem; + } + + private function setCacheKeys(): void + { + if (empty($this->jwksUri)) { + throw new RuntimeException('JWKS URI is empty'); + } + + // ensure we do not have illegal characters + $key = preg_replace('|[^a-zA-Z0-9_\.!]|', '', $this->jwksUri); + + // add prefix + $key = $this->cacheKeyPrefix . $key; + + // Hash keys if they exceed $maxKeyLength of 64 + if (\strlen($key) > $this->maxKeyLength) { + $key = substr(hash('sha256', $key), 0, $this->maxKeyLength); + } + + $this->cacheKey = $key; + + if ($this->rateLimit) { + // add prefix + $rateLimitKey = $this->cacheKeyPrefix . 'ratelimit' . $key; + + // Hash keys if they exceed $maxKeyLength of 64 + if (\strlen($rateLimitKey) > $this->maxKeyLength) { + $rateLimitKey = substr(hash('sha256', $rateLimitKey), 0, $this->maxKeyLength); + } + + $this->rateLimitCacheKey = $rateLimitKey; + } + } +} diff --git a/includes/vendor/firebase/php-jwt/src/ExpiredException.php b/includes/vendor/firebase/php-jwt/src/ExpiredException.php index 3597370..81ba52d 100644 --- a/includes/vendor/firebase/php-jwt/src/ExpiredException.php +++ b/includes/vendor/firebase/php-jwt/src/ExpiredException.php @@ -1,7 +1,7 @@ + * @license http://opensource.org/licenses/BSD-3-Clause 3-clause BSD + * @link https://github.com/firebase/php-jwt + */ +class JWK +{ + private const OID = '1.2.840.10045.2.1'; + private const ASN1_OBJECT_IDENTIFIER = 0x06; + private const ASN1_SEQUENCE = 0x10; // also defined in JWT + private const ASN1_BIT_STRING = 0x03; + private const EC_CURVES = [ + 'P-256' => '1.2.840.10045.3.1.7', // Len: 64 + // 'P-384' => '1.3.132.0.34', // Len: 96 (not yet supported) + // 'P-521' => '1.3.132.0.35', // Len: 132 (not supported) + ]; + + /** + * Parse a set of JWK keys + * + * @param array $jwks The JSON Web Key Set as an associative array + * @param string $defaultAlg The algorithm for the Key object if "alg" is not set in the + * JSON Web Key Set + * + * @return array An associative array of key IDs (kid) to Key objects + * + * @throws InvalidArgumentException Provided JWK Set is empty + * @throws UnexpectedValueException Provided JWK Set was invalid + * @throws DomainException OpenSSL failure + * + * @uses parseKey + */ + public static function parseKeySet(array $jwks, string $defaultAlg = null): array + { + $keys = []; + + if (!isset($jwks['keys'])) { + throw new UnexpectedValueException('"keys" member must exist in the JWK Set'); + } + + if (empty($jwks['keys'])) { + throw new InvalidArgumentException('JWK Set did not contain any keys'); + } + + foreach ($jwks['keys'] as $k => $v) { + $kid = isset($v['kid']) ? $v['kid'] : $k; + if ($key = self::parseKey($v, $defaultAlg)) { + $keys[(string) $kid] = $key; + } + } + + if (0 === \count($keys)) { + throw new UnexpectedValueException('No supported algorithms found in JWK Set'); + } + + return $keys; + } + + /** + * Parse a JWK key + * + * @param array $jwk An individual JWK + * @param string $defaultAlg The algorithm for the Key object if "alg" is not set in the + * JSON Web Key Set + * + * @return Key The key object for the JWK + * + * @throws InvalidArgumentException Provided JWK is empty + * @throws UnexpectedValueException Provided JWK was invalid + * @throws DomainException OpenSSL failure + * + * @uses createPemFromModulusAndExponent + */ + public static function parseKey(array $jwk, string $defaultAlg = null): ?Key + { + if (empty($jwk)) { + throw new InvalidArgumentException('JWK must not be empty'); + } + + if (!isset($jwk['kty'])) { + throw new UnexpectedValueException('JWK must contain a "kty" parameter'); + } + + if (!isset($jwk['alg'])) { + if (\is_null($defaultAlg)) { + // The "alg" parameter is optional in a KTY, but an algorithm is required + // for parsing in this library. Use the $defaultAlg parameter when parsing the + // key set in order to prevent this error. + // @see https://datatracker.ietf.org/doc/html/rfc7517#section-4.4 + throw new UnexpectedValueException('JWK must contain an "alg" parameter'); + } + $jwk['alg'] = $defaultAlg; + } + + switch ($jwk['kty']) { + case 'RSA': + if (!empty($jwk['d'])) { + throw new UnexpectedValueException('RSA private keys are not supported'); + } + if (!isset($jwk['n']) || !isset($jwk['e'])) { + throw new UnexpectedValueException('RSA keys must contain values for both "n" and "e"'); + } + + $pem = self::createPemFromModulusAndExponent($jwk['n'], $jwk['e']); + $publicKey = \openssl_pkey_get_public($pem); + if (false === $publicKey) { + throw new DomainException( + 'OpenSSL error: ' . \openssl_error_string() + ); + } + return new Key($publicKey, $jwk['alg']); + case 'EC': + if (isset($jwk['d'])) { + // The key is actually a private key + throw new UnexpectedValueException('Key data must be for a public key'); + } + + if (empty($jwk['crv'])) { + throw new UnexpectedValueException('crv not set'); + } + + if (!isset(self::EC_CURVES[$jwk['crv']])) { + throw new DomainException('Unrecognised or unsupported EC curve'); + } + + if (empty($jwk['x']) || empty($jwk['y'])) { + throw new UnexpectedValueException('x and y not set'); + } + + $publicKey = self::createPemFromCrvAndXYCoordinates($jwk['crv'], $jwk['x'], $jwk['y']); + return new Key($publicKey, $jwk['alg']); + default: + // Currently only RSA is supported + break; + } + + return null; + } + + /** + * Converts the EC JWK values to pem format. + * + * @param string $crv The EC curve (only P-256 is supported) + * @param string $x The EC x-coordinate + * @param string $y The EC y-coordinate + * + * @return string + */ + private static function createPemFromCrvAndXYCoordinates(string $crv, string $x, string $y): string + { + $pem = + self::encodeDER( + self::ASN1_SEQUENCE, + self::encodeDER( + self::ASN1_SEQUENCE, + self::encodeDER( + self::ASN1_OBJECT_IDENTIFIER, + self::encodeOID(self::OID) + ) + . self::encodeDER( + self::ASN1_OBJECT_IDENTIFIER, + self::encodeOID(self::EC_CURVES[$crv]) + ) + ) . + self::encodeDER( + self::ASN1_BIT_STRING, + \chr(0x00) . \chr(0x04) + . JWT::urlsafeB64Decode($x) + . JWT::urlsafeB64Decode($y) + ) + ); + + return sprintf( + "-----BEGIN PUBLIC KEY-----\n%s\n-----END PUBLIC KEY-----\n", + wordwrap(base64_encode($pem), 64, "\n", true) + ); + } + + /** + * Create a public key represented in PEM format from RSA modulus and exponent information + * + * @param string $n The RSA modulus encoded in Base64 + * @param string $e The RSA exponent encoded in Base64 + * + * @return string The RSA public key represented in PEM format + * + * @uses encodeLength + */ + private static function createPemFromModulusAndExponent( + string $n, + string $e + ): string { + $mod = JWT::urlsafeB64Decode($n); + $exp = JWT::urlsafeB64Decode($e); + + $modulus = \pack('Ca*a*', 2, self::encodeLength(\strlen($mod)), $mod); + $publicExponent = \pack('Ca*a*', 2, self::encodeLength(\strlen($exp)), $exp); + + $rsaPublicKey = \pack( + 'Ca*a*a*', + 48, + self::encodeLength(\strlen($modulus) + \strlen($publicExponent)), + $modulus, + $publicExponent + ); + + // sequence(oid(1.2.840.113549.1.1.1), null)) = rsaEncryption. + $rsaOID = \pack('H*', '300d06092a864886f70d0101010500'); // hex version of MA0GCSqGSIb3DQEBAQUA + $rsaPublicKey = \chr(0) . $rsaPublicKey; + $rsaPublicKey = \chr(3) . self::encodeLength(\strlen($rsaPublicKey)) . $rsaPublicKey; + + $rsaPublicKey = \pack( + 'Ca*a*', + 48, + self::encodeLength(\strlen($rsaOID . $rsaPublicKey)), + $rsaOID . $rsaPublicKey + ); + + return "-----BEGIN PUBLIC KEY-----\r\n" . + \chunk_split(\base64_encode($rsaPublicKey), 64) . + '-----END PUBLIC KEY-----'; + } + + /** + * DER-encode the length + * + * DER supports lengths up to (2**8)**127, however, we'll only support lengths up to (2**8)**4. See + * {@link http://itu.int/ITU-T/studygroups/com17/languages/X.690-0207.pdf#p=13 X.690 paragraph 8.1.3} for more information. + * + * @param int $length + * @return string + */ + private static function encodeLength(int $length): string + { + if ($length <= 0x7F) { + return \chr($length); + } + + $temp = \ltrim(\pack('N', $length), \chr(0)); + + return \pack('Ca*', 0x80 | \strlen($temp), $temp); + } + + /** + * Encodes a value into a DER object. + * Also defined in Firebase\JWT\JWT + * + * @param int $type DER tag + * @param string $value the value to encode + * @return string the encoded object + */ + private static function encodeDER(int $type, string $value): string + { + $tag_header = 0; + if ($type === self::ASN1_SEQUENCE) { + $tag_header |= 0x20; + } + + // Type + $der = \chr($tag_header | $type); + + // Length + $der .= \chr(\strlen($value)); + + return $der . $value; + } + + /** + * Encodes a string into a DER-encoded OID. + * + * @param string $oid the OID string + * @return string the binary DER-encoded OID + */ + private static function encodeOID(string $oid): string + { + $octets = explode('.', $oid); + + // Get the first octet + $first = (int) array_shift($octets); + $second = (int) array_shift($octets); + $oid = \chr($first * 40 + $second); + + // Iterate over subsequent octets + foreach ($octets as $octet) { + if ($octet == 0) { + $oid .= \chr(0x00); + continue; + } + $bin = ''; + + while ($octet) { + $bin .= \chr(0x80 | ($octet & 0x7f)); + $octet >>= 7; + } + $bin[0] = $bin[0] & \chr(0x7f); + + // Convert to big endian if necessary + if (pack('V', 65534) == pack('L', 65534)) { + $oid .= strrev($bin); + } else { + $oid .= $bin; + } + } + + return $oid; + } +} diff --git a/includes/vendor/firebase/php-jwt/src/JWT.php b/includes/vendor/firebase/php-jwt/src/JWT.php index 22a67e3..9964073 100644 --- a/includes/vendor/firebase/php-jwt/src/JWT.php +++ b/includes/vendor/firebase/php-jwt/src/JWT.php @@ -1,10 +1,16 @@ array('hash_hmac', 'SHA256'), - 'HS512' => array('hash_hmac', 'SHA512'), - 'HS384' => array('hash_hmac', 'SHA384'), - 'RS256' => array('openssl', 'SHA256'), - 'RS384' => array('openssl', 'SHA384'), - 'RS512' => array('openssl', 'SHA512'), - ); + /** + * @var array + */ + public static $supported_algs = [ + 'ES384' => ['openssl', 'SHA384'], + 'ES256' => ['openssl', 'SHA256'], + 'HS256' => ['hash_hmac', 'SHA256'], + 'HS384' => ['hash_hmac', 'SHA384'], + 'HS512' => ['hash_hmac', 'SHA512'], + 'RS256' => ['openssl', 'SHA256'], + 'RS384' => ['openssl', 'SHA384'], + 'RS512' => ['openssl', 'SHA512'], + 'EdDSA' => ['sodium_crypto', 'EdDSA'], + ]; /** * Decodes a JWT string into a PHP object. * - * @param string $jwt The JWT - * @param string|array $key The key, or map of keys. - * If the algorithm used is asymmetric, this is the public key - * @param array $allowed_algs List of supported verification algorithms - * Supported algorithms are 'HS256', 'HS384', 'HS512' and 'RS256' + * @param string $jwt The JWT + * @param Key|array $keyOrKeyArray The Key or associative array of key IDs (kid) to Key objects. + * If the algorithm used is asymmetric, this is the public key + * Each Key object contains an algorithm and matching key. + * Supported algorithms are 'ES384','ES256', 'HS256', 'HS384', + * 'HS512', 'RS256', 'RS384', and 'RS512' * - * @return object The JWT's payload as a PHP object + * @return stdClass The JWT's payload as a PHP object * + * @throws InvalidArgumentException Provided key/key-array was empty + * @throws DomainException Provided JWT is malformed * @throws UnexpectedValueException Provided JWT was invalid * @throws SignatureInvalidException Provided JWT was invalid because the signature verification failed * @throws BeforeValidException Provided JWT is trying to be used before it's eligible as defined by 'nbf' @@ -66,57 +87,64 @@ class JWT * @uses jsonDecode * @uses urlsafeB64Decode */ - public static function decode($jwt, $key, array $allowed_algs = array()) - { - $timestamp = is_null(static::$timestamp) ? time() : static::$timestamp; + public static function decode( + string $jwt, + $keyOrKeyArray + ): stdClass { + // Validate JWT + $timestamp = \is_null(static::$timestamp) ? \time() : static::$timestamp; - if (empty($key)) { + if (empty($keyOrKeyArray)) { throw new InvalidArgumentException('Key may not be empty'); } - $tks = explode('.', $jwt); - if (count($tks) != 3) { + $tks = \explode('.', $jwt); + if (\count($tks) !== 3) { throw new UnexpectedValueException('Wrong number of segments'); } list($headb64, $bodyb64, $cryptob64) = $tks; - if (null === ($header = static::jsonDecode(static::urlsafeB64Decode($headb64)))) { + $headerRaw = static::urlsafeB64Decode($headb64); + if (null === ($header = static::jsonDecode($headerRaw))) { throw new UnexpectedValueException('Invalid header encoding'); } - if (null === $payload = static::jsonDecode(static::urlsafeB64Decode($bodyb64))) { + $payloadRaw = static::urlsafeB64Decode($bodyb64); + if (null === ($payload = static::jsonDecode($payloadRaw))) { throw new UnexpectedValueException('Invalid claims encoding'); } - if (false === ($sig = static::urlsafeB64Decode($cryptob64))) { - throw new UnexpectedValueException('Invalid signature encoding'); + if (\is_array($payload)) { + // prevent PHP Fatal Error in edge-cases when payload is empty array + $payload = (object) $payload; } + if (!$payload instanceof stdClass) { + throw new UnexpectedValueException('Payload must be a JSON object'); + } + $sig = static::urlsafeB64Decode($cryptob64); if (empty($header->alg)) { throw new UnexpectedValueException('Empty algorithm'); } if (empty(static::$supported_algs[$header->alg])) { throw new UnexpectedValueException('Algorithm not supported'); } - if (!in_array($header->alg, $allowed_algs)) { - throw new UnexpectedValueException('Algorithm not allowed'); + + $key = self::getKey($keyOrKeyArray, property_exists($header, 'kid') ? $header->kid : null); + + // Check the algorithm + if (!self::constantTimeEquals($key->getAlgorithm(), $header->alg)) { + // See issue #351 + throw new UnexpectedValueException('Incorrect key for this algorithm'); } - if (is_array($key) || $key instanceof \ArrayAccess) { - if (isset($header->kid)) { - if (!isset($key[$header->kid])) { - throw new UnexpectedValueException('"kid" invalid, unable to lookup correct key'); - } - $key = $key[$header->kid]; - } else { - throw new UnexpectedValueException('"kid" empty, unable to lookup correct key'); - } + if ($header->alg === 'ES256' || $header->alg === 'ES384') { + // OpenSSL expects an ASN.1 DER sequence for ES256/ES384 signatures + $sig = self::signatureToDER($sig); } - - // Check the signature - if (!static::verify("$headb64.$bodyb64", $sig, $key, $header->alg)) { + if (!self::verify("${headb64}.${bodyb64}", $sig, $key->getKeyMaterial(), $header->alg)) { throw new SignatureInvalidException('Signature verification failed'); } - // Check if the nbf if it is defined. This is the time that the + // Check the nbf if it is defined. This is the time that the // token can actually be used. If it's not yet that time, abort. if (isset($payload->nbf) && $payload->nbf > ($timestamp + static::$leeway)) { throw new BeforeValidException( - 'Cannot handle token prior to ' . date(DateTime::ISO8601, $payload->nbf) + 'Cannot handle token prior to ' . \date(DateTime::ISO8601, $payload->nbf) ); } @@ -125,7 +153,7 @@ public static function decode($jwt, $key, array $allowed_algs = array()) // correctly used the nbf claim). if (isset($payload->iat) && $payload->iat > ($timestamp + static::$leeway)) { throw new BeforeValidException( - 'Cannot handle token prior to ' . date(DateTime::ISO8601, $payload->iat) + 'Cannot handle token prior to ' . \date(DateTime::ISO8601, $payload->iat) ); } @@ -140,118 +168,161 @@ public static function decode($jwt, $key, array $allowed_algs = array()) /** * Converts and signs a PHP object or array into a JWT string. * - * @param object|array $payload PHP object or array - * @param string $key The secret key. - * If the algorithm used is asymmetric, this is the private key - * @param string $alg The signing algorithm. - * Supported algorithms are 'HS256', 'HS384', 'HS512' and 'RS256' - * @param mixed $keyId - * @param array $head An array with header elements to attach + * @param array $payload PHP array + * @param string|resource|OpenSSLAsymmetricKey|OpenSSLCertificate $key The secret key. + * @param string $alg Supported algorithms are 'ES384','ES256', 'HS256', 'HS384', + * 'HS512', 'RS256', 'RS384', and 'RS512' + * @param string $keyId + * @param array $head An array with header elements to attach * * @return string A signed JWT * * @uses jsonEncode * @uses urlsafeB64Encode */ - public static function encode($payload, $key, $alg = 'HS256', $keyId = null, $head = null) - { - $header = array('typ' => 'JWT', 'alg' => $alg); + public static function encode( + array $payload, + $key, + string $alg, + string $keyId = null, + array $head = null + ): string { + $header = ['typ' => 'JWT', 'alg' => $alg]; if ($keyId !== null) { $header['kid'] = $keyId; } - if ( isset($head) && is_array($head) ) { - $header = array_merge($head, $header); + if (isset($head) && \is_array($head)) { + $header = \array_merge($head, $header); } - $segments = array(); - $segments[] = static::urlsafeB64Encode(static::jsonEncode($header)); - $segments[] = static::urlsafeB64Encode(static::jsonEncode($payload)); - $signing_input = implode('.', $segments); + $segments = []; + $segments[] = static::urlsafeB64Encode((string) static::jsonEncode($header)); + $segments[] = static::urlsafeB64Encode((string) static::jsonEncode($payload)); + $signing_input = \implode('.', $segments); $signature = static::sign($signing_input, $key, $alg); $segments[] = static::urlsafeB64Encode($signature); - return implode('.', $segments); + return \implode('.', $segments); } /** * Sign a string with a given key and algorithm. * - * @param string $msg The message to sign - * @param string|resource $key The secret key - * @param string $alg The signing algorithm. - * Supported algorithms are 'HS256', 'HS384', 'HS512' and 'RS256' + * @param string $msg The message to sign + * @param string|resource|OpenSSLAsymmetricKey|OpenSSLCertificate $key The secret key. + * @param string $alg Supported algorithms are 'ES384','ES256', 'HS256', 'HS384', + * 'HS512', 'RS256', 'RS384', and 'RS512' * * @return string An encrypted message * - * @throws DomainException Unsupported algorithm was specified + * @throws DomainException Unsupported algorithm or bad key was specified */ - public static function sign($msg, $key, $alg = 'HS256') - { + public static function sign( + string $msg, + $key, + string $alg + ): string { if (empty(static::$supported_algs[$alg])) { throw new DomainException('Algorithm not supported'); } list($function, $algorithm) = static::$supported_algs[$alg]; - switch($function) { + switch ($function) { case 'hash_hmac': - return hash_hmac($algorithm, $msg, $key, true); + if (!\is_string($key)) { + throw new InvalidArgumentException('key must be a string when using hmac'); + } + return \hash_hmac($algorithm, $msg, $key, true); case 'openssl': $signature = ''; - $success = openssl_sign($msg, $signature, $key, $algorithm); + $success = \openssl_sign($msg, $signature, $key, $algorithm); // @phpstan-ignore-line if (!$success) { - throw new DomainException("OpenSSL unable to sign data"); - } else { - return $signature; + throw new DomainException('OpenSSL unable to sign data'); + } + if ($alg === 'ES256') { + $signature = self::signatureFromDER($signature, 256); + } elseif ($alg === 'ES384') { + $signature = self::signatureFromDER($signature, 384); + } + return $signature; + case 'sodium_crypto': + if (!\function_exists('sodium_crypto_sign_detached')) { + throw new DomainException('libsodium is not available'); + } + if (!\is_string($key)) { + throw new InvalidArgumentException('key must be a string when using EdDSA'); + } + try { + // The last non-empty line is used as the key. + $lines = array_filter(explode("\n", $key)); + $key = base64_decode((string) end($lines)); + return sodium_crypto_sign_detached($msg, $key); + } catch (Exception $e) { + throw new DomainException($e->getMessage(), 0, $e); } } + + throw new DomainException('Algorithm not supported'); } /** * Verify a signature with the message, key and method. Not all methods * are symmetric, so we must have a separate verify and sign method. * - * @param string $msg The original message (header and body) - * @param string $signature The original signature - * @param string|resource $key For HS*, a string key works. for RS*, must be a resource of an openssl public key - * @param string $alg The algorithm + * @param string $msg The original message (header and body) + * @param string $signature The original signature + * @param string|resource|OpenSSLAsymmetricKey|OpenSSLCertificate $keyMaterial For HS*, a string key works. for RS*, must be an instance of OpenSSLAsymmetricKey + * @param string $alg The algorithm * * @return bool * - * @throws DomainException Invalid Algorithm or OpenSSL failure + * @throws DomainException Invalid Algorithm, bad key, or OpenSSL failure */ - private static function verify($msg, $signature, $key, $alg) - { + private static function verify( + string $msg, + string $signature, + $keyMaterial, + string $alg + ): bool { if (empty(static::$supported_algs[$alg])) { throw new DomainException('Algorithm not supported'); } list($function, $algorithm) = static::$supported_algs[$alg]; - switch($function) { + switch ($function) { case 'openssl': - $success = openssl_verify($msg, $signature, $key, $algorithm); + $success = \openssl_verify($msg, $signature, $keyMaterial, $algorithm); // @phpstan-ignore-line if ($success === 1) { return true; - } elseif ($success === 0) { + } + if ($success === 0) { return false; } // returns 1 on success, 0 on failure, -1 on error. throw new DomainException( - 'OpenSSL error: ' . openssl_error_string() + 'OpenSSL error: ' . \openssl_error_string() ); + case 'sodium_crypto': + if (!\function_exists('sodium_crypto_sign_verify_detached')) { + throw new DomainException('libsodium is not available'); + } + if (!\is_string($keyMaterial)) { + throw new InvalidArgumentException('key must be a string when using EdDSA'); + } + try { + // The last non-empty line is used as the key. + $lines = array_filter(explode("\n", $keyMaterial)); + $key = base64_decode((string) end($lines)); + return sodium_crypto_sign_verify_detached($signature, $msg, $key); + } catch (Exception $e) { + throw new DomainException($e->getMessage(), 0, $e); + } case 'hash_hmac': default: - $hash = hash_hmac($algorithm, $msg, $key, true); - if (function_exists('hash_equals')) { - return hash_equals($signature, $hash); - } - $len = min(static::safeStrlen($signature), static::safeStrlen($hash)); - - $status = 0; - for ($i = 0; $i < $len; $i++) { - $status |= (ord($signature[$i]) ^ ord($hash[$i])); + if (!\is_string($keyMaterial)) { + throw new InvalidArgumentException('key must be a string when using hmac'); } - $status |= (static::safeStrlen($signature) ^ static::safeStrlen($hash)); - - return ($status === 0); + $hash = \hash_hmac($algorithm, $msg, $keyMaterial, true); + return self::constantTimeEquals($hash, $signature); } } @@ -260,30 +331,16 @@ private static function verify($msg, $signature, $key, $alg) * * @param string $input JSON string * - * @return object Object representation of JSON string + * @return mixed The decoded JSON string * * @throws DomainException Provided string was invalid JSON */ - public static function jsonDecode($input) + public static function jsonDecode(string $input) { - if (version_compare(PHP_VERSION, '5.4.0', '>=') && !(defined('JSON_C_VERSION') && PHP_INT_SIZE > 4)) { - /** In PHP >=5.4.0, json_decode() accepts an options parameter, that allows you - * to specify that large ints (like Steam Transaction IDs) should be treated as - * strings, rather than the PHP default behaviour of converting them to floats. - */ - $obj = json_decode($input, false, 512, JSON_BIGINT_AS_STRING); - } else { - /** Not all servers will support that, however, so for older versions we must - * manually detect large ints in the JSON string and quote them (thus converting - *them to strings) before decoding, hence the preg_replace() call. - */ - $max_int_length = strlen((string) PHP_INT_MAX) - 1; - $json_without_bigints = preg_replace('/:\s*(-?\d{'.$max_int_length.',})/', ': "$1"', $input); - $obj = json_decode($json_without_bigints); - } + $obj = \json_decode($input, false, 512, JSON_BIGINT_AS_STRING); - if (function_exists('json_last_error') && $errno = json_last_error()) { - static::handleJsonError($errno); + if ($errno = \json_last_error()) { + self::handleJsonError($errno); } elseif ($obj === null && $input !== 'null') { throw new DomainException('Null result with non-null input'); } @@ -291,22 +348,30 @@ public static function jsonDecode($input) } /** - * Encode a PHP object into a JSON string. + * Encode a PHP array into a JSON string. * - * @param object|array $input A PHP object or array + * @param array $input A PHP array * - * @return string JSON representation of the PHP object or array + * @return string JSON representation of the PHP array * * @throws DomainException Provided object could not be encoded to valid JSON */ - public static function jsonEncode($input) + public static function jsonEncode(array $input): string { - $json = json_encode($input); - if (function_exists('json_last_error') && $errno = json_last_error()) { - static::handleJsonError($errno); + if (PHP_VERSION_ID >= 50400) { + $json = \json_encode($input, \JSON_UNESCAPED_SLASHES); + } else { + // PHP 5.3 only + $json = \json_encode($input); + } + if ($errno = \json_last_error()) { + self::handleJsonError($errno); } elseif ($json === 'null' && $input !== null) { throw new DomainException('Null result with non-null input'); } + if ($json === false) { + throw new DomainException('Provided object could not be encoded to valid JSON'); + } return $json; } @@ -316,15 +381,17 @@ public static function jsonEncode($input) * @param string $input A Base64 encoded string * * @return string A decoded string + * + * @throws InvalidArgumentException invalid base64 characters */ - public static function urlsafeB64Decode($input) + public static function urlsafeB64Decode(string $input): string { - $remainder = strlen($input) % 4; + $remainder = \strlen($input) % 4; if ($remainder) { $padlen = 4 - $remainder; - $input .= str_repeat('=', $padlen); + $input .= \str_repeat('=', $padlen); } - return base64_decode(strtr($input, '-_', '+/')); + return \base64_decode(\strtr($input, '-_', '+/')); } /** @@ -334,9 +401,64 @@ public static function urlsafeB64Decode($input) * * @return string The base64 encode of what you passed in */ - public static function urlsafeB64Encode($input) + public static function urlsafeB64Encode(string $input): string { - return str_replace('=', '', strtr(base64_encode($input), '+/', '-_')); + return \str_replace('=', '', \strtr(\base64_encode($input), '+/', '-_')); + } + + + /** + * Determine if an algorithm has been provided for each Key + * + * @param Key|ArrayAccess|array $keyOrKeyArray + * @param string|null $kid + * + * @throws UnexpectedValueException + * + * @return Key + */ + private static function getKey( + $keyOrKeyArray, + ?string $kid + ): Key { + if ($keyOrKeyArray instanceof Key) { + return $keyOrKeyArray; + } + + if ($keyOrKeyArray instanceof CachedKeySet) { + // Skip "isset" check, as this will automatically refresh if not set + return $keyOrKeyArray[$kid]; + } + + if (empty($kid)) { + throw new UnexpectedValueException('"kid" empty, unable to lookup correct key'); + } + if (!isset($keyOrKeyArray[$kid])) { + throw new UnexpectedValueException('"kid" invalid, unable to lookup correct key'); + } + + return $keyOrKeyArray[$kid]; + } + + /** + * @param string $left The string of known length to compare against + * @param string $right The user-supplied string + * @return bool + */ + public static function constantTimeEquals(string $left, string $right): bool + { + if (\function_exists('hash_equals')) { + return \hash_equals($left, $right); + } + $len = \min(self::safeStrlen($left), self::safeStrlen($right)); + + $status = 0; + for ($i = 0; $i < $len; $i++) { + $status |= (\ord($left[$i]) ^ \ord($right[$i])); + } + $status |= (self::safeStrlen($left) ^ self::safeStrlen($right)); + + return ($status === 0); } /** @@ -344,17 +466,19 @@ public static function urlsafeB64Encode($input) * * @param int $errno An error number from json_last_error() * + * @throws DomainException + * * @return void */ - private static function handleJsonError($errno) + private static function handleJsonError(int $errno): void { - $messages = array( + $messages = [ JSON_ERROR_DEPTH => 'Maximum stack depth exceeded', JSON_ERROR_STATE_MISMATCH => 'Invalid or malformed JSON', JSON_ERROR_CTRL_CHAR => 'Unexpected control character found', JSON_ERROR_SYNTAX => 'Syntax error, malformed JSON', JSON_ERROR_UTF8 => 'Malformed UTF-8 characters' //PHP >= 5.3.3 - ); + ]; throw new DomainException( isset($messages[$errno]) ? $messages[$errno] @@ -365,15 +489,139 @@ private static function handleJsonError($errno) /** * Get the number of bytes in cryptographic strings. * - * @param string + * @param string $str * * @return int */ - private static function safeStrlen($str) + private static function safeStrlen(string $str): int + { + if (\function_exists('mb_strlen')) { + return \mb_strlen($str, '8bit'); + } + return \strlen($str); + } + + /** + * Convert an ECDSA signature to an ASN.1 DER sequence + * + * @param string $sig The ECDSA signature to convert + * @return string The encoded DER object + */ + private static function signatureToDER(string $sig): string + { + // Separate the signature into r-value and s-value + $length = max(1, (int) (\strlen($sig) / 2)); + list($r, $s) = \str_split($sig, $length); + + // Trim leading zeros + $r = \ltrim($r, "\x00"); + $s = \ltrim($s, "\x00"); + + // Convert r-value and s-value from unsigned big-endian integers to + // signed two's complement + if (\ord($r[0]) > 0x7f) { + $r = "\x00" . $r; + } + if (\ord($s[0]) > 0x7f) { + $s = "\x00" . $s; + } + + return self::encodeDER( + self::ASN1_SEQUENCE, + self::encodeDER(self::ASN1_INTEGER, $r) . + self::encodeDER(self::ASN1_INTEGER, $s) + ); + } + + /** + * Encodes a value into a DER object. + * + * @param int $type DER tag + * @param string $value the value to encode + * + * @return string the encoded object + */ + private static function encodeDER(int $type, string $value): string { - if (function_exists('mb_strlen')) { - return mb_strlen($str, '8bit'); + $tag_header = 0; + if ($type === self::ASN1_SEQUENCE) { + $tag_header |= 0x20; } - return strlen($str); + + // Type + $der = \chr($tag_header | $type); + + // Length + $der .= \chr(\strlen($value)); + + return $der . $value; + } + + /** + * Encodes signature from a DER object. + * + * @param string $der binary signature in DER format + * @param int $keySize the number of bits in the key + * + * @return string the signature + */ + private static function signatureFromDER(string $der, int $keySize): string + { + // OpenSSL returns the ECDSA signatures as a binary ASN.1 DER SEQUENCE + list($offset, $_) = self::readDER($der); + list($offset, $r) = self::readDER($der, $offset); + list($offset, $s) = self::readDER($der, $offset); + + // Convert r-value and s-value from signed two's compliment to unsigned + // big-endian integers + $r = \ltrim($r, "\x00"); + $s = \ltrim($s, "\x00"); + + // Pad out r and s so that they are $keySize bits long + $r = \str_pad($r, $keySize / 8, "\x00", STR_PAD_LEFT); + $s = \str_pad($s, $keySize / 8, "\x00", STR_PAD_LEFT); + + return $r . $s; + } + + /** + * Reads binary DER-encoded data and decodes into a single object + * + * @param string $der the binary data in DER format + * @param int $offset the offset of the data stream containing the object + * to decode + * + * @return array{int, string|null} the new offset and the decoded object + */ + private static function readDER(string $der, int $offset = 0): array + { + $pos = $offset; + $size = \strlen($der); + $constructed = (\ord($der[$pos]) >> 5) & 0x01; + $type = \ord($der[$pos++]) & 0x1f; + + // Length + $len = \ord($der[$pos++]); + if ($len & 0x80) { + $n = $len & 0x1f; + $len = 0; + while ($n-- && $pos < $size) { + $len = ($len << 8) | \ord($der[$pos++]); + } + } + + // Value + if ($type === self::ASN1_BIT_STRING) { + $pos++; // Skip the first contents octet (padding indicator) + $data = \substr($der, $pos, $len - 1); + $pos += $len - 1; + } elseif (!$constructed) { + $data = \substr($der, $pos, $len); + $pos += $len; + } else { + $data = null; + } + + return [$pos, $data]; } } diff --git a/includes/vendor/firebase/php-jwt/src/Key.php b/includes/vendor/firebase/php-jwt/src/Key.php new file mode 100644 index 0000000..00cf7f2 --- /dev/null +++ b/includes/vendor/firebase/php-jwt/src/Key.php @@ -0,0 +1,64 @@ +keyMaterial = $keyMaterial; + $this->algorithm = $algorithm; + } + + /** + * Return the algorithm valid for this key + * + * @return string + */ + public function getAlgorithm(): string + { + return $this->algorithm; + } + + /** + * @return string|resource|OpenSSLAsymmetricKey|OpenSSLCertificate + */ + public function getKeyMaterial() + { + return $this->keyMaterial; + } +} diff --git a/includes/vendor/firebase/php-jwt/src/SignatureInvalidException.php b/includes/vendor/firebase/php-jwt/src/SignatureInvalidException.php index 27332b2..d35dee9 100644 --- a/includes/vendor/firebase/php-jwt/src/SignatureInvalidException.php +++ b/includes/vendor/firebase/php-jwt/src/SignatureInvalidException.php @@ -1,7 +1,7 @@ 403, ) @@ -121,7 +122,7 @@ public function generate_token($request) /** Try to authenticate the user with the passed credentials*/ $user = wp_authenticate($username, $password); - /** If the authentication fails return a error*/ + /** If the authentication fails return an error*/ if (is_wp_error($user)) { $error_code = $user->get_error_code(); return new WP_Error( @@ -151,7 +152,11 @@ public function generate_token($request) ); /** Let the user modify the token data before the sign. */ - $token = JWT::encode(apply_filters('jwt_auth_token_before_sign', $token, $user), $secret_key); + $token = JWT::encode( + apply_filters('jwt_auth_token_before_sign', $token, $user), + $secret_key, + apply_filters('jwt_auth_algorithm', 'HS256') + ); /** The token is signed, now create the object with no sensible user data to the client*/ $data = array( @@ -190,7 +195,7 @@ public function determine_current_user($user) /* * if the request URI is for validate the token don't do anything, - * this avoid double calls to the validate_token function. + * this avoids double calls to the validate_token function. */ $validate_uri = strpos($_SERVER['REQUEST_URI'], 'token/validate'); if ($validate_uri > 0) { @@ -201,7 +206,7 @@ public function determine_current_user($user) if (is_wp_error($token)) { if ($token->get_error_code() != 'jwt_auth_no_auth_header') { - /** If there is a error, store it to show it after see rest_pre_dispatch */ + /** If there is an error, store it to show it after see rest_pre_dispatch */ $this->jwt_error = $token; return $user; } else { @@ -213,7 +218,7 @@ public function determine_current_user($user) } /** - * Main validation function, this function try to get the Autentication + * Main validation function, this function try to get the Authentication * headers and decoded. * * @param bool $output @@ -263,7 +268,7 @@ public function validate_token($output = true) if (!$secret_key) { return new WP_Error( 'jwt_auth_bad_config', - 'JWT is not configurated properly, please contact the admin', + 'JWT is not configured properly, please contact the admin', array( 'status' => 403, ) @@ -272,7 +277,10 @@ public function validate_token($output = true) /** Try to decode the token */ try { - $token = JWT::decode($token, $secret_key, array('HS256')); + $token = JWT::decode( + $token, + new Key($secret_key, apply_filters('jwt_auth_algorithm', 'HS256')) + ); /** The Token is decoded now validate the iss */ if ($token->iss != get_bloginfo('url')) { /** The iss do not match, return error */ @@ -318,12 +326,14 @@ public function validate_token($output = true) } } - /** - * Filter to hook the rest_pre_dispatch, if the is an error in the request - * send it, if there is no error just continue with the current request. - * - * @param $request - */ + /** + * Filter to hook the rest_pre_dispatch, if the is an error in the request + * send it, if there is no error just continue with the current request. + * + * @param $request + * + * @return mixed|WP_Error|null + */ public function rest_pre_dispatch($request) { if (is_wp_error($this->jwt_error)) { From 785f790c2fa0ae3a8e8db0394b75a4948f9d758a Mon Sep 17 00:00:00 2001 From: Tmeister Date: Tue, 20 Sep 2022 21:00:19 -0500 Subject: [PATCH 14/79] Remove unnecessary back slash - Fix a typo --- public/class-jwt-auth-public.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/public/class-jwt-auth-public.php b/public/class-jwt-auth-public.php index 2b83ed3..8988a46 100755 --- a/public/class-jwt-auth-public.php +++ b/public/class-jwt-auth-public.php @@ -1,7 +1,7 @@ Date: Tue, 20 Sep 2022 21:10:34 -0500 Subject: [PATCH 15/79] Revert "Fix warning `register_rest_route was called incorrectly.`" --- public/class-jwt-auth-public.php | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/public/class-jwt-auth-public.php b/public/class-jwt-auth-public.php index 007da76..bcfe2e1 100755 --- a/public/class-jwt-auth-public.php +++ b/public/class-jwt-auth-public.php @@ -73,15 +73,13 @@ public function __construct($plugin_name, $version) public function add_api_routes() { register_rest_route($this->namespace, 'token', array( - 'methods' => 'POST', - 'callback' => array($this, 'generate_token'), - 'permission_callback' => '__return_true', + 'methods' => 'POST', + 'callback' => array($this, 'generate_token'), )); register_rest_route($this->namespace, 'token/validate', array( - 'methods' => 'POST', - 'callback' => array($this, 'validate_token'), - 'permission_callback' => '__return_true', + 'methods' => 'POST', + 'callback' => array($this, 'validate_token'), )); } From 6dcd5de6a9d45138ab599a1c0bebf478849ffe40 Mon Sep 17 00:00:00 2001 From: Tmeister Date: Tue, 20 Sep 2022 21:28:36 -0500 Subject: [PATCH 16/79] Fix warning register_rest_route was called incorrectly. - Related #243 - Fixes #207 #228 #209 --- public/class-jwt-auth-public.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/public/class-jwt-auth-public.php b/public/class-jwt-auth-public.php index ce262aa..38075cf 100755 --- a/public/class-jwt-auth-public.php +++ b/public/class-jwt-auth-public.php @@ -76,11 +76,13 @@ public function add_api_routes() register_rest_route($this->namespace, 'token', array( 'methods' => 'POST', 'callback' => array($this, 'generate_token'), + 'permission_callback' => '__return_true', )); register_rest_route($this->namespace, 'token/validate', array( 'methods' => 'POST', 'callback' => array($this, 'validate_token'), + 'permission_callback' => '__return_true', )); } From 2e13d3129e9a6799b150ef79bafeea300c35bbd5 Mon Sep 17 00:00:00 2001 From: Tmeister Date: Tue, 20 Sep 2022 21:49:30 -0500 Subject: [PATCH 17/79] Update Readmes and plugin version up --- README.md | 26 ++++++++++++++++---------- jwt-auth.php | 4 ++-- readme.txt | 28 ++++++++++++++++++++++++++++ 3 files changed, 46 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index e24747d..d4312eb 100644 --- a/README.md +++ b/README.md @@ -319,20 +319,26 @@ $data = array( ); ``` -## Testing +### jwt_auth_algorithm +The **jwt_auth_algorithm** allows you to modify the signing algorithm. -Since version **1.1.0** I've added a new test suite to be sure that the basic features of this plugin do what it's expected. - -You can run this test using the following command +Default value: -``` -composer install -includes/vendor/bin/phpunit tests -``` +```php + Date: Tue, 20 Sep 2022 22:06:13 -0500 Subject: [PATCH 18/79] Add Github actions to deploy from here instead of using the old SVN --- .github/deploy.yml | 17 +++++++++++++++++ .github/trunk.yml | 16 ++++++++++++++++ 2 files changed, 33 insertions(+) create mode 100644 .github/deploy.yml create mode 100644 .github/trunk.yml diff --git a/.github/deploy.yml b/.github/deploy.yml new file mode 100644 index 0000000..5c11b93 --- /dev/null +++ b/.github/deploy.yml @@ -0,0 +1,17 @@ +name: Deploy to WordPress.org +on: + push: + tags: + - "*" +jobs: + tag: + name: New tag + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@master + - name: WordPress Plugin Deploy + uses: 10up/action-wordpress-plugin-deploy@stable + env: + SVN_PASSWORD: ${{ secrets.SVN_PASSWORD }} + SVN_USERNAME: ${{ secrets.SVN_USERNAME }} + SLUG: jwt-authentication-for-wp-rest-api \ No newline at end of file diff --git a/.github/trunk.yml b/.github/trunk.yml new file mode 100644 index 0000000..f5c04ef --- /dev/null +++ b/.github/trunk.yml @@ -0,0 +1,16 @@ +name: Plugin asset/readme update +on: + push: + branches: + - trunk +jobs: + trunk: + name: Push to trunk + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@master + - name: WordPress.org plugin asset/readme update + uses: 10up/action-wordpress-plugin-asset-update@stable + env: + SVN_PASSWORD: ${{ secrets.SVN_PASSWORD }} + SVN_USERNAME: ${{ secrets.SVN_USERNAME }} \ No newline at end of file From 3bae1954b7a8406658c24da78b42c070154ec9c1 Mon Sep 17 00:00:00 2001 From: Tmeister Date: Tue, 20 Sep 2022 22:16:49 -0500 Subject: [PATCH 19/79] Update "Tested up to" --- readme.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/readme.txt b/readme.txt index 9c843b9..3d33363 100755 --- a/readme.txt +++ b/readme.txt @@ -4,7 +4,7 @@ Contributors: tmeister Donate link: https://www.paypal.me/wpchavez Tags: wp-json, jwt, json web authentication, wp-api Requires at least: 4.2 -Tested up to: 6.0 +Tested up to: 6.0.2 Requires PHP: 5.3.0 Stable tag: 1.2.6 License: GPLv2 or later From 367c05cee303becf784cc2de819419f7874201d5 Mon Sep 17 00:00:00 2001 From: Tmeister Date: Tue, 20 Sep 2022 22:19:36 -0500 Subject: [PATCH 20/79] Fix actions path --- .github/{ => workflows}/deploy.yml | 0 .github/{ => workflows}/trunk.yml | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename .github/{ => workflows}/deploy.yml (100%) rename .github/{ => workflows}/trunk.yml (100%) diff --git a/.github/deploy.yml b/.github/workflows/deploy.yml similarity index 100% rename from .github/deploy.yml rename to .github/workflows/deploy.yml diff --git a/.github/trunk.yml b/.github/workflows/trunk.yml similarity index 100% rename from .github/trunk.yml rename to .github/workflows/trunk.yml From fa504b30c3d98599422db42b039c3711ed4cf1d7 Mon Sep 17 00:00:00 2001 From: Tmeister Date: Tue, 20 Sep 2022 22:22:03 -0500 Subject: [PATCH 21/79] Add SLUG value to the truck workflow --- .github/workflows/trunk.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/trunk.yml b/.github/workflows/trunk.yml index f5c04ef..1de9fce 100644 --- a/.github/workflows/trunk.yml +++ b/.github/workflows/trunk.yml @@ -13,4 +13,5 @@ jobs: uses: 10up/action-wordpress-plugin-asset-update@stable env: SVN_PASSWORD: ${{ secrets.SVN_PASSWORD }} - SVN_USERNAME: ${{ secrets.SVN_USERNAME }} \ No newline at end of file + SVN_USERNAME: ${{ secrets.SVN_USERNAME }} + SLUG: jwt-authentication-for-wp-rest-api \ No newline at end of file From 20b8a155d284a31e602644e55d4c3a4a8c49eb2a Mon Sep 17 00:00:00 2001 From: Tmeister Date: Tue, 20 Sep 2022 22:36:46 -0500 Subject: [PATCH 22/79] Add .org assets in .wordpress-org --- .gitignore | 3 ++- .wordpress-org/banner-772x250.jpg | Bin 0 -> 18306 bytes .wordpress-org/banner.psd | Bin 0 -> 761258 bytes .wordpress-org/icon.svg | 19 +++++++++++++++++++ 4 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 .wordpress-org/banner-772x250.jpg create mode 100644 .wordpress-org/banner.psd create mode 100644 .wordpress-org/icon.svg diff --git a/.gitignore b/.gitignore index 600d2d3..6d0ee45 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ -.vscode \ No newline at end of file +.vscode +.DS_Store \ No newline at end of file diff --git a/.wordpress-org/banner-772x250.jpg b/.wordpress-org/banner-772x250.jpg new file mode 100644 index 0000000000000000000000000000000000000000..d71a68a19862603eceb834f087848ac54a6f7e32 GIT binary patch literal 18306 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�y=Q-qQW3#@+4je&mG51PWHpx>LDT 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%0Dr@ zDAlGNjzkeRe)$mdrnheDY+*sAI#9>zkU6SnSHYi~q_X>c(P92(z@wxXp)1{CJB!Z_ zO0)(Z2FH%kR<%3#DLp>5UylLi5PTi)HMRBY1}EqgLKezX$LM#(q5^D*YK8`V)rF(F zqw8rARtiU8A~6;#G=q_h&WAt$3%2?fB?UOIDsCq6JiLn-VQ1p5+#Nxcj`&z2HS4C$ z(LN5Ji+CdrCD16id~yo$z7_s%|LG6j?^dJlXErhi`i=n?)w4HW*B9hz*$gGaJ(eD* zzAgX4o&tXCqxue{>)RWYq0d|1c2#O1#@do-swQh~QCk_c(VMzi-aq68xksdK$lxCh zbK;i~D-%}BJvZWN#!vfj;N+tI%?jMn`hj0HaFePbDCfL zp5;)c*NVK(j5{jfF9_Mn!bsSRk^^&BD)ttFfoor%UILsh^mw#I(JlhGXuGQxe5}#_jv&npw2h-nu;$mS6@>3(;$jxj8YGIOZI{Ho6pmV)w_<;}q zT^f#mmj)GVubHxgdiUWhfSMDl76*GLQ8b`ejo34GrPZ5z>FNI)XMZ(&InB+bkR8`K z);yUp=R(y3t3N9Ca~+A8_>C}YZ*VsW*ddVm0Bh@x4xF8X=%XwxR zFw{+0$;_NFkF3l|z?vs+!x_w_!_jdSP6zfVe{6C6n^M*3%qO+zpCWGFjhBT9R)uF? z$S2|t{INw)j+r-UCeTPPVomPKyAuslSex@)y8bum0n%vI7%D(1f21}nHRHiyw5~#- z(WBSAna(2x&Ur~9w?D7{`d8)p@AZ1-(-K58IZs_J^I)btb=3Y^8XA^z2&9Uj&>BE`uVs|F8sMMp+OBSl&2-7s~ z-3X9z&bJRTMlecrzi3c3(h!yh_ix5RRdK*h{3+2k1j4EQbHti?* z)K5tt13qT|(SYPmw#<&`WN?SN&H8^-uiW{wr(k`Tos*wybJ>TU2{P`wSUjpxI+REM zq9<F6G`b7AGbOZG44Pf5~-!ug_eiRf2iHiRep1EKUM``48y z)mhl5DJJdT^ALae+dXWWLCH3c;UzKOPNQo}p)V6WOB|Xu=v#2L9WExVNAJnhB*RO0 z$KJ=d*j$w7n(gMpk0$^D&%wq{L!cqB1<%zs_rX7(>-2}G=K%n#zJ_8oF?3<94$t(? z{v(FWIO$?i;YN>g^)B|tU*_X~tLS)lDCvpVBchTRIC7{@e3%1a5m;DUif52)%=8IF z94T5Xd~U1A6M2GRSg^XvBSq!M`>iOr0zRSKlsiVOlvQIW;h)CA8t+d4K`M?(MJ4%@ zxBlccUUx^_$C&a5uc*z3AO6m3lL1@@W(Xy`;bKpGJ^71>?-I<&mOw>2C63YeFeUXj z{r5ywi+DIl)ULi8bCiyO!0KqjZ~q(BfBkVar!X^of9-RD_4G8J8*1oDc)N&pp=jWY z)vx~4DxyLJq7Jsa_AUS?d-f2fmG2??zjo6sofmpVC9kQ>n8em*GBbMZ$y|=@->2P7gpY!P ziMxg>mOzZapMa4s2^GVB@OJe;i`fK3(f<&E$rf5MSrt)KNrR7zMYx_U5^4)|@f`Qw zhNouED{w#@MO#1ob^iZb&9fFvTP88Tb}kP){53VEfs{`wsHkwks=(>Q?#tN;ZDieWA8TB^q{hO!G$ZYU~?LxHcLQs-VJ*z^%2 zNMYeyca2lSzY^V9i6R(j%VADrTfQC8pfo}%=F5!j|ND95f1~yP7W^M5f%C_M{|lZP B6&(No literal 0 HcmV?d00001 diff --git a/.wordpress-org/banner.psd b/.wordpress-org/banner.psd new file mode 100644 index 0000000000000000000000000000000000000000..4c12815a2e4c96cca583b0bce129d62945baa665 GIT binary patch literal 761258 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

Xo?HqJ(gI5*5MqaLzxdOheY+N)#ra7D?f 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�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 +( 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 R-I3LuFLmNeotWDm{ug0%Tx9?N literal 0 HcmV?d00001 diff --git a/.wordpress-org/icon.svg b/.wordpress-org/icon.svg new file mode 100644 index 0000000..ca13697 --- /dev/null +++ b/.wordpress-org/icon.svg @@ -0,0 +1,19 @@ + + + + icon + Created with Sketch. + + + + + + + + + + + + + + \ No newline at end of file From 16f3107cad7c46aa08161652be3d98c9e3b40352 Mon Sep 17 00:00:00 2001 From: Tmeister Date: Tue, 20 Sep 2022 22:41:17 -0500 Subject: [PATCH 23/79] Ignoring other files on the trunk action - We just want to update the assets or readme.txt --- .github/workflows/trunk.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/trunk.yml b/.github/workflows/trunk.yml index 1de9fce..4610026 100644 --- a/.github/workflows/trunk.yml +++ b/.github/workflows/trunk.yml @@ -14,4 +14,5 @@ jobs: env: SVN_PASSWORD: ${{ secrets.SVN_PASSWORD }} SVN_USERNAME: ${{ secrets.SVN_USERNAME }} - SLUG: jwt-authentication-for-wp-rest-api \ No newline at end of file + SLUG: jwt-authentication-for-wp-rest-api + IGNORE_OTHER_FILES: true \ No newline at end of file From 658d18019fddd2134e638fdd6496346deb2a856e Mon Sep 17 00:00:00 2001 From: Tmeister Date: Wed, 21 Sep 2022 09:59:38 -0500 Subject: [PATCH 24/79] Set the new stable version tag to 1.3.0 --- readme.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/readme.txt b/readme.txt index 3d33363..04ac231 100755 --- a/readme.txt +++ b/readme.txt @@ -6,7 +6,7 @@ Tags: wp-json, jwt, json web authentication, wp-api Requires at least: 4.2 Tested up to: 6.0.2 Requires PHP: 5.3.0 -Stable tag: 1.2.6 +Stable tag: 1.3.0 License: GPLv2 or later License URI: http://www.gnu.org/licenses/gpl-2.0.html From 3fbddd8ce4264fbac66a422eaffa0abf94f48f0a Mon Sep 17 00:00:00 2001 From: Tmeister Date: Wed, 21 Sep 2022 18:27:35 -0500 Subject: [PATCH 25/79] Add PHP Code Sniffer to set the WP Code Standards. --- composer.json | 28 +-- composer.lock | 189 +++++++++++++++++- includes/vendor/composer/autoload_psr4.php | 1 + includes/vendor/composer/autoload_static.php | 8 + includes/vendor/composer/installed.json | 197 ++++++++++++++++++- includes/vendor/composer/installed.php | 31 ++- includes/vendor/composer/platform_check.php | 4 +- 7 files changed, 439 insertions(+), 19 deletions(-) diff --git a/composer.json b/composer.json index 00c5ed0..c5c972a 100644 --- a/composer.json +++ b/composer.json @@ -5,24 +5,30 @@ "type": "wordpress-plugin", "license": "GPL-2.0+", "authors": [ - { - "name": "Enrique Chavez", - "homepage": "https://enriquechavez.co/" - } + { + "name": "Enrique Chavez", + "homepage": "https://enriquechavez.co/" + } ], "support": { - "issues": "https://github.com/Tmeister/wp-api-jwt-auth/issues", - "source": "https://github.com/Tmeister/wp-api-jwt-auth/" + "issues": "https://github.com/Tmeister/wp-api-jwt-auth/issues", + "source": "https://github.com/Tmeister/wp-api-jwt-auth/" }, "config": { - "vendor-dir": "includes/vendor", + "vendor-dir": "includes/vendor", "allow-plugins": { - "composer/installers": true + "composer/installers": true, + "dealerdirect/phpcodesniffer-composer-installer": true } }, "require": { - "php": ">=5.3", - "composer/installers": "~1.0", - "firebase/php-jwt": "^6.3" + "php": ">=7.4", + "composer/installers": "~1.0", + "firebase/php-jwt": "^6.3" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "*", + "squizlabs/php_codesniffer": "3.*", + "wp-coding-standards/wpcs": "*" } } diff --git a/composer.lock b/composer.lock index 80d0016..0cf50bf 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "2664848c237e209d59c46d6374795bfd", + "content-hash": "d38d1c9b0671fe28649b26de42452788", "packages": [ { "name": "composer/installers", @@ -220,14 +220,197 @@ "time": "2022-07-15T16:48:45+00:00" } ], - "packages-dev": [], + "packages-dev": [ + { + "name": "dealerdirect/phpcodesniffer-composer-installer", + "version": "v0.7.2", + "source": { + "type": "git", + "url": "https://github.com/Dealerdirect/phpcodesniffer-composer-installer.git", + "reference": "1c968e542d8843d7cd71de3c5c9c3ff3ad71a1db" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Dealerdirect/phpcodesniffer-composer-installer/zipball/1c968e542d8843d7cd71de3c5c9c3ff3ad71a1db", + "reference": "1c968e542d8843d7cd71de3c5c9c3ff3ad71a1db", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.0 || ^2.0", + "php": ">=5.3", + "squizlabs/php_codesniffer": "^2.0 || ^3.1.0 || ^4.0" + }, + "require-dev": { + "composer/composer": "*", + "php-parallel-lint/php-parallel-lint": "^1.3.1", + "phpcompatibility/php-compatibility": "^9.0" + }, + "type": "composer-plugin", + "extra": { + "class": "Dealerdirect\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\Plugin" + }, + "autoload": { + "psr-4": { + "Dealerdirect\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Franck Nijhof", + "email": "franck.nijhof@dealerdirect.com", + "homepage": "http://www.frenck.nl/", + "role": "Developer / IT Manager" + }, + { + "name": "Contributors", + "homepage": "https://github.com/Dealerdirect/phpcodesniffer-composer-installer/graphs/contributors" + } + ], + "description": "PHP_CodeSniffer Standards Composer Installer Plugin", + "homepage": "http://www.dealerdirect.com/", + "keywords": [ + "PHPCodeSniffer", + "PHP_CodeSniffer", + "code quality", + "codesniffer", + "composer", + "installer", + "phpcbf", + "phpcs", + "plugin", + "qa", + "quality", + "standard", + "standards", + "style guide", + "stylecheck", + "tests" + ], + "support": { + "issues": "https://github.com/dealerdirect/phpcodesniffer-composer-installer/issues", + "source": "https://github.com/dealerdirect/phpcodesniffer-composer-installer" + }, + "time": "2022-02-04T12:51:07+00:00" + }, + { + "name": "squizlabs/php_codesniffer", + "version": "3.7.1", + "source": { + "type": "git", + "url": "https://github.com/squizlabs/PHP_CodeSniffer.git", + "reference": "1359e176e9307e906dc3d890bcc9603ff6d90619" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/1359e176e9307e906dc3d890bcc9603ff6d90619", + "reference": "1359e176e9307e906dc3d890bcc9603ff6d90619", + "shasum": "" + }, + "require": { + "ext-simplexml": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": ">=5.4.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0" + }, + "bin": [ + "bin/phpcs", + "bin/phpcbf" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Greg Sherwood", + "role": "lead" + } + ], + "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.", + "homepage": "https://github.com/squizlabs/PHP_CodeSniffer", + "keywords": [ + "phpcs", + "standards" + ], + "support": { + "issues": "https://github.com/squizlabs/PHP_CodeSniffer/issues", + "source": "https://github.com/squizlabs/PHP_CodeSniffer", + "wiki": "https://github.com/squizlabs/PHP_CodeSniffer/wiki" + }, + "time": "2022-06-18T07:21:10+00:00" + }, + { + "name": "wp-coding-standards/wpcs", + "version": "2.3.0", + "source": { + "type": "git", + "url": "https://github.com/WordPress/WordPress-Coding-Standards.git", + "reference": "7da1894633f168fe244afc6de00d141f27517b62" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/WordPress/WordPress-Coding-Standards/zipball/7da1894633f168fe244afc6de00d141f27517b62", + "reference": "7da1894633f168fe244afc6de00d141f27517b62", + "shasum": "" + }, + "require": { + "php": ">=5.4", + "squizlabs/php_codesniffer": "^3.3.1" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.5 || ^0.6", + "phpcompatibility/php-compatibility": "^9.0", + "phpcsstandards/phpcsdevtools": "^1.0", + "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0" + }, + "suggest": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.6 || This Composer plugin will sort out the PHPCS 'installed_paths' automatically." + }, + "type": "phpcodesniffer-standard", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Contributors", + "homepage": "https://github.com/WordPress/WordPress-Coding-Standards/graphs/contributors" + } + ], + "description": "PHP_CodeSniffer rules (sniffs) to enforce WordPress coding conventions", + "keywords": [ + "phpcs", + "standards", + "wordpress" + ], + "support": { + "issues": "https://github.com/WordPress/WordPress-Coding-Standards/issues", + "source": "https://github.com/WordPress/WordPress-Coding-Standards", + "wiki": "https://github.com/WordPress/WordPress-Coding-Standards/wiki" + }, + "time": "2020-05-13T23:57:56+00:00" + } + ], "aliases": [], "minimum-stability": "stable", "stability-flags": [], "prefer-stable": false, "prefer-lowest": false, "platform": { - "php": ">=5.3" + "php": ">=7.4" }, "platform-dev": [], "plugin-api-version": "2.3.0" diff --git a/includes/vendor/composer/autoload_psr4.php b/includes/vendor/composer/autoload_psr4.php index f8ff6f8..ef56c4f 100644 --- a/includes/vendor/composer/autoload_psr4.php +++ b/includes/vendor/composer/autoload_psr4.php @@ -7,5 +7,6 @@ return array( 'Firebase\\JWT\\' => array($vendorDir . '/firebase/php-jwt/src'), + 'Dealerdirect\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\' => array($vendorDir . '/dealerdirect/phpcodesniffer-composer-installer/src'), 'Composer\\Installers\\' => array($vendorDir . '/composer/installers/src/Composer/Installers'), ); diff --git a/includes/vendor/composer/autoload_static.php b/includes/vendor/composer/autoload_static.php index 5d0ae45..bd17bdd 100644 --- a/includes/vendor/composer/autoload_static.php +++ b/includes/vendor/composer/autoload_static.php @@ -11,6 +11,10 @@ class ComposerStaticInit6ba6ee55693d165c056f65e51c5383a5 array ( 'Firebase\\JWT\\' => 13, ), + 'D' => + array ( + 'Dealerdirect\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\' => 55, + ), 'C' => array ( 'Composer\\Installers\\' => 20, @@ -22,6 +26,10 @@ class ComposerStaticInit6ba6ee55693d165c056f65e51c5383a5 array ( 0 => __DIR__ . '/..' . '/firebase/php-jwt/src', ), + 'Dealerdirect\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\' => + array ( + 0 => __DIR__ . '/..' . '/dealerdirect/phpcodesniffer-composer-installer/src', + ), 'Composer\\Installers\\' => array ( 0 => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers', diff --git a/includes/vendor/composer/installed.json b/includes/vendor/composer/installed.json index 7140d5a..7681705 100644 --- a/includes/vendor/composer/installed.json +++ b/includes/vendor/composer/installed.json @@ -154,6 +154,84 @@ ], "install-path": "./installers" }, + { + "name": "dealerdirect/phpcodesniffer-composer-installer", + "version": "v0.7.2", + "version_normalized": "0.7.2.0", + "source": { + "type": "git", + "url": "https://github.com/Dealerdirect/phpcodesniffer-composer-installer.git", + "reference": "1c968e542d8843d7cd71de3c5c9c3ff3ad71a1db" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Dealerdirect/phpcodesniffer-composer-installer/zipball/1c968e542d8843d7cd71de3c5c9c3ff3ad71a1db", + "reference": "1c968e542d8843d7cd71de3c5c9c3ff3ad71a1db", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.0 || ^2.0", + "php": ">=5.3", + "squizlabs/php_codesniffer": "^2.0 || ^3.1.0 || ^4.0" + }, + "require-dev": { + "composer/composer": "*", + "php-parallel-lint/php-parallel-lint": "^1.3.1", + "phpcompatibility/php-compatibility": "^9.0" + }, + "time": "2022-02-04T12:51:07+00:00", + "type": "composer-plugin", + "extra": { + "class": "Dealerdirect\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\Plugin" + }, + "installation-source": "dist", + "autoload": { + "psr-4": { + "Dealerdirect\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Franck Nijhof", + "email": "franck.nijhof@dealerdirect.com", + "homepage": "http://www.frenck.nl/", + "role": "Developer / IT Manager" + }, + { + "name": "Contributors", + "homepage": "https://github.com/Dealerdirect/phpcodesniffer-composer-installer/graphs/contributors" + } + ], + "description": "PHP_CodeSniffer Standards Composer Installer Plugin", + "homepage": "http://www.dealerdirect.com/", + "keywords": [ + "PHPCodeSniffer", + "PHP_CodeSniffer", + "code quality", + "codesniffer", + "composer", + "installer", + "phpcbf", + "phpcs", + "plugin", + "qa", + "quality", + "standard", + "standards", + "style guide", + "stylecheck", + "tests" + ], + "support": { + "issues": "https://github.com/dealerdirect/phpcodesniffer-composer-installer/issues", + "source": "https://github.com/dealerdirect/phpcodesniffer-composer-installer" + }, + "install-path": "../dealerdirect/phpcodesniffer-composer-installer" + }, { "name": "firebase/php-jwt", "version": "v6.3.0", @@ -218,8 +296,125 @@ "source": "https://github.com/firebase/php-jwt/tree/v6.3.0" }, "install-path": "../firebase/php-jwt" + }, + { + "name": "squizlabs/php_codesniffer", + "version": "3.7.1", + "version_normalized": "3.7.1.0", + "source": { + "type": "git", + "url": "https://github.com/squizlabs/PHP_CodeSniffer.git", + "reference": "1359e176e9307e906dc3d890bcc9603ff6d90619" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/1359e176e9307e906dc3d890bcc9603ff6d90619", + "reference": "1359e176e9307e906dc3d890bcc9603ff6d90619", + "shasum": "" + }, + "require": { + "ext-simplexml": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": ">=5.4.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0" + }, + "time": "2022-06-18T07:21:10+00:00", + "bin": [ + "bin/phpcs", + "bin/phpcbf" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "installation-source": "dist", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Greg Sherwood", + "role": "lead" + } + ], + "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.", + "homepage": "https://github.com/squizlabs/PHP_CodeSniffer", + "keywords": [ + "phpcs", + "standards" + ], + "support": { + "issues": "https://github.com/squizlabs/PHP_CodeSniffer/issues", + "source": "https://github.com/squizlabs/PHP_CodeSniffer", + "wiki": "https://github.com/squizlabs/PHP_CodeSniffer/wiki" + }, + "install-path": "../squizlabs/php_codesniffer" + }, + { + "name": "wp-coding-standards/wpcs", + "version": "2.3.0", + "version_normalized": "2.3.0.0", + "source": { + "type": "git", + "url": "https://github.com/WordPress/WordPress-Coding-Standards.git", + "reference": "7da1894633f168fe244afc6de00d141f27517b62" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/WordPress/WordPress-Coding-Standards/zipball/7da1894633f168fe244afc6de00d141f27517b62", + "reference": "7da1894633f168fe244afc6de00d141f27517b62", + "shasum": "" + }, + "require": { + "php": ">=5.4", + "squizlabs/php_codesniffer": "^3.3.1" + }, + "require-dev": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.5 || ^0.6", + "phpcompatibility/php-compatibility": "^9.0", + "phpcsstandards/phpcsdevtools": "^1.0", + "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0" + }, + "suggest": { + "dealerdirect/phpcodesniffer-composer-installer": "^0.6 || This Composer plugin will sort out the PHPCS 'installed_paths' automatically." + }, + "time": "2020-05-13T23:57:56+00:00", + "type": "phpcodesniffer-standard", + "installation-source": "dist", + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Contributors", + "homepage": "https://github.com/WordPress/WordPress-Coding-Standards/graphs/contributors" + } + ], + "description": "PHP_CodeSniffer rules (sniffs) to enforce WordPress coding conventions", + "keywords": [ + "phpcs", + "standards", + "wordpress" + ], + "support": { + "issues": "https://github.com/WordPress/WordPress-Coding-Standards/issues", + "source": "https://github.com/WordPress/WordPress-Coding-Standards", + "wiki": "https://github.com/WordPress/WordPress-Coding-Standards/wiki" + }, + "install-path": "../wp-coding-standards/wpcs" } ], "dev": true, - "dev-package-names": [] + "dev-package-names": [ + "dealerdirect/phpcodesniffer-composer-installer", + "squizlabs/php_codesniffer", + "wp-coding-standards/wpcs" + ] } diff --git a/includes/vendor/composer/installed.php b/includes/vendor/composer/installed.php index f87ae62..1558ee7 100644 --- a/includes/vendor/composer/installed.php +++ b/includes/vendor/composer/installed.php @@ -3,7 +3,7 @@ 'name' => 'tmeister/wp-api-jwt-auth', 'pretty_version' => 'dev-develop', 'version' => 'dev-develop', - 'reference' => 'a295379a9c93180daff228ce2050a376dc17acab', + 'reference' => '472b0df1f4674d348f1bcfb9aac68c63b11ce9f7', 'type' => 'wordpress-plugin', 'install_path' => __DIR__ . '/../../../', 'aliases' => array(), @@ -19,6 +19,15 @@ 'aliases' => array(), 'dev_requirement' => false, ), + 'dealerdirect/phpcodesniffer-composer-installer' => array( + 'pretty_version' => 'v0.7.2', + 'version' => '0.7.2.0', + 'reference' => '1c968e542d8843d7cd71de3c5c9c3ff3ad71a1db', + 'type' => 'composer-plugin', + 'install_path' => __DIR__ . '/../dealerdirect/phpcodesniffer-composer-installer', + 'aliases' => array(), + 'dev_requirement' => true, + ), 'firebase/php-jwt' => array( 'pretty_version' => 'v6.3.0', 'version' => '6.3.0.0', @@ -40,14 +49,32 @@ 0 => '*', ), ), + 'squizlabs/php_codesniffer' => array( + 'pretty_version' => '3.7.1', + 'version' => '3.7.1.0', + 'reference' => '1359e176e9307e906dc3d890bcc9603ff6d90619', + 'type' => 'library', + 'install_path' => __DIR__ . '/../squizlabs/php_codesniffer', + 'aliases' => array(), + 'dev_requirement' => true, + ), 'tmeister/wp-api-jwt-auth' => array( 'pretty_version' => 'dev-develop', 'version' => 'dev-develop', - 'reference' => 'a295379a9c93180daff228ce2050a376dc17acab', + 'reference' => '472b0df1f4674d348f1bcfb9aac68c63b11ce9f7', 'type' => 'wordpress-plugin', 'install_path' => __DIR__ . '/../../../', 'aliases' => array(), 'dev_requirement' => false, ), + 'wp-coding-standards/wpcs' => array( + 'pretty_version' => '2.3.0', + 'version' => '2.3.0.0', + 'reference' => '7da1894633f168fe244afc6de00d141f27517b62', + 'type' => 'phpcodesniffer-standard', + 'install_path' => __DIR__ . '/../wp-coding-standards/wpcs', + 'aliases' => array(), + 'dev_requirement' => true, + ), ), ); diff --git a/includes/vendor/composer/platform_check.php b/includes/vendor/composer/platform_check.php index 6d3407d..580fa96 100644 --- a/includes/vendor/composer/platform_check.php +++ b/includes/vendor/composer/platform_check.php @@ -4,8 +4,8 @@ $issues = array(); -if (!(PHP_VERSION_ID >= 70100)) { - $issues[] = 'Your Composer dependencies require a PHP version ">= 7.1.0". You are running ' . PHP_VERSION . '.'; +if (!(PHP_VERSION_ID >= 70400)) { + $issues[] = 'Your Composer dependencies require a PHP version ">= 7.4.0". You are running ' . PHP_VERSION . '.'; } if ($issues) { From b2c455f468e078644ca141515404b89606f97022 Mon Sep 17 00:00:00 2001 From: Tmeister Date: Wed, 21 Sep 2022 18:28:33 -0500 Subject: [PATCH 26/79] PHP 7.4 support, code refactoring and apply WP Code Standards --- includes/class-jwt-auth-i18n.php | 66 ++-- includes/class-jwt-auth-loader.php | 191 +++++---- includes/class-jwt-auth.php | 328 ++++++++------- public/class-jwt-auth-public.php | 613 ++++++++++++++--------------- 4 files changed, 590 insertions(+), 608 deletions(-) diff --git a/includes/class-jwt-auth-i18n.php b/includes/class-jwt-auth-i18n.php index 1553311..fe9ebc2 100755 --- a/includes/class-jwt-auth-i18n.php +++ b/includes/class-jwt-auth-i18n.php @@ -20,40 +20,38 @@ * * @author Enrique Chavez */ -class Jwt_Auth_i18n -{ - /** - * The domain specified for this plugin. - * - * @since 1.0.0 - * - * @var string The domain identifier for this plugin. - */ - private $domain; +class Jwt_Auth_i18n { + /** + * The domain specified for this plugin. + * + * @since 1.0.0 + * + * @var string The domain identifier for this plugin. + */ + private string $domain; - /** - * Load the plugin text domain for translation. - * - * @since 1.0.0 - */ - public function load_plugin_textdomain() - { - load_plugin_textdomain( - $this->domain, - false, - dirname(dirname(plugin_basename(__FILE__))).'/languages/' - ); - } + /** + * Load the plugin text domain for translation. + * + * @since 1.0.0 + */ + public function load_plugin_textdomain() { + load_plugin_textdomain( + $this->domain, + false, + dirname( plugin_basename( __FILE__ ), 2 ) . '/languages/' + ); + } - /** - * Set the domain equal to that of the specified domain. - * - * @since 1.0.0 - * - * @param string $domain The domain that represents the locale of this plugin. - */ - public function set_domain($domain) - { - $this->domain = $domain; - } + /** + * Set the domain equal to that of the specified domain. + * + * @param string $domain The domain that represents the locale of this plugin. + * + * @since 1.0.0 + * + */ + public function set_domain( string $domain ) { + $this->domain = $domain; + } } diff --git a/includes/class-jwt-auth-loader.php b/includes/class-jwt-auth-loader.php index 9884930..519cfc2 100755 --- a/includes/class-jwt-auth-loader.php +++ b/includes/class-jwt-auth-loader.php @@ -16,110 +16,105 @@ * * @author Enrique Chavez */ -class Jwt_Auth_Loader -{ - /** - * The array of actions registered with WordPress. - * - * @since 1.0.0 - * - * @var array The actions registered with WordPress to fire when the plugin loads. - */ - protected $actions; +class Jwt_Auth_Loader { + /** + * The array of actions registered with WordPress. + * + * @since 1.0.0 + * + * @var array The actions registered with WordPress to fire when the plugin loads. + */ + protected array $actions; - /** - * The array of filters registered with WordPress. - * - * @since 1.0.0 - * - * @var array The filters registered with WordPress to fire when the plugin loads. - */ - protected $filters; + /** + * The array of filters registered with WordPress. + * + * @since 1.0.0 + * + * @var array The filters registered with WordPress to fire when the plugin loads. + */ + protected array $filters; - /** - * Initialize the collections used to maintain the actions and filters. - * - * @since 1.0.0 - */ - public function __construct() - { - $this->actions = array(); - $this->filters = array(); - } + /** + * Initialize the collections used to maintain the actions and filters. + * + * @since 1.0.0 + */ + public function __construct() { + $this->actions = []; + $this->filters = []; + } - /** - * Add a new action to the collection to be registered with WordPress. - * - * @since 1.0.0 - * - * @param string $hook The name of the WordPress action that is being registered. - * @param object $component A reference to the instance of the object on which the action is defined. - * @param string $callback The name of the function definition on the $component. - * @param int Optional $priority The priority at which the function should be fired. - * @param int Optional $accepted_args The number of arguments that should be passed to the $callback. - */ - public function add_action($hook, $component, $callback, $priority = 10, $accepted_args = 1) - { - $this->actions = $this->add($this->actions, $hook, $component, $callback, $priority, $accepted_args); - } + /** + * Add a new action to the collection to be registered with WordPress. + * + * @param string $hook The name of the WordPress action that is being registered. + * @param object $component A reference to the instance of the object on which the action is defined. + * @param string $callback The name of the function definition on the $component. + * @param int $priority Optional $priority The priority at which the function should be fired. + * @param int $accepted_args Optional $accepted_args The number of arguments that should be passed to the $callback. + * + * @since 1.0.0 + * + */ + public function add_action( $hook, $component, $callback, $priority = 10, $accepted_args = 1 ) { + $this->actions = $this->add( $this->actions, $hook, $component, $callback, $priority, $accepted_args ); + } - /** - * Add a new filter to the collection to be registered with WordPress. - * - * @since 1.0.0 - * - * @param string $hook The name of the WordPress filter that is being registered. - * @param object $component A reference to the instance of the object on which the filter is defined. - * @param string $callback The name of the function definition on the $component. - * @param int Optional $priority The priority at which the function should be fired. - * @param int Optional $accepted_args The number of arguments that should be passed to the $callback. - */ - public function add_filter($hook, $component, $callback, $priority = 10, $accepted_args = 1) - { - $this->filters = $this->add($this->filters, $hook, $component, $callback, $priority, $accepted_args); - } + /** + * Add a new filter to the collection to be registered with WordPress. + * + * @param string $hook The name of the WordPress filter that is being registered. + * @param object $component A reference to the instance of the object on which the filter is defined. + * @param string $callback The name of the function definition on the $component. + * @param int $priority Optional $priority The priority at which the function should be fired. + * @param int $accepted_args Optional $accepted_args The number of arguments that should be passed to the $callback. + * + * @since 1.0.0 + * + */ + public function add_filter( $hook, $component, $callback, $priority = 10, $accepted_args = 1 ) { + $this->filters = $this->add( $this->filters, $hook, $component, $callback, $priority, $accepted_args ); + } - /** - * A utility function that is used to register the actions and hooks into a single - * collection. - * - * @since 1.0.0 - * - * @param array $hooks The collection of hooks that is being registered (that is, actions or filters). - * @param string $hook The name of the WordPress filter that is being registered. - * @param object $component A reference to the instance of the object on which the filter is defined. - * @param string $callback The name of the function definition on the $component. - * @param int Optional $priority The priority at which the function should be fired. - * @param int Optional $accepted_args The number of arguments that should be passed to the $callback. - * - * @return type The collection of actions and filters registered with WordPress. - */ - private function add($hooks, $hook, $component, $callback, $priority, $accepted_args) - { - $hooks[] = array( - 'hook' => $hook, - 'component' => $component, - 'callback' => $callback, - 'priority' => $priority, - 'accepted_args' => $accepted_args, - ); + /** + * A utility function that is used to register the actions and hooks into a single + * collection. + * + * @param array $hooks The collection of hooks that is being registered (that is, actions or filters). + * @param string $hook The name of the WordPress filter that is being registered. + * @param object $component A reference to the instance of the object on which the filter is defined. + * @param string $callback The name of the function definition on the $component. + * @param int $priority Optional $priority The priority at which the function should be fired. + * @param int $accepted_args Optional $accepted_args The number of arguments that should be passed to the $callback. + * + * @since 1.0.0 + * + */ + private function add( $hooks, $hook, $component, $callback, $priority, $accepted_args ): array { + $hooks[] = [ + 'hook' => $hook, + 'component' => $component, + 'callback' => $callback, + 'priority' => $priority, + 'accepted_args' => $accepted_args, + ]; - return $hooks; - } + return $hooks; + } - /** - * Register the filters and actions with WordPress. - * - * @since 1.0.0 - */ - public function run() - { - foreach ($this->filters as $hook) { - add_filter($hook['hook'], array($hook['component'], $hook['callback']), $hook['priority'], $hook['accepted_args']); - } + /** + * Register the filters and actions with WordPress. + * + * @since 1.0.0 + */ + public function run() { + foreach ( $this->filters as $hook ) { + add_filter( $hook['hook'], [ $hook['component'], $hook['callback'] ], $hook['priority'], $hook['accepted_args'] ); + } - foreach ($this->actions as $hook) { - add_action($hook['hook'], array($hook['component'], $hook['callback']), $hook['priority'], $hook['accepted_args']); - } - } + foreach ( $this->actions as $hook ) { + add_action( $hook['hook'], [ $hook['component'], $hook['callback'] ], $hook['priority'], $hook['accepted_args'] ); + } + } } diff --git a/includes/class-jwt-auth.php b/includes/class-jwt-auth.php index f2d8705..ea74e94 100755 --- a/includes/class-jwt-auth.php +++ b/includes/class-jwt-auth.php @@ -23,172 +23,164 @@ * * @author Enrique Chavez */ -class Jwt_Auth -{ - /** - * The loader that's responsible for maintaining and registering all hooks that power - * the plugin. - * - * @since 1.0.0 - * - * @var Jwt_Auth_Loader Maintains and registers all hooks for the plugin. - */ - protected $loader; - - /** - * The unique identifier of this plugin. - * - * @since 1.0.0 - * - * @var string The string used to uniquely identify this plugin. - */ - protected $plugin_name; - - /** - * The current version of the plugin. - * - * @since 1.0.0 - * - * @var string The current version of the plugin. - */ - protected $version; - - /** - * Define the core functionality of the plugin. - * - * Set the plugin name and the plugin version that can be used throughout the plugin. - * Load the dependencies, define the locale, and set the hooks for the admin area and - * the public-facing side of the site. - * - * @since 1.0.0 - */ - public function __construct() - { - $this->plugin_name = 'jwt-auth'; - $this->version = '1.1.0'; - - $this->load_dependencies(); - $this->set_locale(); - $this->define_public_hooks(); - } - - /** - * Load the required dependencies for this plugin. - * - * Include the following files that make up the plugin: - * - * - Jwt_Auth_Loader. Orchestrates the hooks of the plugin. - * - Jwt_Auth_i18n. Defines internationalization functionality. - * - Jwt_Auth_Admin. Defines all hooks for the admin area. - * - Jwt_Auth_Public. Defines all hooks for the public side of the site. - * - * Create an instance of the loader which will be used to register the hooks - * with WordPress. - * - * @since 1.0.0 - */ - private function load_dependencies() - { - - /** - * Load dependecies managed by composer. - */ - require_once plugin_dir_path(dirname(__FILE__)) . 'includes/vendor/autoload.php'; - - /** - * The class responsible for orchestrating the actions and filters of the - * core plugin. - */ - require_once plugin_dir_path(dirname(__FILE__)) . 'includes/class-jwt-auth-loader.php'; - - /** - * The class responsible for defining internationalization functionality - * of the plugin. - */ - require_once plugin_dir_path(dirname(__FILE__)) . 'includes/class-jwt-auth-i18n.php'; - - /** - * The class responsible for defining all actions that occur in the public-facing - * side of the site. - */ - require_once plugin_dir_path(dirname(__FILE__)) . 'public/class-jwt-auth-public.php'; - - $this->loader = new Jwt_Auth_Loader(); - } - - /** - * Define the locale for this plugin for internationalization. - * - * Uses the Jwt_Auth_i18n class in order to set the domain and to register the hook - * with WordPress. - * - * @since 1.0.0 - */ - private function set_locale() - { - $plugin_i18n = new Jwt_Auth_i18n(); - $plugin_i18n->set_domain($this->get_plugin_name()); - $this->loader->add_action('plugins_loaded', $plugin_i18n, 'load_plugin_textdomain'); - } - /** - * Register all of the hooks related to the public-facing functionality - * of the plugin. - * - * @since 1.0.0 - */ - private function define_public_hooks() - { - $plugin_public = new Jwt_Auth_Public($this->get_plugin_name(), $this->get_version()); - $this->loader->add_action('rest_api_init', $plugin_public, 'add_api_routes'); - $this->loader->add_filter('rest_api_init', $plugin_public, 'add_cors_support'); - $this->loader->add_filter('rest_pre_dispatch', $plugin_public, 'rest_pre_dispatch', 10, 2); - $this->loader->add_filter('determine_current_user', $plugin_public, 'determine_current_user', 10); - } - - /** - * Run the loader to execute all of the hooks with WordPress. - * - * @since 1.0.0 - */ - public function run() - { - $this->loader->run(); - } - - /** - * The name of the plugin used to uniquely identify it within the context of - * WordPress and to define internationalization functionality. - * - * @since 1.0.0 - * - * @return string The name of the plugin. - */ - public function get_plugin_name() - { - return $this->plugin_name; - } - - /** - * The reference to the class that orchestrates the hooks with the plugin. - * - * @since 1.0.0 - * - * @return Jwt_Auth_Loader Orchestrates the hooks of the plugin. - */ - public function get_loader() - { - return $this->loader; - } - - /** - * Retrieve the version number of the plugin. - * - * @since 1.0.0 - * - * @return string The version number of the plugin. - */ - public function get_version() - { - return $this->version; - } +class Jwt_Auth { + /** + * The loader that's responsible for maintaining and registering all hooks that power + * the plugin. + * + * @since 1.0.0 + * + * @var Jwt_Auth_Loader Maintains and registers all hooks for the plugin. + */ + protected Jwt_Auth_Loader $loader; + + /** + * The unique identifier of this plugin. + * + * @since 1.0.0 + * + * @var string The string used to uniquely identify this plugin. + */ + protected string $plugin_name; + + /** + * The current version of the plugin. + * + * @since 1.0.0 + * + * @var string The current version of the plugin. + */ + protected string $version; + + /** + * Define the core functionality of the plugin. + * + * Set the plugin name and the plugin version that can be used throughout the plugin. + * Load the dependencies, define the locale, and set the hooks for the admin area and + * the public-facing side of the site. + * + * @since 1.0.0 + */ + public function __construct() { + $this->plugin_name = 'jwt-auth'; + $this->version = '1.1.0'; + + $this->load_dependencies(); + $this->set_locale(); + $this->define_public_hooks(); + } + + /** + * Load the required dependencies for this plugin. + * + * Include the following files that make up the plugin: + * + * - Jwt_Auth_Loader. Orchestrates the hooks of the plugin. + * - Jwt_Auth_i18n. Defines internationalization functionality. + * - Jwt_Auth_Admin. Defines all hooks for the admin area. + * - Jwt_Auth_Public. Defines all hooks for the public side of the site. + * + * Create an instance of the loader which will be used to register the hooks + * with WordPress. + * + * @since 1.0.0 + */ + private function load_dependencies() { + + /** + * Load dependencies managed by composer. + */ + require_once plugin_dir_path( dirname( __FILE__ ) ) . 'includes/vendor/autoload.php'; + + /** + * The class responsible for orchestrating the actions and filters of the + * core plugin. + */ + require_once plugin_dir_path( dirname( __FILE__ ) ) . 'includes/class-jwt-auth-loader.php'; + + /** + * The class responsible for defining internationalization functionality + * of the plugin. + */ + require_once plugin_dir_path( dirname( __FILE__ ) ) . 'includes/class-jwt-auth-i18n.php'; + + /** + * The class responsible for defining all actions that occur in the public-facing + * side of the site. + */ + require_once plugin_dir_path( dirname( __FILE__ ) ) . 'public/class-jwt-auth-public.php'; + + $this->loader = new Jwt_Auth_Loader(); + } + + /** + * Define the locale for this plugin for internationalization. + * + * Uses the Jwt_Auth_i18n class in order to set the domain and to register the hook + * with WordPress. + * + * @since 1.0.0 + */ + private function set_locale() { + $plugin_i18n = new Jwt_Auth_i18n(); + $plugin_i18n->set_domain( $this->get_plugin_name() ); + $this->loader->add_action( 'plugins_loaded', $plugin_i18n, 'load_plugin_textdomain' ); + } + + /** + * Register all the hooks related to the public-facing functionality + * of the plugin. + * + * @since 1.0.0 + */ + private function define_public_hooks() { + $plugin_public = new Jwt_Auth_Public( $this->get_plugin_name(), $this->get_version() ); + $this->loader->add_action( 'rest_api_init', $plugin_public, 'add_api_routes' ); + $this->loader->add_filter( 'rest_api_init', $plugin_public, 'add_cors_support' ); + $this->loader->add_filter( 'rest_pre_dispatch', $plugin_public, 'rest_pre_dispatch', 10, 2 ); + $this->loader->add_filter( 'determine_current_user', $plugin_public, 'determine_current_user' ); + } + + /** + * Run the loader to execute all the hooks with WordPress. + * + * @since 1.0.0 + */ + public function run() { + $this->loader->run(); + } + + /** + * The name of the plugin used to uniquely identify it within the context of + * WordPress and to define internationalization functionality. + * + * @return string The name of the plugin. + * @since 1.0.0 + * + */ + public function get_plugin_name(): string { + return $this->plugin_name; + } + + /** + * The reference to the class that orchestrates the hooks with the plugin. + * + * @return Jwt_Auth_Loader Orchestrates the hooks of the plugin. + * @since 1.0.0 + * + */ + public function get_loader(): Jwt_Auth_Loader { + return $this->loader; + } + + /** + * Retrieve the version number of the plugin. + * + * @return string The version number of the plugin. + * @since 1.0.0 + * + */ + public function get_version(): string { + return $this->version; + } } diff --git a/public/class-jwt-auth-public.php b/public/class-jwt-auth-public.php index 38075cf..e6158ab 100755 --- a/public/class-jwt-auth-public.php +++ b/public/class-jwt-auth-public.php @@ -1,6 +1,7 @@ */ -class Jwt_Auth_Public -{ - /** - * The ID of this plugin. - * - * @since 1.0.0 - * - * @var string The ID of this plugin. - */ - private $plugin_name; - - /** - * The version of this plugin. - * - * @since 1.0.0 - * - * @var string The current version of this plugin. - */ - private $version; - - /** - * The namespace to add to the api calls. - * - * @var string The namespace to add to the api call - */ - private $namespace; - - /** - * Store errors to display if the JWT is wrong - * - * @var WP_Error - */ - private $jwt_error = null; - - /** - * Initialize the class and set its properties. - * - * @since 1.0.0 - * - * @param string $plugin_name The name of the plugin. - * @param string $version The version of this plugin. - */ - public function __construct($plugin_name, $version) - { - $this->plugin_name = $plugin_name; - $this->version = $version; - $this->namespace = $this->plugin_name . '/v' . intval($this->version); - } - - /** - * Add the endpoints to the API - */ - public function add_api_routes() - { - register_rest_route($this->namespace, 'token', array( - 'methods' => 'POST', - 'callback' => array($this, 'generate_token'), - 'permission_callback' => '__return_true', - )); - - register_rest_route($this->namespace, 'token/validate', array( - 'methods' => 'POST', - 'callback' => array($this, 'validate_token'), - 'permission_callback' => '__return_true', - )); - } - - /** - * Add CORs support to the request. - */ - public function add_cors_support() - { - $enable_cors = defined('JWT_AUTH_CORS_ENABLE') ? JWT_AUTH_CORS_ENABLE : false; - if ($enable_cors) { - $headers = apply_filters('jwt_auth_cors_allow_headers', 'Access-Control-Allow-Headers, Content-Type, Authorization'); - header(sprintf('Access-Control-Allow-Headers: %s', $headers)); - } - } +class Jwt_Auth_Public { + /** + * The ID of this plugin. + * + * @since 1.0.0 + * + * @var string The ID of this plugin. + */ + private string $plugin_name; + + /** + * The version of this plugin. + * + * @since 1.0.0 + * + * @var string The current version of this plugin. + */ + private string $version; + + /** + * The namespace to add to the api calls. + * + * @var string The namespace to add to the api call + */ + private string $namespace; + + /** + * Store errors to display if the JWT is wrong + * + * @var WP_Error|null + */ + private ?WP_Error $jwt_error = null; + + /** + * Initialize the class and set its properties. + * + * @param string $plugin_name The name of the plugin. + * @param string $version The version of this plugin. + * + * @since 1.0.0 + * + */ + public function __construct( string $plugin_name, string $version ) { + $this->plugin_name = $plugin_name; + $this->version = $version; + $this->namespace = $this->plugin_name . '/v' . intval( $this->version ); + } + + /** + * Add the endpoints to the API + */ + public function add_api_routes() { + register_rest_route( $this->namespace, 'token', [ + 'methods' => 'POST', + 'callback' => [ $this, 'generate_token' ], + 'permission_callback' => '__return_true', + ] ); + + register_rest_route( $this->namespace, 'token/validate', [ + 'methods' => 'POST', + 'callback' => [ $this, 'validate_token' ], + 'permission_callback' => '__return_true', + ] ); + } + + /** + * Add CORs support to the request. + */ + public function add_cors_support() { + $enable_cors = defined( 'JWT_AUTH_CORS_ENABLE' ) && JWT_AUTH_CORS_ENABLE; + if ( $enable_cors ) { + $headers = apply_filters( 'jwt_auth_cors_allow_headers', 'Access-Control-Allow-Headers, Content-Type, Authorization' ); + header( sprintf( 'Access-Control-Allow-Headers: %s', $headers ) ); + } + } /** * Get the user and password in the request body and generate a JWT @@ -105,229 +103,228 @@ public function add_cors_support() * * @return mixed|WP_Error|null [type] [description] */ - public function generate_token($request) - { - $secret_key = defined('JWT_AUTH_SECRET_KEY') ? JWT_AUTH_SECRET_KEY : false; - $username = $request->get_param('username'); - $password = $request->get_param('password'); - - /** First thing, check the secret key if not exist return a error*/ - if (!$secret_key) { - return new WP_Error( - 'jwt_auth_bad_config', - __('JWT is not configured properly, please contact the admin', 'wp-api-jwt-auth'), - array( - 'status' => 403, - ) - ); - } - /** Try to authenticate the user with the passed credentials*/ - $user = wp_authenticate($username, $password); - - /** If the authentication fails return an error*/ - if (is_wp_error($user)) { - $error_code = $user->get_error_code(); - return new WP_Error( - '[jwt_auth] ' . $error_code, - $user->get_error_message($error_code), - array( - 'status' => 403, - ) - ); - } - - /** Valid credentials, the user exists create the according Token */ - $issuedAt = time(); - $notBefore = apply_filters('jwt_auth_not_before', $issuedAt, $issuedAt); - $expire = apply_filters('jwt_auth_expire', $issuedAt + (DAY_IN_SECONDS * 7), $issuedAt); - - $token = array( - 'iss' => get_bloginfo('url'), - 'iat' => $issuedAt, - 'nbf' => $notBefore, - 'exp' => $expire, - 'data' => array( - 'user' => array( - 'id' => $user->data->ID, - ), - ), - ); - - /** Let the user modify the token data before the sign. */ - $token = JWT::encode( - apply_filters('jwt_auth_token_before_sign', $token, $user), - $secret_key, - apply_filters('jwt_auth_algorithm', 'HS256') - ); - - /** The token is signed, now create the object with no sensible user data to the client*/ - $data = array( - 'token' => $token, - 'user_email' => $user->data->user_email, - 'user_nicename' => $user->data->user_nicename, - 'user_display_name' => $user->data->display_name, - ); - - /** Let the user modify the data before send it back */ - return apply_filters('jwt_auth_token_before_dispatch', $data, $user); - } - - /** - * This is our Middleware to try to authenticate the user according to the - * token send. - * - * @param (int|bool) $user Logged User ID - * - * @return (int|bool) - */ - public function determine_current_user($user) - { - /** - * This hook only should run on the REST API requests to determine - * if the user in the Token (if any) is valid, for any other - * normal call ex. wp-admin/.* return the user. - * - * @since 1.2.3 - **/ - $rest_api_slug = rest_get_url_prefix(); - $valid_api_uri = strpos($_SERVER['REQUEST_URI'], $rest_api_slug); - // if already valid user or invalid url, don't attempt to validate token - if ( !$valid_api_uri || $user ) { - return $user; - } - - /* - * if the request URI is for validate the token don't do anything, - * this avoids double calls to the validate_token function. - */ - $validate_uri = strpos($_SERVER['REQUEST_URI'], 'token/validate'); - if ($validate_uri > 0) { - return $user; - } - - $token = $this->validate_token(false); - - if (is_wp_error($token)) { - if ($token->get_error_code() != 'jwt_auth_no_auth_header') { - /** If there is an error, store it to show it after see rest_pre_dispatch */ - $this->jwt_error = $token; - return $user; - } else { - return $user; - } - } - /** Everything is ok, return the user ID stored in the token*/ - return $token->data->user->id; - } - - /** - * Main validation function, this function try to get the Authentication - * headers and decoded. - * - * @param bool $output - * - * @return WP_Error | Object | Array - */ - public function validate_token($output = true) - { - /* - * Looking for the HTTP_AUTHORIZATION header, if not present just - * return the user. - */ - $auth = isset($_SERVER['HTTP_AUTHORIZATION']) ? $_SERVER['HTTP_AUTHORIZATION'] : false; - - /* Double check for different auth header string (server dependent) */ - if (!$auth) { - $auth = isset($_SERVER['REDIRECT_HTTP_AUTHORIZATION']) ? $_SERVER['REDIRECT_HTTP_AUTHORIZATION'] : false; - } - - if (!$auth) { - return new WP_Error( - 'jwt_auth_no_auth_header', - 'Authorization header not found.', - array( - 'status' => 403, - ) - ); - } - - /* - * The HTTP_AUTHORIZATION is present verify the format - * if the format is wrong return the user. - */ - list($token) = sscanf($auth, 'Bearer %s'); - if (!$token) { - return new WP_Error( - 'jwt_auth_bad_auth_header', - 'Authorization header malformed.', - array( - 'status' => 403, - ) - ); - } - - /** Get the Secret Key */ - $secret_key = defined('JWT_AUTH_SECRET_KEY') ? JWT_AUTH_SECRET_KEY : false; - if (!$secret_key) { - return new WP_Error( - 'jwt_auth_bad_config', - 'JWT is not configured properly, please contact the admin', - array( - 'status' => 403, - ) - ); - } - - /** Try to decode the token */ - try { - $token = JWT::decode( - $token, - new Key($secret_key, apply_filters('jwt_auth_algorithm', 'HS256')) - ); - /** The Token is decoded now validate the iss */ - if ($token->iss != get_bloginfo('url')) { - /** The iss do not match, return error */ - return new WP_Error( - 'jwt_auth_bad_iss', - 'The iss do not match with this server', - array( - 'status' => 403, - ) - ); - } - /** So far so good, validate the user id in the token */ - if (!isset($token->data->user->id)) { - /** No user id in the token, abort!! */ - return new WP_Error( - 'jwt_auth_bad_request', - 'User ID not found in the token', - array( - 'status' => 403, - ) - ); - } - /** Everything looks good return the decoded token if the $output is false */ - if (!$output) { - return $token; - } - /** If the output is true return an answer to the request to show it */ - return array( - 'code' => 'jwt_auth_valid_token', - 'data' => array( - 'status' => 200, - ), - ); - } catch (Exception $e) { - /** Something is wrong trying to decode the token, send back the error */ - return new WP_Error( - 'jwt_auth_invalid_token', - $e->getMessage(), - array( - 'status' => 403, - ) - ); - } - } + public function generate_token( $request ) { + $secret_key = defined( 'JWT_AUTH_SECRET_KEY' ) ? JWT_AUTH_SECRET_KEY : false; + $username = $request->get_param( 'username' ); + $password = $request->get_param( 'password' ); + + /** First thing, check the secret key if not exist return an error*/ + if ( ! $secret_key ) { + return new WP_Error( + 'jwt_auth_bad_config', + __( 'JWT is not configured properly, please contact the admin', 'wp-api-jwt-auth' ), + [ + 'status' => 403, + ] + ); + } + /** Try to authenticate the user with the passed credentials*/ + $user = wp_authenticate( $username, $password ); + + /** If the authentication fails return an error*/ + if ( is_wp_error( $user ) ) { + $error_code = $user->get_error_code(); + + return new WP_Error( + '[jwt_auth] ' . $error_code, + $user->get_error_message( $error_code ), + [ + 'status' => 403, + ] + ); + } + + /** Valid credentials, the user exists create the according Token */ + $issuedAt = time(); + $notBefore = apply_filters( 'jwt_auth_not_before', $issuedAt, $issuedAt ); + $expire = apply_filters( 'jwt_auth_expire', $issuedAt + ( DAY_IN_SECONDS * 7 ), $issuedAt ); + + $token = [ + 'iss' => get_bloginfo( 'url' ), + 'iat' => $issuedAt, + 'nbf' => $notBefore, + 'exp' => $expire, + 'data' => [ + 'user' => [ + 'id' => $user->data->ID, + ], + ], + ]; + + /** Let the user modify the token data before the sign. */ + $token = JWT::encode( + apply_filters( 'jwt_auth_token_before_sign', $token, $user ), + $secret_key, + apply_filters( 'jwt_auth_algorithm', 'HS256' ) + ); + + /** The token is signed, now create the object with no sensible user data to the client*/ + $data = [ + 'token' => $token, + 'user_email' => $user->data->user_email, + 'user_nicename' => $user->data->user_nicename, + 'user_display_name' => $user->data->display_name, + ]; + + /** Let the user modify the data before send it back */ + return apply_filters( 'jwt_auth_token_before_dispatch', $data, $user ); + } + + /** + * This is our Middleware to try to authenticate the user according to the + * token send. + * + * @param (int|bool) $user Logged User ID + * + * @return (int|bool) + */ + public function determine_current_user( $user ) { + /** + * This hook only should run on the REST API requests to determine + * if the user in the Token (if any) is valid, for any other + * normal call ex. wp-admin/.* return the user. + * + * @since 1.2.3 + **/ + $rest_api_slug = rest_get_url_prefix(); + $valid_api_uri = strpos( $_SERVER['REQUEST_URI'], $rest_api_slug ); + // if already valid user or invalid url, don't attempt to validate token + if ( ! $valid_api_uri || $user ) { + return $user; + } + + /* + * if the request URI is for validate the token don't do anything, + * this avoids double calls to the validate_token function. + */ + $validate_uri = strpos( $_SERVER['REQUEST_URI'], 'token/validate' ); + if ( $validate_uri > 0 ) { + return $user; + } + + $token = $this->validate_token( false ); + + if ( is_wp_error( $token ) ) { + if ( $token->get_error_code() != 'jwt_auth_no_auth_header' ) { + /** If there is an error, store it to show it after see rest_pre_dispatch */ + $this->jwt_error = $token; + } + + return $user; + } + + /** Everything is ok, return the user ID stored in the token*/ + return $token->data->user->id; + } + + /** + * Main validation function, this function try to get the Authentication + * headers and decoded. + * + * @param bool $output + * + * @return WP_Error | Object | Array + */ + public function validate_token( bool $output = true ) { + /* + * Looking for the HTTP_AUTHORIZATION header, if not present just + * return the user. + */ + $auth = $_SERVER['HTTP_AUTHORIZATION'] ?? false; + + /* Double check for different auth header string (server dependent) */ + if ( ! $auth ) { + $auth = $_SERVER['REDIRECT_HTTP_AUTHORIZATION'] ?? false; + } + + if ( ! $auth ) { + return new WP_Error( + 'jwt_auth_no_auth_header', + 'Authorization header not found.', + [ + 'status' => 403, + ] + ); + } + + /* + * The HTTP_AUTHORIZATION is present verify the format + * if the format is wrong return the user. + */ + [ $token ] = sscanf( $auth, 'Bearer %s' ); + if ( ! $token ) { + return new WP_Error( + 'jwt_auth_bad_auth_header', + 'Authorization header malformed.', + [ + 'status' => 403, + ] + ); + } + + /** Get the Secret Key */ + $secret_key = defined( 'JWT_AUTH_SECRET_KEY' ) ? JWT_AUTH_SECRET_KEY : false; + if ( ! $secret_key ) { + return new WP_Error( + 'jwt_auth_bad_config', + 'JWT is not configured properly, please contact the admin', + [ + 'status' => 403, + ] + ); + } + + /** Try to decode the token */ + try { + $token = JWT::decode( + $token, + new Key( $secret_key, apply_filters( 'jwt_auth_algorithm', 'HS256' ) ) + ); + /** The Token is decoded now validate the iss */ + if ( $token->iss != get_bloginfo( 'url' ) ) { + /** The iss do not match, return error */ + return new WP_Error( + 'jwt_auth_bad_iss', + 'The iss do not match with this server', + [ + 'status' => 403, + ] + ); + } + /** So far so good, validate the user id in the token */ + if ( ! isset( $token->data->user->id ) ) { + /** No user id in the token, abort!! */ + return new WP_Error( + 'jwt_auth_bad_request', + 'User ID not found in the token', + [ + 'status' => 403, + ] + ); + } + /** Everything looks good return the decoded token if the $output is false */ + if ( ! $output ) { + return $token; + } + + /** If the output is true return an answer to the request to show it */ + return [ + 'code' => 'jwt_auth_valid_token', + 'data' => [ + 'status' => 200, + ], + ]; + } catch ( Exception $e ) { + /** Something is wrong trying to decode the token, send back the error */ + return new WP_Error( + 'jwt_auth_invalid_token', + $e->getMessage(), + [ + 'status' => 403, + ] + ); + } + } /** * Filter to hook the rest_pre_dispatch, if the is an error in the request @@ -337,11 +334,11 @@ public function validate_token($output = true) * * @return mixed|WP_Error|null */ - public function rest_pre_dispatch($request) - { - if (is_wp_error($this->jwt_error)) { - return $this->jwt_error; - } - return $request; - } + public function rest_pre_dispatch( $request ) { + if ( is_wp_error( $this->jwt_error ) ) { + return $this->jwt_error; + } + + return $request; + } } From b4b1cf8ad2db229ff32234ec41ada0c2e62aa70d Mon Sep 17 00:00:00 2001 From: Tmeister Date: Wed, 21 Sep 2022 18:28:58 -0500 Subject: [PATCH 27/79] WP Code Standards --- jwt-auth.php | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/jwt-auth.php b/jwt-auth.php index b2fb1b0..977d3dc 100755 --- a/jwt-auth.php +++ b/jwt-auth.php @@ -25,15 +25,15 @@ */ // If this file is called directly, abort. -if (!defined('WPINC')) { - die; +if ( ! defined( 'WPINC' ) ) { + die; } /** * The core plugin class that is used to define internationalization, * admin-specific hooks, and public-facing site hooks. */ -require plugin_dir_path(__FILE__) . 'includes/class-jwt-auth.php'; +require plugin_dir_path( __FILE__ ) . 'includes/class-jwt-auth.php'; /** * Begins execution of the plugin. @@ -44,9 +44,9 @@ * * @since 1.0.0 */ -function run_jwt_auth() -{ - $plugin = new Jwt_Auth(); - $plugin->run(); +function run_jwt_auth() { + $plugin = new Jwt_Auth(); + $plugin->run(); } + run_jwt_auth(); From d96e2927588dcb6803a8b69c8d18f04de7059424 Mon Sep 17 00:00:00 2001 From: Tmeister Date: Wed, 21 Sep 2022 18:29:19 -0500 Subject: [PATCH 28/79] Ignore the DEV dependecies --- .gitignore | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 6d0ee45..0579dfc 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,6 @@ .vscode -.DS_Store \ No newline at end of file +.DS_Store +includes/vendor/bin +includes/vendor/dealerdirect +includes/vendor/squizlabs +includes/vendor/wp-coding-standards From bbd8a29a9e8d14e0e25d659c1630d8c639c1f4cc Mon Sep 17 00:00:00 2001 From: Tmeister Date: Sat, 24 Sep 2022 17:16:39 -0500 Subject: [PATCH 29/79] WIP Validate input data --- public/class-jwt-auth-public.php | 67 ++++++++++++++++++++++++++++---- 1 file changed, 59 insertions(+), 8 deletions(-) diff --git a/public/class-jwt-auth-public.php b/public/class-jwt-auth-public.php index e6158ab..31b942b 100755 --- a/public/class-jwt-auth-public.php +++ b/public/class-jwt-auth-public.php @@ -53,6 +53,15 @@ class Jwt_Auth_Public { */ private ?WP_Error $jwt_error = null; + /** + * List of supported algorithms to sign the token. + * + * @var array|string[] + * @since 1.3.1 + * @see https://www.rfc-editor.org/rfc/rfc7518#section-3 + */ + private array $supported_algorithms = [ 'HS256', 'HS384', 'HS512', 'RS256', 'RS384', 'RS512', 'ES256', 'ES384', 'ES512', 'PS256', 'PS384', 'PS512' ]; + /** * Initialize the class and set its properties. * @@ -99,11 +108,11 @@ public function add_cors_support() { /** * Get the user and password in the request body and generate a JWT * - * @param [type] $request [description] + * @param WP_REST_Request $request * - * @return mixed|WP_Error|null [type] [description] + * @return mixed|WP_Error|null */ - public function generate_token( $request ) { + public function generate_token( WP_REST_Request $request ) { $secret_key = defined( 'JWT_AUTH_SECRET_KEY' ) ? JWT_AUTH_SECRET_KEY : false; $username = $request->get_param( 'username' ); $password = $request->get_param( 'password' ); @@ -152,10 +161,22 @@ public function generate_token( $request ) { ]; /** Let the user modify the token data before the sign. */ + $algorithm = $this->get_algorithm(); + + if ( $algorithm === false ) { + return new WP_Error( + 'jwt_auth_unsupported_algorithm', + __( 'Algorithm not supported, see https://www.rfc-editor.org/rfc/rfc7518#section-3', 'wp-api-jwt-auth' ), + [ + 'status' => 403, + ] + ); + } + $token = JWT::encode( apply_filters( 'jwt_auth_token_before_sign', $token, $user ), $secret_key, - apply_filters( 'jwt_auth_algorithm', 'HS256' ) + $algorithm ); /** The token is signed, now create the object with no sensible user data to the client*/ @@ -187,7 +208,8 @@ public function determine_current_user( $user ) { * @since 1.2.3 **/ $rest_api_slug = rest_get_url_prefix(); - $valid_api_uri = strpos( $_SERVER['REQUEST_URI'], $rest_api_slug ); + $requested_url = sanitize_url(http://github.com/$_SERVER['REQUEST_URI']); + $valid_api_uri = strpos( $requested_url, $rest_api_slug ); // if already valid user or invalid url, don't attempt to validate token if ( ! $valid_api_uri || $user ) { return $user; @@ -197,7 +219,7 @@ public function determine_current_user( $user ) { * if the request URI is for validate the token don't do anything, * this avoids double calls to the validate_token function. */ - $validate_uri = strpos( $_SERVER['REQUEST_URI'], 'token/validate' ); + $validate_uri = strpos( $requested_url, 'token/validate' ); if ( $validate_uri > 0 ) { return $user; } @@ -276,12 +298,24 @@ public function validate_token( bool $output = true ) { /** Try to decode the token */ try { + $algorithm = $this->get_algorithm(); + if ( $algorithm === false ) { + return new WP_Error( + 'jwt_auth_unsupported_algorithm', + __( 'Algorithm not supported, see https://www.rfc-editor.org/rfc/rfc7518#section-3', 'wp-api-jwt-auth' ), + [ + 'status' => 403, + ] + ); + } + $token = JWT::decode( $token, - new Key( $secret_key, apply_filters( 'jwt_auth_algorithm', 'HS256' ) ) + new Key( $secret_key, $algorithm ) ); + /** The Token is decoded now validate the iss */ - if ( $token->iss != get_bloginfo( 'url' ) ) { + if ( $token->iss !== get_bloginfo( 'url' ) ) { /** The iss do not match, return error */ return new WP_Error( 'jwt_auth_bad_iss', @@ -291,6 +325,7 @@ public function validate_token( bool $output = true ) { ] ); } + /** So far so good, validate the user id in the token */ if ( ! isset( $token->data->user->id ) ) { /** No user id in the token, abort!! */ @@ -302,6 +337,7 @@ public function validate_token( bool $output = true ) { ] ); } + /** Everything looks good return the decoded token if the $output is false */ if ( ! $output ) { return $token; @@ -341,4 +377,19 @@ public function rest_pre_dispatch( $request ) { return $request; } + + /** + * Get the algorithm used to sign the token via the filter jwt_auth_algorithm. + * and validate that the algorithm is in the supported list. + * + * @return false|mixed|null + */ + private function get_algorithm() { + $algorithm = apply_filters( 'jwt_auth_algorithm', 'HS256' ); + if ( ! in_array( $algorithm, $this->supported_algorithms ) ) { + return false; + } + + return $algorithm; + } } From 36190193281bee2a1dae988295829e84dfbc7a92 Mon Sep 17 00:00:00 2001 From: Tmeister Date: Sat, 24 Sep 2022 20:18:15 -0500 Subject: [PATCH 30/79] Change the way we get and verify the authentication header --- includes/vendor/composer/installed.php | 4 +- public/class-jwt-auth-public.php | 92 +++++++++++++++----------- 2 files changed, 57 insertions(+), 39 deletions(-) diff --git a/includes/vendor/composer/installed.php b/includes/vendor/composer/installed.php index 1558ee7..d0d52e4 100644 --- a/includes/vendor/composer/installed.php +++ b/includes/vendor/composer/installed.php @@ -3,7 +3,7 @@ 'name' => 'tmeister/wp-api-jwt-auth', 'pretty_version' => 'dev-develop', 'version' => 'dev-develop', - 'reference' => '472b0df1f4674d348f1bcfb9aac68c63b11ce9f7', + 'reference' => 'bbd8a29a9e8d14e0e25d659c1630d8c639c1f4cc', 'type' => 'wordpress-plugin', 'install_path' => __DIR__ . '/../../../', 'aliases' => array(), @@ -61,7 +61,7 @@ 'tmeister/wp-api-jwt-auth' => array( 'pretty_version' => 'dev-develop', 'version' => 'dev-develop', - 'reference' => '472b0df1f4674d348f1bcfb9aac68c63b11ce9f7', + 'reference' => 'bbd8a29a9e8d14e0e25d659c1630d8c639c1f4cc', 'type' => 'wordpress-plugin', 'install_path' => __DIR__ . '/../../../', 'aliases' => array(), diff --git a/public/class-jwt-auth-public.php b/public/class-jwt-auth-public.php index 31b942b..ef6bde4 100755 --- a/public/class-jwt-auth-public.php +++ b/public/class-jwt-auth-public.php @@ -1,17 +1,9 @@ + * @since 1.0.0 */ class Jwt_Auth_Public { /** @@ -54,7 +47,7 @@ class Jwt_Auth_Public { private ?WP_Error $jwt_error = null; /** - * List of supported algorithms to sign the token. + * Supported algorithms to sign the token. * * @var array|string[] * @since 1.3.1 @@ -209,22 +202,37 @@ public function determine_current_user( $user ) { **/ $rest_api_slug = rest_get_url_prefix(); $requested_url = sanitize_url(http://github.com/$_SERVER['REQUEST_URI']); - $valid_api_uri = strpos( $requested_url, $rest_api_slug ); - // if already valid user or invalid url, don't attempt to validate token - if ( ! $valid_api_uri || $user ) { + // if we already have a valid user, or we have an invalid url, don't attempt to validate token + if ( ! defined( 'REST_REQUEST' ) || ! REST_REQUEST || strpos( $requested_url, $rest_api_slug ) === false || $user ) { return $user; } /* * if the request URI is for validate the token don't do anything, - * this avoids double calls to the validate_token function. + * this avoids double calls. */ $validate_uri = strpos( $requested_url, 'token/validate' ); if ( $validate_uri > 0 ) { return $user; } - $token = $this->validate_token( false ); + /** + * We still need to get the Authorization header and check for the token. + */ + $auth_header = $_SERVER['HTTP_AUTHORIZATION'] ? sanitize_text_field( $_SERVER['HTTP_AUTHORIZATION'] ) : false; + /* Double check for different auth header string (server dependent) */ + if ( ! $auth_header ) { + $auth_header = $_SERVER['REDIRECT_HTTP_AUTHORIZATION'] ? sanitize_text_field( $_SERVER['REDIRECT_HTTP_AUTHORIZATION'] ) : false; + } + + if ( ! $auth_header ) { + return $user; + } + + /* + * Check the token from the headers. + */ + $token = $this->validate_token( new WP_REST_Request(), $auth_header ); if ( is_wp_error( $token ) ) { if ( $token->get_error_code() != 'jwt_auth_no_auth_header' ) { @@ -240,26 +248,36 @@ public function determine_current_user( $user ) { } /** - * Main validation function, this function try to get the Authentication - * headers and decoded. + * Main validation function + * + * This function is used by the /token/validate endpoint and + * by our middleware. * - * @param bool $output + * The function take the token and try to decode it and validated it. + * + * @param WP_REST_Request $request + * @param bool $custom_token * * @return WP_Error | Object | Array */ - public function validate_token( bool $output = true ) { + public function validate_token( WP_REST_Request $request, bool $custom_token = false ) { /* - * Looking for the HTTP_AUTHORIZATION header, if not present just - * return the user. + * Looking for the Authorization header + * + * There is two ways to get the authorization token + * 1. via WP_REST_Request + * 2. via custom_token, we get this for all the other API requests + * + * The get_header( 'Authorization' ) checks for the header in the following order: + * 1. HTTP_AUTHORIZATION + * 2. REDIRECT_HTTP_AUTHORIZATION + * + * @see https://core.trac.wordpress.org/ticket/47077 */ - $auth = $_SERVER['HTTP_AUTHORIZATION'] ?? false; - /* Double check for different auth header string (server dependent) */ - if ( ! $auth ) { - $auth = $_SERVER['REDIRECT_HTTP_AUTHORIZATION'] ?? false; - } + $auth_header = $custom_token ?: $request->get_header( 'Authorization' ); - if ( ! $auth ) { + if ( ! $auth_header ) { return new WP_Error( 'jwt_auth_no_auth_header', 'Authorization header not found.', @@ -270,10 +288,13 @@ public function validate_token( bool $output = true ) { } /* - * The HTTP_AUTHORIZATION is present verify the format - * if the format is wrong return the user. + * Extract the authorization header + */ + [ $token ] = sscanf( $auth_header, 'Bearer %s' ); + + /** + * if the format is not valid return an error. */ - [ $token ] = sscanf( $auth, 'Bearer %s' ); if ( ! $token ) { return new WP_Error( 'jwt_auth_bad_auth_header', @@ -309,10 +330,7 @@ public function validate_token( bool $output = true ) { ); } - $token = JWT::decode( - $token, - new Key( $secret_key, $algorithm ) - ); + $token = JWT::decode( $token, new Key( $secret_key, $algorithm ) ); /** The Token is decoded now validate the iss */ if ( $token->iss !== get_bloginfo( 'url' ) ) { @@ -338,12 +356,12 @@ public function validate_token( bool $output = true ) { ); } - /** Everything looks good return the decoded token if the $output is false */ - if ( ! $output ) { + /** Everything looks good return the decoded token if we are using the custom_token */ + if ( $custom_token ) { return $token; } - /** If the output is true return an answer to the request to show it */ + /** This is for the /toke/validate endpoint*/ return [ 'code' => 'jwt_auth_valid_token', 'data' => [ @@ -351,7 +369,7 @@ public function validate_token( bool $output = true ) { ], ]; } catch ( Exception $e ) { - /** Something is wrong trying to decode the token, send back the error */ + /** Something were wrong trying to decode the token, send back the error */ return new WP_Error( 'jwt_auth_invalid_token', $e->getMessage(), From d5181b702e0481f26073987932f99dc3ef4a6c08 Mon Sep 17 00:00:00 2001 From: Tmeister Date: Sat, 24 Sep 2022 20:22:02 -0500 Subject: [PATCH 31/79] Fix type --- public/class-jwt-auth-public.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/public/class-jwt-auth-public.php b/public/class-jwt-auth-public.php index ef6bde4..21a3084 100755 --- a/public/class-jwt-auth-public.php +++ b/public/class-jwt-auth-public.php @@ -256,11 +256,11 @@ public function determine_current_user( $user ) { * The function take the token and try to decode it and validated it. * * @param WP_REST_Request $request - * @param bool $custom_token + * @param bool|string $custom_token * * @return WP_Error | Object | Array */ - public function validate_token( WP_REST_Request $request, bool $custom_token = false ) { + public function validate_token( WP_REST_Request $request, $custom_token = false ) { /* * Looking for the Authorization header * From e7e4e984b20e43ba53854a519c4756db620ad79e Mon Sep 17 00:00:00 2001 From: Tmeister Date: Fri, 7 Oct 2022 15:08:45 -0500 Subject: [PATCH 32/79] Optimized composer dependencies * test folder deleted for now --- .../vendor/composer/autoload_classmap.php | 109 ++++++++++ includes/vendor/composer/autoload_psr4.php | 1 - includes/vendor/composer/autoload_static.php | 117 +++++++++- includes/vendor/composer/installed.json | 199 +----------------- includes/vendor/composer/installed.php | 33 +-- tests/GeneralTest.php | 155 -------------- 6 files changed, 223 insertions(+), 391 deletions(-) delete mode 100644 tests/GeneralTest.php diff --git a/includes/vendor/composer/autoload_classmap.php b/includes/vendor/composer/autoload_classmap.php index 37e449b..074b09e 100644 --- a/includes/vendor/composer/autoload_classmap.php +++ b/includes/vendor/composer/autoload_classmap.php @@ -7,4 +7,113 @@ return array( 'Composer\\InstalledVersions' => $vendorDir . '/composer/InstalledVersions.php', + 'Composer\\Installers\\AglInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/AglInstaller.php', + 'Composer\\Installers\\AimeosInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/AimeosInstaller.php', + 'Composer\\Installers\\AnnotateCmsInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/AnnotateCmsInstaller.php', + 'Composer\\Installers\\AsgardInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/AsgardInstaller.php', + 'Composer\\Installers\\AttogramInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/AttogramInstaller.php', + 'Composer\\Installers\\BaseInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/BaseInstaller.php', + 'Composer\\Installers\\BitrixInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/BitrixInstaller.php', + 'Composer\\Installers\\BonefishInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/BonefishInstaller.php', + 'Composer\\Installers\\CakePHPInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/CakePHPInstaller.php', + 'Composer\\Installers\\ChefInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/ChefInstaller.php', + 'Composer\\Installers\\CiviCrmInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/CiviCrmInstaller.php', + 'Composer\\Installers\\ClanCatsFrameworkInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/ClanCatsFrameworkInstaller.php', + 'Composer\\Installers\\CockpitInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/CockpitInstaller.php', + 'Composer\\Installers\\CodeIgniterInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/CodeIgniterInstaller.php', + 'Composer\\Installers\\Concrete5Installer' => $vendorDir . '/composer/installers/src/Composer/Installers/Concrete5Installer.php', + 'Composer\\Installers\\CraftInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/CraftInstaller.php', + 'Composer\\Installers\\CroogoInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/CroogoInstaller.php', + 'Composer\\Installers\\DecibelInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/DecibelInstaller.php', + 'Composer\\Installers\\DframeInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/DframeInstaller.php', + 'Composer\\Installers\\DokuWikiInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/DokuWikiInstaller.php', + 'Composer\\Installers\\DolibarrInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/DolibarrInstaller.php', + 'Composer\\Installers\\DrupalInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/DrupalInstaller.php', + 'Composer\\Installers\\ElggInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/ElggInstaller.php', + 'Composer\\Installers\\EliasisInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/EliasisInstaller.php', + 'Composer\\Installers\\ExpressionEngineInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/ExpressionEngineInstaller.php', + 'Composer\\Installers\\EzPlatformInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/EzPlatformInstaller.php', + 'Composer\\Installers\\FuelInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/FuelInstaller.php', + 'Composer\\Installers\\FuelphpInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/FuelphpInstaller.php', + 'Composer\\Installers\\GravInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/GravInstaller.php', + 'Composer\\Installers\\HuradInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/HuradInstaller.php', + 'Composer\\Installers\\ImageCMSInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/ImageCMSInstaller.php', + 'Composer\\Installers\\Installer' => $vendorDir . '/composer/installers/src/Composer/Installers/Installer.php', + 'Composer\\Installers\\ItopInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/ItopInstaller.php', + 'Composer\\Installers\\JoomlaInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/JoomlaInstaller.php', + 'Composer\\Installers\\KanboardInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/KanboardInstaller.php', + 'Composer\\Installers\\KirbyInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/KirbyInstaller.php', + 'Composer\\Installers\\KnownInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/KnownInstaller.php', + 'Composer\\Installers\\KodiCMSInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/KodiCMSInstaller.php', + 'Composer\\Installers\\KohanaInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/KohanaInstaller.php', + 'Composer\\Installers\\LanManagementSystemInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/LanManagementSystemInstaller.php', + 'Composer\\Installers\\LaravelInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/LaravelInstaller.php', + 'Composer\\Installers\\LavaLiteInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/LavaLiteInstaller.php', + 'Composer\\Installers\\LithiumInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/LithiumInstaller.php', + 'Composer\\Installers\\MODULEWorkInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/MODULEWorkInstaller.php', + 'Composer\\Installers\\MODXEvoInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/MODXEvoInstaller.php', + 'Composer\\Installers\\MagentoInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/MagentoInstaller.php', + 'Composer\\Installers\\MajimaInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/MajimaInstaller.php', + 'Composer\\Installers\\MakoInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/MakoInstaller.php', + 'Composer\\Installers\\MantisBTInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/MantisBTInstaller.php', + 'Composer\\Installers\\MauticInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/MauticInstaller.php', + 'Composer\\Installers\\MayaInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/MayaInstaller.php', + 'Composer\\Installers\\MediaWikiInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/MediaWikiInstaller.php', + 'Composer\\Installers\\MiaoxingInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/MiaoxingInstaller.php', + 'Composer\\Installers\\MicroweberInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/MicroweberInstaller.php', + 'Composer\\Installers\\ModxInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/ModxInstaller.php', + 'Composer\\Installers\\MoodleInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/MoodleInstaller.php', + 'Composer\\Installers\\OctoberInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/OctoberInstaller.php', + 'Composer\\Installers\\OntoWikiInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/OntoWikiInstaller.php', + 'Composer\\Installers\\OsclassInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/OsclassInstaller.php', + 'Composer\\Installers\\OxidInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/OxidInstaller.php', + 'Composer\\Installers\\PPIInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/PPIInstaller.php', + 'Composer\\Installers\\PantheonInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/PantheonInstaller.php', + 'Composer\\Installers\\PhiftyInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/PhiftyInstaller.php', + 'Composer\\Installers\\PhpBBInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/PhpBBInstaller.php', + 'Composer\\Installers\\PimcoreInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/PimcoreInstaller.php', + 'Composer\\Installers\\PiwikInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/PiwikInstaller.php', + 'Composer\\Installers\\PlentymarketsInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/PlentymarketsInstaller.php', + 'Composer\\Installers\\Plugin' => $vendorDir . '/composer/installers/src/Composer/Installers/Plugin.php', + 'Composer\\Installers\\PortoInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/PortoInstaller.php', + 'Composer\\Installers\\PrestashopInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/PrestashopInstaller.php', + 'Composer\\Installers\\ProcessWireInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/ProcessWireInstaller.php', + 'Composer\\Installers\\PuppetInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/PuppetInstaller.php', + 'Composer\\Installers\\PxcmsInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/PxcmsInstaller.php', + 'Composer\\Installers\\RadPHPInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/RadPHPInstaller.php', + 'Composer\\Installers\\ReIndexInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/ReIndexInstaller.php', + 'Composer\\Installers\\Redaxo5Installer' => $vendorDir . '/composer/installers/src/Composer/Installers/Redaxo5Installer.php', + 'Composer\\Installers\\RedaxoInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/RedaxoInstaller.php', + 'Composer\\Installers\\RoundcubeInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/RoundcubeInstaller.php', + 'Composer\\Installers\\SMFInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/SMFInstaller.php', + 'Composer\\Installers\\ShopwareInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/ShopwareInstaller.php', + 'Composer\\Installers\\SilverStripeInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/SilverStripeInstaller.php', + 'Composer\\Installers\\SiteDirectInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/SiteDirectInstaller.php', + 'Composer\\Installers\\StarbugInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/StarbugInstaller.php', + 'Composer\\Installers\\SyDESInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/SyDESInstaller.php', + 'Composer\\Installers\\SyliusInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/SyliusInstaller.php', + 'Composer\\Installers\\Symfony1Installer' => $vendorDir . '/composer/installers/src/Composer/Installers/Symfony1Installer.php', + 'Composer\\Installers\\TYPO3CmsInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/TYPO3CmsInstaller.php', + 'Composer\\Installers\\TYPO3FlowInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/TYPO3FlowInstaller.php', + 'Composer\\Installers\\TaoInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/TaoInstaller.php', + 'Composer\\Installers\\TastyIgniterInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/TastyIgniterInstaller.php', + 'Composer\\Installers\\TheliaInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/TheliaInstaller.php', + 'Composer\\Installers\\TuskInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/TuskInstaller.php', + 'Composer\\Installers\\UserFrostingInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/UserFrostingInstaller.php', + 'Composer\\Installers\\VanillaInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/VanillaInstaller.php', + 'Composer\\Installers\\VgmcpInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/VgmcpInstaller.php', + 'Composer\\Installers\\WHMCSInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/WHMCSInstaller.php', + 'Composer\\Installers\\WinterInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/WinterInstaller.php', + 'Composer\\Installers\\WolfCMSInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/WolfCMSInstaller.php', + 'Composer\\Installers\\WordPressInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/WordPressInstaller.php', + 'Composer\\Installers\\YawikInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/YawikInstaller.php', + 'Composer\\Installers\\ZendInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/ZendInstaller.php', + 'Composer\\Installers\\ZikulaInstaller' => $vendorDir . '/composer/installers/src/Composer/Installers/ZikulaInstaller.php', + 'Firebase\\JWT\\BeforeValidException' => $vendorDir . '/firebase/php-jwt/src/BeforeValidException.php', + 'Firebase\\JWT\\CachedKeySet' => $vendorDir . '/firebase/php-jwt/src/CachedKeySet.php', + 'Firebase\\JWT\\ExpiredException' => $vendorDir . '/firebase/php-jwt/src/ExpiredException.php', + 'Firebase\\JWT\\JWK' => $vendorDir . '/firebase/php-jwt/src/JWK.php', + 'Firebase\\JWT\\JWT' => $vendorDir . '/firebase/php-jwt/src/JWT.php', + 'Firebase\\JWT\\Key' => $vendorDir . '/firebase/php-jwt/src/Key.php', + 'Firebase\\JWT\\SignatureInvalidException' => $vendorDir . '/firebase/php-jwt/src/SignatureInvalidException.php', ); diff --git a/includes/vendor/composer/autoload_psr4.php b/includes/vendor/composer/autoload_psr4.php index ef56c4f..f8ff6f8 100644 --- a/includes/vendor/composer/autoload_psr4.php +++ b/includes/vendor/composer/autoload_psr4.php @@ -7,6 +7,5 @@ return array( 'Firebase\\JWT\\' => array($vendorDir . '/firebase/php-jwt/src'), - 'Dealerdirect\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\' => array($vendorDir . '/dealerdirect/phpcodesniffer-composer-installer/src'), 'Composer\\Installers\\' => array($vendorDir . '/composer/installers/src/Composer/Installers'), ); diff --git a/includes/vendor/composer/autoload_static.php b/includes/vendor/composer/autoload_static.php index bd17bdd..fe63127 100644 --- a/includes/vendor/composer/autoload_static.php +++ b/includes/vendor/composer/autoload_static.php @@ -11,10 +11,6 @@ class ComposerStaticInit6ba6ee55693d165c056f65e51c5383a5 array ( 'Firebase\\JWT\\' => 13, ), - 'D' => - array ( - 'Dealerdirect\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\' => 55, - ), 'C' => array ( 'Composer\\Installers\\' => 20, @@ -26,10 +22,6 @@ class ComposerStaticInit6ba6ee55693d165c056f65e51c5383a5 array ( 0 => __DIR__ . '/..' . '/firebase/php-jwt/src', ), - 'Dealerdirect\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\' => - array ( - 0 => __DIR__ . '/..' . '/dealerdirect/phpcodesniffer-composer-installer/src', - ), 'Composer\\Installers\\' => array ( 0 => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers', @@ -38,6 +30,115 @@ class ComposerStaticInit6ba6ee55693d165c056f65e51c5383a5 public static $classMap = array ( 'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php', + 'Composer\\Installers\\AglInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/AglInstaller.php', + 'Composer\\Installers\\AimeosInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/AimeosInstaller.php', + 'Composer\\Installers\\AnnotateCmsInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/AnnotateCmsInstaller.php', + 'Composer\\Installers\\AsgardInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/AsgardInstaller.php', + 'Composer\\Installers\\AttogramInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/AttogramInstaller.php', + 'Composer\\Installers\\BaseInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/BaseInstaller.php', + 'Composer\\Installers\\BitrixInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/BitrixInstaller.php', + 'Composer\\Installers\\BonefishInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/BonefishInstaller.php', + 'Composer\\Installers\\CakePHPInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/CakePHPInstaller.php', + 'Composer\\Installers\\ChefInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/ChefInstaller.php', + 'Composer\\Installers\\CiviCrmInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/CiviCrmInstaller.php', + 'Composer\\Installers\\ClanCatsFrameworkInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/ClanCatsFrameworkInstaller.php', + 'Composer\\Installers\\CockpitInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/CockpitInstaller.php', + 'Composer\\Installers\\CodeIgniterInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/CodeIgniterInstaller.php', + 'Composer\\Installers\\Concrete5Installer' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/Concrete5Installer.php', + 'Composer\\Installers\\CraftInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/CraftInstaller.php', + 'Composer\\Installers\\CroogoInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/CroogoInstaller.php', + 'Composer\\Installers\\DecibelInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/DecibelInstaller.php', + 'Composer\\Installers\\DframeInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/DframeInstaller.php', + 'Composer\\Installers\\DokuWikiInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/DokuWikiInstaller.php', + 'Composer\\Installers\\DolibarrInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/DolibarrInstaller.php', + 'Composer\\Installers\\DrupalInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/DrupalInstaller.php', + 'Composer\\Installers\\ElggInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/ElggInstaller.php', + 'Composer\\Installers\\EliasisInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/EliasisInstaller.php', + 'Composer\\Installers\\ExpressionEngineInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/ExpressionEngineInstaller.php', + 'Composer\\Installers\\EzPlatformInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/EzPlatformInstaller.php', + 'Composer\\Installers\\FuelInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/FuelInstaller.php', + 'Composer\\Installers\\FuelphpInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/FuelphpInstaller.php', + 'Composer\\Installers\\GravInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/GravInstaller.php', + 'Composer\\Installers\\HuradInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/HuradInstaller.php', + 'Composer\\Installers\\ImageCMSInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/ImageCMSInstaller.php', + 'Composer\\Installers\\Installer' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/Installer.php', + 'Composer\\Installers\\ItopInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/ItopInstaller.php', + 'Composer\\Installers\\JoomlaInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/JoomlaInstaller.php', + 'Composer\\Installers\\KanboardInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/KanboardInstaller.php', + 'Composer\\Installers\\KirbyInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/KirbyInstaller.php', + 'Composer\\Installers\\KnownInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/KnownInstaller.php', + 'Composer\\Installers\\KodiCMSInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/KodiCMSInstaller.php', + 'Composer\\Installers\\KohanaInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/KohanaInstaller.php', + 'Composer\\Installers\\LanManagementSystemInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/LanManagementSystemInstaller.php', + 'Composer\\Installers\\LaravelInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/LaravelInstaller.php', + 'Composer\\Installers\\LavaLiteInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/LavaLiteInstaller.php', + 'Composer\\Installers\\LithiumInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/LithiumInstaller.php', + 'Composer\\Installers\\MODULEWorkInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/MODULEWorkInstaller.php', + 'Composer\\Installers\\MODXEvoInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/MODXEvoInstaller.php', + 'Composer\\Installers\\MagentoInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/MagentoInstaller.php', + 'Composer\\Installers\\MajimaInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/MajimaInstaller.php', + 'Composer\\Installers\\MakoInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/MakoInstaller.php', + 'Composer\\Installers\\MantisBTInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/MantisBTInstaller.php', + 'Composer\\Installers\\MauticInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/MauticInstaller.php', + 'Composer\\Installers\\MayaInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/MayaInstaller.php', + 'Composer\\Installers\\MediaWikiInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/MediaWikiInstaller.php', + 'Composer\\Installers\\MiaoxingInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/MiaoxingInstaller.php', + 'Composer\\Installers\\MicroweberInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/MicroweberInstaller.php', + 'Composer\\Installers\\ModxInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/ModxInstaller.php', + 'Composer\\Installers\\MoodleInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/MoodleInstaller.php', + 'Composer\\Installers\\OctoberInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/OctoberInstaller.php', + 'Composer\\Installers\\OntoWikiInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/OntoWikiInstaller.php', + 'Composer\\Installers\\OsclassInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/OsclassInstaller.php', + 'Composer\\Installers\\OxidInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/OxidInstaller.php', + 'Composer\\Installers\\PPIInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/PPIInstaller.php', + 'Composer\\Installers\\PantheonInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/PantheonInstaller.php', + 'Composer\\Installers\\PhiftyInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/PhiftyInstaller.php', + 'Composer\\Installers\\PhpBBInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/PhpBBInstaller.php', + 'Composer\\Installers\\PimcoreInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/PimcoreInstaller.php', + 'Composer\\Installers\\PiwikInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/PiwikInstaller.php', + 'Composer\\Installers\\PlentymarketsInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/PlentymarketsInstaller.php', + 'Composer\\Installers\\Plugin' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/Plugin.php', + 'Composer\\Installers\\PortoInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/PortoInstaller.php', + 'Composer\\Installers\\PrestashopInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/PrestashopInstaller.php', + 'Composer\\Installers\\ProcessWireInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/ProcessWireInstaller.php', + 'Composer\\Installers\\PuppetInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/PuppetInstaller.php', + 'Composer\\Installers\\PxcmsInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/PxcmsInstaller.php', + 'Composer\\Installers\\RadPHPInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/RadPHPInstaller.php', + 'Composer\\Installers\\ReIndexInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/ReIndexInstaller.php', + 'Composer\\Installers\\Redaxo5Installer' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/Redaxo5Installer.php', + 'Composer\\Installers\\RedaxoInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/RedaxoInstaller.php', + 'Composer\\Installers\\RoundcubeInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/RoundcubeInstaller.php', + 'Composer\\Installers\\SMFInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/SMFInstaller.php', + 'Composer\\Installers\\ShopwareInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/ShopwareInstaller.php', + 'Composer\\Installers\\SilverStripeInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/SilverStripeInstaller.php', + 'Composer\\Installers\\SiteDirectInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/SiteDirectInstaller.php', + 'Composer\\Installers\\StarbugInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/StarbugInstaller.php', + 'Composer\\Installers\\SyDESInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/SyDESInstaller.php', + 'Composer\\Installers\\SyliusInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/SyliusInstaller.php', + 'Composer\\Installers\\Symfony1Installer' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/Symfony1Installer.php', + 'Composer\\Installers\\TYPO3CmsInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/TYPO3CmsInstaller.php', + 'Composer\\Installers\\TYPO3FlowInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/TYPO3FlowInstaller.php', + 'Composer\\Installers\\TaoInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/TaoInstaller.php', + 'Composer\\Installers\\TastyIgniterInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/TastyIgniterInstaller.php', + 'Composer\\Installers\\TheliaInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/TheliaInstaller.php', + 'Composer\\Installers\\TuskInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/TuskInstaller.php', + 'Composer\\Installers\\UserFrostingInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/UserFrostingInstaller.php', + 'Composer\\Installers\\VanillaInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/VanillaInstaller.php', + 'Composer\\Installers\\VgmcpInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/VgmcpInstaller.php', + 'Composer\\Installers\\WHMCSInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/WHMCSInstaller.php', + 'Composer\\Installers\\WinterInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/WinterInstaller.php', + 'Composer\\Installers\\WolfCMSInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/WolfCMSInstaller.php', + 'Composer\\Installers\\WordPressInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/WordPressInstaller.php', + 'Composer\\Installers\\YawikInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/YawikInstaller.php', + 'Composer\\Installers\\ZendInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/ZendInstaller.php', + 'Composer\\Installers\\ZikulaInstaller' => __DIR__ . '/..' . '/composer/installers/src/Composer/Installers/ZikulaInstaller.php', + 'Firebase\\JWT\\BeforeValidException' => __DIR__ . '/..' . '/firebase/php-jwt/src/BeforeValidException.php', + 'Firebase\\JWT\\CachedKeySet' => __DIR__ . '/..' . '/firebase/php-jwt/src/CachedKeySet.php', + 'Firebase\\JWT\\ExpiredException' => __DIR__ . '/..' . '/firebase/php-jwt/src/ExpiredException.php', + 'Firebase\\JWT\\JWK' => __DIR__ . '/..' . '/firebase/php-jwt/src/JWK.php', + 'Firebase\\JWT\\JWT' => __DIR__ . '/..' . '/firebase/php-jwt/src/JWT.php', + 'Firebase\\JWT\\Key' => __DIR__ . '/..' . '/firebase/php-jwt/src/Key.php', + 'Firebase\\JWT\\SignatureInvalidException' => __DIR__ . '/..' . '/firebase/php-jwt/src/SignatureInvalidException.php', ); public static function getInitializer(ClassLoader $loader) diff --git a/includes/vendor/composer/installed.json b/includes/vendor/composer/installed.json index 7681705..0e11dde 100644 --- a/includes/vendor/composer/installed.json +++ b/includes/vendor/composer/installed.json @@ -154,84 +154,6 @@ ], "install-path": "./installers" }, - { - "name": "dealerdirect/phpcodesniffer-composer-installer", - "version": "v0.7.2", - "version_normalized": "0.7.2.0", - "source": { - "type": "git", - "url": "https://github.com/Dealerdirect/phpcodesniffer-composer-installer.git", - "reference": "1c968e542d8843d7cd71de3c5c9c3ff3ad71a1db" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Dealerdirect/phpcodesniffer-composer-installer/zipball/1c968e542d8843d7cd71de3c5c9c3ff3ad71a1db", - "reference": "1c968e542d8843d7cd71de3c5c9c3ff3ad71a1db", - "shasum": "" - }, - "require": { - "composer-plugin-api": "^1.0 || ^2.0", - "php": ">=5.3", - "squizlabs/php_codesniffer": "^2.0 || ^3.1.0 || ^4.0" - }, - "require-dev": { - "composer/composer": "*", - "php-parallel-lint/php-parallel-lint": "^1.3.1", - "phpcompatibility/php-compatibility": "^9.0" - }, - "time": "2022-02-04T12:51:07+00:00", - "type": "composer-plugin", - "extra": { - "class": "Dealerdirect\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\Plugin" - }, - "installation-source": "dist", - "autoload": { - "psr-4": { - "Dealerdirect\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Franck Nijhof", - "email": "franck.nijhof@dealerdirect.com", - "homepage": "http://www.frenck.nl/", - "role": "Developer / IT Manager" - }, - { - "name": "Contributors", - "homepage": "https://github.com/Dealerdirect/phpcodesniffer-composer-installer/graphs/contributors" - } - ], - "description": "PHP_CodeSniffer Standards Composer Installer Plugin", - "homepage": "http://www.dealerdirect.com/", - "keywords": [ - "PHPCodeSniffer", - "PHP_CodeSniffer", - "code quality", - "codesniffer", - "composer", - "installer", - "phpcbf", - "phpcs", - "plugin", - "qa", - "quality", - "standard", - "standards", - "style guide", - "stylecheck", - "tests" - ], - "support": { - "issues": "https://github.com/dealerdirect/phpcodesniffer-composer-installer/issues", - "source": "https://github.com/dealerdirect/phpcodesniffer-composer-installer" - }, - "install-path": "../dealerdirect/phpcodesniffer-composer-installer" - }, { "name": "firebase/php-jwt", "version": "v6.3.0", @@ -296,125 +218,8 @@ "source": "https://github.com/firebase/php-jwt/tree/v6.3.0" }, "install-path": "../firebase/php-jwt" - }, - { - "name": "squizlabs/php_codesniffer", - "version": "3.7.1", - "version_normalized": "3.7.1.0", - "source": { - "type": "git", - "url": "https://github.com/squizlabs/PHP_CodeSniffer.git", - "reference": "1359e176e9307e906dc3d890bcc9603ff6d90619" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/1359e176e9307e906dc3d890bcc9603ff6d90619", - "reference": "1359e176e9307e906dc3d890bcc9603ff6d90619", - "shasum": "" - }, - "require": { - "ext-simplexml": "*", - "ext-tokenizer": "*", - "ext-xmlwriter": "*", - "php": ">=5.4.0" - }, - "require-dev": { - "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0" - }, - "time": "2022-06-18T07:21:10+00:00", - "bin": [ - "bin/phpcs", - "bin/phpcbf" - ], - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "3.x-dev" - } - }, - "installation-source": "dist", - "notification-url": "https://packagist.org/downloads/", - "license": [ - "BSD-3-Clause" - ], - "authors": [ - { - "name": "Greg Sherwood", - "role": "lead" - } - ], - "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.", - "homepage": "https://github.com/squizlabs/PHP_CodeSniffer", - "keywords": [ - "phpcs", - "standards" - ], - "support": { - "issues": "https://github.com/squizlabs/PHP_CodeSniffer/issues", - "source": "https://github.com/squizlabs/PHP_CodeSniffer", - "wiki": "https://github.com/squizlabs/PHP_CodeSniffer/wiki" - }, - "install-path": "../squizlabs/php_codesniffer" - }, - { - "name": "wp-coding-standards/wpcs", - "version": "2.3.0", - "version_normalized": "2.3.0.0", - "source": { - "type": "git", - "url": "https://github.com/WordPress/WordPress-Coding-Standards.git", - "reference": "7da1894633f168fe244afc6de00d141f27517b62" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/WordPress/WordPress-Coding-Standards/zipball/7da1894633f168fe244afc6de00d141f27517b62", - "reference": "7da1894633f168fe244afc6de00d141f27517b62", - "shasum": "" - }, - "require": { - "php": ">=5.4", - "squizlabs/php_codesniffer": "^3.3.1" - }, - "require-dev": { - "dealerdirect/phpcodesniffer-composer-installer": "^0.5 || ^0.6", - "phpcompatibility/php-compatibility": "^9.0", - "phpcsstandards/phpcsdevtools": "^1.0", - "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0" - }, - "suggest": { - "dealerdirect/phpcodesniffer-composer-installer": "^0.6 || This Composer plugin will sort out the PHPCS 'installed_paths' automatically." - }, - "time": "2020-05-13T23:57:56+00:00", - "type": "phpcodesniffer-standard", - "installation-source": "dist", - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Contributors", - "homepage": "https://github.com/WordPress/WordPress-Coding-Standards/graphs/contributors" - } - ], - "description": "PHP_CodeSniffer rules (sniffs) to enforce WordPress coding conventions", - "keywords": [ - "phpcs", - "standards", - "wordpress" - ], - "support": { - "issues": "https://github.com/WordPress/WordPress-Coding-Standards/issues", - "source": "https://github.com/WordPress/WordPress-Coding-Standards", - "wiki": "https://github.com/WordPress/WordPress-Coding-Standards/wiki" - }, - "install-path": "../wp-coding-standards/wpcs" } ], - "dev": true, - "dev-package-names": [ - "dealerdirect/phpcodesniffer-composer-installer", - "squizlabs/php_codesniffer", - "wp-coding-standards/wpcs" - ] + "dev": false, + "dev-package-names": [] } diff --git a/includes/vendor/composer/installed.php b/includes/vendor/composer/installed.php index d0d52e4..6bcf874 100644 --- a/includes/vendor/composer/installed.php +++ b/includes/vendor/composer/installed.php @@ -3,11 +3,11 @@ 'name' => 'tmeister/wp-api-jwt-auth', 'pretty_version' => 'dev-develop', 'version' => 'dev-develop', - 'reference' => 'bbd8a29a9e8d14e0e25d659c1630d8c639c1f4cc', + 'reference' => 'd5181b702e0481f26073987932f99dc3ef4a6c08', 'type' => 'wordpress-plugin', 'install_path' => __DIR__ . '/../../../', 'aliases' => array(), - 'dev' => true, + 'dev' => false, ), 'versions' => array( 'composer/installers' => array( @@ -19,15 +19,6 @@ 'aliases' => array(), 'dev_requirement' => false, ), - 'dealerdirect/phpcodesniffer-composer-installer' => array( - 'pretty_version' => 'v0.7.2', - 'version' => '0.7.2.0', - 'reference' => '1c968e542d8843d7cd71de3c5c9c3ff3ad71a1db', - 'type' => 'composer-plugin', - 'install_path' => __DIR__ . '/../dealerdirect/phpcodesniffer-composer-installer', - 'aliases' => array(), - 'dev_requirement' => true, - ), 'firebase/php-jwt' => array( 'pretty_version' => 'v6.3.0', 'version' => '6.3.0.0', @@ -49,32 +40,14 @@ 0 => '*', ), ), - 'squizlabs/php_codesniffer' => array( - 'pretty_version' => '3.7.1', - 'version' => '3.7.1.0', - 'reference' => '1359e176e9307e906dc3d890bcc9603ff6d90619', - 'type' => 'library', - 'install_path' => __DIR__ . '/../squizlabs/php_codesniffer', - 'aliases' => array(), - 'dev_requirement' => true, - ), 'tmeister/wp-api-jwt-auth' => array( 'pretty_version' => 'dev-develop', 'version' => 'dev-develop', - 'reference' => 'bbd8a29a9e8d14e0e25d659c1630d8c639c1f4cc', + 'reference' => 'd5181b702e0481f26073987932f99dc3ef4a6c08', 'type' => 'wordpress-plugin', 'install_path' => __DIR__ . '/../../../', 'aliases' => array(), 'dev_requirement' => false, ), - 'wp-coding-standards/wpcs' => array( - 'pretty_version' => '2.3.0', - 'version' => '2.3.0.0', - 'reference' => '7da1894633f168fe244afc6de00d141f27517b62', - 'type' => 'phpcodesniffer-standard', - 'install_path' => __DIR__ . '/../wp-coding-standards/wpcs', - 'aliases' => array(), - 'dev_requirement' => true, - ), ), ); diff --git a/tests/GeneralTest.php b/tests/GeneralTest.php deleted file mode 100644 index 2f0cb27..0000000 --- a/tests/GeneralTest.php +++ /dev/null @@ -1,155 +0,0 @@ -client = new GuzzleHttp\Client([ - 'base_uri' => $this->baseUrl - ]); - } - - /** - * Load the site and look for a Status Code Equal to 200 - */ - public function test_is_site_up() - { - $response = $this->client->get('/'); - $this->assertEquals(200, $response->getStatusCode()); - } - - /** - * Look for the wp-json endpoint and look for basic data. - */ - public function test_is_wp_api_installed() - { - $response = $this->client->get('wp-json/'); - $this->assertEquals(200, $response->getStatusCode()); - $data = json_decode($response->getBody(), true); - $this->assertArrayHasKey('namespaces', $data); - $this->assertArrayHasKey('authentication', $data); - $this->assertArrayHasKey('routes', $data); - } - - /** - * Check for the jwt-auth/v1 endpoint and - */ - public function test_is_jwt_installed() - { - $response = $this->client->get('wp-json/jwt-auth/v1/'); - $this->assertEquals(200, $response->getStatusCode()); - $data = json_decode($response->getBody(), true); - $this->assertEquals('jwt-auth/v1', $data['namespace']); - } - - /** - * Get the user token - */ - public function test_get_jwt_token() - { - $response = $this->client->post('wp-json/jwt-auth/v1/token', [ - 'json' => [ - 'username' => 'admin', - 'password' => 'poipoipoi' - ] - ]); - $this->assertEquals(200, $response->getStatusCode()); - $data = json_decode($response->getBody(), true); - $this->assertArrayHasKey('token', $data); - $this->assertArrayHasKey('token', $data); - $this->assertArrayHasKey('user_email', $data); - $this->assertNotEmpty($data['token']); - $this->assertNotEmpty($data['user_email']); - } - - /** - * Get the Token and then validate... - */ - public function test_validate_jwt_token() - { - $token = ''; - #first get a valid token. - $response = $this->client->post('wp-json/jwt-auth/v1/token', [ - 'json' => [ - 'username' => 'admin', - 'password' => 'poipoipoi' - ] - ]); - $this->assertEquals(200, $response->getStatusCode()); - $data = json_decode($response->getBody(), true); - $token = $data['token']; - - #With the token now validate it. - $response = $this->client->post('wp-json/jwt-auth/v1/token/validate', [ - 'headers' => [ - 'Authorization' => 'Bearer ' . $token - ] - ]); - $this->assertEquals(200, $response->getStatusCode()); - $data = json_decode($response->getBody(), true); - $this->assertArrayHasKey('code', $data); - $this->assertArrayHasKey('data', $data); - $this->assertEquals(200, $data['data']['status']); - - #Finally get the me | Reading - $response = $this->client->get('wp-json/wp/v2/users/me', [ - 'headers' => [ - 'Authorization' => 'Bearer ' . $token - ] - ]); - - $this->assertEquals(200, $response->getStatusCode()); - $data = json_decode($response->getBody(), true); - $this->assertArrayHasKey('id', $data); - $this->assertArrayHasKey('name', $data); - } - - /** - * Try to Write a Post | Write Permissions - */ - public function test_jwt_write_access() - { - #first get a valid token. - $response = $this->client->post('wp-json/jwt-auth/v1/token', [ - 'json' => [ - 'username' => 'admin', - 'password' => 'poipoipoi' - ] - ]); - $this->assertEquals(200, $response->getStatusCode()); - $data = json_decode($response->getBody(), true); - $token = $data['token']; - - #Create the post | Writing - $response = $this->client->post('wp-json/wp/v2/posts', [ - 'headers' => [ - 'Authorization' => 'Bearer ' . $token - ], - 'json' => [ - 'title' => 'Created from Tests' - ] - ]); - - $this->assertEquals(201, $response->getStatusCode()); - $data = json_decode($response->getBody(), true); - #201 is created and now look and get the new post ID - $this->assertArrayHasKey('id', $data); - $post_id = $data['id']; - - #Delete the test post - #Finally get the me | Reading - $response = $this->client->delete('wp-json/wp/v2/posts/' . $post_id, [ - 'headers' => [ - 'Authorization' => 'Bearer ' . $token - ] - ]); - $this->assertEquals(200, $response->getStatusCode()); - $data = json_decode($response->getBody(), true); - $this->assertArrayHasKey('id', $data); - //The post ID must to be the same as the created one. - $this->assertEquals($post_id, $data['id']); - } -} \ No newline at end of file From 4d6db548f7a713273ea65ba8e3b45549ed93e3b7 Mon Sep 17 00:00:00 2001 From: Tmeister Date: Fri, 7 Oct 2022 15:33:49 -0500 Subject: [PATCH 33/79] Update Readme files and version up to 1.3.1 --- README.md | 5 ++++- jwt-auth.php | 2 +- readme.txt | 11 +++++++++++ 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index d4312eb..00e9e5d 100644 --- a/README.md +++ b/README.md @@ -340,7 +340,10 @@ $token = JWT::decode( ); ``` -##Credits +## Testing +I've created a small app to test the basic functionality of the plugin; you can get the app and read all the details on the [JWT-Client Repo](https://github.com/Tmeister/jwt-client) + +## Credits [WP REST API V2](http://v2.wp-api.org/) [PHP-JWT from firebase](https://github.com/firebase/php-jwt) diff --git a/jwt-auth.php b/jwt-auth.php index 977d3dc..3117b3b 100755 --- a/jwt-auth.php +++ b/jwt-auth.php @@ -15,7 +15,7 @@ * Plugin Name: JWT Authentication for WP-API * Plugin URI: https://enriquechavez.co * Description: Extends the WP REST API using JSON Web Tokens Authentication as an authentication method. - * Version: 1.3.0 + * Version: 1.3.1 * Author: Enrique Chavez * Author URI: https://enriquechavez.co * License: GPL-2.0+ diff --git a/readme.txt b/readme.txt index 04ac231..6079133 100755 --- a/readme.txt +++ b/readme.txt @@ -342,6 +342,9 @@ $token = JWT::decode( ); ` +## Testing +I've created a small app to test the basic functionality of the plugin; you can get the app and read all the details on the [JWT-Client Repo](https://github.com/Tmeister/jwt-client) + ==Installation== = Using The WordPress Dashboard = @@ -362,6 +365,14 @@ $token = JWT::decode( ###Please read how to configured the plugin https://wordpress.org/plugins/jwt-authentication-for-wp-rest-api/ == Changelog == += 1.3.1 = +* Updating the minimum version of PHP to 7.4 +* Validate the signing algorithm against the supported algorithms @see https://www.rfc-editor.org/rfc/rfc7518#section-3 +* Sanitize the REQUEST_URI and HTTP_AUTHORIZATION values before to use them +* Use get_header() instead of $_SERVER to get the Authorization header when possible +* Added typed properties to the JWT_Auth class where possible +* Along with this release, I release a new simple JWT Client App for testing purposes @see https://github.com/Tmeister/jwt-client + = 1.3.0 = * Update firebase/php-jwt to 6.3 * Fix warning, register_rest_route was called incorrectly From 8c3c03fa0b92a8c45bd6acb4489aa38bbc4c898a Mon Sep 17 00:00:00 2001 From: Tmeister Date: Fri, 7 Oct 2022 17:54:33 -0500 Subject: [PATCH 34/79] Update stable tag --- readme.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/readme.txt b/readme.txt index 6079133..2e6d806 100755 --- a/readme.txt +++ b/readme.txt @@ -6,7 +6,7 @@ Tags: wp-json, jwt, json web authentication, wp-api Requires at least: 4.2 Tested up to: 6.0.2 Requires PHP: 5.3.0 -Stable tag: 1.3.0 +Stable tag: 1.3.1 License: GPLv2 or later License URI: http://www.gnu.org/licenses/gpl-2.0.html From 847215a8d7fc2a06f7012a9a30b469d7642d8dce Mon Sep 17 00:00:00 2001 From: Tmeister Date: Fri, 7 Oct 2022 17:59:22 -0500 Subject: [PATCH 35/79] Update the PHP version required on readme.txt --- readme.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/readme.txt b/readme.txt index 2e6d806..574cdf8 100755 --- a/readme.txt +++ b/readme.txt @@ -5,7 +5,7 @@ Donate link: https://www.paypal.me/wpchavez Tags: wp-json, jwt, json web authentication, wp-api Requires at least: 4.2 Tested up to: 6.0.2 -Requires PHP: 5.3.0 +Requires PHP: 7.4.0 Stable tag: 1.3.1 License: GPLv2 or later License URI: http://www.gnu.org/licenses/gpl-2.0.html From e334037e24bcdb44a87689950b323a5178c34614 Mon Sep 17 00:00:00 2001 From: Mario Shtika Date: Fri, 14 Oct 2022 11:18:22 +0300 Subject: [PATCH 36/79] Create a unique namespace to load the JWT & Key classes of this plugin --- includes/class-jwt-auth.php | 6 ++++++ includes/extend-classes.php | 11 +++++++++++ public/class-jwt-auth-public.php | 4 ++-- 3 files changed, 19 insertions(+), 2 deletions(-) create mode 100644 includes/extend-classes.php mode change 100755 => 100644 public/class-jwt-auth-public.php diff --git a/includes/class-jwt-auth.php b/includes/class-jwt-auth.php index ea74e94..7212ddf 100755 --- a/includes/class-jwt-auth.php +++ b/includes/class-jwt-auth.php @@ -104,6 +104,12 @@ private function load_dependencies() { */ require_once plugin_dir_path( dirname( __FILE__ ) ) . 'includes/class-jwt-auth-i18n.php'; + /** + * The class responsible for creating a unique namespace to load the JWT & Key + * classes of this plugin + */ + require_once plugin_dir_path(dirname(__FILE__)) . 'includes/extend-classes.php'; + /** * The class responsible for defining all actions that occur in the public-facing * side of the site. diff --git a/includes/extend-classes.php b/includes/extend-classes.php new file mode 100644 index 0000000..82f7b6e --- /dev/null +++ b/includes/extend-classes.php @@ -0,0 +1,11 @@ + Date: Fri, 14 Oct 2022 13:14:52 -0500 Subject: [PATCH 37/79] Add a wrapper namespace to prevent conflicts with other plugins using the same JWT library --- includes/class-jwt-auth.php | 7 ++++--- includes/class-jwt-namespace-wrapper.php | 18 ++++++++++++++++++ includes/extend-classes.php | 11 ----------- jwt-auth.php | 2 +- readme.txt | 5 ++++- 5 files changed, 27 insertions(+), 16 deletions(-) create mode 100644 includes/class-jwt-namespace-wrapper.php delete mode 100644 includes/extend-classes.php diff --git a/includes/class-jwt-auth.php b/includes/class-jwt-auth.php index 7212ddf..cb1f9d2 100755 --- a/includes/class-jwt-auth.php +++ b/includes/class-jwt-auth.php @@ -105,10 +105,11 @@ private function load_dependencies() { require_once plugin_dir_path( dirname( __FILE__ ) ) . 'includes/class-jwt-auth-i18n.php'; /** - * The class responsible for creating a unique namespace to load the JWT & Key - * classes of this plugin + * Class responsible for creating a `wrapper namespace` to load the Firebase's JWT & Key + * classes and prevent conflicts with other plugins using the same library + * with different versions. */ - require_once plugin_dir_path(dirname(__FILE__)) . 'includes/extend-classes.php'; + require_once plugin_dir_path(dirname(__FILE__)) . 'includes/class-jwt-namespace-wrapper.php'; /** * The class responsible for defining all actions that occur in the public-facing diff --git a/includes/class-jwt-namespace-wrapper.php b/includes/class-jwt-namespace-wrapper.php new file mode 100644 index 0000000..befcf08 --- /dev/null +++ b/includes/class-jwt-namespace-wrapper.php @@ -0,0 +1,18 @@ + Date: Mon, 17 Oct 2022 18:28:26 -0500 Subject: [PATCH 38/79] Update Tested up to version --- readme.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/readme.txt b/readme.txt index 2a1ee32..0e1eed1 100755 --- a/readme.txt +++ b/readme.txt @@ -4,7 +4,7 @@ Contributors: tmeister Donate link: https://www.paypal.me/wpchavez Tags: wp-json, jwt, json web authentication, wp-api Requires at least: 4.2 -Tested up to: 6.0.2 +Tested up to: 6.0.3 Requires PHP: 7.4.0 Stable tag: 1.3.2 License: GPLv2 or later From f4c4c2a4a6669409505c8f347568198a6cea9a49 Mon Sep 17 00:00:00 2001 From: marioshtika Date: Wed, 19 Oct 2022 14:04:33 +0300 Subject: [PATCH 39/79] Fix the condition where it checks if the request is a REST Request --- public/class-jwt-auth-public.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/public/class-jwt-auth-public.php b/public/class-jwt-auth-public.php index 430ecaa..cea4ceb 100644 --- a/public/class-jwt-auth-public.php +++ b/public/class-jwt-auth-public.php @@ -203,7 +203,9 @@ public function determine_current_user( $user ) { $rest_api_slug = rest_get_url_prefix(); $requested_url = sanitize_url(http://github.com/$_SERVER['REQUEST_URI']); // if we already have a valid user, or we have an invalid url, don't attempt to validate token - if ( ! defined( 'REST_REQUEST' ) || ! REST_REQUEST || strpos( $requested_url, $rest_api_slug ) === false || $user ) { + $isRestRequestConstantDefined = defined( 'REST_REQUEST' ) && REST_REQUEST; + $isRestRequest = $isRestRequestConstantDefined || strpos( $requested_url, $rest_api_slug ); + if ( $isRestRequest && $user ) { return $user; } From 08ef2fcf5d8cf68dd8fcb2d72fe204c1cac769dc Mon Sep 17 00:00:00 2001 From: Nicklas Sundberg Date: Wed, 2 Nov 2022 20:32:09 +0100 Subject: [PATCH 40/79] Check if request headers are set before using --- public/class-jwt-auth-public.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/public/class-jwt-auth-public.php b/public/class-jwt-auth-public.php index 430ecaa..68e6df5 100644 --- a/public/class-jwt-auth-public.php +++ b/public/class-jwt-auth-public.php @@ -219,10 +219,10 @@ public function determine_current_user( $user ) { /** * We still need to get the Authorization header and check for the token. */ - $auth_header = $_SERVER['HTTP_AUTHORIZATION'] ? sanitize_text_field( $_SERVER['HTTP_AUTHORIZATION'] ) : false; + $auth_header = ! empty( $_SERVER['HTTP_AUTHORIZATION'] ) ? sanitize_text_field( $_SERVER['HTTP_AUTHORIZATION'] ) : false; /* Double check for different auth header string (server dependent) */ if ( ! $auth_header ) { - $auth_header = $_SERVER['REDIRECT_HTTP_AUTHORIZATION'] ? sanitize_text_field( $_SERVER['REDIRECT_HTTP_AUTHORIZATION'] ) : false; + $auth_header = ! empty( $_SERVER['REDIRECT_HTTP_AUTHORIZATION'] ) ? sanitize_text_field( $_SERVER['REDIRECT_HTTP_AUTHORIZATION'] ) : false; } if ( ! $auth_header ) { From 30fd6c661638434096e97312c6a25f03c1db443d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 13 Feb 2023 10:05:10 +0000 Subject: [PATCH 41/79] Bump firebase/php-jwt from 6.3.0 to 6.4.0 Bumps [firebase/php-jwt](https://github.com/firebase/php-jwt) from 6.3.0 to 6.4.0. - [Release notes](https://github.com/firebase/php-jwt/releases) - [Changelog](https://github.com/firebase/php-jwt/blob/main/CHANGELOG.md) - [Commits](https://github.com/firebase/php-jwt/compare/v6.3.0...v6.4.0) --- updated-dependencies: - dependency-name: firebase/php-jwt dependency-type: direct:production update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] --- composer.lock | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/composer.lock b/composer.lock index 0cf50bf..4579228 100644 --- a/composer.lock +++ b/composer.lock @@ -159,16 +159,16 @@ }, { "name": "firebase/php-jwt", - "version": "v6.3.0", + "version": "v6.4.0", "source": { "type": "git", "url": "https://github.com/firebase/php-jwt.git", - "reference": "018dfc4e1da92ad8a1b90adc4893f476a3b41cb8" + "reference": "4dd1e007f22a927ac77da5a3fbb067b42d3bc224" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/firebase/php-jwt/zipball/018dfc4e1da92ad8a1b90adc4893f476a3b41cb8", - "reference": "018dfc4e1da92ad8a1b90adc4893f476a3b41cb8", + "url": "https://api.github.com/repos/firebase/php-jwt/zipball/4dd1e007f22a927ac77da5a3fbb067b42d3bc224", + "reference": "4dd1e007f22a927ac77da5a3fbb067b42d3bc224", "shasum": "" }, "require": { @@ -183,6 +183,7 @@ "psr/http-factory": "^1.0" }, "suggest": { + "ext-sodium": "Support EdDSA (Ed25519) signatures", "paragonie/sodium_compat": "Support EdDSA (Ed25519) signatures when libsodium is not present" }, "type": "library", @@ -215,9 +216,9 @@ ], "support": { "issues": "https://github.com/firebase/php-jwt/issues", - "source": "https://github.com/firebase/php-jwt/tree/v6.3.0" + "source": "https://github.com/firebase/php-jwt/tree/v6.4.0" }, - "time": "2022-07-15T16:48:45+00:00" + "time": "2023-02-09T21:01:23+00:00" } ], "packages-dev": [ From f2b84e755c0a039dc82e8898e619b5e10a205947 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 27 Feb 2023 09:23:26 +0000 Subject: [PATCH 42/79] Bump squizlabs/php_codesniffer from 3.7.1 to 3.7.2 Bumps [squizlabs/php_codesniffer](https://github.com/squizlabs/PHP_CodeSniffer) from 3.7.1 to 3.7.2. - [Release notes](https://github.com/squizlabs/PHP_CodeSniffer/releases) - [Commits](https://github.com/squizlabs/PHP_CodeSniffer/compare/3.7.1...3.7.2) --- updated-dependencies: - dependency-name: squizlabs/php_codesniffer dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] --- composer.lock | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/composer.lock b/composer.lock index 0cf50bf..3b9e91b 100644 --- a/composer.lock +++ b/composer.lock @@ -298,16 +298,16 @@ }, { "name": "squizlabs/php_codesniffer", - "version": "3.7.1", + "version": "3.7.2", "source": { "type": "git", "url": "https://github.com/squizlabs/PHP_CodeSniffer.git", - "reference": "1359e176e9307e906dc3d890bcc9603ff6d90619" + "reference": "ed8e00df0a83aa96acf703f8c2979ff33341f879" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/1359e176e9307e906dc3d890bcc9603ff6d90619", - "reference": "1359e176e9307e906dc3d890bcc9603ff6d90619", + "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/ed8e00df0a83aa96acf703f8c2979ff33341f879", + "reference": "ed8e00df0a83aa96acf703f8c2979ff33341f879", "shasum": "" }, "require": { @@ -343,14 +343,15 @@ "homepage": "https://github.com/squizlabs/PHP_CodeSniffer", "keywords": [ "phpcs", - "standards" + "standards", + "static analysis" ], "support": { "issues": "https://github.com/squizlabs/PHP_CodeSniffer/issues", "source": "https://github.com/squizlabs/PHP_CodeSniffer", "wiki": "https://github.com/squizlabs/PHP_CodeSniffer/wiki" }, - "time": "2022-06-18T07:21:10+00:00" + "time": "2023-02-22T23:07:41+00:00" }, { "name": "wp-coding-standards/wpcs", From 1f6a6dd8da735907daa5c5102c6bdcff6cf8ebb2 Mon Sep 17 00:00:00 2001 From: Enrique Chavez Date: Sun, 3 Sep 2023 13:52:05 -0600 Subject: [PATCH 43/79] Update: Update php-jwt to 6.4.0 - Change variables name to snake case --- includes/vendor/autoload.php | 17 ++- includes/vendor/composer/ClassLoader.php | 41 ++++-- .../vendor/composer/InstalledVersions.php | 17 ++- includes/vendor/composer/installed.json | 15 +- includes/vendor/composer/installed.php | 10 +- includes/vendor/firebase/php-jwt/CHANGELOG.md | 105 ++++++++++++++ includes/vendor/firebase/php-jwt/README.md | 135 +++++++----------- .../vendor/firebase/php-jwt/composer.json | 3 +- .../firebase/php-jwt/src/CachedKeySet.php | 47 ++++-- includes/vendor/firebase/php-jwt/src/JWK.php | 1 + includes/vendor/firebase/php-jwt/src/JWT.php | 37 +++-- public/class-jwt-auth-public.php | 6 +- 12 files changed, 290 insertions(+), 144 deletions(-) create mode 100644 includes/vendor/firebase/php-jwt/CHANGELOG.md diff --git a/includes/vendor/autoload.php b/includes/vendor/autoload.php index 4e9f2cf..b4d56ee 100644 --- a/includes/vendor/autoload.php +++ b/includes/vendor/autoload.php @@ -3,8 +3,21 @@ // autoload.php @generated by Composer if (PHP_VERSION_ID < 50600) { - echo 'Composer 2.3.0 dropped support for autoloading on PHP <5.6 and you are running '.PHP_VERSION.', please upgrade PHP or use Composer 2.2 LTS via "composer self-update --2.2". Aborting.'.PHP_EOL; - exit(1); + if (!headers_sent()) { + header('HTTP/1.1 500 Internal Server Error'); + } + $err = 'Composer 2.3.0 dropped support for autoloading on PHP <5.6 and you are running '.PHP_VERSION.', please upgrade PHP or use Composer 2.2 LTS via "composer self-update --2.2". Aborting.'.PHP_EOL; + if (!ini_get('display_errors')) { + if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') { + fwrite(STDERR, $err); + } elseif (!headers_sent()) { + echo $err; + } + } + trigger_error( + $err, + E_USER_ERROR + ); } require_once __DIR__ . '/composer/autoload_real.php'; diff --git a/includes/vendor/composer/ClassLoader.php b/includes/vendor/composer/ClassLoader.php index afef3fa..a72151c 100644 --- a/includes/vendor/composer/ClassLoader.php +++ b/includes/vendor/composer/ClassLoader.php @@ -42,6 +42,9 @@ */ class ClassLoader { + /** @var \Closure(string):void */ + private static $includeFile; + /** @var ?string */ private $vendorDir; @@ -106,6 +109,7 @@ class ClassLoader public function __construct($vendorDir = null) { $this->vendorDir = $vendorDir; + self::initializeIncludeClosure(); } /** @@ -425,7 +429,8 @@ public function unregister() public function loadClass($class) { if ($file = $this->findFile($class)) { - includeFile($file); + $includeFile = self::$includeFile; + $includeFile($file); return true; } @@ -555,18 +560,26 @@ private function findFileWithExtension($class, $ext) return false; } -} -/** - * Scope isolated include. - * - * Prevents access to $this/self from included files. - * - * @param string $file - * @return void - * @private - */ -function includeFile($file) -{ - include $file; + /** + * @return void + */ + private static function initializeIncludeClosure() + { + if (self::$includeFile !== null) { + return; + } + + /** + * Scope isolated include. + * + * Prevents access to $this/self from included files. + * + * @param string $file + * @return void + */ + self::$includeFile = \Closure::bind(static function($file) { + include $file; + }, null, null); + } } diff --git a/includes/vendor/composer/InstalledVersions.php b/includes/vendor/composer/InstalledVersions.php index c6b54af..51e734a 100644 --- a/includes/vendor/composer/InstalledVersions.php +++ b/includes/vendor/composer/InstalledVersions.php @@ -98,7 +98,7 @@ public static function isInstalled($packageName, $includeDevRequirements = true) { foreach (self::getInstalled() as $installed) { if (isset($installed['versions'][$packageName])) { - return $includeDevRequirements || empty($installed['versions'][$packageName]['dev_requirement']); + return $includeDevRequirements || !isset($installed['versions'][$packageName]['dev_requirement']) || $installed['versions'][$packageName]['dev_requirement'] === false; } } @@ -119,7 +119,7 @@ public static function isInstalled($packageName, $includeDevRequirements = true) */ public static function satisfies(VersionParser $parser, $packageName, $constraint) { - $constraint = $parser->parseConstraints($constraint); + $constraint = $parser->parseConstraints((string) $constraint); $provided = $parser->parseConstraints(self::getVersionRanges($packageName)); return $provided->matches($constraint); @@ -328,7 +328,9 @@ private static function getInstalled() if (isset(self::$installedByVendor[$vendorDir])) { $installed[] = self::$installedByVendor[$vendorDir]; } elseif (is_file($vendorDir.'/composer/installed.php')) { - $installed[] = self::$installedByVendor[$vendorDir] = require $vendorDir.'/composer/installed.php'; + /** @var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array} $required */ + $required = require $vendorDir.'/composer/installed.php'; + $installed[] = self::$installedByVendor[$vendorDir] = $required; if (null === self::$installed && strtr($vendorDir.'/composer', '\\', '/') === strtr(__DIR__, '\\', '/')) { self::$installed = $installed[count($installed) - 1]; } @@ -340,12 +342,17 @@ private static function getInstalled() // only require the installed.php file if this file is loaded from its dumped location, // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937 if (substr(__DIR__, -8, 1) !== 'C') { - self::$installed = require __DIR__ . '/installed.php'; + /** @var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array} $required */ + $required = require __DIR__ . '/installed.php'; + self::$installed = $required; } else { self::$installed = array(); } } - $installed[] = self::$installed; + + if (self::$installed !== array()) { + $installed[] = self::$installed; + } return $installed; } diff --git a/includes/vendor/composer/installed.json b/includes/vendor/composer/installed.json index 0e11dde..5312805 100644 --- a/includes/vendor/composer/installed.json +++ b/includes/vendor/composer/installed.json @@ -156,17 +156,17 @@ }, { "name": "firebase/php-jwt", - "version": "v6.3.0", - "version_normalized": "6.3.0.0", + "version": "v6.4.0", + "version_normalized": "6.4.0.0", "source": { "type": "git", "url": "https://github.com/firebase/php-jwt.git", - "reference": "018dfc4e1da92ad8a1b90adc4893f476a3b41cb8" + "reference": "4dd1e007f22a927ac77da5a3fbb067b42d3bc224" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/firebase/php-jwt/zipball/018dfc4e1da92ad8a1b90adc4893f476a3b41cb8", - "reference": "018dfc4e1da92ad8a1b90adc4893f476a3b41cb8", + "url": "https://api.github.com/repos/firebase/php-jwt/zipball/4dd1e007f22a927ac77da5a3fbb067b42d3bc224", + "reference": "4dd1e007f22a927ac77da5a3fbb067b42d3bc224", "shasum": "" }, "require": { @@ -181,9 +181,10 @@ "psr/http-factory": "^1.0" }, "suggest": { + "ext-sodium": "Support EdDSA (Ed25519) signatures", "paragonie/sodium_compat": "Support EdDSA (Ed25519) signatures when libsodium is not present" }, - "time": "2022-07-15T16:48:45+00:00", + "time": "2023-02-09T21:01:23+00:00", "type": "library", "installation-source": "dist", "autoload": { @@ -215,7 +216,7 @@ ], "support": { "issues": "https://github.com/firebase/php-jwt/issues", - "source": "https://github.com/firebase/php-jwt/tree/v6.3.0" + "source": "https://github.com/firebase/php-jwt/tree/v6.4.0" }, "install-path": "../firebase/php-jwt" } diff --git a/includes/vendor/composer/installed.php b/includes/vendor/composer/installed.php index 6bcf874..cd9d36a 100644 --- a/includes/vendor/composer/installed.php +++ b/includes/vendor/composer/installed.php @@ -3,7 +3,7 @@ 'name' => 'tmeister/wp-api-jwt-auth', 'pretty_version' => 'dev-develop', 'version' => 'dev-develop', - 'reference' => 'd5181b702e0481f26073987932f99dc3ef4a6c08', + 'reference' => 'd91b9b6412fcd1e09102f5c9254481c13ed07f9c', 'type' => 'wordpress-plugin', 'install_path' => __DIR__ . '/../../../', 'aliases' => array(), @@ -20,9 +20,9 @@ 'dev_requirement' => false, ), 'firebase/php-jwt' => array( - 'pretty_version' => 'v6.3.0', - 'version' => '6.3.0.0', - 'reference' => '018dfc4e1da92ad8a1b90adc4893f476a3b41cb8', + 'pretty_version' => 'v6.4.0', + 'version' => '6.4.0.0', + 'reference' => '4dd1e007f22a927ac77da5a3fbb067b42d3bc224', 'type' => 'library', 'install_path' => __DIR__ . '/../firebase/php-jwt', 'aliases' => array(), @@ -43,7 +43,7 @@ 'tmeister/wp-api-jwt-auth' => array( 'pretty_version' => 'dev-develop', 'version' => 'dev-develop', - 'reference' => 'd5181b702e0481f26073987932f99dc3ef4a6c08', + 'reference' => 'd91b9b6412fcd1e09102f5c9254481c13ed07f9c', 'type' => 'wordpress-plugin', 'install_path' => __DIR__ . '/../../../', 'aliases' => array(), diff --git a/includes/vendor/firebase/php-jwt/CHANGELOG.md b/includes/vendor/firebase/php-jwt/CHANGELOG.md new file mode 100644 index 0000000..9242bd3 --- /dev/null +++ b/includes/vendor/firebase/php-jwt/CHANGELOG.md @@ -0,0 +1,105 @@ +# Changelog + +## [6.4.0](https://github.com/firebase/php-jwt/compare/v6.3.2...v6.4.0) (2023-02-08) + + +### Features + +* add support for W3C ES256K ([#462](https://github.com/firebase/php-jwt/issues/462)) ([213924f](https://github.com/firebase/php-jwt/commit/213924f51936291fbbca99158b11bd4ae56c2c95)) +* improve caching by only decoding jwks when necessary ([#486](https://github.com/firebase/php-jwt/issues/486)) ([78d3ed1](https://github.com/firebase/php-jwt/commit/78d3ed1073553f7d0bbffa6c2010009a0d483d5c)) + +## [6.3.2](https://github.com/firebase/php-jwt/compare/v6.3.1...v6.3.2) (2022-11-01) + + +### Bug Fixes + +* check kid before using as array index ([bad1b04](https://github.com/firebase/php-jwt/commit/bad1b040d0c736bbf86814c6b5ae614f517cf7bd)) + +## [6.3.1](https://github.com/firebase/php-jwt/compare/v6.3.0...v6.3.1) (2022-11-01) + + +### Bug Fixes + +* casing of GET for PSR compat ([#451](https://github.com/firebase/php-jwt/issues/451)) ([60b52b7](https://github.com/firebase/php-jwt/commit/60b52b71978790eafcf3b95cfbd83db0439e8d22)) +* string interpolation format for php 8.2 ([#446](https://github.com/firebase/php-jwt/issues/446)) ([2e07d8a](https://github.com/firebase/php-jwt/commit/2e07d8a1524d12b69b110ad649f17461d068b8f2)) + +## 6.3.0 / 2022-07-15 + + - Added ES256 support to JWK parsing ([#399](https://github.com/firebase/php-jwt/pull/399)) + - Fixed potential caching error in `CachedKeySet` by caching jwks as strings ([#435](https://github.com/firebase/php-jwt/pull/435)) + +## 6.2.0 / 2022-05-14 + + - Added `CachedKeySet` ([#397](https://github.com/firebase/php-jwt/pull/397)) + - Added `$defaultAlg` parameter to `JWT::parseKey` and `JWT::parseKeySet` ([#426](https://github.com/firebase/php-jwt/pull/426)). + +## 6.1.0 / 2022-03-23 + + - Drop support for PHP 5.3, 5.4, 5.5, 5.6, and 7.0 + - Add parameter typing and return types where possible + +## 6.0.0 / 2022-01-24 + + - **Backwards-Compatibility Breaking Changes**: See the [Release Notes](https://github.com/firebase/php-jwt/releases/tag/v6.0.0) for more information. + - New Key object to prevent key/algorithm type confusion (#365) + - Add JWK support (#273) + - Add ES256 support (#256) + - Add ES384 support (#324) + - Add Ed25519 support (#343) + +## 5.0.0 / 2017-06-26 +- Support RS384 and RS512. + See [#117](https://github.com/firebase/php-jwt/pull/117). Thanks [@joostfaassen](https://github.com/joostfaassen)! +- Add an example for RS256 openssl. + See [#125](https://github.com/firebase/php-jwt/pull/125). Thanks [@akeeman](https://github.com/akeeman)! +- Detect invalid Base64 encoding in signature. + See [#162](https://github.com/firebase/php-jwt/pull/162). Thanks [@psignoret](https://github.com/psignoret)! +- Update `JWT::verify` to handle OpenSSL errors. + See [#159](https://github.com/firebase/php-jwt/pull/159). Thanks [@bshaffer](https://github.com/bshaffer)! +- Add `array` type hinting to `decode` method + See [#101](https://github.com/firebase/php-jwt/pull/101). Thanks [@hywak](https://github.com/hywak)! +- Add all JSON error types. + See [#110](https://github.com/firebase/php-jwt/pull/110). Thanks [@gbalduzzi](https://github.com/gbalduzzi)! +- Bugfix 'kid' not in given key list. + See [#129](https://github.com/firebase/php-jwt/pull/129). Thanks [@stampycode](https://github.com/stampycode)! +- Miscellaneous cleanup, documentation and test fixes. + See [#107](https://github.com/firebase/php-jwt/pull/107), [#115](https://github.com/firebase/php-jwt/pull/115), + [#160](https://github.com/firebase/php-jwt/pull/160), [#161](https://github.com/firebase/php-jwt/pull/161), and + [#165](https://github.com/firebase/php-jwt/pull/165). Thanks [@akeeman](https://github.com/akeeman), + [@chinedufn](https://github.com/chinedufn), and [@bshaffer](https://github.com/bshaffer)! + +## 4.0.0 / 2016-07-17 +- Add support for late static binding. See [#88](https://github.com/firebase/php-jwt/pull/88) for details. Thanks to [@chappy84](https://github.com/chappy84)! +- Use static `$timestamp` instead of `time()` to improve unit testing. See [#93](https://github.com/firebase/php-jwt/pull/93) for details. Thanks to [@josephmcdermott](https://github.com/josephmcdermott)! +- Fixes to exceptions classes. See [#81](https://github.com/firebase/php-jwt/pull/81) for details. Thanks to [@Maks3w](https://github.com/Maks3w)! +- Fixes to PHPDoc. See [#76](https://github.com/firebase/php-jwt/pull/76) for details. Thanks to [@akeeman](https://github.com/akeeman)! + +## 3.0.0 / 2015-07-22 +- Minimum PHP version updated from `5.2.0` to `5.3.0`. +- Add `\Firebase\JWT` namespace. See +[#59](https://github.com/firebase/php-jwt/pull/59) for details. Thanks to +[@Dashron](https://github.com/Dashron)! +- Require a non-empty key to decode and verify a JWT. See +[#60](https://github.com/firebase/php-jwt/pull/60) for details. Thanks to +[@sjones608](https://github.com/sjones608)! +- Cleaner documentation blocks in the code. See +[#62](https://github.com/firebase/php-jwt/pull/62) for details. Thanks to +[@johanderuijter](https://github.com/johanderuijter)! + +## 2.2.0 / 2015-06-22 +- Add support for adding custom, optional JWT headers to `JWT::encode()`. See +[#53](https://github.com/firebase/php-jwt/pull/53/files) for details. Thanks to +[@mcocaro](https://github.com/mcocaro)! + +## 2.1.0 / 2015-05-20 +- Add support for adding a leeway to `JWT:decode()` that accounts for clock skew +between signing and verifying entities. Thanks to [@lcabral](https://github.com/lcabral)! +- Add support for passing an object implementing the `ArrayAccess` interface for +`$keys` argument in `JWT::decode()`. Thanks to [@aztech-dev](https://github.com/aztech-dev)! + +## 2.0.0 / 2015-04-01 +- **Note**: It is strongly recommended that you update to > v2.0.0 to address + known security vulnerabilities in prior versions when both symmetric and + asymmetric keys are used together. +- Update signature for `JWT::decode(...)` to require an array of supported + algorithms to use when verifying token signatures. diff --git a/includes/vendor/firebase/php-jwt/README.md b/includes/vendor/firebase/php-jwt/README.md index fed1e95..ae2b389 100644 --- a/includes/vendor/firebase/php-jwt/README.md +++ b/includes/vendor/firebase/php-jwt/README.md @@ -245,6 +245,56 @@ $decoded = JWT::decode($jwt, $keySet); Miscellaneous ------------- +#### Exception Handling + +When a call to `JWT::decode` is invalid, it will throw one of the following exceptions: + +```php +use Firebase\JWT\JWT; +use Firebase\JWT\SignatureInvalidException; +use Firebase\JWT\BeforeValidException; +use Firebase\JWT\ExpiredException; +use DomainException; +use InvalidArgumentException; +use UnexpectedValueException; + +try { + $decoded = JWT::decode($payload, $keys); +} catch (InvalidArgumentException $e) { + // provided key/key-array is empty or malformed. +} catch (DomainException $e) { + // provided algorithm is unsupported OR + // provided key is invalid OR + // unknown error thrown in openSSL or libsodium OR + // libsodium is required but not available. +} catch (SignatureInvalidException $e) { + // provided JWT signature verification failed. +} catch (BeforeValidException $e) { + // provided JWT is trying to be used before "nbf" claim OR + // provided JWT is trying to be used before "iat" claim. +} catch (ExpiredException $e) { + // provided JWT is trying to be used after "exp" claim. +} catch (UnexpectedValueException $e) { + // provided JWT is malformed OR + // provided JWT is missing an algorithm / using an unsupported algorithm OR + // provided JWT algorithm does not match provided key OR + // provided key ID in key/key-array is empty or invalid. +} +``` + +All exceptions in the `Firebase\JWT` namespace extend `UnexpectedValueException`, and can be simplified +like this: + +```php +try { + $decoded = JWT::decode($payload, $keys); +} catch (LogicException $e) { + // errors having to do with environmental setup or malformed JWT Keys +} catch (UnexpectedValueException $e) { + // errors having to do with JWT signature and claims +} +``` + #### Casting to array The return value of `JWT::decode` is the generic PHP object `stdClass`. If you'd like to handle with arrays @@ -258,91 +308,6 @@ $decoded = JWT::decode($payload, $keys); $decoded = json_decode(json_encode($decoded), true); ``` -Changelog ---------- - -#### 6.3.0 / 2022-07-15 - - - Added ES256 support to JWK parsing ([#399](https://github.com/firebase/php-jwt/pull/399)) - - Fixed potential caching error in `CachedKeySet` by caching jwks as strings ([#435](https://github.com/firebase/php-jwt/pull/435)) - -#### 6.2.0 / 2022-05-14 - - - Added `CachedKeySet` ([#397](https://github.com/firebase/php-jwt/pull/397)) - - Added `$defaultAlg` parameter to `JWT::parseKey` and `JWT::parseKeySet` ([#426](https://github.com/firebase/php-jwt/pull/426)). - -#### 6.1.0 / 2022-03-23 - - - Drop support for PHP 5.3, 5.4, 5.5, 5.6, and 7.0 - - Add parameter typing and return types where possible - -#### 6.0.0 / 2022-01-24 - - - **Backwards-Compatibility Breaking Changes**: See the [Release Notes](https://github.com/firebase/php-jwt/releases/tag/v6.0.0) for more information. - - New Key object to prevent key/algorithm type confusion (#365) - - Add JWK support (#273) - - Add ES256 support (#256) - - Add ES384 support (#324) - - Add Ed25519 support (#343) - -#### 5.0.0 / 2017-06-26 -- Support RS384 and RS512. - See [#117](https://github.com/firebase/php-jwt/pull/117). Thanks [@joostfaassen](https://github.com/joostfaassen)! -- Add an example for RS256 openssl. - See [#125](https://github.com/firebase/php-jwt/pull/125). Thanks [@akeeman](https://github.com/akeeman)! -- Detect invalid Base64 encoding in signature. - See [#162](https://github.com/firebase/php-jwt/pull/162). Thanks [@psignoret](https://github.com/psignoret)! -- Update `JWT::verify` to handle OpenSSL errors. - See [#159](https://github.com/firebase/php-jwt/pull/159). Thanks [@bshaffer](https://github.com/bshaffer)! -- Add `array` type hinting to `decode` method - See [#101](https://github.com/firebase/php-jwt/pull/101). Thanks [@hywak](https://github.com/hywak)! -- Add all JSON error types. - See [#110](https://github.com/firebase/php-jwt/pull/110). Thanks [@gbalduzzi](https://github.com/gbalduzzi)! -- Bugfix 'kid' not in given key list. - See [#129](https://github.com/firebase/php-jwt/pull/129). Thanks [@stampycode](https://github.com/stampycode)! -- Miscellaneous cleanup, documentation and test fixes. - See [#107](https://github.com/firebase/php-jwt/pull/107), [#115](https://github.com/firebase/php-jwt/pull/115), - [#160](https://github.com/firebase/php-jwt/pull/160), [#161](https://github.com/firebase/php-jwt/pull/161), and - [#165](https://github.com/firebase/php-jwt/pull/165). Thanks [@akeeman](https://github.com/akeeman), - [@chinedufn](https://github.com/chinedufn), and [@bshaffer](https://github.com/bshaffer)! - -#### 4.0.0 / 2016-07-17 -- Add support for late static binding. See [#88](https://github.com/firebase/php-jwt/pull/88) for details. Thanks to [@chappy84](https://github.com/chappy84)! -- Use static `$timestamp` instead of `time()` to improve unit testing. See [#93](https://github.com/firebase/php-jwt/pull/93) for details. Thanks to [@josephmcdermott](https://github.com/josephmcdermott)! -- Fixes to exceptions classes. See [#81](https://github.com/firebase/php-jwt/pull/81) for details. Thanks to [@Maks3w](https://github.com/Maks3w)! -- Fixes to PHPDoc. See [#76](https://github.com/firebase/php-jwt/pull/76) for details. Thanks to [@akeeman](https://github.com/akeeman)! - -#### 3.0.0 / 2015-07-22 -- Minimum PHP version updated from `5.2.0` to `5.3.0`. -- Add `\Firebase\JWT` namespace. See -[#59](https://github.com/firebase/php-jwt/pull/59) for details. Thanks to -[@Dashron](https://github.com/Dashron)! -- Require a non-empty key to decode and verify a JWT. See -[#60](https://github.com/firebase/php-jwt/pull/60) for details. Thanks to -[@sjones608](https://github.com/sjones608)! -- Cleaner documentation blocks in the code. See -[#62](https://github.com/firebase/php-jwt/pull/62) for details. Thanks to -[@johanderuijter](https://github.com/johanderuijter)! - -#### 2.2.0 / 2015-06-22 -- Add support for adding custom, optional JWT headers to `JWT::encode()`. See -[#53](https://github.com/firebase/php-jwt/pull/53/files) for details. Thanks to -[@mcocaro](https://github.com/mcocaro)! - -#### 2.1.0 / 2015-05-20 -- Add support for adding a leeway to `JWT:decode()` that accounts for clock skew -between signing and verifying entities. Thanks to [@lcabral](https://github.com/lcabral)! -- Add support for passing an object implementing the `ArrayAccess` interface for -`$keys` argument in `JWT::decode()`. Thanks to [@aztech-dev](https://github.com/aztech-dev)! - -#### 2.0.0 / 2015-04-01 -- **Note**: It is strongly recommended that you update to > v2.0.0 to address - known security vulnerabilities in prior versions when both symmetric and - asymmetric keys are used together. -- Update signature for `JWT::decode(...)` to require an array of supported - algorithms to use when verifying token signatures. - - Tests ----- Run the tests using phpunit: diff --git a/includes/vendor/firebase/php-jwt/composer.json b/includes/vendor/firebase/php-jwt/composer.json index 2a3cb2d..c9aa3db 100644 --- a/includes/vendor/firebase/php-jwt/composer.json +++ b/includes/vendor/firebase/php-jwt/composer.json @@ -23,7 +23,8 @@ "php": "^7.1||^8.0" }, "suggest": { - "paragonie/sodium_compat": "Support EdDSA (Ed25519) signatures when libsodium is not present" + "paragonie/sodium_compat": "Support EdDSA (Ed25519) signatures when libsodium is not present", + "ext-sodium": "Support EdDSA (Ed25519) signatures" }, "autoload": { "psr-4": { diff --git a/includes/vendor/firebase/php-jwt/src/CachedKeySet.php b/includes/vendor/firebase/php-jwt/src/CachedKeySet.php index e2215b3..baf801f 100644 --- a/includes/vendor/firebase/php-jwt/src/CachedKeySet.php +++ b/includes/vendor/firebase/php-jwt/src/CachedKeySet.php @@ -3,6 +3,7 @@ namespace Firebase\JWT; use ArrayAccess; +use InvalidArgumentException; use LogicException; use OutOfBoundsException; use Psr\Cache\CacheItemInterface; @@ -10,6 +11,7 @@ use Psr\Http\Client\ClientInterface; use Psr\Http\Message\RequestFactoryInterface; use RuntimeException; +use UnexpectedValueException; /** * @implements ArrayAccess @@ -41,7 +43,7 @@ class CachedKeySet implements ArrayAccess */ private $cacheItem; /** - * @var array + * @var array> */ private $keySet; /** @@ -101,7 +103,7 @@ public function offsetGet($keyId): Key if (!$this->keyIdExists($keyId)) { throw new OutOfBoundsException('Key ID not found'); } - return $this->keySet[$keyId]; + return JWK::parseKey($this->keySet[$keyId], $this->defaultAlg); } /** @@ -130,15 +132,43 @@ public function offsetUnset($offset): void throw new LogicException('Method not implemented'); } + /** + * @return array + */ + private function formatJwksForCache(string $jwks): array + { + $jwks = json_decode($jwks, true); + + if (!isset($jwks['keys'])) { + throw new UnexpectedValueException('"keys" member must exist in the JWK Set'); + } + + if (empty($jwks['keys'])) { + throw new InvalidArgumentException('JWK Set did not contain any keys'); + } + + $keys = []; + foreach ($jwks['keys'] as $k => $v) { + $kid = isset($v['kid']) ? $v['kid'] : $k; + $keys[(string) $kid] = $v; + } + + return $keys; + } + private function keyIdExists(string $keyId): bool { if (null === $this->keySet) { $item = $this->getCacheItem(); // Try to load keys from cache if ($item->isHit()) { - // item found! Return it - $jwks = $item->get(); - $this->keySet = JWK::parseKeySet(json_decode($jwks, true), $this->defaultAlg); + // item found! retrieve it + $this->keySet = $item->get(); + // If the cached item is a string, the JWKS response was cached (previous behavior). + // Parse this into expected format array instead. + if (\is_string($this->keySet)) { + $this->keySet = $this->formatJwksForCache($this->keySet); + } } } @@ -146,17 +176,16 @@ private function keyIdExists(string $keyId): bool if ($this->rateLimitExceeded()) { return false; } - $request = $this->httpFactory->createRequest('get', $this->jwksUri); + $request = $this->httpFactory->createRequest('GET', $this->jwksUri); $jwksResponse = $this->httpClient->sendRequest($request); - $jwks = (string) $jwksResponse->getBody(); - $this->keySet = JWK::parseKeySet(json_decode($jwks, true), $this->defaultAlg); + $this->keySet = $this->formatJwksForCache((string) $jwksResponse->getBody()); if (!isset($this->keySet[$keyId])) { return false; } $item = $this->getCacheItem(); - $item->set($jwks); + $item->set($this->keySet); if ($this->expiresAfter) { $item->expiresAfter($this->expiresAfter); } diff --git a/includes/vendor/firebase/php-jwt/src/JWK.php b/includes/vendor/firebase/php-jwt/src/JWK.php index 15631ec..c7eff8a 100644 --- a/includes/vendor/firebase/php-jwt/src/JWK.php +++ b/includes/vendor/firebase/php-jwt/src/JWK.php @@ -26,6 +26,7 @@ class JWK private const ASN1_BIT_STRING = 0x03; private const EC_CURVES = [ 'P-256' => '1.2.840.10045.3.1.7', // Len: 64 + 'secp256k1' => '1.3.132.0.10', // Len: 64 // 'P-384' => '1.3.132.0.34', // Len: 96 (not yet supported) // 'P-521' => '1.3.132.0.35', // Len: 132 (not supported) ]; diff --git a/includes/vendor/firebase/php-jwt/src/JWT.php b/includes/vendor/firebase/php-jwt/src/JWT.php index 9964073..269e8ca 100644 --- a/includes/vendor/firebase/php-jwt/src/JWT.php +++ b/includes/vendor/firebase/php-jwt/src/JWT.php @@ -55,6 +55,7 @@ class JWT public static $supported_algs = [ 'ES384' => ['openssl', 'SHA384'], 'ES256' => ['openssl', 'SHA256'], + 'ES256K' => ['openssl', 'SHA256'], 'HS256' => ['hash_hmac', 'SHA256'], 'HS384' => ['hash_hmac', 'SHA384'], 'HS512' => ['hash_hmac', 'SHA512'], @@ -76,7 +77,7 @@ class JWT * * @return stdClass The JWT's payload as a PHP object * - * @throws InvalidArgumentException Provided key/key-array was empty + * @throws InvalidArgumentException Provided key/key-array was empty or malformed * @throws DomainException Provided JWT is malformed * @throws UnexpectedValueException Provided JWT was invalid * @throws SignatureInvalidException Provided JWT was invalid because the signature verification failed @@ -132,11 +133,11 @@ public static function decode( // See issue #351 throw new UnexpectedValueException('Incorrect key for this algorithm'); } - if ($header->alg === 'ES256' || $header->alg === 'ES384') { - // OpenSSL expects an ASN.1 DER sequence for ES256/ES384 signatures + if (\in_array($header->alg, ['ES256', 'ES256K', 'ES384'], true)) { + // OpenSSL expects an ASN.1 DER sequence for ES256/ES256K/ES384 signatures $sig = self::signatureToDER($sig); } - if (!self::verify("${headb64}.${bodyb64}", $sig, $key->getKeyMaterial(), $header->alg)) { + if (!self::verify("{$headb64}.{$bodyb64}", $sig, $key->getKeyMaterial(), $header->alg)) { throw new SignatureInvalidException('Signature verification failed'); } @@ -166,12 +167,12 @@ public static function decode( } /** - * Converts and signs a PHP object or array into a JWT string. + * Converts and signs a PHP array into a JWT string. * * @param array $payload PHP array * @param string|resource|OpenSSLAsymmetricKey|OpenSSLCertificate $key The secret key. - * @param string $alg Supported algorithms are 'ES384','ES256', 'HS256', 'HS384', - * 'HS512', 'RS256', 'RS384', and 'RS512' + * @param string $alg Supported algorithms are 'ES384','ES256', 'ES256K', 'HS256', + * 'HS384', 'HS512', 'RS256', 'RS384', and 'RS512' * @param string $keyId * @param array $head An array with header elements to attach * @@ -210,8 +211,8 @@ public static function encode( * * @param string $msg The message to sign * @param string|resource|OpenSSLAsymmetricKey|OpenSSLCertificate $key The secret key. - * @param string $alg Supported algorithms are 'ES384','ES256', 'HS256', 'HS384', - * 'HS512', 'RS256', 'RS384', and 'RS512' + * @param string $alg Supported algorithms are 'ES384','ES256', 'ES256K', 'HS256', + * 'HS384', 'HS512', 'RS256', 'RS384', and 'RS512' * * @return string An encrypted message * @@ -238,7 +239,7 @@ public static function sign( if (!$success) { throw new DomainException('OpenSSL unable to sign data'); } - if ($alg === 'ES256') { + if ($alg === 'ES256' || $alg === 'ES256K') { $signature = self::signatureFromDER($signature, 256); } elseif ($alg === 'ES384') { $signature = self::signatureFromDER($signature, 384); @@ -255,6 +256,9 @@ public static function sign( // The last non-empty line is used as the key. $lines = array_filter(explode("\n", $key)); $key = base64_decode((string) end($lines)); + if (\strlen($key) === 0) { + throw new DomainException('Key cannot be empty string'); + } return sodium_crypto_sign_detached($msg, $key); } catch (Exception $e) { throw new DomainException($e->getMessage(), 0, $e); @@ -312,6 +316,12 @@ private static function verify( // The last non-empty line is used as the key. $lines = array_filter(explode("\n", $keyMaterial)); $key = base64_decode((string) end($lines)); + if (\strlen($key) === 0) { + throw new DomainException('Key cannot be empty string'); + } + if (\strlen($signature) === 0) { + throw new DomainException('Signature cannot be empty string'); + } return sodium_crypto_sign_verify_detached($signature, $msg, $key); } catch (Exception $e) { throw new DomainException($e->getMessage(), 0, $e); @@ -425,14 +435,15 @@ private static function getKey( return $keyOrKeyArray; } + if (empty($kid)) { + throw new UnexpectedValueException('"kid" empty, unable to lookup correct key'); + } + if ($keyOrKeyArray instanceof CachedKeySet) { // Skip "isset" check, as this will automatically refresh if not set return $keyOrKeyArray[$kid]; } - if (empty($kid)) { - throw new UnexpectedValueException('"kid" empty, unable to lookup correct key'); - } if (!isset($keyOrKeyArray[$kid])) { throw new UnexpectedValueException('"kid" invalid, unable to lookup correct key'); } diff --git a/public/class-jwt-auth-public.php b/public/class-jwt-auth-public.php index 9dfeb6b..ba82016 100644 --- a/public/class-jwt-auth-public.php +++ b/public/class-jwt-auth-public.php @@ -203,9 +203,9 @@ public function determine_current_user( $user ) { $rest_api_slug = rest_get_url_prefix(); $requested_url = sanitize_url(http://github.com/$_SERVER['REQUEST_URI']); // if we already have a valid user, or we have an invalid url, don't attempt to validate token - $isRestRequestConstantDefined = defined( 'REST_REQUEST' ) && REST_REQUEST; - $isRestRequest = $isRestRequestConstantDefined || strpos( $requested_url, $rest_api_slug ); - if ( $isRestRequest && $user ) { + $is_rest_request_constant_defined = defined( 'REST_REQUEST' ) && REST_REQUEST; + $is_rest_request = $is_rest_request_constant_defined || strpos( $requested_url, $rest_api_slug ); + if ( $is_rest_request && $user ) { return $user; } From 7f99bfa0dfdaba454347d1a4a4d5341786aa5480 Mon Sep 17 00:00:00 2001 From: Enrique Chavez Date: Sun, 3 Sep 2023 14:04:10 -0600 Subject: [PATCH 44/79] Add changelog for 1.3.3 - Version up to 1.3.3 --- includes/class-jwt-auth.php | 2 +- jwt-auth.php | 2 +- readme.txt | 9 +++++++-- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/includes/class-jwt-auth.php b/includes/class-jwt-auth.php index cb1f9d2..433a29e 100755 --- a/includes/class-jwt-auth.php +++ b/includes/class-jwt-auth.php @@ -63,7 +63,7 @@ class Jwt_Auth { */ public function __construct() { $this->plugin_name = 'jwt-auth'; - $this->version = '1.1.0'; + $this->version = '1.3.3'; $this->load_dependencies(); $this->set_locale(); diff --git a/jwt-auth.php b/jwt-auth.php index 4a05ebf..b496c17 100755 --- a/jwt-auth.php +++ b/jwt-auth.php @@ -15,7 +15,7 @@ * Plugin Name: JWT Authentication for WP-API * Plugin URI: https://enriquechavez.co * Description: Extends the WP REST API using JSON Web Tokens Authentication as an authentication method. - * Version: 1.3.2 + * Version: 1.3.3 * Author: Enrique Chavez * Author URI: https://enriquechavez.co * License: GPL-2.0+ diff --git a/readme.txt b/readme.txt index 2a1ee32..85e31ff 100755 --- a/readme.txt +++ b/readme.txt @@ -4,9 +4,9 @@ Contributors: tmeister Donate link: https://www.paypal.me/wpchavez Tags: wp-json, jwt, json web authentication, wp-api Requires at least: 4.2 -Tested up to: 6.0.2 +Tested up to: 6.3.1 Requires PHP: 7.4.0 -Stable tag: 1.3.2 +Stable tag: 1.3.3 License: GPLv2 or later License URI: http://www.gnu.org/licenses/gpl-2.0.html @@ -365,6 +365,11 @@ I've created a small app to test the basic functionality of the plugin; you can ###Please read how to configured the plugin https://wordpress.org/plugins/jwt-authentication-for-wp-rest-api/ == Changelog == += 1.3.3 = +* Update php-jwt to 6.4.0 +* Fix php warnings (https://github.com/Tmeister/wp-api-jwt-auth/pull/259) +* Fix the condition where it checks if the request is a REST Request (https://github.com/Tmeister/wp-api-jwt-auth/pull/256) + = 1.3.2 = * Fix conflicts with other plugins using the same JWT library adding a wrapper namespace to the JWT class. From 54336850307eb4337d80d67066e40b0ed29b1ce5 Mon Sep 17 00:00:00 2001 From: Enrique Chavez Date: Sun, 3 Sep 2023 16:18:07 -0600 Subject: [PATCH 45/79] Adding PR and Issue templates --- .github/issue_template.md | 43 ++++++++++++++++++++++++++++++++ .github/pull_request_template.md | 34 +++++++++++++++++++++++++ 2 files changed, 77 insertions(+) create mode 100644 .github/issue_template.md create mode 100644 .github/pull_request_template.md diff --git a/.github/issue_template.md b/.github/issue_template.md new file mode 100644 index 0000000..8b6cfc8 --- /dev/null +++ b/.github/issue_template.md @@ -0,0 +1,43 @@ +# Issue Name +## Prerequisites + +Please answer the following questions for yourself before submitting an issue. + +- [ ] I am running the latest plugin version +- [ ] I am running the latest WordPress version +- [ ] I know what PHP version I'm using +- [ ] I checked the documentation and found no answer +- [ ] I checked to make sure that this issue has not already been filed + +## Context + +Please provide any relevant information about your setup. This is important in case the issue is not reproducible except for under certain conditions. + +* WordPress version +* PHP Version +* Plugin A name and version +* Plugin B name and version + +## Expected Behavior + +Please describe the behavior you are expecting. + +## Current Behavior + +What is the current behavior? + +## Failure Information (for bugs) + +Please help provide information about the failure if this is a bug. If it is not a bug, please remove the rest of this template. + +### Steps to Reproduce + +Please provide detailed steps for reproducing the issue. + +1. Step 1 +2. Step 2 +3. You get it... + +### Failure Logs + +Please include any relevant log snippets or files here. diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 0000000..6fe27dc --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,34 @@ +# Description + +Please include a summary of the change or changes and which issue is fixed. Please also include relevant motivation and context. + +Fixes #(issue) + +## Type of change + +- [ ] Bug fix (non-breaking change which fixes an issue) +- [ ] New feature (non-breaking change which adds functionality) +- [ ] Breaking change (fix or feature that would cause existing functionality not to work as expected) +- [ ] This change requires a documentation update + +# How has this been tested? + +Please describe the tests that you ran to verify your changes. Provide instructions so we can reproduce. Please also list any relevant details for your test configuration and if you use specific plugins. + +- [ ] Describe test A +- [ ] Describe test B + +**Test Configuration**: +* WordPress version +* PHP version +* Plugin name and version +* Plugin B name and version + +# Checklist: + +- [ ] My code follows the style guidelines of this project (WordPress code standards) +- [ ] I have performed a self-review of my own code +- [ ] I have commented on my code, particularly in hard-to-understand areas +- [ ] I have made corresponding changes to the documentation (if needed) +- [ ] My changes generate no new warnings +- [ ] I have described how I made my tests that prove my fix is effective or that my feature works From a7b5ce51628353a3e7f07b9b720d559c0592c308 Mon Sep 17 00:00:00 2001 From: Enrique Chavez Date: Tue, 5 Sep 2023 13:23:17 -0600 Subject: [PATCH 46/79] Add new empty settings page --- README.md | 2 +- admin/class-jwt-auth-admin.php | 60 ++++++++++++++++++++++++++ includes/class-jwt-auth.php | 18 ++++++++ includes/vendor/composer/installed.php | 4 +- readme.txt | 2 +- 5 files changed, 82 insertions(+), 4 deletions(-) create mode 100644 admin/class-jwt-auth-admin.php diff --git a/README.md b/README.md index 00e9e5d..37d8ff3 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ So, to use the **wp-api-jwt-auth** you need to install and activate [WP REST API ### PHP -**Minimum PHP version: 5.3.0** +**Minimum PHP version: 7.4.0** ### Enable PHP HTTP Authorization Header diff --git a/admin/class-jwt-auth-admin.php b/admin/class-jwt-auth-admin.php new file mode 100644 index 0000000..8dabb39 --- /dev/null +++ b/admin/class-jwt-auth-admin.php @@ -0,0 +1,60 @@ + + * @since 1.3.4 + */ +class Jwt_Auth_Admin { + /** + * The ID of this plugin. + * + * @since 1.3.4 + * + * @var string The ID of this plugin. + */ + private string $plugin_name; + + /** + * The version of this plugin. + * + * @since 1.3.4 + * + * @var string The current version of this plugin. + */ + private string $version; + + /** + * Initialize the class and set its properties. + * + * @param string $plugin_name The name of the plugin. + * @param string $version The version of this plugin. + * + * @since 1.3.4 + */ + public function __construct( string $plugin_name, string $version ) { + $this->plugin_name = $plugin_name; + $this->version = $version; + } + + public function register_menu_page(){ + // Register a new submenu under the Settings top-level menu: + add_submenu_page( + 'options-general.php', + __('JWT Authentication', 'jwt-auth'), + __('JWT Authentication', 'jwt-auth'), + 'manage_options', + 'jwt-authentication', + [$this, 'render_admin_page'] + ); + } + + public function render_admin_page(){ + ?> +

+ load_dependencies(); $this->set_locale(); $this->define_public_hooks(); + $this->define_admin_hooks(); } /** @@ -117,6 +118,12 @@ private function load_dependencies() { */ require_once plugin_dir_path( dirname( __FILE__ ) ) . 'public/class-jwt-auth-public.php'; + /** + * The class responsible for defining all actions that occur in the admin-facing + * side of the site. + */ + require_once plugin_dir_path( dirname( __FILE__ ) ) . 'admin/class-jwt-auth-admin.php'; + $this->loader = new Jwt_Auth_Loader(); } @@ -148,6 +155,17 @@ private function define_public_hooks() { $this->loader->add_filter( 'determine_current_user', $plugin_public, 'determine_current_user' ); } + /** + * Register all the hooks related to the admin-facing functionality + * of the plugin. + * + * @since 1.3.4 + */ + private function define_admin_hooks() { + $plugin_admin = new Jwt_Auth_Admin( $this->get_plugin_name(), $this->get_version() ); + $this->loader->add_action( 'admin_menu', $plugin_admin, 'register_menu_page' ); + } + /** * Run the loader to execute all the hooks with WordPress. * diff --git a/includes/vendor/composer/installed.php b/includes/vendor/composer/installed.php index cd9d36a..ecbd921 100644 --- a/includes/vendor/composer/installed.php +++ b/includes/vendor/composer/installed.php @@ -3,7 +3,7 @@ 'name' => 'tmeister/wp-api-jwt-auth', 'pretty_version' => 'dev-develop', 'version' => 'dev-develop', - 'reference' => 'd91b9b6412fcd1e09102f5c9254481c13ed07f9c', + 'reference' => '54336850307eb4337d80d67066e40b0ed29b1ce5', 'type' => 'wordpress-plugin', 'install_path' => __DIR__ . '/../../../', 'aliases' => array(), @@ -43,7 +43,7 @@ 'tmeister/wp-api-jwt-auth' => array( 'pretty_version' => 'dev-develop', 'version' => 'dev-develop', - 'reference' => 'd91b9b6412fcd1e09102f5c9254481c13ed07f9c', + 'reference' => '54336850307eb4337d80d67066e40b0ed29b1ce5', 'type' => 'wordpress-plugin', 'install_path' => __DIR__ . '/../../../', 'aliases' => array(), diff --git a/readme.txt b/readme.txt index 85e31ff..2bd75a7 100755 --- a/readme.txt +++ b/readme.txt @@ -30,7 +30,7 @@ So, to use the **wp-api-jwt-auth** you need to install and activate [WP REST API ### PHP -**Minimum PHP version: 5.3.0** +**Minimum PHP version: 7.4.0** ### PHP HTTP Authorization Header enable From ab2a271272af0400202557718ec5b557ccf9afe1 Mon Sep 17 00:00:00 2001 From: Enrique Chavez Date: Tue, 5 Sep 2023 20:14:18 -0600 Subject: [PATCH 47/79] feat: Added new settings page - Added Gutenberg based settings page - Added initial plugin settings - Added initial page layout --- .gitignore | 1 + admin/class-jwt-auth-admin.php | 73 +- admin/ui/build/index.asset.php | 1 + admin/ui/build/index.css | 1 + admin/ui/build/index.js | 1 + admin/ui/nvmrc | 1 + admin/ui/package.json | 27 + admin/ui/src/components/cta.js | 19 + admin/ui/src/components/main-view.js | 9 + admin/ui/src/components/settings-screen.js | 41 + admin/ui/src/index.js | 13 + admin/ui/src/index.scss | 40 + admin/ui/yarn.lock | 10912 +++++++++++++++++++ includes/class-jwt-auth.php | 3 + 14 files changed, 11135 insertions(+), 7 deletions(-) create mode 100644 admin/ui/build/index.asset.php create mode 100644 admin/ui/build/index.css create mode 100644 admin/ui/build/index.js create mode 100644 admin/ui/nvmrc create mode 100644 admin/ui/package.json create mode 100644 admin/ui/src/components/cta.js create mode 100644 admin/ui/src/components/main-view.js create mode 100644 admin/ui/src/components/settings-screen.js create mode 100644 admin/ui/src/index.js create mode 100644 admin/ui/src/index.scss create mode 100644 admin/ui/yarn.lock diff --git a/.gitignore b/.gitignore index 0579dfc..1dbdf6e 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ includes/vendor/bin includes/vendor/dealerdirect includes/vendor/squizlabs includes/vendor/wp-coding-standards +admin/ui/node_modules diff --git a/admin/class-jwt-auth-admin.php b/admin/class-jwt-auth-admin.php index 8dabb39..6b300f7 100644 --- a/admin/class-jwt-auth-admin.php +++ b/admin/class-jwt-auth-admin.php @@ -40,21 +40,80 @@ public function __construct( string $plugin_name, string $version ) { $this->version = $version; } - public function register_menu_page(){ + public function register_menu_page() { // Register a new submenu under the Settings top-level menu: add_submenu_page( 'options-general.php', - __('JWT Authentication', 'jwt-auth'), - __('JWT Authentication', 'jwt-auth'), + __( 'JWT Authentication', 'jwt-auth' ), + __( 'JWT Authentication', 'jwt-auth' ), 'manage_options', - 'jwt-authentication', - [$this, 'render_admin_page'] + 'jwt_authentication', + [ $this, 'render_admin_page' ] ); } - public function render_admin_page(){ + public function enqueue_plugin_assets( $suffix ) { + if ( $suffix !== 'settings_page_jwt_authentication' ) { + return null; + } + // get full path to admin/ui/build/index.asset.php + $asset_file = plugin_dir_path( __FILE__ ) . 'ui/build/index.asset.php'; + + // If the asset file do not exist then just return false + if ( ! file_exists( $asset_file ) ) { + return null; + } + + // Get the asset file + $asset = require_once $asset_file; + // Enqueue the script files based on the asset file + wp_enqueue_script( + $this->plugin_name . '-settings', + plugins_url(http://github.com/'ui/build/index.js',%20__FILE__), + $asset['dependencies'], + $asset['version'], + [ + 'in_footer' => true, + ] + ); + + // Enqueue the style file for the Gutenberg components + foreach ( $asset['dependencies'] as $style ) { + wp_enqueue_style( $style ); + } + + // Enqueue the style file + wp_enqueue_style( + $this->plugin_name . '-settings', + plugins_url(http://github.com/'ui/build/index.css',%20__FILE__), + [], + $asset['version'] + ); + } + + public function register_plugin_settings() { + register_setting( 'jwt_auth', 'jwt_auth_options', [ + 'type' => 'object', + 'default' => [ + 'share_data' => false, + ], + 'show_in_rest' => [ + 'schema' => [ + 'type' => 'object', + 'properties' => [ + 'share_data' => [ + 'type' => 'boolean', + 'default' => false, + ], + ], + ], + ] + ] ); + } + + public function render_admin_page() { ?> -
Here my boi
+
array('wp-core-data', 'wp-data', 'wp-element'), 'version' => 'e8fe4187f9575f448963'); diff --git a/admin/ui/build/index.css b/admin/ui/build/index.css new file mode 100644 index 0000000..2b8ceb8 --- /dev/null +++ b/admin/ui/build/index.css @@ -0,0 +1 @@ +.jwt-auth-box{border:1px solid #ddd;border-radius:4px;box-shadow:0 0 10px rgba(0,0,0,.1);padding:1rem;position:relative}.jwt-auth-settings{display:flex;gap:2rem;margin-top:2rem}.jwt-auth-settings .jwt-auth-options{width:66.6%}.jwt-auth-settings .jwt-auth-cta{max-width:360px;width:33.3%}.jwt-auth-settings .jwt-auth-cta .jwt-auth-cta-wrapper{display:inline-block;position:relative;width:100%}.jwt-auth-settings .jwt-auth-cta .jwt-auth-cta-wrapper .jwt-auth-cta-button{background:#0073aa;border-radius:4px;color:#fff;display:block;font-size:1rem;padding:1rem;text-align:center;text-decoration:none} diff --git a/admin/ui/build/index.js b/admin/ui/build/index.js new file mode 100644 index 0000000..058e808 --- /dev/null +++ b/admin/ui/build/index.js @@ -0,0 +1 @@ +!function(){"use strict";var e=window.wp.element,t=window.wp.coreData,a=window.wp.data,n=()=>(0,e.createElement)("div",{className:"jwt-auth-cta jwt-auth-box"},(0,e.createElement)("h3",null,"Need Freelance Support?"),(0,e.createElement)("p",null,"Hello! I'm ",(0,e.createElement)("a",{href:"#"},"Enrique Chavez"),", a freelance WordPress developer. I've been working with WordPress for over 10 years and I'd love to help you with your next project."),(0,e.createElement)("div",{className:"jwt-auth-cta-wrapper"},(0,e.createElement)("a",{href:"#",className:"jwt-auth-cta-button"},"Get in touch"))),r=()=>(0,e.createElement)("div",{className:"jwt-auth-options"},(0,e.createElement)("div",{className:"jwt-auth-box"},"Intro")),l=()=>{const[l,c]=(0,t.useEntityProp)("root","site","jwt_auth_options"),{saveEditedEntityRecord:o}=(0,a.useDispatch)("core");return(0,e.createElement)("div",{className:"wrap"},(0,e.createElement)("h1",{className:"wp-heading-inline"},"JWT Authentication"),l&&(0,e.createElement)("div",{className:"jwt-auth-settings"},(0,e.createElement)(r,null),(0,e.createElement)(n,null)))};const c=document.getElementById("jwt-auth-holder");e.createRoot?(0,e.createRoot)(c).render((0,e.createElement)(l,null)):(0,e.render)((0,e.createElement)(l,null),c)}(); \ No newline at end of file diff --git a/admin/ui/nvmrc b/admin/ui/nvmrc new file mode 100644 index 0000000..5e0828a --- /dev/null +++ b/admin/ui/nvmrc @@ -0,0 +1 @@ +v18.16.1 diff --git a/admin/ui/package.json b/admin/ui/package.json new file mode 100644 index 0000000..e120f9e --- /dev/null +++ b/admin/ui/package.json @@ -0,0 +1,27 @@ +{ + "name": "jwt-auth-admin-ui", + "version": "1.0.0", + "main": "build/index.js", + "license": "GPL-2.0-or-later", + "author": "Enrique Chavez", + "scripts": { + "build": "wp-scripts build", + "start": "wp-scripts start", + "format": "wp-scripts format", + "lint:js": "wp-scripts lint-js", + "lint:js:fix": "wp-scripts lint-js --fix", + "lint:css": "wp-scripts lint-css", + "lint:css:fix": "wp-scripts lint-css --fix", + "packages-update": "wp-scripts packages-update" + }, + "devDependencies": { + "@wordpress/scripts": "^26.12.0" + }, + "dependencies": { + "@wordpress/api-fetch": "^6.38.0", + "@wordpress/components": "^25.7.0", + "@wordpress/core-data": "^6.18.0", + "@wordpress/data": "^9.11.0", + "@wordpress/element": "^5.18.0" + } +} diff --git a/admin/ui/src/components/cta.js b/admin/ui/src/components/cta.js new file mode 100644 index 0000000..db9db09 --- /dev/null +++ b/admin/ui/src/components/cta.js @@ -0,0 +1,19 @@ +const CTA = () => { + return ( +
+

Need Freelance Support?

+

+ Hello! I'm Enrique Chavez, a freelance WordPress + developer. I've been working with WordPress for over 10 years + and I'd love to help you with your next project. +

+ +
+ ); +}; + +export default CTA; diff --git a/admin/ui/src/components/main-view.js b/admin/ui/src/components/main-view.js new file mode 100644 index 0000000..f2a7fb4 --- /dev/null +++ b/admin/ui/src/components/main-view.js @@ -0,0 +1,9 @@ +const MainView = () => { + return ( +
+
Intro
+
+ ); +}; + +export default MainView; diff --git a/admin/ui/src/components/settings-screen.js b/admin/ui/src/components/settings-screen.js new file mode 100644 index 0000000..d1d2f42 --- /dev/null +++ b/admin/ui/src/components/settings-screen.js @@ -0,0 +1,41 @@ +import { useEntityProp } from '@wordpress/core-data'; +import { useDispatch } from '@wordpress/data'; + +import CTA from './cta'; +import MainView from './main-view'; + +const SettingsScreen = () => { + // Get the plugin settings + const [ settings, setSettings ] = useEntityProp( + 'root', + 'site', + 'jwt_auth_options' + ); + // Get the save edited entity record function + const { saveEditedEntityRecord } = useDispatch( 'core' ); + + // Handle the save settings action + const saveSettings = () => { + // Update the settings values + setSettings( { + ...settings, + share_data: ! settings.share_data, + } ); + + // Save the settings + saveEditedEntityRecord( 'root', 'site' ); + }; + return ( +
+

JWT Authentication

+ { settings && ( +
+ + +
+ ) } +
+ ); +}; + +export default SettingsScreen; diff --git a/admin/ui/src/index.js b/admin/ui/src/index.js new file mode 100644 index 0000000..bd1646f --- /dev/null +++ b/admin/ui/src/index.js @@ -0,0 +1,13 @@ +import './index.scss'; +import { createRoot, render } from '@wordpress/element'; + +const domElement = document.getElementById( 'jwt-auth-holder' ); +// Internal dependencies +import SettingsScreen from './components/settings-screen'; + +// Mounts the main component to the DOM. +if ( createRoot ) { + createRoot( domElement ).render( ); +} else { + render( , domElement ); +} diff --git a/admin/ui/src/index.scss b/admin/ui/src/index.scss new file mode 100644 index 0000000..9148e99 --- /dev/null +++ b/admin/ui/src/index.scss @@ -0,0 +1,40 @@ +.jwt-auth-box { + border: 1px solid #ddd; + border-radius: 4px; + box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); + padding: 1rem; + position: relative; +} + +.jwt-auth-settings { + margin-top: 2rem; + display: flex; + gap: 2rem; + + .jwt-auth-options { + width: 66.6%; + } + + .jwt-auth-cta { + width: 33.3%; + max-width: 360px; + + + .jwt-auth-cta-wrapper { + position: relative; + display: inline-block; + width: 100%; + + .jwt-auth-cta-button { + display: block; + text-align: center; + padding: 1rem; + border-radius: 4px; + background: #0073aa; + color: #fff; + text-decoration: none; + font-size: 1rem; + } + } + } +} diff --git a/admin/ui/yarn.lock b/admin/ui/yarn.lock new file mode 100644 index 0000000..edadd0f --- /dev/null +++ b/admin/ui/yarn.lock @@ -0,0 +1,10912 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@aashutoshrathi/word-wrap@^1.2.3": + version "1.2.6" + resolved "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz" + integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== + +"@ampproject/remapping@^2.2.0": + version "2.2.1" + resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.1.tgz" + integrity sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg== + dependencies: + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@ariakit/core@0.2.9": + version "0.2.9" + resolved "https://registry.npmjs.org/@ariakit/core/-/core-0.2.9.tgz" + integrity sha512-BIEfY3AHImIc8R5j5DaBrEBKLlki5f0vqZbs56I0xQb12ssjn5VqpLr8Jl4v7DBm5S4ktTgeHjLloTppKFdABg== + +"@ariakit/react-core@0.2.17": + version "0.2.17" + resolved "https://registry.npmjs.org/@ariakit/react-core/-/react-core-0.2.17.tgz" + integrity sha512-y8pHUR2lMcYHUontd33lpnenOBIT8E72IhbMQq/aROQHAevNxLr0JtSkQ+G439N9DfCpKxDaErikss6zqCEGGQ== + dependencies: + "@ariakit/core" "0.2.9" + "@floating-ui/dom" "^1.0.0" + use-sync-external-store "^1.2.0" + +"@ariakit/react@^0.2.12": + version "0.2.17" + resolved "https://registry.npmjs.org/@ariakit/react/-/react-0.2.17.tgz" + integrity sha512-fJG0JBoACasyIVb+K9rW1Vyo7gI5Iseu1sP3WvIMnt5VdWjC/63NLpBHdnwQLhSx4z83pBPY6zKfPmEJa9fYug== + dependencies: + "@ariakit/react-core" "0.2.17" + +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.22.13": + version "7.22.13" + resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz" + integrity sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w== + dependencies: + "@babel/highlight" "^7.22.13" + chalk "^2.4.2" + +"@babel/compat-data@^7.22.6", "@babel/compat-data@^7.22.9": + version "7.22.9" + resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.22.9.tgz" + integrity sha512-5UamI7xkUcJ3i9qVDS+KFDEK8/7oJ55/sJMB1Ge7IEapr7KfdfV/HErR+koZwOfd+SgtFKOKRhRakdg++DcJpQ== + +"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.16.0", "@babel/core@^7.21.3": + version "7.22.15" + resolved "https://registry.npmjs.org/@babel/core/-/core-7.22.15.tgz" + integrity sha512-PtZqMmgRrvj8ruoEOIwVA3yoF91O+Hgw9o7DAUTNBA6Mo2jpu31clx9a7Nz/9JznqetTR6zwfC4L3LAjKQXUwA== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.22.13" + "@babel/generator" "^7.22.15" + "@babel/helper-compilation-targets" "^7.22.15" + "@babel/helper-module-transforms" "^7.22.15" + "@babel/helpers" "^7.22.15" + "@babel/parser" "^7.22.15" + "@babel/template" "^7.22.15" + "@babel/traverse" "^7.22.15" + "@babel/types" "^7.22.15" + convert-source-map "^1.7.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.3" + semver "^6.3.1" + +"@babel/eslint-parser@^7.16.0": + version "7.22.15" + resolved "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.22.15.tgz" + integrity sha512-yc8OOBIQk1EcRrpizuARSQS0TWAcOMpEJ1aafhNznaeYkeL+OhqnDObGFylB8ka8VFF/sZc+S4RzHyO+3LjQxg== + dependencies: + "@nicolo-ribaudo/eslint-scope-5-internals" "5.1.1-v1" + eslint-visitor-keys "^2.1.0" + semver "^6.3.1" + +"@babel/generator@^7.22.15", "@babel/generator@^7.7.2": + version "7.22.15" + resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.22.15.tgz" + integrity sha512-Zu9oWARBqeVOW0dZOjXc3JObrzuqothQ3y/n1kUtrjCoCPLkXUwMvOo/F/TCfoHMbWIFlWwpZtkZVb9ga4U2pA== + dependencies: + "@babel/types" "^7.22.15" + "@jridgewell/gen-mapping" "^0.3.2" + "@jridgewell/trace-mapping" "^0.3.17" + jsesc "^2.5.1" + +"@babel/helper-annotate-as-pure@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz" + integrity sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-builder-binary-assignment-operator-visitor@^7.22.5": + version "7.22.15" + resolved "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz" + integrity sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw== + dependencies: + "@babel/types" "^7.22.15" + +"@babel/helper-compilation-targets@^7.22.15", "@babel/helper-compilation-targets@^7.22.5", "@babel/helper-compilation-targets@^7.22.6": + version "7.22.15" + resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz" + integrity sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw== + dependencies: + "@babel/compat-data" "^7.22.9" + "@babel/helper-validator-option" "^7.22.15" + browserslist "^4.21.9" + lru-cache "^5.1.1" + semver "^6.3.1" + +"@babel/helper-create-class-features-plugin@^7.22.11", "@babel/helper-create-class-features-plugin@^7.22.15", "@babel/helper-create-class-features-plugin@^7.22.5": + version "7.22.15" + resolved "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz" + integrity sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-member-expression-to-functions" "^7.22.15" + "@babel/helper-optimise-call-expression" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + semver "^6.3.1" + +"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.22.5": + version "7.22.15" + resolved "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz" + integrity sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + regexpu-core "^5.3.1" + semver "^6.3.1" + +"@babel/helper-define-polyfill-provider@^0.4.2": + version "0.4.2" + resolved "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.2.tgz" + integrity sha512-k0qnnOqHn5dK9pZpfD5XXZ9SojAITdCKRn2Lp6rnDGzIbaP0rHyMPk/4wsSxVBVz4RfN0q6VpXWP2pDGIoQ7hw== + 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" + +"@babel/helper-environment-visitor@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.5.tgz" + integrity sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q== + +"@babel/helper-function-name@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.22.5.tgz" + integrity sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ== + dependencies: + "@babel/template" "^7.22.5" + "@babel/types" "^7.22.5" + +"@babel/helper-hoist-variables@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz" + integrity sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-member-expression-to-functions@^7.22.15", "@babel/helper-member-expression-to-functions@^7.22.5": + version "7.22.15" + resolved "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.22.15.tgz" + integrity sha512-qLNsZbgrNh0fDQBCPocSL8guki1hcPvltGDv/NxvUoABwFq7GkKSu1nRXeJkVZc+wJvne2E0RKQz+2SQrz6eAA== + dependencies: + "@babel/types" "^7.22.15" + +"@babel/helper-module-imports@^7.16.7", "@babel/helper-module-imports@^7.22.15", "@babel/helper-module-imports@^7.22.5": + version "7.22.15" + resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz" + integrity sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w== + dependencies: + "@babel/types" "^7.22.15" + +"@babel/helper-module-transforms@^7.22.15", "@babel/helper-module-transforms@^7.22.5", "@babel/helper-module-transforms@^7.22.9": + version "7.22.15" + resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.22.15.tgz" + integrity sha512-l1UiX4UyHSFsYt17iQ3Se5pQQZZHa22zyIXURmvkmLCD4t/aU+dvNWHatKac/D9Vm9UES7nvIqHs4jZqKviUmQ== + dependencies: + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-module-imports" "^7.22.15" + "@babel/helper-simple-access" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/helper-validator-identifier" "^7.22.15" + +"@babel/helper-optimise-call-expression@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz" + integrity sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz" + integrity sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg== + +"@babel/helper-remap-async-to-generator@^7.22.5", "@babel/helper-remap-async-to-generator@^7.22.9": + version "7.22.9" + resolved "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.9.tgz" + integrity sha512-8WWC4oR4Px+tr+Fp0X3RHDVfINGpF3ad1HIbrc8A77epiR6eMMc6jsgozkzT2uDiOOdoS9cLIQ+XD2XvI2WSmQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-wrap-function" "^7.22.9" + +"@babel/helper-replace-supers@^7.22.5", "@babel/helper-replace-supers@^7.22.9": + version "7.22.9" + resolved "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.9.tgz" + integrity sha512-LJIKvvpgPOPUThdYqcX6IXRuIcTkcAub0IaDRGCZH0p5GPUp7PhRU9QVgFcDDd51BaPkk77ZjqFwh6DZTAEmGg== + dependencies: + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-member-expression-to-functions" "^7.22.5" + "@babel/helper-optimise-call-expression" "^7.22.5" + +"@babel/helper-simple-access@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz" + integrity sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-skip-transparent-expression-wrappers@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz" + integrity sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-split-export-declaration@^7.22.6": + version "7.22.6" + resolved "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz" + integrity sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g== + dependencies: + "@babel/types" "^7.22.5" + +"@babel/helper-string-parser@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz" + integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw== + +"@babel/helper-validator-identifier@^7.22.15", "@babel/helper-validator-identifier@^7.22.5": + version "7.22.15" + resolved "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.15.tgz" + integrity sha512-4E/F9IIEi8WR94324mbDUMo074YTheJmd7eZF5vITTeYchqAi6sYXRLHUVsmkdmY4QjfKTcB2jB7dVP3NaBElQ== + +"@babel/helper-validator-option@^7.22.15": + version "7.22.15" + resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz" + integrity sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA== + +"@babel/helper-wrap-function@^7.22.9": + version "7.22.10" + resolved "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.10.tgz" + integrity sha512-OnMhjWjuGYtdoO3FmsEFWvBStBAe2QOgwOLsLNDjN+aaiMD8InJk1/O3HSD8lkqTjCgg5YI34Tz15KNNA3p+nQ== + dependencies: + "@babel/helper-function-name" "^7.22.5" + "@babel/template" "^7.22.5" + "@babel/types" "^7.22.10" + +"@babel/helpers@^7.22.15": + version "7.22.15" + resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.15.tgz" + integrity sha512-7pAjK0aSdxOwR+CcYAqgWOGy5dcfvzsTIfFTb2odQqW47MDfv14UaJDY6eng8ylM2EaeKXdxaSWESbkmaQHTmw== + dependencies: + "@babel/template" "^7.22.15" + "@babel/traverse" "^7.22.15" + "@babel/types" "^7.22.15" + +"@babel/highlight@^7.22.13": + version "7.22.13" + resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.13.tgz" + integrity sha512-C/BaXcnnvBCmHTpz/VGZ8jgtE2aYlW4hxDhseJAWZb7gqGM/qtCK6iZUb0TyKFf7BOUsBH7Q7fkRsDRhg1XklQ== + dependencies: + "@babel/helper-validator-identifier" "^7.22.5" + chalk "^2.4.2" + js-tokens "^4.0.0" + +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.22.15": + version "7.22.15" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.22.15.tgz" + integrity sha512-RWmQ/sklUN9BvGGpCDgSubhHWfAx24XDTDObup4ffvxaYsptOg2P3KG0j+1eWKLxpkX0j0uHxmpq2Z1SP/VhxA== + +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.22.15": + version "7.22.15" + resolved "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.15.tgz" + integrity sha512-FB9iYlz7rURmRJyXRKEnalYPPdn87H5no108cyuQQyMwlpJ2SJtpIUBI27kdTin956pz+LPypkPVPUTlxOmrsg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.22.15": + version "7.22.15" + resolved "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.15.tgz" + integrity sha512-Hyph9LseGvAeeXzikV88bczhsrLrIZqDPxO+sSmAunMPaGrBGhfMWzCPYTtiW9t+HzSE2wtV8e5cc5P6r1xMDQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/plugin-transform-optional-chaining" "^7.22.15" + +"@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2": + 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== + +"@babel/plugin-syntax-async-generators@^7.8.4": + 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== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-bigint@^7.8.3": + 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== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-class-properties@^7.12.13", "@babel/plugin-syntax-class-properties@^7.8.3": + 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== + dependencies: + "@babel/helper-plugin-utils" "^7.12.13" + +"@babel/plugin-syntax-class-static-block@^7.14.5": + 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== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-dynamic-import@^7.8.3": + 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== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-export-namespace-from@^7.8.3": + 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== + dependencies: + "@babel/helper-plugin-utils" "^7.8.3" + +"@babel/plugin-syntax-import-assertions@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz" + integrity sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-syntax-import-attributes@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.5.tgz" + integrity sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-syntax-import-meta@^7.10.4", "@babel/plugin-syntax-import-meta@^7.8.3": + 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== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-json-strings@^7.8.3": + 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== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-jsx@^7.22.5", "@babel/plugin-syntax-jsx@^7.7.2": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.22.5.tgz" + integrity sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-syntax-logical-assignment-operators@^7.10.4", "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": + 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== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3": + 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== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-numeric-separator@^7.10.4", "@babel/plugin-syntax-numeric-separator@^7.8.3": + 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== + dependencies: + "@babel/helper-plugin-utils" "^7.10.4" + +"@babel/plugin-syntax-object-rest-spread@^7.8.3": + 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== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-catch-binding@^7.8.3": + 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== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-optional-chaining@^7.8.3": + 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== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-private-property-in-object@^7.14.5": + 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== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-top-level-await@^7.14.5", "@babel/plugin-syntax-top-level-await@^7.8.3": + 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== + dependencies: + "@babel/helper-plugin-utils" "^7.14.5" + +"@babel/plugin-syntax-typescript@^7.22.5", "@babel/plugin-syntax-typescript@^7.7.2": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.22.5.tgz" + integrity sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-syntax-unicode-sets-regex@^7.18.6": + 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== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-arrow-functions@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz" + integrity sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-async-generator-functions@^7.22.15": + version "7.22.15" + resolved "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.22.15.tgz" + integrity sha512-jBm1Es25Y+tVoTi5rfd5t1KLmL8ogLKpXszboWOTTtGFGz2RKnQe2yn7HbZ+kb/B8N0FVSGQo874NSlOU1T4+w== + dependencies: + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-remap-async-to-generator" "^7.22.9" + "@babel/plugin-syntax-async-generators" "^7.8.4" + +"@babel/plugin-transform-async-to-generator@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz" + integrity sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ== + dependencies: + "@babel/helper-module-imports" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-remap-async-to-generator" "^7.22.5" + +"@babel/plugin-transform-block-scoped-functions@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz" + integrity sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-block-scoping@^7.22.15": + version "7.22.15" + resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.22.15.tgz" + integrity sha512-G1czpdJBZCtngoK1sJgloLiOHUnkb/bLZwqVZD8kXmq0ZnVfTTWUcs9OWtp0mBtYJ+4LQY1fllqBkOIPhXmFmw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-class-properties@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.5.tgz" + integrity sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-class-static-block@^7.22.11": + version "7.22.11" + resolved "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.11.tgz" + integrity sha512-GMM8gGmqI7guS/llMFk1bJDkKfn3v3C4KHK9Yg1ey5qcHcOlKb0QvcMrgzvxo+T03/4szNh5lghY+fEC98Kq9g== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.22.11" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + +"@babel/plugin-transform-classes@^7.22.15": + version "7.22.15" + resolved "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.15.tgz" + integrity sha512-VbbC3PGjBdE0wAWDdHM9G8Gm977pnYI0XpqMd6LrKISj8/DJXEsWqgRuTYaNE9Bv0JGhTZUzHDlMk18IpOuoqw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-compilation-targets" "^7.22.15" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-optimise-call-expression" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.9" + "@babel/helper-split-export-declaration" "^7.22.6" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz" + integrity sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/template" "^7.22.5" + +"@babel/plugin-transform-destructuring@^7.22.15": + version "7.22.15" + resolved "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.22.15.tgz" + integrity sha512-HzG8sFl1ZVGTme74Nw+X01XsUTqERVQ6/RLHo3XjGRzm7XD6QTtfS3NJotVgCGy8BzkDqRjRBD8dAyJn5TuvSQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-dotall-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz" + integrity sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-duplicate-keys@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz" + integrity sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-dynamic-import@^7.22.11": + version "7.22.11" + resolved "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.11.tgz" + integrity sha512-g/21plo58sfteWjaO0ZNVb+uEOkJNjAaHhbejrnBmu011l/eNDScmkbjCC3l4FKb10ViaGU4aOkFznSu2zRHgA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + +"@babel/plugin-transform-exponentiation-operator@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz" + integrity sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g== + dependencies: + "@babel/helper-builder-binary-assignment-operator-visitor" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-export-namespace-from@^7.22.11": + version "7.22.11" + resolved "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.11.tgz" + integrity sha512-xa7aad7q7OiT8oNZ1mU7NrISjlSkVdMbNxn9IuLZyL9AJEhs1Apba3I+u5riX1dIkdptP5EKDG5XDPByWxtehw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + +"@babel/plugin-transform-for-of@^7.22.15": + version "7.22.15" + resolved "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.15.tgz" + integrity sha512-me6VGeHsx30+xh9fbDLLPi0J1HzmeIIyenoOQHuw2D4m2SAU3NrspX5XxJLBpqn5yrLzrlw2Iy3RA//Bx27iOA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-function-name@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz" + integrity sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg== + dependencies: + "@babel/helper-compilation-targets" "^7.22.5" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-json-strings@^7.22.11": + version "7.22.11" + resolved "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.11.tgz" + integrity sha512-CxT5tCqpA9/jXFlme9xIBCc5RPtdDq3JpkkhgHQqtDdiTnTI0jtZ0QzXhr5DILeYifDPp2wvY2ad+7+hLMW5Pw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-json-strings" "^7.8.3" + +"@babel/plugin-transform-literals@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz" + integrity sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-logical-assignment-operators@^7.22.11": + version "7.22.11" + resolved "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.11.tgz" + integrity sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + +"@babel/plugin-transform-member-expression-literals@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz" + integrity sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-modules-amd@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.22.5.tgz" + integrity sha512-R+PTfLTcYEmb1+kK7FNkhQ1gP4KgjpSO6HfH9+f8/yfp2Nt3ggBjiVpRwmwTlfqZLafYKJACy36yDXlEmI9HjQ== + dependencies: + "@babel/helper-module-transforms" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-modules-commonjs@^7.22.15": + version "7.22.15" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.22.15.tgz" + integrity sha512-jWL4eh90w0HQOTKP2MoXXUpVxilxsB2Vl4ji69rSjS3EcZ/v4sBmn+A3NpepuJzBhOaEBbR7udonlHHn5DWidg== + dependencies: + "@babel/helper-module-transforms" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-simple-access" "^7.22.5" + +"@babel/plugin-transform-modules-systemjs@^7.22.11": + version "7.22.11" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.22.11.tgz" + integrity sha512-rIqHmHoMEOhI3VkVf5jQ15l539KrwhzqcBO6wdCNWPWc/JWt9ILNYNUssbRpeq0qWns8svuw8LnMNCvWBIJ8wA== + dependencies: + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-module-transforms" "^7.22.9" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.5" + +"@babel/plugin-transform-modules-umd@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz" + integrity sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ== + dependencies: + "@babel/helper-module-transforms" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz" + integrity sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-new-target@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz" + integrity sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-nullish-coalescing-operator@^7.22.11": + version "7.22.11" + resolved "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.11.tgz" + integrity sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + +"@babel/plugin-transform-numeric-separator@^7.22.11": + version "7.22.11" + resolved "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.11.tgz" + integrity sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-numeric-separator" "^7.10.4" + +"@babel/plugin-transform-object-rest-spread@^7.22.15": + version "7.22.15" + resolved "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.15.tgz" + integrity sha512-fEB+I1+gAmfAyxZcX1+ZUwLeAuuf8VIg67CTznZE0MqVFumWkh8xWtn58I4dxdVf080wn7gzWoF8vndOViJe9Q== + dependencies: + "@babel/compat-data" "^7.22.9" + "@babel/helper-compilation-targets" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.22.15" + +"@babel/plugin-transform-object-super@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz" + integrity sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.5" + +"@babel/plugin-transform-optional-catch-binding@^7.22.11": + version "7.22.11" + resolved "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.11.tgz" + integrity sha512-rli0WxesXUeCJnMYhzAglEjLWVDF6ahb45HuprcmQuLidBJFWjNnOzssk2kuc6e33FlLaiZhG/kUIzUMWdBKaQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" + +"@babel/plugin-transform-optional-chaining@^7.22.15": + version "7.22.15" + resolved "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.22.15.tgz" + integrity sha512-ngQ2tBhq5vvSJw2Q2Z9i7ealNkpDMU0rGWnHPKqRZO0tzZ5tlaoz4hDvhXioOoaE0X2vfNss1djwg0DXlfu30A== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + "@babel/plugin-syntax-optional-chaining" "^7.8.3" + +"@babel/plugin-transform-parameters@^7.22.15": + version "7.22.15" + resolved "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.15.tgz" + integrity sha512-hjk7qKIqhyzhhUvRT683TYQOFa/4cQKwQy7ALvTpODswN40MljzNDa0YldevS6tGbxwaEKVn502JmY0dP7qEtQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-private-methods@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.5.tgz" + integrity sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-private-property-in-object@^7.22.11": + version "7.22.11" + resolved "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.11.tgz" + integrity sha512-sSCbqZDBKHetvjSwpyWzhuHkmW5RummxJBVbYLkGkaiTOWGxml7SXt0iWa03bzxFIx7wOj3g/ILRd0RcJKBeSQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-create-class-features-plugin" "^7.22.11" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-private-property-in-object" "^7.14.5" + +"@babel/plugin-transform-property-literals@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz" + integrity sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-react-constant-elements@^7.21.3": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.22.5.tgz" + integrity sha512-BF5SXoO+nX3h5OhlN78XbbDrBOffv+AxPP2ENaJOVqjWCgBDeOY3WcaUcddutGSfoap+5NEQ/q/4I3WZIvgkXA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-react-display-name@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.22.5.tgz" + integrity sha512-PVk3WPYudRF5z4GKMEYUrLjPl38fJSKNaEOkFuoprioowGuWN6w2RKznuFNSlJx7pzzXXStPUnNSOEO0jL5EVw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-react-jsx-development@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.22.5.tgz" + integrity sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A== + dependencies: + "@babel/plugin-transform-react-jsx" "^7.22.5" + +"@babel/plugin-transform-react-jsx@^7.16.0", "@babel/plugin-transform-react-jsx@^7.22.15", "@babel/plugin-transform-react-jsx@^7.22.5": + version "7.22.15" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.22.15.tgz" + integrity sha512-oKckg2eZFa8771O/5vi7XeTvmM6+O9cxZu+kanTU7tD4sin5nO/G8jGJhq8Hvt2Z0kUoEDRayuZLaUlYl8QuGA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-module-imports" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-jsx" "^7.22.5" + "@babel/types" "^7.22.15" + +"@babel/plugin-transform-react-pure-annotations@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.22.5.tgz" + integrity sha512-gP4k85wx09q+brArVinTXhWiyzLl9UpmGva0+mWyKxk6JZequ05x3eUcIUE+FyttPKJFRRVtAvQaJ6YF9h1ZpA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-regenerator@^7.22.10": + version "7.22.10" + resolved "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.10.tgz" + integrity sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + regenerator-transform "^0.15.2" + +"@babel/plugin-transform-reserved-words@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz" + integrity sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-runtime@^7.16.0": + version "7.22.15" + resolved "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.22.15.tgz" + integrity sha512-tEVLhk8NRZSmwQ0DJtxxhTrCht1HVo8VaMzYT4w6lwyKBuHsgoioAUA7/6eT2fRfc5/23fuGdlwIxXhRVgWr4g== + dependencies: + "@babel/helper-module-imports" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + babel-plugin-polyfill-corejs2 "^0.4.5" + babel-plugin-polyfill-corejs3 "^0.8.3" + babel-plugin-polyfill-regenerator "^0.5.2" + semver "^6.3.1" + +"@babel/plugin-transform-shorthand-properties@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz" + integrity sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-spread@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz" + integrity sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" + +"@babel/plugin-transform-sticky-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz" + integrity sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-template-literals@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz" + integrity sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-typeof-symbol@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz" + integrity sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-typescript@^7.22.15": + version "7.22.15" + resolved "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.22.15.tgz" + integrity sha512-1uirS0TnijxvQLnlv5wQBwOX3E1wCFX7ITv+9pBV2wKEk4K+M5tqDaoNXnTH8tjEIYHLO98MwiTWO04Ggz4XuA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-create-class-features-plugin" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/plugin-syntax-typescript" "^7.22.5" + +"@babel/plugin-transform-unicode-escapes@^7.22.10": + version "7.22.10" + resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.10.tgz" + integrity sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-unicode-property-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.5.tgz" + integrity sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-unicode-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz" + integrity sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/plugin-transform-unicode-sets-regex@^7.22.5": + version "7.22.5" + resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.5.tgz" + integrity sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.22.5" + "@babel/helper-plugin-utils" "^7.22.5" + +"@babel/preset-env@^7.16.0", "@babel/preset-env@^7.20.2": + version "7.22.15" + resolved "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.22.15.tgz" + integrity sha512-tZFHr54GBkHk6hQuVA8w4Fmq+MSPsfvMG0vPnOYyTnJpyfMqybL8/MbNCPRT9zc2KBO2pe4tq15g6Uno4Jpoag== + dependencies: + "@babel/compat-data" "^7.22.9" + "@babel/helper-compilation-targets" "^7.22.15" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-option" "^7.22.15" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.22.15" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.22.15" + "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2" + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-class-properties" "^7.12.13" + "@babel/plugin-syntax-class-static-block" "^7.14.5" + "@babel/plugin-syntax-dynamic-import" "^7.8.3" + "@babel/plugin-syntax-export-namespace-from" "^7.8.3" + "@babel/plugin-syntax-import-assertions" "^7.22.5" + "@babel/plugin-syntax-import-attributes" "^7.22.5" + "@babel/plugin-syntax-import-meta" "^7.10.4" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" + "@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.22.5" + "@babel/plugin-transform-async-generator-functions" "^7.22.15" + "@babel/plugin-transform-async-to-generator" "^7.22.5" + "@babel/plugin-transform-block-scoped-functions" "^7.22.5" + "@babel/plugin-transform-block-scoping" "^7.22.15" + "@babel/plugin-transform-class-properties" "^7.22.5" + "@babel/plugin-transform-class-static-block" "^7.22.11" + "@babel/plugin-transform-classes" "^7.22.15" + "@babel/plugin-transform-computed-properties" "^7.22.5" + "@babel/plugin-transform-destructuring" "^7.22.15" + "@babel/plugin-transform-dotall-regex" "^7.22.5" + "@babel/plugin-transform-duplicate-keys" "^7.22.5" + "@babel/plugin-transform-dynamic-import" "^7.22.11" + "@babel/plugin-transform-exponentiation-operator" "^7.22.5" + "@babel/plugin-transform-export-namespace-from" "^7.22.11" + "@babel/plugin-transform-for-of" "^7.22.15" + "@babel/plugin-transform-function-name" "^7.22.5" + "@babel/plugin-transform-json-strings" "^7.22.11" + "@babel/plugin-transform-literals" "^7.22.5" + "@babel/plugin-transform-logical-assignment-operators" "^7.22.11" + "@babel/plugin-transform-member-expression-literals" "^7.22.5" + "@babel/plugin-transform-modules-amd" "^7.22.5" + "@babel/plugin-transform-modules-commonjs" "^7.22.15" + "@babel/plugin-transform-modules-systemjs" "^7.22.11" + "@babel/plugin-transform-modules-umd" "^7.22.5" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.22.5" + "@babel/plugin-transform-new-target" "^7.22.5" + "@babel/plugin-transform-nullish-coalescing-operator" "^7.22.11" + "@babel/plugin-transform-numeric-separator" "^7.22.11" + "@babel/plugin-transform-object-rest-spread" "^7.22.15" + "@babel/plugin-transform-object-super" "^7.22.5" + "@babel/plugin-transform-optional-catch-binding" "^7.22.11" + "@babel/plugin-transform-optional-chaining" "^7.22.15" + "@babel/plugin-transform-parameters" "^7.22.15" + "@babel/plugin-transform-private-methods" "^7.22.5" + "@babel/plugin-transform-private-property-in-object" "^7.22.11" + "@babel/plugin-transform-property-literals" "^7.22.5" + "@babel/plugin-transform-regenerator" "^7.22.10" + "@babel/plugin-transform-reserved-words" "^7.22.5" + "@babel/plugin-transform-shorthand-properties" "^7.22.5" + "@babel/plugin-transform-spread" "^7.22.5" + "@babel/plugin-transform-sticky-regex" "^7.22.5" + "@babel/plugin-transform-template-literals" "^7.22.5" + "@babel/plugin-transform-typeof-symbol" "^7.22.5" + "@babel/plugin-transform-unicode-escapes" "^7.22.10" + "@babel/plugin-transform-unicode-property-regex" "^7.22.5" + "@babel/plugin-transform-unicode-regex" "^7.22.5" + "@babel/plugin-transform-unicode-sets-regex" "^7.22.5" + "@babel/preset-modules" "0.1.6-no-external-plugins" + "@babel/types" "^7.22.15" + babel-plugin-polyfill-corejs2 "^0.4.5" + babel-plugin-polyfill-corejs3 "^0.8.3" + babel-plugin-polyfill-regenerator "^0.5.2" + core-js-compat "^3.31.0" + semver "^6.3.1" + +"@babel/preset-modules@0.1.6-no-external-plugins": + 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== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/types" "^7.4.4" + esutils "^2.0.2" + +"@babel/preset-react@^7.18.6": + version "7.22.15" + resolved "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.22.15.tgz" + integrity sha512-Csy1IJ2uEh/PecCBXXoZGAZBeCATTuePzCSB7dLYWS0vOEj6CNpjxIhW4duWwZodBNueH7QO14WbGn8YyeuN9w== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-option" "^7.22.15" + "@babel/plugin-transform-react-display-name" "^7.22.5" + "@babel/plugin-transform-react-jsx" "^7.22.15" + "@babel/plugin-transform-react-jsx-development" "^7.22.5" + "@babel/plugin-transform-react-pure-annotations" "^7.22.5" + +"@babel/preset-typescript@^7.16.0", "@babel/preset-typescript@^7.21.0": + version "7.22.15" + resolved "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.22.15.tgz" + integrity sha512-HblhNmh6yM+cU4VwbBRpxFhxsTdfS1zsvH9W+gEjD0ARV9+8B4sNfpI6GuhePti84nuvhiwKS539jKPFHskA9A== + dependencies: + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-option" "^7.22.15" + "@babel/plugin-syntax-jsx" "^7.22.5" + "@babel/plugin-transform-modules-commonjs" "^7.22.15" + "@babel/plugin-transform-typescript" "^7.22.15" + +"@babel/regjsgen@^0.8.0": + version "0.8.0" + resolved "https://registry.npmjs.org/@babel/regjsgen/-/regjsgen-0.8.0.tgz" + integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== + +"@babel/runtime@^7.12.5", "@babel/runtime@^7.13.10", "@babel/runtime@^7.14.8", "@babel/runtime@^7.16.0", "@babel/runtime@^7.18.3", "@babel/runtime@^7.20.7", "@babel/runtime@^7.21.0", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2": + version "7.22.15" + resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.15.tgz" + integrity sha512-T0O+aa+4w0u06iNmapipJXMV4HoUir03hpx3/YqXXhu9xim3w+dVphjFWl1OH8NbZHw5Lbm9k45drDkgq2VNNA== + dependencies: + regenerator-runtime "^0.14.0" + +"@babel/template@^7.22.15", "@babel/template@^7.22.5", "@babel/template@^7.3.3": + version "7.22.15" + resolved "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz" + integrity sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w== + dependencies: + "@babel/code-frame" "^7.22.13" + "@babel/parser" "^7.22.15" + "@babel/types" "^7.22.15" + +"@babel/traverse@^7.22.15": + version "7.22.15" + resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.15.tgz" + integrity sha512-DdHPwvJY0sEeN4xJU5uRLmZjgMMDIvMPniLuYzUVXj/GGzysPl0/fwt44JBkyUIzGJPV8QgHMcQdQ34XFuKTYQ== + dependencies: + "@babel/code-frame" "^7.22.13" + "@babel/generator" "^7.22.15" + "@babel/helper-environment-visitor" "^7.22.5" + "@babel/helper-function-name" "^7.22.5" + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-split-export-declaration" "^7.22.6" + "@babel/parser" "^7.22.15" + "@babel/types" "^7.22.15" + debug "^4.1.0" + globals "^11.1.0" + +"@babel/types@^7.0.0", "@babel/types@^7.20.7", "@babel/types@^7.21.3", "@babel/types@^7.22.10", "@babel/types@^7.22.15", "@babel/types@^7.22.5", "@babel/types@^7.3.3", "@babel/types@^7.4.4": + version "7.22.15" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.22.15.tgz" + integrity sha512-X+NLXr0N8XXmN5ZsaQdm9U2SSC3UbIYq/doL++sueHOTisgZHoKaQtZxGuV2cUPQHMfjKEfg/g6oy7Hm6SKFtA== + dependencies: + "@babel/helper-string-parser" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.15" + to-fast-properties "^2.0.0" + +"@bcoe/v8-coverage@^0.2.3": + version "0.2.3" + resolved "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz" + integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== + +"@csstools/selector-specificity@^2.0.2": + version "2.2.0" + resolved "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.2.0.tgz" + integrity sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw== + +"@discoveryjs/json-ext@0.5.7", "@discoveryjs/json-ext@^0.5.0": + version "0.5.7" + resolved "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz" + integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== + +"@emotion/babel-plugin@^11.11.0": + version "11.11.0" + resolved "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz" + integrity sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ== + dependencies: + "@babel/helper-module-imports" "^7.16.7" + "@babel/runtime" "^7.18.3" + "@emotion/hash" "^0.9.1" + "@emotion/memoize" "^0.8.1" + "@emotion/serialize" "^1.1.2" + 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" + +"@emotion/cache@^11.11.0", "@emotion/cache@^11.7.1": + version "11.11.0" + resolved "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz" + integrity sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ== + dependencies: + "@emotion/memoize" "^0.8.1" + "@emotion/sheet" "^1.2.2" + "@emotion/utils" "^1.2.1" + "@emotion/weak-memoize" "^0.3.1" + stylis "4.2.0" + +"@emotion/css@^11.7.1": + version "11.11.2" + resolved "https://registry.npmjs.org/@emotion/css/-/css-11.11.2.tgz" + integrity sha512-VJxe1ucoMYMS7DkiMdC2T7PWNbrEI0a39YRiyDvK2qq4lXwjRbVP/z4lpG+odCsRzadlR+1ywwrTzhdm5HNdew== + dependencies: + "@emotion/babel-plugin" "^11.11.0" + "@emotion/cache" "^11.11.0" + "@emotion/serialize" "^1.1.2" + "@emotion/sheet" "^1.2.2" + "@emotion/utils" "^1.2.1" + +"@emotion/hash@^0.9.1": + version "0.9.1" + resolved "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz" + integrity sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ== + +"@emotion/is-prop-valid@^0.8.2": + version "0.8.8" + resolved "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz" + integrity sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA== + dependencies: + "@emotion/memoize" "0.7.4" + +"@emotion/is-prop-valid@^1.2.1": + version "1.2.1" + resolved "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.1.tgz" + integrity sha512-61Mf7Ufx4aDxx1xlDeOm8aFFigGHE4z+0sKCa+IHCeZKiyP9RLD0Mmx7m8b9/Cf37f7NAvQOOJAbQQGVr5uERw== + dependencies: + "@emotion/memoize" "^0.8.1" + +"@emotion/memoize@0.7.4": + version "0.7.4" + resolved "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.7.4.tgz" + integrity sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw== + +"@emotion/memoize@^0.8.1": + version "0.8.1" + resolved "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz" + integrity sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA== + +"@emotion/react@^11.7.1": + version "11.11.1" + resolved "https://registry.npmjs.org/@emotion/react/-/react-11.11.1.tgz" + integrity sha512-5mlW1DquU5HaxjLkfkGN1GA/fvVGdyHURRiX/0FHl2cfIfRxSOfmxEH5YS43edp0OldZrZ+dkBKbngxcNCdZvA== + dependencies: + "@babel/runtime" "^7.18.3" + "@emotion/babel-plugin" "^11.11.0" + "@emotion/cache" "^11.11.0" + "@emotion/serialize" "^1.1.2" + "@emotion/use-insertion-effect-with-fallbacks" "^1.0.1" + "@emotion/utils" "^1.2.1" + "@emotion/weak-memoize" "^0.3.1" + hoist-non-react-statics "^3.3.1" + +"@emotion/serialize@^1.0.2", "@emotion/serialize@^1.1.2": + version "1.1.2" + resolved "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.2.tgz" + integrity sha512-zR6a/fkFP4EAcCMQtLOhIgpprZOwNmCldtpaISpvz348+DP4Mz8ZoKaGGCQpbzepNIUWbq4w6hNZkwDyKoS+HA== + dependencies: + "@emotion/hash" "^0.9.1" + "@emotion/memoize" "^0.8.1" + "@emotion/unitless" "^0.8.1" + "@emotion/utils" "^1.2.1" + csstype "^3.0.2" + +"@emotion/sheet@^1.2.2": + version "1.2.2" + resolved "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz" + integrity sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA== + +"@emotion/styled@^11.6.0": + version "11.11.0" + resolved "https://registry.npmjs.org/@emotion/styled/-/styled-11.11.0.tgz" + integrity sha512-hM5Nnvu9P3midq5aaXj4I+lnSfNi7Pmd4EWk1fOZ3pxookaQTNew6bp4JaCBYM4HVFZF9g7UjJmsUmC2JlxOng== + dependencies: + "@babel/runtime" "^7.18.3" + "@emotion/babel-plugin" "^11.11.0" + "@emotion/is-prop-valid" "^1.2.1" + "@emotion/serialize" "^1.1.2" + "@emotion/use-insertion-effect-with-fallbacks" "^1.0.1" + "@emotion/utils" "^1.2.1" + +"@emotion/unitless@^0.8.1": + version "0.8.1" + resolved "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz" + integrity sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ== + +"@emotion/use-insertion-effect-with-fallbacks@^1.0.1": + version "1.0.1" + resolved "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz" + integrity sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw== + +"@emotion/utils@^1.0.0", "@emotion/utils@^1.2.1": + version "1.2.1" + resolved "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz" + integrity sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg== + +"@emotion/weak-memoize@^0.3.1": + version "0.3.1" + resolved "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz" + integrity sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww== + +"@es-joy/jsdoccomment@~0.40.1": + version "0.40.1" + resolved "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.40.1.tgz" + integrity sha512-YORCdZSusAlBrFpZ77pJjc5r1bQs5caPWtAu+WWmiSo+8XaUzseapVrfAtiRFbQWnrBxxLLEwF6f6ZG/UgCQCg== + dependencies: + comment-parser "1.4.0" + esquery "^1.5.0" + jsdoc-type-pratt-parser "~4.0.0" + +"@eslint-community/eslint-utils@^4.2.0": + version "4.4.0" + resolved "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz" + integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== + dependencies: + eslint-visitor-keys "^3.3.0" + +"@eslint-community/regexpp@^4.4.0", "@eslint-community/regexpp@^4.6.1": + version "4.8.0" + resolved "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.0.tgz" + integrity sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg== + +"@eslint/eslintrc@^2.1.2": + version "2.1.2" + resolved "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz" + integrity sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g== + 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" + +"@eslint/js@8.48.0": + version "8.48.0" + resolved "https://registry.npmjs.org/@eslint/js/-/js-8.48.0.tgz" + integrity sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw== + +"@floating-ui/core@^0.7.3": + version "0.7.3" + resolved "https://registry.npmjs.org/@floating-ui/core/-/core-0.7.3.tgz" + integrity sha512-buc8BXHmG9l82+OQXOFU3Kr2XQx9ys01U/Q9HMIrZ300iLc8HLMgh7dcCqgYzAzf4BkoQvDcXf5Y+CuEZ5JBYg== + +"@floating-ui/core@^1.4.1": + version "1.4.1" + resolved "https://registry.npmjs.org/@floating-ui/core/-/core-1.4.1.tgz" + integrity sha512-jk3WqquEJRlcyu7997NtR5PibI+y5bi+LS3hPmguVClypenMsCY3CBa3LAQnozRCtCrYWSEtAdiskpamuJRFOQ== + dependencies: + "@floating-ui/utils" "^0.1.1" + +"@floating-ui/dom@^0.5.3": + version "0.5.4" + resolved "https://registry.npmjs.org/@floating-ui/dom/-/dom-0.5.4.tgz" + integrity sha512-419BMceRLq0RrmTSDxn8hf9R3VCJv2K9PUfugh5JyEFmdjzDo+e8U5EdR8nzKq8Yj1htzLm3b6eQEEam3/rrtg== + dependencies: + "@floating-ui/core" "^0.7.3" + +"@floating-ui/dom@^1.0.0", "@floating-ui/dom@^1.5.1": + version "1.5.1" + resolved "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.1.tgz" + integrity sha512-KwvVcPSXg6mQygvA1TjbN/gh///36kKtllIF8SUm0qpFj8+rvYrpvlYdL1JoA71SHpDqgSSdGOSoQ0Mp3uY5aw== + dependencies: + "@floating-ui/core" "^1.4.1" + "@floating-ui/utils" "^0.1.1" + +"@floating-ui/react-dom@0.7.2": + version "0.7.2" + resolved "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-0.7.2.tgz" + integrity sha512-1T0sJcpHgX/u4I1OzIEhlcrvkUN8ln39nz7fMoE/2HDHrPiMFoOGR7++GYyfUmIQHkkrTinaeQsO3XWubjSvGg== + dependencies: + "@floating-ui/dom" "^0.5.3" + use-isomorphic-layout-effect "^1.1.1" + +"@floating-ui/react-dom@^2.0.1": + version "2.0.2" + resolved "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.2.tgz" + integrity sha512-5qhlDvjaLmAst/rKb3VdlCinwTF4EYMiVxuuc/HVUjs46W0zgtbMmAZ1UTsDrRTxRmUEzl92mOtWbeeXL26lSQ== + dependencies: + "@floating-ui/dom" "^1.5.1" + +"@floating-ui/utils@^0.1.1": + version "0.1.1" + resolved "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.1.tgz" + integrity sha512-m0G6wlnhm/AX0H12IOWtK8gASEMffnX08RtKkCgTdHb9JpHKGloI7icFfLg9ZmQeavcvR0PKmzxClyuFPSjKWw== + +"@hapi/hoek@^9.0.0": + version "9.3.0" + resolved "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz" + integrity sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ== + +"@hapi/topo@^5.0.0": + version "5.1.0" + resolved "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz" + integrity sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg== + dependencies: + "@hapi/hoek" "^9.0.0" + +"@humanwhocodes/config-array@^0.11.10": + version "0.11.11" + resolved "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.11.tgz" + integrity sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA== + dependencies: + "@humanwhocodes/object-schema" "^1.2.1" + debug "^4.1.1" + minimatch "^3.0.5" + +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== + +"@humanwhocodes/object-schema@^1.2.1": + version "1.2.1" + resolved "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz" + integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== + +"@istanbuljs/load-nyc-config@^1.0.0": + version "1.1.0" + resolved "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz" + integrity sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ== + 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" + +"@istanbuljs/schema@^0.1.2": + version "0.1.3" + resolved "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz" + integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA== + +"@jest/console@^29.6.4": + version "29.6.4" + resolved "https://registry.npmjs.org/@jest/console/-/console-29.6.4.tgz" + integrity sha512-wNK6gC0Ha9QeEPSkeJedQuTQqxZYnDPuDcDhVuVatRvMkL4D0VTvFVZj+Yuh6caG2aOfzkUZ36KtCmLNtR02hw== + dependencies: + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + jest-message-util "^29.6.3" + jest-util "^29.6.3" + slash "^3.0.0" + +"@jest/core@^29.6.4": + version "29.6.4" + resolved "https://registry.npmjs.org/@jest/core/-/core-29.6.4.tgz" + integrity sha512-U/vq5ccNTSVgYH7mHnodHmCffGWHJnz/E1BEWlLuK5pM4FZmGfBn/nrJGLjUsSmyx3otCeqc1T31F4y08AMDLg== + dependencies: + "@jest/console" "^29.6.4" + "@jest/reporters" "^29.6.4" + "@jest/test-result" "^29.6.4" + "@jest/transform" "^29.6.4" + "@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.6.3" + jest-config "^29.6.4" + jest-haste-map "^29.6.4" + jest-message-util "^29.6.3" + jest-regex-util "^29.6.3" + jest-resolve "^29.6.4" + jest-resolve-dependencies "^29.6.4" + jest-runner "^29.6.4" + jest-runtime "^29.6.4" + jest-snapshot "^29.6.4" + jest-util "^29.6.3" + jest-validate "^29.6.3" + jest-watcher "^29.6.4" + micromatch "^4.0.4" + pretty-format "^29.6.3" + slash "^3.0.0" + strip-ansi "^6.0.0" + +"@jest/environment@^29.6.4": + version "29.6.4" + resolved "https://registry.npmjs.org/@jest/environment/-/environment-29.6.4.tgz" + integrity sha512-sQ0SULEjA1XUTHmkBRl7A1dyITM9yb1yb3ZNKPX3KlTd6IG7mWUe3e2yfExtC2Zz1Q+mMckOLHmL/qLiuQJrBQ== + dependencies: + "@jest/fake-timers" "^29.6.4" + "@jest/types" "^29.6.3" + "@types/node" "*" + jest-mock "^29.6.3" + +"@jest/expect-utils@^29.6.4": + version "29.6.4" + resolved "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-29.6.4.tgz" + integrity sha512-FEhkJhqtvBwgSpiTrocquJCdXPsyvNKcl/n7A3u7X4pVoF4bswm11c9d4AV+kfq2Gpv/mM8x7E7DsRvH+djkrg== + dependencies: + jest-get-type "^29.6.3" + +"@jest/expect@^29.6.4": + version "29.6.4" + resolved "https://registry.npmjs.org/@jest/expect/-/expect-29.6.4.tgz" + integrity sha512-Warhsa7d23+3X5bLbrbYvaehcgX5TLYhI03JKoedTiI8uJU4IhqYBWF7OSSgUyz4IgLpUYPkK0AehA5/fRclAA== + dependencies: + expect "^29.6.4" + jest-snapshot "^29.6.4" + +"@jest/fake-timers@^29.6.4": + version "29.6.4" + resolved "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-29.6.4.tgz" + integrity sha512-6UkCwzoBK60edXIIWb0/KWkuj7R7Qq91vVInOe3De6DSpaEiqjKcJw4F7XUet24Wupahj9J6PlR09JqJ5ySDHw== + dependencies: + "@jest/types" "^29.6.3" + "@sinonjs/fake-timers" "^10.0.2" + "@types/node" "*" + jest-message-util "^29.6.3" + jest-mock "^29.6.3" + jest-util "^29.6.3" + +"@jest/globals@^29.6.4": + version "29.6.4" + resolved "https://registry.npmjs.org/@jest/globals/-/globals-29.6.4.tgz" + integrity sha512-wVIn5bdtjlChhXAzVXavcY/3PEjf4VqM174BM3eGL5kMxLiZD5CLnbmkEyA1Dwh9q8XjP6E8RwjBsY/iCWrWsA== + dependencies: + "@jest/environment" "^29.6.4" + "@jest/expect" "^29.6.4" + "@jest/types" "^29.6.3" + jest-mock "^29.6.3" + +"@jest/reporters@^29.6.4": + version "29.6.4" + resolved "https://registry.npmjs.org/@jest/reporters/-/reporters-29.6.4.tgz" + integrity sha512-sxUjWxm7QdchdrD3NfWKrL8FBsortZeibSJv4XLjESOOjSUOkjQcb0ZHJwfhEGIvBvTluTzfG2yZWZhkrXJu8g== + dependencies: + "@bcoe/v8-coverage" "^0.2.3" + "@jest/console" "^29.6.4" + "@jest/test-result" "^29.6.4" + "@jest/transform" "^29.6.4" + "@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.6.3" + jest-util "^29.6.3" + jest-worker "^29.6.4" + slash "^3.0.0" + string-length "^4.0.1" + strip-ansi "^6.0.0" + v8-to-istanbul "^9.0.1" + +"@jest/schemas@^29.6.3": + version "29.6.3" + resolved "https://registry.npmjs.org/@jest/schemas/-/schemas-29.6.3.tgz" + integrity sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA== + dependencies: + "@sinclair/typebox" "^0.27.8" + +"@jest/source-map@^29.6.3": + version "29.6.3" + resolved "https://registry.npmjs.org/@jest/source-map/-/source-map-29.6.3.tgz" + integrity sha512-MHjT95QuipcPrpLM+8JMSzFx6eHp5Bm+4XeFDJlwsvVBjmKNiIAvasGK2fxz2WbGRlnvqehFbh07MMa7n3YJnw== + dependencies: + "@jridgewell/trace-mapping" "^0.3.18" + callsites "^3.0.0" + graceful-fs "^4.2.9" + +"@jest/test-result@^29.6.4": + version "29.6.4" + resolved "https://registry.npmjs.org/@jest/test-result/-/test-result-29.6.4.tgz" + integrity sha512-uQ1C0AUEN90/dsyEirgMLlouROgSY+Wc/JanVVk0OiUKa5UFh7sJpMEM3aoUBAz2BRNvUJ8j3d294WFuRxSyOQ== + dependencies: + "@jest/console" "^29.6.4" + "@jest/types" "^29.6.3" + "@types/istanbul-lib-coverage" "^2.0.0" + collect-v8-coverage "^1.0.0" + +"@jest/test-sequencer@^29.6.4": + version "29.6.4" + resolved "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-29.6.4.tgz" + integrity sha512-E84M6LbpcRq3fT4ckfKs9ryVanwkaIB0Ws9bw3/yP4seRLg/VaCZ/LgW0MCq5wwk4/iP/qnilD41aj2fsw2RMg== + dependencies: + "@jest/test-result" "^29.6.4" + graceful-fs "^4.2.9" + jest-haste-map "^29.6.4" + slash "^3.0.0" + +"@jest/transform@^29.6.4": + version "29.6.4" + resolved "https://registry.npmjs.org/@jest/transform/-/transform-29.6.4.tgz" + integrity sha512-8thgRSiXUqtr/pPGY/OsyHuMjGyhVnWrFAwoxmIemlBuiMyU1WFs0tXoNxzcr4A4uErs/ABre76SGmrr5ab/AA== + 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.6.4" + jest-regex-util "^29.6.3" + jest-util "^29.6.3" + micromatch "^4.0.4" + pirates "^4.0.4" + slash "^3.0.0" + write-file-atomic "^4.0.2" + +"@jest/types@^29.6.3": + version "29.6.3" + resolved "https://registry.npmjs.org/@jest/types/-/types-29.6.3.tgz" + integrity sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw== + 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" + +"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2": + version "0.3.3" + resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz" + integrity sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ== + dependencies: + "@jridgewell/set-array" "^1.0.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/resolve-uri@^3.1.0": + version "3.1.1" + resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz" + integrity sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA== + +"@jridgewell/set-array@^1.0.1": + version "1.1.2" + resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz" + integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw== + +"@jridgewell/source-map@^0.3.3": + version "0.3.5" + resolved "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz" + integrity sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ== + dependencies: + "@jridgewell/gen-mapping" "^0.3.0" + "@jridgewell/trace-mapping" "^0.3.9" + +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": + version "1.4.15" + resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz" + integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg== + +"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.9": + version "0.3.19" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.19.tgz" + integrity sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + +"@leichtgewicht/ip-codec@^2.0.1": + version "2.0.4" + resolved "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz" + integrity sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A== + +"@nicolo-ribaudo/eslint-scope-5-internals@5.1.1-v1": + 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== + dependencies: + eslint-scope "5.1.1" + +"@nodelib/fs.scandir@2.1.5": + version "2.1.5" + resolved "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz" + integrity sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g== + dependencies: + "@nodelib/fs.stat" "2.0.5" + run-parallel "^1.1.9" + +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": + version "2.0.5" + resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" + integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== + +"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": + version "1.2.8" + resolved "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz" + integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== + dependencies: + "@nodelib/fs.scandir" "2.1.5" + fastq "^1.6.0" + +"@pmmmwh/react-refresh-webpack-plugin@^0.5.2": + version "0.5.11" + resolved "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.11.tgz" + integrity sha512-7j/6vdTym0+qZ6u4XbSAxrWBGYSdCfTzySkj7WAFgDLmSyWlOrWvpyzxlFh5jtw9dn0oL/jtW+06XfFiisN3JQ== + dependencies: + ansi-html-community "^0.0.8" + common-path-prefix "^3.0.0" + core-js-pure "^3.23.3" + error-stack-parser "^2.0.6" + find-up "^5.0.0" + html-entities "^2.1.0" + loader-utils "^2.0.4" + schema-utils "^3.0.0" + source-map "^0.7.3" + +"@polka/url@^1.0.0-next.20": + version "1.0.0-next.21" + resolved "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz" + integrity sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g== + +"@popperjs/core@^2.5.4": + version "2.11.8" + resolved "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz" + integrity sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A== + +"@radix-ui/primitive@1.0.0": + version "1.0.0" + resolved "https://registry.npmjs.org/@radix-ui/primitive/-/primitive-1.0.0.tgz" + integrity sha512-3e7rn8FDMin4CgeL7Z/49smCA3rFYY3Ha2rUQ7HRWFadS5iCRw08ZgVT1LaNTCNqgvrUiyczLflrVrF0SRQtNA== + dependencies: + "@babel/runtime" "^7.13.10" + +"@radix-ui/react-arrow@1.0.2": + version "1.0.2" + resolved "https://registry.npmjs.org/@radix-ui/react-arrow/-/react-arrow-1.0.2.tgz" + integrity sha512-fqYwhhI9IarZ0ll2cUSfKuXHlJK0qE4AfnRrPBbRwEH/4mGQn04/QFGomLi8TXWIdv9WJk//KgGm+aDxVIr1wA== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-primitive" "1.0.2" + +"@radix-ui/react-collection@1.0.2": + version "1.0.2" + resolved "https://registry.npmjs.org/@radix-ui/react-collection/-/react-collection-1.0.2.tgz" + integrity sha512-s8WdQQ6wNXpaxdZ308KSr8fEWGrg4un8i4r/w7fhiS4ElRNjk5rRcl0/C6TANG2LvLOGIxtzo/jAg6Qf73TEBw== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-compose-refs" "1.0.0" + "@radix-ui/react-context" "1.0.0" + "@radix-ui/react-primitive" "1.0.2" + "@radix-ui/react-slot" "1.0.1" + +"@radix-ui/react-compose-refs@1.0.0": + version "1.0.0" + resolved "https://registry.npmjs.org/@radix-ui/react-compose-refs/-/react-compose-refs-1.0.0.tgz" + integrity sha512-0KaSv6sx787/hK3eF53iOkiSLwAGlFMx5lotrqD2pTjB18KbybKoEIgkNZTKC60YECDQTKGTRcDBILwZVqVKvA== + dependencies: + "@babel/runtime" "^7.13.10" + +"@radix-ui/react-context@1.0.0": + version "1.0.0" + resolved "https://registry.npmjs.org/@radix-ui/react-context/-/react-context-1.0.0.tgz" + integrity sha512-1pVM9RfOQ+n/N5PJK33kRSKsr1glNxomxONs5c49MliinBY6Yw2Q995qfBUUo0/Mbg05B/sGA0gkgPI7kmSHBg== + dependencies: + "@babel/runtime" "^7.13.10" + +"@radix-ui/react-dialog@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-dialog/-/react-dialog-1.0.0.tgz#997e97cb183bc90bd888b26b8e23a355ac9fe5f0" + integrity sha512-Yn9YU+QlHYLWwV1XfKiqnGVpWYWk6MeBVM6x/bcoyPvxgjQGoeT35482viLPctTMWoMw0PoHgqfSox7Ig+957Q== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/primitive" "1.0.0" + "@radix-ui/react-compose-refs" "1.0.0" + "@radix-ui/react-context" "1.0.0" + "@radix-ui/react-dismissable-layer" "1.0.0" + "@radix-ui/react-focus-guards" "1.0.0" + "@radix-ui/react-focus-scope" "1.0.0" + "@radix-ui/react-id" "1.0.0" + "@radix-ui/react-portal" "1.0.0" + "@radix-ui/react-presence" "1.0.0" + "@radix-ui/react-primitive" "1.0.0" + "@radix-ui/react-slot" "1.0.0" + "@radix-ui/react-use-controllable-state" "1.0.0" + aria-hidden "^1.1.1" + react-remove-scroll "2.5.4" + +"@radix-ui/react-direction@1.0.0": + version "1.0.0" + resolved "https://registry.npmjs.org/@radix-ui/react-direction/-/react-direction-1.0.0.tgz" + integrity sha512-2HV05lGUgYcA6xgLQ4BKPDmtL+QbIZYH5fCOTAOOcJ5O0QbWS3i9lKaurLzliYUDhORI2Qr3pyjhJh44lKA3rQ== + dependencies: + "@babel/runtime" "^7.13.10" + +"@radix-ui/react-dismissable-layer@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.0.0.tgz#35b7826fa262fd84370faef310e627161dffa76b" + integrity sha512-n7kDRfx+LB1zLueRDvZ1Pd0bxdJWDUZNQ/GWoxDn2prnuJKRdxsjulejX/ePkOsLi2tTm6P24mDqlMSgQpsT6g== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/primitive" "1.0.0" + "@radix-ui/react-compose-refs" "1.0.0" + "@radix-ui/react-primitive" "1.0.0" + "@radix-ui/react-use-callback-ref" "1.0.0" + "@radix-ui/react-use-escape-keydown" "1.0.0" + +"@radix-ui/react-dismissable-layer@1.0.3": + version "1.0.3" + resolved "https://registry.npmjs.org/@radix-ui/react-dismissable-layer/-/react-dismissable-layer-1.0.3.tgz" + integrity sha512-nXZOvFjOuHS1ovumntGV7NNoLaEp9JEvTht3MBjP44NSW5hUKj/8OnfN3+8WmB+CEhN44XaGhpHoSsUIEl5P7Q== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/primitive" "1.0.0" + "@radix-ui/react-compose-refs" "1.0.0" + "@radix-ui/react-primitive" "1.0.2" + "@radix-ui/react-use-callback-ref" "1.0.0" + "@radix-ui/react-use-escape-keydown" "1.0.2" + +"@radix-ui/react-dropdown-menu@2.0.4": + version "2.0.4" + resolved "https://registry.npmjs.org/@radix-ui/react-dropdown-menu/-/react-dropdown-menu-2.0.4.tgz" + integrity sha512-y6AT9+MydyXcByivdK1+QpjWoKaC7MLjkS/cH1Q3keEyMvDkiY85m8o2Bi6+Z1PPUlCsMULopxagQOSfN0wahg== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/primitive" "1.0.0" + "@radix-ui/react-compose-refs" "1.0.0" + "@radix-ui/react-context" "1.0.0" + "@radix-ui/react-id" "1.0.0" + "@radix-ui/react-menu" "2.0.4" + "@radix-ui/react-primitive" "1.0.2" + "@radix-ui/react-use-controllable-state" "1.0.0" + +"@radix-ui/react-focus-guards@1.0.0": + version "1.0.0" + resolved "https://registry.npmjs.org/@radix-ui/react-focus-guards/-/react-focus-guards-1.0.0.tgz" + integrity sha512-UagjDk4ijOAnGu4WMUPj9ahi7/zJJqNZ9ZAiGPp7waUWJO0O1aWXi/udPphI0IUjvrhBsZJGSN66dR2dsueLWQ== + dependencies: + "@babel/runtime" "^7.13.10" + +"@radix-ui/react-focus-scope@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-focus-scope/-/react-focus-scope-1.0.0.tgz#95a0c1188276dc8933b1eac5f1cdb6471e01ade5" + integrity sha512-C4SWtsULLGf/2L4oGeIHlvWQx7Rf+7cX/vKOAD2dXW0A1b5QXwi3wWeaEgW+wn+SEVrraMUk05vLU9fZZz5HbQ== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-compose-refs" "1.0.0" + "@radix-ui/react-primitive" "1.0.0" + "@radix-ui/react-use-callback-ref" "1.0.0" + +"@radix-ui/react-focus-scope@1.0.2": + version "1.0.2" + resolved "https://registry.npmjs.org/@radix-ui/react-focus-scope/-/react-focus-scope-1.0.2.tgz" + integrity sha512-spwXlNTfeIprt+kaEWE/qYuYT3ZAqJiAGjN/JgdvgVDTu8yc+HuX+WOWXrKliKnLnwck0F6JDkqIERncnih+4A== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-compose-refs" "1.0.0" + "@radix-ui/react-primitive" "1.0.2" + "@radix-ui/react-use-callback-ref" "1.0.0" + +"@radix-ui/react-id@1.0.0": + version "1.0.0" + resolved "https://registry.npmjs.org/@radix-ui/react-id/-/react-id-1.0.0.tgz" + integrity sha512-Q6iAB/U7Tq3NTolBBQbHTgclPmGWE3OlktGGqrClPozSw4vkQ1DfQAOtzgRPecKsMdJINE05iaoDUG8tRzCBjw== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-use-layout-effect" "1.0.0" + +"@radix-ui/react-menu@2.0.4": + version "2.0.4" + resolved "https://registry.npmjs.org/@radix-ui/react-menu/-/react-menu-2.0.4.tgz" + integrity sha512-mzKR47tZ1t193trEqlQoJvzY4u9vYfVH16ryBrVrCAGZzkgyWnMQYEZdUkM7y8ak9mrkKtJiqB47TlEnubeOFQ== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/primitive" "1.0.0" + "@radix-ui/react-collection" "1.0.2" + "@radix-ui/react-compose-refs" "1.0.0" + "@radix-ui/react-context" "1.0.0" + "@radix-ui/react-direction" "1.0.0" + "@radix-ui/react-dismissable-layer" "1.0.3" + "@radix-ui/react-focus-guards" "1.0.0" + "@radix-ui/react-focus-scope" "1.0.2" + "@radix-ui/react-id" "1.0.0" + "@radix-ui/react-popper" "1.1.1" + "@radix-ui/react-portal" "1.0.2" + "@radix-ui/react-presence" "1.0.0" + "@radix-ui/react-primitive" "1.0.2" + "@radix-ui/react-roving-focus" "1.0.3" + "@radix-ui/react-slot" "1.0.1" + "@radix-ui/react-use-callback-ref" "1.0.0" + aria-hidden "^1.1.1" + react-remove-scroll "2.5.5" + +"@radix-ui/react-popper@1.1.1": + version "1.1.1" + resolved "https://registry.npmjs.org/@radix-ui/react-popper/-/react-popper-1.1.1.tgz" + integrity sha512-keYDcdMPNMjSC8zTsZ8wezUMiWM9Yj14wtF3s0PTIs9srnEPC9Kt2Gny1T3T81mmSeyDjZxsD9N5WCwNNb712w== + dependencies: + "@babel/runtime" "^7.13.10" + "@floating-ui/react-dom" "0.7.2" + "@radix-ui/react-arrow" "1.0.2" + "@radix-ui/react-compose-refs" "1.0.0" + "@radix-ui/react-context" "1.0.0" + "@radix-ui/react-primitive" "1.0.2" + "@radix-ui/react-use-callback-ref" "1.0.0" + "@radix-ui/react-use-layout-effect" "1.0.0" + "@radix-ui/react-use-rect" "1.0.0" + "@radix-ui/react-use-size" "1.0.0" + "@radix-ui/rect" "1.0.0" + +"@radix-ui/react-portal@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-portal/-/react-portal-1.0.0.tgz#7220b66743394fabb50c55cb32381395cc4a276b" + integrity sha512-a8qyFO/Xb99d8wQdu4o7qnigNjTPG123uADNecz0eX4usnQEj7o+cG4ZX4zkqq98NYekT7UoEQIjxBNWIFuqTA== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-primitive" "1.0.0" + +"@radix-ui/react-portal@1.0.2": + version "1.0.2" + resolved "https://registry.npmjs.org/@radix-ui/react-portal/-/react-portal-1.0.2.tgz" + integrity sha512-swu32idoCW7KA2VEiUZGBSu9nB6qwGdV6k6HYhUoOo3M1FFpD+VgLzUqtt3mwL1ssz7r2x8MggpLSQach2Xy/Q== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-primitive" "1.0.2" + +"@radix-ui/react-presence@1.0.0": + version "1.0.0" + resolved "https://registry.npmjs.org/@radix-ui/react-presence/-/react-presence-1.0.0.tgz" + integrity sha512-A+6XEvN01NfVWiKu38ybawfHsBjWum42MRPnEuqPsBZ4eV7e/7K321B5VgYMPv3Xx5An6o1/l9ZuDBgmcmWK3w== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-compose-refs" "1.0.0" + "@radix-ui/react-use-layout-effect" "1.0.0" + +"@radix-ui/react-primitive@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-primitive/-/react-primitive-1.0.0.tgz#376cd72b0fcd5e0e04d252ed33eb1b1f025af2b0" + integrity sha512-EyXe6mnRlHZ8b6f4ilTDrXmkLShICIuOTTj0GX4w1rp+wSxf3+TD05u1UOITC8VsJ2a9nwHvdXtOXEOl0Cw/zQ== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-slot" "1.0.0" + +"@radix-ui/react-primitive@1.0.2": + version "1.0.2" + resolved "https://registry.npmjs.org/@radix-ui/react-primitive/-/react-primitive-1.0.2.tgz" + integrity sha512-zY6G5Qq4R8diFPNwtyoLRZBxzu1Z+SXMlfYpChN7Dv8gvmx9X3qhDqiLWvKseKVJMuedFeU/Sa0Sy/Ia+t06Dw== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-slot" "1.0.1" + +"@radix-ui/react-roving-focus@1.0.3": + version "1.0.3" + resolved "https://registry.npmjs.org/@radix-ui/react-roving-focus/-/react-roving-focus-1.0.3.tgz" + integrity sha512-stjCkIoMe6h+1fWtXlA6cRfikdBzCLp3SnVk7c48cv/uy3DTGoXhN76YaOYUJuy3aEDvDIKwKR5KSmvrtPvQPQ== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/primitive" "1.0.0" + "@radix-ui/react-collection" "1.0.2" + "@radix-ui/react-compose-refs" "1.0.0" + "@radix-ui/react-context" "1.0.0" + "@radix-ui/react-direction" "1.0.0" + "@radix-ui/react-id" "1.0.0" + "@radix-ui/react-primitive" "1.0.2" + "@radix-ui/react-use-callback-ref" "1.0.0" + "@radix-ui/react-use-controllable-state" "1.0.0" + +"@radix-ui/react-slot@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-slot/-/react-slot-1.0.0.tgz#7fa805b99891dea1e862d8f8fbe07f4d6d0fd698" + integrity sha512-3mrKauI/tWXo1Ll+gN5dHcxDPdm/Df1ufcDLCecn+pnCIVcdWE7CujXo8QaXOWRJyZyQWWbpB8eFwHzWXlv5mQ== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-compose-refs" "1.0.0" + +"@radix-ui/react-slot@1.0.1": + version "1.0.1" + resolved "https://registry.npmjs.org/@radix-ui/react-slot/-/react-slot-1.0.1.tgz" + integrity sha512-avutXAFL1ehGvAXtPquu0YK5oz6ctS474iM3vNGQIkswrVhdrS52e3uoMQBzZhNRAIE0jBnUyXWNmSjGHhCFcw== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-compose-refs" "1.0.0" + +"@radix-ui/react-use-callback-ref@1.0.0": + version "1.0.0" + resolved "https://registry.npmjs.org/@radix-ui/react-use-callback-ref/-/react-use-callback-ref-1.0.0.tgz" + integrity sha512-GZtyzoHz95Rhs6S63D2t/eqvdFCm7I+yHMLVQheKM7nBD8mbZIt+ct1jz4536MDnaOGKIxynJ8eHTkVGVVkoTg== + dependencies: + "@babel/runtime" "^7.13.10" + +"@radix-ui/react-use-controllable-state@1.0.0": + version "1.0.0" + resolved "https://registry.npmjs.org/@radix-ui/react-use-controllable-state/-/react-use-controllable-state-1.0.0.tgz" + integrity sha512-FohDoZvk3mEXh9AWAVyRTYR4Sq7/gavuofglmiXB2g1aKyboUD4YtgWxKj8O5n+Uak52gXQ4wKz5IFST4vtJHg== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-use-callback-ref" "1.0.0" + +"@radix-ui/react-use-escape-keydown@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.0.0.tgz#aef375db4736b9de38a5a679f6f49b45a060e5d1" + integrity sha512-JwfBCUIfhXRxKExgIqGa4CQsiMemo1Xt0W/B4ei3fpzpvPENKpMKQ8mZSB6Acj3ebrAEgi2xiQvcI1PAAodvyg== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-use-callback-ref" "1.0.0" + +"@radix-ui/react-use-escape-keydown@1.0.2": + version "1.0.2" + resolved "https://registry.npmjs.org/@radix-ui/react-use-escape-keydown/-/react-use-escape-keydown-1.0.2.tgz" + integrity sha512-DXGim3x74WgUv+iMNCF+cAo8xUHHeqvjx8zs7trKf+FkQKPQXLk2sX7Gx1ysH7Q76xCpZuxIJE7HLPxRE+Q+GA== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-use-callback-ref" "1.0.0" + +"@radix-ui/react-use-layout-effect@1.0.0": + version "1.0.0" + resolved "https://registry.npmjs.org/@radix-ui/react-use-layout-effect/-/react-use-layout-effect-1.0.0.tgz" + integrity sha512-6Tpkq+R6LOlmQb1R5NNETLG0B4YP0wc+klfXafpUCj6JGyaUc8il7/kUZ7m59rGbXGczE9Bs+iz2qloqsZBduQ== + dependencies: + "@babel/runtime" "^7.13.10" + +"@radix-ui/react-use-rect@1.0.0": + version "1.0.0" + resolved "https://registry.npmjs.org/@radix-ui/react-use-rect/-/react-use-rect-1.0.0.tgz" + integrity sha512-TB7pID8NRMEHxb/qQJpvSt3hQU4sqNPM1VCTjTRjEOa7cEop/QMuq8S6fb/5Tsz64kqSvB9WnwsDHtjnrM9qew== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/rect" "1.0.0" + +"@radix-ui/react-use-size@1.0.0": + version "1.0.0" + resolved "https://registry.npmjs.org/@radix-ui/react-use-size/-/react-use-size-1.0.0.tgz" + integrity sha512-imZ3aYcoYCKhhgNpkNDh/aTiU05qw9hX+HHI1QDBTyIlcFjgeFlKKySNGMwTp7nYFLQg/j0VA2FmCY4WPDDHMg== + dependencies: + "@babel/runtime" "^7.13.10" + "@radix-ui/react-use-layout-effect" "1.0.0" + +"@radix-ui/rect@1.0.0": + version "1.0.0" + resolved "https://registry.npmjs.org/@radix-ui/rect/-/rect-1.0.0.tgz" + integrity sha512-d0O68AYy/9oeEy1DdC07bz1/ZXX+DqCskRd3i4JzLSTXwefzaepQrKjXC7aNM8lTHjFLDO0pDgaEiQ7jEk+HVg== + dependencies: + "@babel/runtime" "^7.13.10" + +"@react-spring/animated@~9.7.3": + version "9.7.3" + resolved "https://registry.yarnpkg.com/@react-spring/animated/-/animated-9.7.3.tgz#4211b1a6d48da0ff474a125e93c0f460ff816e0f" + integrity sha512-5CWeNJt9pNgyvuSzQH+uy2pvTg8Y4/OisoscZIR8/ZNLIOI+CatFBhGZpDGTF/OzdNFsAoGk3wiUYTwoJ0YIvw== + dependencies: + "@react-spring/shared" "~9.7.3" + "@react-spring/types" "~9.7.3" + +"@react-spring/core@~9.7.3": + version "9.7.3" + resolved "https://registry.yarnpkg.com/@react-spring/core/-/core-9.7.3.tgz#60056bcb397f2c4f371c6c9a5f882db77ae90095" + integrity sha512-IqFdPVf3ZOC1Cx7+M0cXf4odNLxDC+n7IN3MDcVCTIOSBfqEcBebSv+vlY5AhM0zw05PDbjKrNmBpzv/AqpjnQ== + dependencies: + "@react-spring/animated" "~9.7.3" + "@react-spring/shared" "~9.7.3" + "@react-spring/types" "~9.7.3" + +"@react-spring/shared@~9.7.3": + version "9.7.3" + resolved "https://registry.yarnpkg.com/@react-spring/shared/-/shared-9.7.3.tgz#4cf29797847c689912aec4e62e34c99a4d5d9e53" + integrity sha512-NEopD+9S5xYyQ0pGtioacLhL2luflh6HACSSDUZOwLHoxA5eku1UPuqcJqjwSD6luKjjLfiLOspxo43FUHKKSA== + dependencies: + "@react-spring/types" "~9.7.3" + +"@react-spring/types@~9.7.3": + version "9.7.3" + resolved "https://registry.yarnpkg.com/@react-spring/types/-/types-9.7.3.tgz#ea78fd447cbc2612c1f5d55852e3c331e8172a0b" + integrity sha512-Kpx/fQ/ZFX31OtlqVEFfgaD1ACzul4NksrvIgYfIFq9JpDHFwQkMVZ10tbo0FU/grje4rcL4EIrjekl3kYwgWw== + +"@react-spring/web@^9.4.5": + version "9.7.3" + resolved "https://registry.yarnpkg.com/@react-spring/web/-/web-9.7.3.tgz#d9f4e17fec259f1d65495a19502ada4f5b57fa3d" + integrity sha512-BXt6BpS9aJL/QdVqEIX9YoUy8CE6TJrU0mNCqSoxdXlIeNcEBWOfIyE6B14ENNsyQKS3wOWkiJfco0tCr/9tUg== + dependencies: + "@react-spring/animated" "~9.7.3" + "@react-spring/core" "~9.7.3" + "@react-spring/shared" "~9.7.3" + "@react-spring/types" "~9.7.3" + +"@sideway/address@^4.1.3": + version "4.1.4" + resolved "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz" + integrity sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw== + dependencies: + "@hapi/hoek" "^9.0.0" + +"@sideway/formula@^3.0.1": + version "3.0.1" + resolved "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz" + integrity sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg== + +"@sideway/pinpoint@^2.0.0": + version "2.0.0" + resolved "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz" + integrity sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ== + +"@sinclair/typebox@^0.27.8": + version "0.27.8" + resolved "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz" + integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== + +"@sinonjs/commons@^3.0.0": + version "3.0.0" + resolved "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz" + integrity sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA== + dependencies: + type-detect "4.0.8" + +"@sinonjs/fake-timers@^10.0.2": + 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== + dependencies: + "@sinonjs/commons" "^3.0.0" + +"@svgr/babel-plugin-add-jsx-attribute@8.0.0": + 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== + +"@svgr/babel-plugin-remove-jsx-attribute@8.0.0": + 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== + +"@svgr/babel-plugin-remove-jsx-empty-expression@8.0.0": + 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== + +"@svgr/babel-plugin-replace-jsx-attribute-value@8.0.0": + 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== + +"@svgr/babel-plugin-svg-dynamic-title@8.0.0": + 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== + +"@svgr/babel-plugin-svg-em-dimensions@8.0.0": + 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== + +"@svgr/babel-plugin-transform-react-native-svg@8.1.0": + 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== + +"@svgr/babel-plugin-transform-svg-component@8.0.0": + 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== + +"@svgr/babel-preset@8.1.0": + version "8.1.0" + resolved "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-8.1.0.tgz" + integrity sha512-7EYDbHE7MxHpv4sxvnVPngw5fuR6pw79SkcrILHJ/iMpuKySNCl5W1qcwPEpU+LgyRXOaAFgH0KhwD18wwg6ug== + 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" + +"@svgr/core@8.1.0": + version "8.1.0" + resolved "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz" + integrity sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA== + 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" + +"@svgr/hast-util-to-babel-ast@8.0.0": + 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== + dependencies: + "@babel/types" "^7.21.3" + entities "^4.4.0" + +"@svgr/plugin-jsx@8.1.0": + version "8.1.0" + resolved "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-8.1.0.tgz" + integrity sha512-0xiIyBsLlr8quN+WyuxooNW9RJ0Dpr8uOnH/xrCVO8GLUcwHISwj1AG0k+LFzteTkAA0GbX0kj9q6Dk70PTiPA== + 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" + +"@svgr/plugin-svgo@8.1.0": + version "8.1.0" + resolved "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-8.1.0.tgz" + integrity sha512-Ywtl837OGO9pTLIN/onoWLmDQ4zFUycI1g76vuKGEz6evR/ZTJlJuz3G/fIkb6OVBJ2g0o6CGJzaEjfmEo3AHA== + dependencies: + cosmiconfig "^8.1.3" + deepmerge "^4.3.1" + svgo "^3.0.2" + +"@svgr/webpack@^8.0.1": + version "8.1.0" + resolved "https://registry.npmjs.org/@svgr/webpack/-/webpack-8.1.0.tgz" + integrity sha512-LnhVjMWyMQV9ZmeEy26maJk+8HTIbd59cH4F2MJ439k9DqejRisfFNGAPvRYlKETuh9LrImlS8aKsBgKjMA8WA== + 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" + +"@tannin/compile@^1.1.0": + 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" + +"@tannin/evaluate@^1.2.0": + version "1.2.0" + resolved "https://registry.npmjs.org/@tannin/evaluate/-/evaluate-1.2.0.tgz" + integrity sha512-3ioXvNowbO/wSrxsDG5DKIMxC81P0QrQTYai8zFNY+umuoHWRPbQ/TuuDEOju9E+jQDXmj6yI5GyejNuh8I+eg== + +"@tannin/plural-forms@^1.1.0": + 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" + +"@tannin/postfix@^1.1.0": + version "1.1.0" + resolved "https://registry.npmjs.org/@tannin/postfix/-/postfix-1.1.0.tgz" + integrity sha512-oocsqY7g0cR+Gur5jRQLSrX2OtpMLMse1I10JQBm8CdGMrDkh1Mg2gjsiquMHRtBs4Qwu5wgEp5GgIYHk4SNPw== + +"@tootallnate/once@2": + version "2.0.0" + resolved "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz" + integrity sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A== + +"@trysound/sax@0.2.0": + version "0.2.0" + resolved "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz" + integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA== + +"@types/babel__core@^7.1.14": + version "7.20.1" + resolved "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.1.tgz" + integrity sha512-aACu/U/omhdk15O4Nfb+fHgH/z3QsfQzpnvRZhYhThms83ZnAOZz7zZAWO7mn2yyNQaA4xTO8GLK3uqFU4bYYw== + dependencies: + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" + "@types/babel__generator" "*" + "@types/babel__template" "*" + "@types/babel__traverse" "*" + +"@types/babel__generator@*": + version "7.6.4" + resolved "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz" + integrity sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg== + dependencies: + "@babel/types" "^7.0.0" + +"@types/babel__template@*": + version "7.4.1" + resolved "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz" + integrity sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g== + dependencies: + "@babel/parser" "^7.1.0" + "@babel/types" "^7.0.0" + +"@types/babel__traverse@*", "@types/babel__traverse@^7.0.6": + version "7.20.1" + resolved "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.1.tgz" + integrity sha512-MitHFXnhtgwsGZWtT68URpOvLN4EREih1u3QtQiN4VdAxWKRVvGCSvw/Qth0M0Qq3pJpnGOu5JaM/ydK7OGbqg== + dependencies: + "@babel/types" "^7.20.7" + +"@types/body-parser@*": + version "1.19.2" + resolved "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz" + integrity sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g== + dependencies: + "@types/connect" "*" + "@types/node" "*" + +"@types/bonjour@^3.5.9": + version "3.5.10" + resolved "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz" + integrity sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw== + dependencies: + "@types/node" "*" + +"@types/connect-history-api-fallback@^1.3.5": + version "1.5.1" + resolved "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.1.tgz" + integrity sha512-iaQslNbARe8fctL5Lk+DsmgWOM83lM+7FzP0eQUJs1jd3kBE8NWqBTIT2S8SqQOJjxvt2eyIjpOuYeRXq2AdMw== + dependencies: + "@types/express-serve-static-core" "*" + "@types/node" "*" + +"@types/connect@*": + version "3.4.36" + resolved "https://registry.npmjs.org/@types/connect/-/connect-3.4.36.tgz" + integrity sha512-P63Zd/JUGq+PdrM1lv0Wv5SBYeA2+CORvbrXbngriYY0jzLUWfQMQQxOhjONEz/wlHOAxOdY7CY65rgQdTjq2w== + dependencies: + "@types/node" "*" + +"@types/eslint-scope@^3.7.3": + version "3.7.4" + resolved "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz" + integrity sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA== + dependencies: + "@types/eslint" "*" + "@types/estree" "*" + +"@types/eslint@*": + version "8.44.2" + resolved "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.2.tgz" + integrity sha512-sdPRb9K6iL5XZOmBubg8yiFp5yS/JdUDQsq5e6h95km91MCYMuvp7mh1fjPEYUhvHepKpZOjnEaMBR4PxjWDzg== + dependencies: + "@types/estree" "*" + "@types/json-schema" "*" + +"@types/estree@*", "@types/estree@^1.0.0": + version "1.0.1" + resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz" + integrity sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA== + +"@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.33": + version "4.17.36" + resolved "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.36.tgz" + integrity sha512-zbivROJ0ZqLAtMzgzIUC4oNqDG9iF0lSsAqpOD9kbs5xcIM3dTiyuHvBc7R8MtWBp3AAWGaovJa+wzWPjLYW7Q== + dependencies: + "@types/node" "*" + "@types/qs" "*" + "@types/range-parser" "*" + "@types/send" "*" + +"@types/express@*", "@types/express@^4.17.13": + version "4.17.17" + resolved "https://registry.npmjs.org/@types/express/-/express-4.17.17.tgz" + integrity sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q== + dependencies: + "@types/body-parser" "*" + "@types/express-serve-static-core" "^4.17.33" + "@types/qs" "*" + "@types/serve-static" "*" + +"@types/glob@^7.1.1": + version "7.2.0" + resolved "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz" + integrity sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA== + dependencies: + "@types/minimatch" "*" + "@types/node" "*" + +"@types/graceful-fs@^4.1.3": + version "4.1.6" + resolved "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz" + integrity sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw== + dependencies: + "@types/node" "*" + +"@types/http-errors@*": + version "2.0.1" + resolved "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.1.tgz" + integrity sha512-/K3ds8TRAfBvi5vfjuz8y6+GiAYBZ0x4tXv1Av6CWBWn0IlADc+ZX9pMq7oU0fNQPnBwIZl3rmeLp6SBApbxSQ== + +"@types/http-proxy@^1.17.8": + version "1.17.11" + resolved "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.11.tgz" + integrity sha512-HC8G7c1WmaF2ekqpnFq626xd3Zz0uvaqFmBJNRZCGEZCXkvSdJoNFn/8Ygbd9fKNQj8UzLdCETaI0UWPAjK7IA== + dependencies: + "@types/node" "*" + +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0", "@types/istanbul-lib-coverage@^2.0.1": + version "2.0.4" + resolved "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz" + integrity sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g== + +"@types/istanbul-lib-report@*": + version "3.0.0" + resolved "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz" + integrity sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg== + dependencies: + "@types/istanbul-lib-coverage" "*" + +"@types/istanbul-reports@^3.0.0": + version "3.0.1" + resolved "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz" + integrity sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw== + dependencies: + "@types/istanbul-lib-report" "*" + +"@types/jsdom@^20.0.0": + version "20.0.1" + resolved "https://registry.npmjs.org/@types/jsdom/-/jsdom-20.0.1.tgz" + integrity sha512-d0r18sZPmMQr1eG35u12FZfhIXNrnsPU/g5wvRKCUf/tOGilKKwYMYGqh33BNR6ba+2gkHw1EUiHoN3mn7E5IQ== + dependencies: + "@types/node" "*" + "@types/tough-cookie" "*" + parse5 "^7.0.0" + +"@types/json-schema@*", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": + version "7.0.12" + resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz" + integrity sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA== + +"@types/json5@^0.0.29": + version "0.0.29" + resolved "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz" + integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ== + +"@types/mime@*": + version "3.0.1" + resolved "https://registry.npmjs.org/@types/mime/-/mime-3.0.1.tgz" + integrity sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA== + +"@types/mime@^1": + version "1.3.2" + resolved "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz" + integrity sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw== + +"@types/minimatch@*": + version "5.1.2" + resolved "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz" + integrity sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA== + +"@types/minimist@^1.2.0": + version "1.2.2" + resolved "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz" + integrity sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ== + +"@types/mousetrap@^1.6.8": + version "1.6.11" + resolved "https://registry.npmjs.org/@types/mousetrap/-/mousetrap-1.6.11.tgz" + integrity sha512-F0oAily9Q9QQpv9JKxKn0zMKfOo36KHCW7myYsmUyf2t0g+sBTbG3UleTPoguHdE1z3GLFr3p7/wiOio52QFjQ== + +"@types/node@*": + version "20.5.9" + resolved "https://registry.npmjs.org/@types/node/-/node-20.5.9.tgz" + integrity sha512-PcGNd//40kHAS3sTlzKB9C9XL4K0sTup8nbG5lC14kzEteTNuAFh9u5nA0o5TWnSG2r/JNPRXFVcHJIIeRlmqQ== + +"@types/normalize-package-data@^2.4.0": + version "2.4.1" + resolved "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz" + integrity sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw== + +"@types/parse-json@^4.0.0": + version "4.0.0" + resolved "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz" + integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA== + +"@types/prop-types@*": + version "15.7.5" + resolved "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz" + integrity sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w== + +"@types/qs@*": + version "6.9.8" + resolved "https://registry.npmjs.org/@types/qs/-/qs-6.9.8.tgz" + integrity sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg== + +"@types/range-parser@*": + version "1.2.4" + resolved "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz" + integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw== + +"@types/react-dom@^18.0.6": + version "18.2.7" + resolved "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.7.tgz" + integrity sha512-GRaAEriuT4zp9N4p1i8BDBYmEyfo+xQ3yHjJU4eiK5NDa1RmUZG+unZABUTK4/Ox/M+GaHwb6Ow8rUITrtjszA== + dependencies: + "@types/react" "*" + +"@types/react@*", "@types/react@^18.0.21": + version "18.2.21" + resolved "https://registry.npmjs.org/@types/react/-/react-18.2.21.tgz" + integrity sha512-neFKG/sBAwGxHgXiIxnbm3/AAVQ/cMRS93hvBpg8xYRbeQSPVABp9U2bRnPf0iI4+Ucdv3plSxKK+3CW2ENJxA== + dependencies: + "@types/prop-types" "*" + "@types/scheduler" "*" + csstype "^3.0.2" + +"@types/retry@0.12.0": + version "0.12.0" + resolved "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz" + integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA== + +"@types/scheduler@*": + version "0.16.3" + resolved "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.3.tgz" + integrity sha512-5cJ8CB4yAx7BH1oMvdU0Jh9lrEXyPkar6F9G/ERswkCuvP4KQZfZkSjcMbAICCpQTN4OuZn8tz0HiKv9TGZgrQ== + +"@types/semver@^7.3.12": + version "7.5.1" + resolved "https://registry.npmjs.org/@types/semver/-/semver-7.5.1.tgz" + integrity sha512-cJRQXpObxfNKkFAZbJl2yjWtJCqELQIdShsogr1d2MilP8dKD9TE/nEKHkJgUNHdGKCQaf9HbIynuV2csLGVLg== + +"@types/send@*": + version "0.17.1" + resolved "https://registry.npmjs.org/@types/send/-/send-0.17.1.tgz" + integrity sha512-Cwo8LE/0rnvX7kIIa3QHCkcuF21c05Ayb0ZfxPiv0W8VRiZiNW/WuRupHKpqqGVGf7SUA44QSOUKaEd9lIrd/Q== + dependencies: + "@types/mime" "^1" + "@types/node" "*" + +"@types/serve-index@^1.9.1": + version "1.9.1" + resolved "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz" + integrity sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg== + dependencies: + "@types/express" "*" + +"@types/serve-static@*", "@types/serve-static@^1.13.10": + version "1.15.2" + resolved "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.2.tgz" + integrity sha512-J2LqtvFYCzaj8pVYKw8klQXrLLk7TBZmQ4ShlcdkELFKGwGMfevMLneMMRkMgZxotOD9wg497LpC7O8PcvAmfw== + dependencies: + "@types/http-errors" "*" + "@types/mime" "*" + "@types/node" "*" + +"@types/sockjs@^0.3.33": + version "0.3.33" + resolved "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz" + integrity sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw== + dependencies: + "@types/node" "*" + +"@types/source-list-map@*": + version "0.1.2" + resolved "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz" + integrity sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA== + +"@types/stack-utils@^2.0.0": + version "2.0.1" + resolved "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz" + integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== + +"@types/tapable@^1": + version "1.0.8" + resolved "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.8.tgz" + integrity sha512-ipixuVrh2OdNmauvtT51o3d8z12p6LtFW9in7U79der/kwejjdNchQC5UMn5u/KxNoM7VHHOs/l8KS8uHxhODQ== + +"@types/tough-cookie@*": + version "4.0.2" + resolved "https://registry.npmjs.org/@types/tough-cookie/-/tough-cookie-4.0.2.tgz" + integrity sha512-Q5vtl1W5ue16D+nIaW8JWebSSraJVlK+EthKn7e7UcD4KWsaSJ8BqGPXNaPghgtcn/fhvrN17Tv8ksUsQpiplw== + +"@types/uglify-js@*": + version "3.17.2" + resolved "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.17.2.tgz" + integrity sha512-9SjrHO54LINgC/6Ehr81NjAxAYvwEZqjUHLjJYvC4Nmr9jbLQCIZbWSvl4vXQkkmR1UAuaKDycau3O1kWGFyXQ== + dependencies: + source-map "^0.6.1" + +"@types/webpack-sources@*": + version "3.2.0" + resolved "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-3.2.0.tgz" + integrity sha512-Ft7YH3lEVRQ6ls8k4Ff1oB4jN6oy/XmU6tQISKdhfh+1mR+viZFphS6WL0IrtDOzvefmJg5a0s7ZQoRXwqTEFg== + dependencies: + "@types/node" "*" + "@types/source-list-map" "*" + source-map "^0.7.3" + +"@types/webpack@^4.4.31": + version "4.41.33" + resolved "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.33.tgz" + integrity sha512-PPajH64Ft2vWevkerISMtnZ8rTs4YmRbs+23c402J0INmxDKCrhZNvwZYtzx96gY2wAtXdrK1BS2fiC8MlLr3g== + dependencies: + "@types/node" "*" + "@types/tapable" "^1" + "@types/uglify-js" "*" + "@types/webpack-sources" "*" + anymatch "^3.0.0" + source-map "^0.6.0" + +"@types/ws@^8.5.5": + version "8.5.5" + resolved "https://registry.npmjs.org/@types/ws/-/ws-8.5.5.tgz" + integrity sha512-lwhs8hktwxSjf9UaZ9tG5M03PGogvFaH8gUgLNbN9HKIg0dvv6q+gkSuJ8HN4/VbyxkuLzCjlN7GquQ0gUJfIg== + dependencies: + "@types/node" "*" + +"@types/yargs-parser@*": + version "21.0.0" + resolved "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz" + integrity sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA== + +"@types/yargs@^17.0.8": + version "17.0.24" + resolved "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.24.tgz" + integrity sha512-6i0aC7jV6QzQB8ne1joVZ0eSFIstHsCrobmOtghM11yGlH0j43FKL2UhWdELkyps0zuf7qVTUVCCR+tgSlyLLw== + dependencies: + "@types/yargs-parser" "*" + +"@types/yauzl@^2.9.1": + version "2.10.0" + resolved "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz" + integrity sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw== + dependencies: + "@types/node" "*" + +"@typescript-eslint/eslint-plugin@^5.62.0": + version "5.62.0" + resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz" + integrity sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag== + dependencies: + "@eslint-community/regexpp" "^4.4.0" + "@typescript-eslint/scope-manager" "5.62.0" + "@typescript-eslint/type-utils" "5.62.0" + "@typescript-eslint/utils" "5.62.0" + debug "^4.3.4" + graphemer "^1.4.0" + ignore "^5.2.0" + natural-compare-lite "^1.4.0" + semver "^7.3.7" + tsutils "^3.21.0" + +"@typescript-eslint/parser@^5.62.0": + version "5.62.0" + resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz" + integrity sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA== + dependencies: + "@typescript-eslint/scope-manager" "5.62.0" + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/typescript-estree" "5.62.0" + debug "^4.3.4" + +"@typescript-eslint/scope-manager@5.62.0": + version "5.62.0" + resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.62.0.tgz" + integrity sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w== + dependencies: + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/visitor-keys" "5.62.0" + +"@typescript-eslint/type-utils@5.62.0": + version "5.62.0" + resolved "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.62.0.tgz" + integrity sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew== + dependencies: + "@typescript-eslint/typescript-estree" "5.62.0" + "@typescript-eslint/utils" "5.62.0" + debug "^4.3.4" + tsutils "^3.21.0" + +"@typescript-eslint/types@5.62.0": + version "5.62.0" + resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz" + integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ== + +"@typescript-eslint/typescript-estree@5.62.0": + 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== + 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" + +"@typescript-eslint/utils@5.62.0", "@typescript-eslint/utils@^5.10.0": + version "5.62.0" + resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz" + integrity sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@types/json-schema" "^7.0.9" + "@types/semver" "^7.3.12" + "@typescript-eslint/scope-manager" "5.62.0" + "@typescript-eslint/types" "5.62.0" + "@typescript-eslint/typescript-estree" "5.62.0" + eslint-scope "^5.1.1" + semver "^7.3.7" + +"@typescript-eslint/visitor-keys@5.62.0": + 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== + dependencies: + "@typescript-eslint/types" "5.62.0" + eslint-visitor-keys "^3.3.0" + +"@use-gesture/core@10.2.27": + version "10.2.27" + resolved "https://registry.npmjs.org/@use-gesture/core/-/core-10.2.27.tgz" + integrity sha512-V4XV7hn9GAD2MYu8yBBVi5iuWBsAMfjPRMsEVzoTNGYH72tf0kFP+OKqGKc8YJFQIJx6yj+AOqxmEHOmx2/MEA== + +"@use-gesture/react@^10.2.24": + version "10.2.27" + resolved "https://registry.npmjs.org/@use-gesture/react/-/react-10.2.27.tgz" + integrity sha512-7E5vnWCxeslWlxwZ8uKIcnUZVMTRMZ8cvSnLLKF1NkyNb3PnNiAzoXM4G1vTKJKRhgOTeI6wK1YsEpwo9ABV5w== + dependencies: + "@use-gesture/core" "10.2.27" + +"@webassemblyjs/ast@1.11.6", "@webassemblyjs/ast@^1.11.5": + version "1.11.6" + resolved "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz" + integrity sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q== + dependencies: + "@webassemblyjs/helper-numbers" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + +"@webassemblyjs/floating-point-hex-parser@1.11.6": + version "1.11.6" + resolved "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz" + integrity sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw== + +"@webassemblyjs/helper-api-error@1.11.6": + version "1.11.6" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz" + integrity sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q== + +"@webassemblyjs/helper-buffer@1.11.6": + version "1.11.6" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz" + integrity sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA== + +"@webassemblyjs/helper-numbers@1.11.6": + version "1.11.6" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz" + integrity sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g== + dependencies: + "@webassemblyjs/floating-point-hex-parser" "1.11.6" + "@webassemblyjs/helper-api-error" "1.11.6" + "@xtuc/long" "4.2.2" + +"@webassemblyjs/helper-wasm-bytecode@1.11.6": + version "1.11.6" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz" + integrity sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA== + +"@webassemblyjs/helper-wasm-section@1.11.6": + version "1.11.6" + resolved "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz" + integrity sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g== + dependencies: + "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/helper-buffer" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/wasm-gen" "1.11.6" + +"@webassemblyjs/ieee754@1.11.6": + version "1.11.6" + resolved "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz" + integrity sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg== + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.11.6": + version "1.11.6" + resolved "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz" + integrity sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ== + dependencies: + "@xtuc/long" "4.2.2" + +"@webassemblyjs/utf8@1.11.6": + version "1.11.6" + resolved "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz" + integrity sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA== + +"@webassemblyjs/wasm-edit@^1.11.5": + version "1.11.6" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz" + integrity sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw== + dependencies: + "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/helper-buffer" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/helper-wasm-section" "1.11.6" + "@webassemblyjs/wasm-gen" "1.11.6" + "@webassemblyjs/wasm-opt" "1.11.6" + "@webassemblyjs/wasm-parser" "1.11.6" + "@webassemblyjs/wast-printer" "1.11.6" + +"@webassemblyjs/wasm-gen@1.11.6": + version "1.11.6" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz" + integrity sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA== + dependencies: + "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/ieee754" "1.11.6" + "@webassemblyjs/leb128" "1.11.6" + "@webassemblyjs/utf8" "1.11.6" + +"@webassemblyjs/wasm-opt@1.11.6": + version "1.11.6" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz" + integrity sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g== + dependencies: + "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/helper-buffer" "1.11.6" + "@webassemblyjs/wasm-gen" "1.11.6" + "@webassemblyjs/wasm-parser" "1.11.6" + +"@webassemblyjs/wasm-parser@1.11.6", "@webassemblyjs/wasm-parser@^1.11.5": + version "1.11.6" + resolved "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz" + integrity sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ== + dependencies: + "@webassemblyjs/ast" "1.11.6" + "@webassemblyjs/helper-api-error" "1.11.6" + "@webassemblyjs/helper-wasm-bytecode" "1.11.6" + "@webassemblyjs/ieee754" "1.11.6" + "@webassemblyjs/leb128" "1.11.6" + "@webassemblyjs/utf8" "1.11.6" + +"@webassemblyjs/wast-printer@1.11.6": + version "1.11.6" + resolved "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz" + integrity sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A== + dependencies: + "@webassemblyjs/ast" "1.11.6" + "@xtuc/long" "4.2.2" + +"@webpack-cli/configtest@^1.2.0": + version "1.2.0" + resolved "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.2.0.tgz" + integrity sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg== + +"@webpack-cli/info@^1.5.0": + version "1.5.0" + resolved "https://registry.npmjs.org/@webpack-cli/info/-/info-1.5.0.tgz" + integrity sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ== + dependencies: + envinfo "^7.7.3" + +"@webpack-cli/serve@^1.7.0": + version "1.7.0" + resolved "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.7.0.tgz" + integrity sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q== + +"@wordpress/a11y@^3.41.0": + version "3.41.0" + resolved "https://registry.npmjs.org/@wordpress/a11y/-/a11y-3.41.0.tgz" + integrity sha512-T+7rHdX4k72ty3MdtySuL41d4wrIXRKdM1Xhjr89G/OXyetsY0nb4n6jUsFGnf69iq7gFSgVjEVogbOc/ffbTA== + dependencies: + "@babel/runtime" "^7.16.0" + "@wordpress/dom-ready" "^3.41.0" + "@wordpress/i18n" "^4.41.0" + +"@wordpress/api-fetch@^6.38.0": + version "6.38.0" + resolved "https://registry.yarnpkg.com/@wordpress/api-fetch/-/api-fetch-6.38.0.tgz#f19e1336fa7b5e0dc0321e3036110da5fdbfe252" + integrity sha512-EY5+9hxUDFOKCrIBFokUFuF2bPnWjtOlc8yQcB1SmJv5JULdFZF+pgAKXqTPFwWR8wcNjv2hypemV8j82Rq4MA== + dependencies: + "@babel/runtime" "^7.16.0" + "@wordpress/i18n" "^4.41.0" + "@wordpress/url" "^3.42.0" + +"@wordpress/autop@^3.41.0": + version "3.41.0" + resolved "https://registry.yarnpkg.com/@wordpress/autop/-/autop-3.41.0.tgz#705bcad0049b8d71733f1a423e925062751c8f93" + integrity sha512-oaGwox3PKg6/a4nFul7js4k/wXazgtL0t6v8Epg3IotMUFXBN3rCAqH/zmCl/669LA9gG0TaT0VoqjF3iFuLtQ== + dependencies: + "@babel/runtime" "^7.16.0" + +"@wordpress/babel-plugin-import-jsx-pragma@^4.24.0": + version "4.24.0" + resolved "https://registry.npmjs.org/@wordpress/babel-plugin-import-jsx-pragma/-/babel-plugin-import-jsx-pragma-4.24.0.tgz" + integrity sha512-qtde+CeTWWnXsLsUSJddKZmOQnbEjqfUk8vUEHySHIDUNd785etG0i6m6YCudpJPKTbacNSZiJ5GVZvWArBUrw== + +"@wordpress/babel-preset-default@^7.25.0": + version "7.25.0" + resolved "https://registry.npmjs.org/@wordpress/babel-preset-default/-/babel-preset-default-7.25.0.tgz" + integrity sha512-wxFDIWxAZs+GcHkByNpzQLJq9LMny79n51ntTwaCTUtjkAJoYqGujCCdwuF7G1EKsv2zmyQhLXa5CWjikYveEQ== + dependencies: + "@babel/core" "^7.16.0" + "@babel/plugin-transform-react-jsx" "^7.16.0" + "@babel/plugin-transform-runtime" "^7.16.0" + "@babel/preset-env" "^7.16.0" + "@babel/preset-typescript" "^7.16.0" + "@babel/runtime" "^7.16.0" + "@wordpress/babel-plugin-import-jsx-pragma" "^4.24.0" + "@wordpress/browserslist-config" "^5.24.0" + "@wordpress/element" "^5.18.0" + "@wordpress/warning" "^2.41.0" + browserslist "^4.21.9" + core-js "^3.31.0" + +"@wordpress/base-styles@^4.32.0": + version "4.32.0" + resolved "https://registry.npmjs.org/@wordpress/base-styles/-/base-styles-4.32.0.tgz" + integrity sha512-P75dFG2nnoUiTmQTIatnJNB9D0/Th9+47ki1+0/uQwH5zCCc80+TQAXR4DRD/XACg5nDbYHiy0waOGTm9+vuqw== + +"@wordpress/blob@^3.41.0": + version "3.41.0" + resolved "https://registry.yarnpkg.com/@wordpress/blob/-/blob-3.41.0.tgz#cd81d22528348a21679a774f1917ec5eec023945" + integrity sha512-osBcD1IpN/YT96ArGqf7Cdon/Z8gHMC8sWPUAQ1OPLNrxlFLomaCPOoC9UeAgbEh338epoYfqmi7rTwUMCBS3Q== + dependencies: + "@babel/runtime" "^7.16.0" + +"@wordpress/block-editor@^12.9.0": + version "12.9.0" + resolved "https://registry.yarnpkg.com/@wordpress/block-editor/-/block-editor-12.9.0.tgz#fe40903e327b42180556dfd4f64da55c38c981ed" + integrity sha512-x8fUoP2T6PtuEXm62VGkJSLokDU8EKmh+5sFeVIj2Vbh7av4i0+OWzf/LhP4rCi1bRujZSk8Gn1uzRfJglNMHQ== + dependencies: + "@babel/runtime" "^7.16.0" + "@emotion/react" "^11.7.1" + "@emotion/styled" "^11.6.0" + "@react-spring/web" "^9.4.5" + "@wordpress/a11y" "^3.41.0" + "@wordpress/api-fetch" "^6.38.0" + "@wordpress/blob" "^3.41.0" + "@wordpress/blocks" "^12.18.0" + "@wordpress/commands" "^0.12.0" + "@wordpress/components" "^25.7.0" + "@wordpress/compose" "^6.18.0" + "@wordpress/data" "^9.11.0" + "@wordpress/date" "^4.41.0" + "@wordpress/deprecated" "^3.41.0" + "@wordpress/dom" "^3.41.0" + "@wordpress/element" "^5.18.0" + "@wordpress/escape-html" "^2.41.0" + "@wordpress/hooks" "^3.41.0" + "@wordpress/html-entities" "^3.41.0" + "@wordpress/i18n" "^4.41.0" + "@wordpress/icons" "^9.32.0" + "@wordpress/is-shallow-equal" "^4.41.0" + "@wordpress/keyboard-shortcuts" "^4.18.0" + "@wordpress/keycodes" "^3.41.0" + "@wordpress/notices" "^4.9.0" + "@wordpress/preferences" "^3.18.0" + "@wordpress/private-apis" "^0.23.0" + "@wordpress/rich-text" "^6.18.0" + "@wordpress/shortcode" "^3.41.0" + "@wordpress/style-engine" "^1.24.0" + "@wordpress/token-list" "^2.41.0" + "@wordpress/url" "^3.42.0" + "@wordpress/warning" "^2.41.0" + "@wordpress/wordcount" "^3.41.0" + change-case "^4.1.2" + classnames "^2.3.1" + colord "^2.7.0" + deepmerge "^4.3.0" + diff "^4.0.2" + dom-scroll-into-view "^1.2.1" + fast-deep-equal "^3.1.3" + inherits "^2.0.3" + react-autosize-textarea "^7.1.0" + react-easy-crop "^4.5.1" + rememo "^4.0.2" + remove-accents "^0.5.0" + traverse "^0.6.6" + +"@wordpress/block-serialization-default-parser@^4.41.0": + version "4.41.0" + resolved "https://registry.yarnpkg.com/@wordpress/block-serialization-default-parser/-/block-serialization-default-parser-4.41.0.tgz#78ea6dd4357bc1526c121e0f6f13c06ff5669ee9" + integrity sha512-/bHeVewOO2GSm3y6fSoOlt0ZNweP2jua8G+CTZG3XKrwX1eTXWFQtJTJQPUuerXeWEqMTD58lILxneqyw28hcg== + dependencies: + "@babel/runtime" "^7.16.0" + +"@wordpress/blocks@^12.18.0": + version "12.18.0" + resolved "https://registry.yarnpkg.com/@wordpress/blocks/-/blocks-12.18.0.tgz#af34be9774d87b9a7efb4024087db7d35f97aff0" + integrity sha512-JS2g4k95GPNdO2hOLBbppz3kTBUdKIoFXJ5w5tn11TGYep4dmEHh8ugGCW9XweOCkz3g4HDT+vansRAz4JF1yQ== + dependencies: + "@babel/runtime" "^7.16.0" + "@wordpress/autop" "^3.41.0" + "@wordpress/blob" "^3.41.0" + "@wordpress/block-serialization-default-parser" "^4.41.0" + "@wordpress/compose" "^6.18.0" + "@wordpress/data" "^9.11.0" + "@wordpress/deprecated" "^3.41.0" + "@wordpress/dom" "^3.41.0" + "@wordpress/element" "^5.18.0" + "@wordpress/hooks" "^3.41.0" + "@wordpress/html-entities" "^3.41.0" + "@wordpress/i18n" "^4.41.0" + "@wordpress/is-shallow-equal" "^4.41.0" + "@wordpress/private-apis" "^0.23.0" + "@wordpress/shortcode" "^3.41.0" + change-case "^4.1.2" + colord "^2.7.0" + deepmerge "^4.3.0" + fast-deep-equal "^3.1.3" + hpq "^1.3.0" + is-plain-object "^5.0.0" + memize "^2.1.0" + rememo "^4.0.2" + remove-accents "^0.5.0" + showdown "^1.9.1" + simple-html-tokenizer "^0.5.7" + uuid "^8.3.0" + +"@wordpress/browserslist-config@^5.24.0": + version "5.24.0" + resolved "https://registry.npmjs.org/@wordpress/browserslist-config/-/browserslist-config-5.24.0.tgz" + integrity sha512-6QYbEVeIZxak8Bt0XCQ7msF9QcVjWqdREgDXVcWPD907WdKC5Hmi8ZtY63mY5OouKn5Cnxg7VJRv1AWb9eT0/g== + +"@wordpress/commands@^0.12.0": + version "0.12.0" + resolved "https://registry.yarnpkg.com/@wordpress/commands/-/commands-0.12.0.tgz#4169d5d893b539bbaabc3096f471dbb06f9f24a6" + integrity sha512-yeFZ2BCDh9i8+XhcwAjwREXE8WUl9hv4YL5/b2Dh6eUqld/TGH4lUtxIHMxsnlzLqR29ZRaChobU44ji4rZf9g== + dependencies: + "@babel/runtime" "^7.16.0" + "@wordpress/components" "^25.7.0" + "@wordpress/data" "^9.11.0" + "@wordpress/element" "^5.18.0" + "@wordpress/i18n" "^4.41.0" + "@wordpress/icons" "^9.32.0" + "@wordpress/keyboard-shortcuts" "^4.18.0" + "@wordpress/private-apis" "^0.23.0" + classnames "^2.3.1" + cmdk "^0.2.0" + rememo "^4.0.2" + +"@wordpress/components@^25.7.0": + version "25.7.0" + resolved "https://registry.npmjs.org/@wordpress/components/-/components-25.7.0.tgz" + integrity sha512-CFUhdMKuIA+0flsA3ACnJ0h84uKo+PrGkWG3nCSJwifdC6AVB7b7VOriDRhYsJXKoyr3QV+gRfAnFn0Hrc7tQQ== + dependencies: + "@ariakit/react" "^0.2.12" + "@babel/runtime" "^7.16.0" + "@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.1" + "@radix-ui/react-dropdown-menu" "2.0.4" + "@use-gesture/react" "^10.2.24" + "@wordpress/a11y" "^3.41.0" + "@wordpress/compose" "^6.18.0" + "@wordpress/date" "^4.41.0" + "@wordpress/deprecated" "^3.41.0" + "@wordpress/dom" "^3.41.0" + "@wordpress/element" "^5.18.0" + "@wordpress/escape-html" "^2.41.0" + "@wordpress/hooks" "^3.41.0" + "@wordpress/html-entities" "^3.41.0" + "@wordpress/i18n" "^4.41.0" + "@wordpress/icons" "^9.32.0" + "@wordpress/is-shallow-equal" "^4.41.0" + "@wordpress/keycodes" "^3.41.0" + "@wordpress/primitives" "^3.39.0" + "@wordpress/private-apis" "^0.23.0" + "@wordpress/rich-text" "^6.18.0" + "@wordpress/warning" "^2.41.0" + change-case "^4.1.2" + classnames "^2.3.1" + colord "^2.7.0" + date-fns "^2.28.0" + deepmerge "^4.3.0" + dom-scroll-into-view "^1.2.1" + downshift "^6.0.15" + fast-deep-equal "^3.1.3" + framer-motion "^10.13.0" + 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" + reakit "^1.3.11" + remove-accents "^0.5.0" + use-lilius "^2.0.1" + uuid "^8.3.0" + valtio "1.7.0" + +"@wordpress/compose@^6.18.0": + version "6.18.0" + resolved "https://registry.npmjs.org/@wordpress/compose/-/compose-6.18.0.tgz" + integrity sha512-aZyvttCnT8HI4vS8Nb8y5Go+AycrThy0gvEl9jc9ZB9emm1ZifNkA6gTNpBd7zU2uzS4wUpiZYGGvUNeAuShvQ== + dependencies: + "@babel/runtime" "^7.16.0" + "@types/mousetrap" "^1.6.8" + "@wordpress/deprecated" "^3.41.0" + "@wordpress/dom" "^3.41.0" + "@wordpress/element" "^5.18.0" + "@wordpress/is-shallow-equal" "^4.41.0" + "@wordpress/keycodes" "^3.41.0" + "@wordpress/priority-queue" "^2.41.0" + change-case "^4.1.2" + clipboard "^2.0.8" + mousetrap "^1.6.5" + use-memo-one "^1.1.1" + +"@wordpress/core-data@^6.18.0": + version "6.18.0" + resolved "https://registry.yarnpkg.com/@wordpress/core-data/-/core-data-6.18.0.tgz#43c1be55a41dabb40563e168cc7d309a990c161a" + integrity sha512-QJCogXr+rjaDQQCphcLjirGVPcsOOzb00mBhALEtqyliIKkZ6KAPBVz3VeMO5DWShC8KaFNbUg3565QtsnY39g== + dependencies: + "@babel/runtime" "^7.16.0" + "@wordpress/api-fetch" "^6.38.0" + "@wordpress/block-editor" "^12.9.0" + "@wordpress/blocks" "^12.18.0" + "@wordpress/compose" "^6.18.0" + "@wordpress/data" "^9.11.0" + "@wordpress/deprecated" "^3.41.0" + "@wordpress/element" "^5.18.0" + "@wordpress/html-entities" "^3.41.0" + "@wordpress/i18n" "^4.41.0" + "@wordpress/is-shallow-equal" "^4.41.0" + "@wordpress/private-apis" "^0.23.0" + "@wordpress/sync" "^0.3.0" + "@wordpress/url" "^3.42.0" + change-case "^4.1.2" + equivalent-key-map "^0.2.2" + fast-deep-equal "^3.1.3" + memize "^2.1.0" + rememo "^4.0.2" + uuid "^8.3.0" + +"@wordpress/data@^9.11.0": + version "9.11.0" + resolved "https://registry.yarnpkg.com/@wordpress/data/-/data-9.11.0.tgz#7a4d7df1d7e2e6c72c53dce911596955e471c81f" + integrity sha512-1UaummqcfxO4EU7eKfkxEaRjlZjRvqHRdtdjyBtrpWHxIaLrTzBdM7rBNu06tilZBoAXGRoBc5TyPuvNI3IWNg== + dependencies: + "@babel/runtime" "^7.16.0" + "@wordpress/compose" "^6.18.0" + "@wordpress/deprecated" "^3.41.0" + "@wordpress/element" "^5.18.0" + "@wordpress/is-shallow-equal" "^4.41.0" + "@wordpress/priority-queue" "^2.41.0" + "@wordpress/private-apis" "^0.23.0" + "@wordpress/redux-routine" "^4.41.0" + 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" + turbo-combine-reducers "^1.0.2" + use-memo-one "^1.1.1" + +"@wordpress/date@^4.41.0": + version "4.41.0" + resolved "https://registry.npmjs.org/@wordpress/date/-/date-4.41.0.tgz" + integrity sha512-R0cTQKev7xT/srjAgUJOgW7CYnXuRdxSpXG7timYr3jEqgYoJFSAP2miq3+FWWSra1nesdT+r4o5z+3rIKFLLg== + dependencies: + "@babel/runtime" "^7.16.0" + "@wordpress/deprecated" "^3.41.0" + moment "^2.29.4" + moment-timezone "^0.5.40" + +"@wordpress/dependency-extraction-webpack-plugin@^4.24.0": + version "4.24.0" + resolved "https://registry.npmjs.org/@wordpress/dependency-extraction-webpack-plugin/-/dependency-extraction-webpack-plugin-4.24.0.tgz" + integrity sha512-HS9Ol9dOV6PU4TBxWVE9yDHXFInoOrXzPeoojw7SBKUziiCAh7ZG9JPFt/hJR83rXf9Ro6FEFke4oOtUTZmo6A== + dependencies: + json2php "^0.0.7" + webpack-sources "^3.2.2" + +"@wordpress/deprecated@^3.41.0": + version "3.41.0" + resolved "https://registry.npmjs.org/@wordpress/deprecated/-/deprecated-3.41.0.tgz" + integrity sha512-8so9fJC6MvMeMxaRqEJYtzXm1RP2i+nq3NXG9DW4fbo8ICEIe1QqBpCFqV4FbkHs8PRqyJ8IJ7C6NnAvL3BWKw== + dependencies: + "@babel/runtime" "^7.16.0" + "@wordpress/hooks" "^3.41.0" + +"@wordpress/dom-ready@^3.41.0": + version "3.41.0" + resolved "https://registry.npmjs.org/@wordpress/dom-ready/-/dom-ready-3.41.0.tgz" + integrity sha512-xbTCYC1192nUiBLB384GrzlQMbFnSv31TjI4+Y4JhR46+alcSsF2KPmlR8htxRbAXBx7z8lT78Fv+0ULhSIERA== + dependencies: + "@babel/runtime" "^7.16.0" + +"@wordpress/dom@^3.41.0": + version "3.41.0" + resolved "https://registry.npmjs.org/@wordpress/dom/-/dom-3.41.0.tgz" + integrity sha512-0FKG4c33G7jOElzy1adqgNjowYBaWX98Q99X9WjpjtF+AY7/Sljq4zOGh5iZXSM/1dpKLPs4f/frFEqueq6MGg== + dependencies: + "@babel/runtime" "^7.16.0" + "@wordpress/deprecated" "^3.41.0" + +"@wordpress/element@^5.18.0": + version "5.18.0" + resolved "https://registry.npmjs.org/@wordpress/element/-/element-5.18.0.tgz" + integrity sha512-OynuZuTFdmterh/ASmMSSKjdBj5r1hcwQi37AQnp7+GpyIV3Ol5PR4UWWYB0coW0Gkd0giJkQAwC71/ZkEPYqQ== + dependencies: + "@babel/runtime" "^7.16.0" + "@types/react" "^18.0.21" + "@types/react-dom" "^18.0.6" + "@wordpress/escape-html" "^2.41.0" + change-case "^4.1.2" + is-plain-object "^5.0.0" + react "^18.2.0" + react-dom "^18.2.0" + +"@wordpress/escape-html@^2.41.0": + version "2.41.0" + resolved "https://registry.npmjs.org/@wordpress/escape-html/-/escape-html-2.41.0.tgz" + integrity sha512-fFDuAO/csLVemQrJKTrwxjmR7d2a6zEuDVCKi2jUt7j9rpLpz9IZnEVD2q/icOj2+u6joeDwvCyyPyTreqEZHA== + dependencies: + "@babel/runtime" "^7.16.0" + +"@wordpress/eslint-plugin@^15.1.0": + version "15.1.0" + resolved "https://registry.npmjs.org/@wordpress/eslint-plugin/-/eslint-plugin-15.1.0.tgz" + integrity sha512-iKc8YnakbOWUh7b5A79XhZ9nIJfkHmKAkluxd56kwmKhhn1dfreRaCXpjjBk9E170axKmkHPqFar4xEMy9kO7A== + dependencies: + "@babel/eslint-parser" "^7.16.0" + "@typescript-eslint/eslint-plugin" "^5.62.0" + "@typescript-eslint/parser" "^5.62.0" + "@wordpress/babel-preset-default" "^7.25.0" + "@wordpress/prettier-config" "^2.24.0" + cosmiconfig "^7.0.0" + eslint-config-prettier "^8.3.0" + eslint-plugin-import "^2.25.2" + eslint-plugin-jest "^27.2.1" + eslint-plugin-jsdoc "^46.4.6" + eslint-plugin-jsx-a11y "^6.5.1" + eslint-plugin-prettier "^3.3.0" + eslint-plugin-react "^7.27.0" + eslint-plugin-react-hooks "^4.3.0" + globals "^13.12.0" + requireindex "^1.2.0" + +"@wordpress/hooks@^3.41.0": + version "3.41.0" + resolved "https://registry.npmjs.org/@wordpress/hooks/-/hooks-3.41.0.tgz" + integrity sha512-o3fC6Z0kCLzZNFUT5W7C1d2mR+qjVwLaWjrwuJngJG92wly4IzKgAUDs/iJZojxtePFMP8JOFCg4FMuzG/VhWw== + dependencies: + "@babel/runtime" "^7.16.0" + +"@wordpress/html-entities@^3.41.0": + version "3.41.0" + resolved "https://registry.npmjs.org/@wordpress/html-entities/-/html-entities-3.41.0.tgz" + integrity sha512-nb8ioGMi9yBfOzy2tIvIKQA+MaVNbgTflM/uiwhb5D/KTqtIUp+e84BOCOOZDI7xtWKQKhtGAn126Ko7hi73Jg== + dependencies: + "@babel/runtime" "^7.16.0" + +"@wordpress/i18n@^4.41.0": + version "4.41.0" + resolved "https://registry.npmjs.org/@wordpress/i18n/-/i18n-4.41.0.tgz" + integrity sha512-MXA+DiVSF2CS0ZhFEBq/eJjfHuKMcu3FUuiF/Dpc1YZRD1X7N6xPlfo4xKJZVUWIAsfgpc8oA2YMLw1VTFzrRA== + dependencies: + "@babel/runtime" "^7.16.0" + "@wordpress/hooks" "^3.41.0" + gettext-parser "^1.3.1" + memize "^2.1.0" + sprintf-js "^1.1.1" + tannin "^1.2.0" + +"@wordpress/icons@^9.32.0": + version "9.32.0" + resolved "https://registry.npmjs.org/@wordpress/icons/-/icons-9.32.0.tgz" + integrity sha512-67imRDf5LF6v4vCBmvAEa4ZzcH0jvwIaBr1Y2ou4ElVJ1KZjiu1C93Lp6dcAy/08L8eX+eZZCwTrTYI+tl9v5w== + dependencies: + "@babel/runtime" "^7.16.0" + "@wordpress/element" "^5.18.0" + "@wordpress/primitives" "^3.39.0" + +"@wordpress/is-shallow-equal@^4.41.0": + version "4.41.0" + resolved "https://registry.npmjs.org/@wordpress/is-shallow-equal/-/is-shallow-equal-4.41.0.tgz" + integrity sha512-z0+bdJvjOcbPf7vGiC0Zfoff+2WyFRFwsJex9d9N9CTVvr87kaVHBZuZlPX6iFmS22RzM2tLeppBKlOSRtSI4w== + dependencies: + "@babel/runtime" "^7.16.0" + +"@wordpress/jest-console@^7.12.0": + version "7.12.0" + resolved "https://registry.npmjs.org/@wordpress/jest-console/-/jest-console-7.12.0.tgz" + integrity sha512-sSgG65n32wPdKVWT6aaaslpOOn/TcRw9413UY+NqBgyc/HIlsSR9zKeoFwR3RoOyWr055PABOGNLup+RgdPKxw== + dependencies: + "@babel/runtime" "^7.16.0" + jest-matcher-utils "^29.6.2" + +"@wordpress/jest-preset-default@^11.12.0": + version "11.12.0" + resolved "https://registry.npmjs.org/@wordpress/jest-preset-default/-/jest-preset-default-11.12.0.tgz" + integrity sha512-HPpjUZsjxwvDDTw2ZWdgR1QVaVbsENCR/u0GRiC4NAArHABoleoFopwMZXJtbO1ii9vdeLJvgRNg1YXV5Zj79g== + dependencies: + "@wordpress/jest-console" "^7.12.0" + babel-jest "^29.6.2" + +"@wordpress/keyboard-shortcuts@^4.18.0": + version "4.18.0" + resolved "https://registry.yarnpkg.com/@wordpress/keyboard-shortcuts/-/keyboard-shortcuts-4.18.0.tgz#18cf35b81a19af8be5068ea361aa9e2c0d749b03" + integrity sha512-3q3Kmzzu6PTsx3abce4t/FHFuyN1jn7oukViNA17lIIFTfIL8Eu6ZfKy+UyPgAoCCXohEjCmaaB801qnsLsooQ== + dependencies: + "@babel/runtime" "^7.16.0" + "@wordpress/data" "^9.11.0" + "@wordpress/element" "^5.18.0" + "@wordpress/keycodes" "^3.41.0" + rememo "^4.0.2" + +"@wordpress/keycodes@^3.41.0": + version "3.41.0" + resolved "https://registry.npmjs.org/@wordpress/keycodes/-/keycodes-3.41.0.tgz" + integrity sha512-0DY07PV5qATrvWLc5jWgrgUGpeFrqvY+K0qF0gLDw1rpIZBxLre+N3K7ANC/iZzSsPLbYxxVF0SSFDIVI23Pug== + dependencies: + "@babel/runtime" "^7.16.0" + "@wordpress/i18n" "^4.41.0" + change-case "^4.1.2" + +"@wordpress/notices@^4.9.0": + version "4.9.0" + resolved "https://registry.yarnpkg.com/@wordpress/notices/-/notices-4.9.0.tgz#be52e5b50d7062621c3f5133dff6533049dde638" + integrity sha512-X7LfAJy6jYBq6d7lbW32lrt1DxkdNOg/VpOyiv8klwn30AKSPws/vBSrTPNDpp9phleuIuRr3tDcpS9/p+jRIw== + dependencies: + "@babel/runtime" "^7.16.0" + "@wordpress/a11y" "^3.41.0" + "@wordpress/data" "^9.11.0" + +"@wordpress/npm-package-json-lint-config@^4.26.0": + version "4.26.0" + resolved "https://registry.npmjs.org/@wordpress/npm-package-json-lint-config/-/npm-package-json-lint-config-4.26.0.tgz" + integrity sha512-LSTk773DE8gSk4y42EcQ4+56ojXY8vUT8F91Zrrsv1Ixdo7EoEbSC84+LEAsN2y60biN71193nbVDeLikgH2jA== + +"@wordpress/postcss-plugins-preset@^4.25.0": + version "4.25.0" + resolved "https://registry.npmjs.org/@wordpress/postcss-plugins-preset/-/postcss-plugins-preset-4.25.0.tgz" + integrity sha512-IoCjFYC/p2SchwPg2IXKq0gCWbjmvqTMn9BVpcjAg8NlXngIFrVk23AqHRjRXHyokG9s/3o5D2ILsKbU7u5DaQ== + dependencies: + "@wordpress/base-styles" "^4.32.0" + autoprefixer "^10.2.5" + +"@wordpress/preferences@^3.18.0": + version "3.18.0" + resolved "https://registry.yarnpkg.com/@wordpress/preferences/-/preferences-3.18.0.tgz#675114e4f9c46f05445104d6edd9ef64c3750d28" + integrity sha512-S7eDEKvUIIJMWpiO+0j/iLDqspyhNdKR2N39HNkkrAA2mdr4LMvs5bOr/+m6xTpiik+8I29hwI/OuJOomqJ7PQ== + dependencies: + "@babel/runtime" "^7.16.0" + "@wordpress/a11y" "^3.41.0" + "@wordpress/components" "^25.7.0" + "@wordpress/data" "^9.11.0" + "@wordpress/element" "^5.18.0" + "@wordpress/i18n" "^4.41.0" + "@wordpress/icons" "^9.32.0" + classnames "^2.3.1" + +"@wordpress/prettier-config@^2.24.0": + version "2.24.0" + resolved "https://registry.npmjs.org/@wordpress/prettier-config/-/prettier-config-2.24.0.tgz" + integrity sha512-dieaF2lU+7L2wvcg1F5Bn96DanRd7tje1clK97PGVdPia6CHyTVlBAovQjBTh7NePrqfLUCs+8ii4W0UyB5bcg== + +"@wordpress/primitives@^3.39.0": + version "3.39.0" + resolved "https://registry.npmjs.org/@wordpress/primitives/-/primitives-3.39.0.tgz" + integrity sha512-QvtVJFQGCOEwdXIpXqktz31p327lj/5n4iwbIlOaGf0AZCPA8974m+O/wFkQCskGOJ9tVRveqZtH60aqKH/ffA== + dependencies: + "@babel/runtime" "^7.16.0" + "@wordpress/element" "^5.18.0" + classnames "^2.3.1" + +"@wordpress/priority-queue@^2.41.0": + version "2.41.0" + resolved "https://registry.npmjs.org/@wordpress/priority-queue/-/priority-queue-2.41.0.tgz" + integrity sha512-OntRPhdybFO5da+MO0/pvnRYG+D+c1kU0KRPDuEa+ArZmmQ/lQC+z+/du9nP/cgvQCAzLHJo2/VKCSQZVyewKw== + dependencies: + "@babel/runtime" "^7.16.0" + requestidlecallback "^0.3.0" + +"@wordpress/private-apis@^0.23.0": + version "0.23.0" + resolved "https://registry.npmjs.org/@wordpress/private-apis/-/private-apis-0.23.0.tgz" + integrity sha512-Z/mAnPF+IcN13S0k7F55lA5J0ducNB+IYDGtujErx4fjnYsBIoF9VeQ5pRc+SPDCx5yYDtR7yL8unLbVbztVBQ== + dependencies: + "@babel/runtime" "^7.16.0" + +"@wordpress/redux-routine@^4.41.0": + version "4.41.0" + resolved "https://registry.npmjs.org/@wordpress/redux-routine/-/redux-routine-4.41.0.tgz" + integrity sha512-u5MVqtcChtHOqy3Fk5ml0HPBF13uHoz6ca1XvzstHKOiMWi4xNj6Nn2YgnscfvsxGxxjQz2su1Qcs0SGZI0g+w== + dependencies: + "@babel/runtime" "^7.16.0" + is-plain-object "^5.0.0" + is-promise "^4.0.0" + rungen "^0.3.2" + +"@wordpress/rich-text@^6.18.0": + version "6.18.0" + resolved "https://registry.npmjs.org/@wordpress/rich-text/-/rich-text-6.18.0.tgz" + integrity sha512-BuBb/yWFLq+/joYI3XMYyF7MQDVYGh8V4AB0+v4mHH+7cTecSOOilUAW/JlEXqXS3LhvghabBk157UaH1gh8IA== + dependencies: + "@babel/runtime" "^7.16.0" + "@wordpress/a11y" "^3.41.0" + "@wordpress/compose" "^6.18.0" + "@wordpress/data" "^9.11.0" + "@wordpress/deprecated" "^3.41.0" + "@wordpress/element" "^5.18.0" + "@wordpress/escape-html" "^2.41.0" + "@wordpress/i18n" "^4.41.0" + "@wordpress/keycodes" "^3.41.0" + memize "^2.1.0" + rememo "^4.0.2" + +"@wordpress/scripts@^26.12.0": + version "26.12.0" + resolved "https://registry.npmjs.org/@wordpress/scripts/-/scripts-26.12.0.tgz" + integrity sha512-fT8tyEA/y2n/TDJ9az26MnhmGm60gNrm1VPbs3/xk8+YuvUdyPU2JjeGQMGGJlITjoRlTk2qE7FqSvQlDLCLbg== + dependencies: + "@babel/core" "^7.16.0" + "@pmmmwh/react-refresh-webpack-plugin" "^0.5.2" + "@svgr/webpack" "^8.0.1" + "@wordpress/babel-preset-default" "^7.25.0" + "@wordpress/browserslist-config" "^5.24.0" + "@wordpress/dependency-extraction-webpack-plugin" "^4.24.0" + "@wordpress/eslint-plugin" "^15.1.0" + "@wordpress/jest-preset-default" "^11.12.0" + "@wordpress/npm-package-json-lint-config" "^4.26.0" + "@wordpress/postcss-plugins-preset" "^4.25.0" + "@wordpress/prettier-config" "^2.24.0" + "@wordpress/stylelint-config" "^21.24.0" + adm-zip "^0.5.9" + babel-jest "^29.6.2" + babel-loader "^8.2.3" + browserslist "^4.21.9" + 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 "^6.0.2" + jest-environment-jsdom "^29.6.2" + jest-environment-node "^29.6.2" + markdownlint-cli "^0.31.1" + merge-deep "^3.0.3" + mini-css-extract-plugin "^2.5.1" + minimist "^1.2.0" + npm-package-json-lint "^6.4.0" + npm-packlist "^3.0.0" + postcss "^8.4.5" + postcss-loader "^6.2.1" + prettier "npm:wp-prettier@2.8.5" + puppeteer-core "^13.2.0" + react-refresh "^0.10.0" + read-pkg-up "^7.0.1" + resolve-bin "^0.4.0" + sass "^1.35.2" + sass-loader "^12.1.0" + source-map-loader "^3.0.0" + stylelint "^14.2.0" + terser-webpack-plugin "^5.3.9" + url-loader "^4.1.1" + webpack "^5.47.1" + webpack-bundle-analyzer "^4.4.2" + webpack-cli "^4.9.1" + webpack-dev-server "^4.4.0" + +"@wordpress/shortcode@^3.41.0": + version "3.41.0" + resolved "https://registry.yarnpkg.com/@wordpress/shortcode/-/shortcode-3.41.0.tgz#cf1c08a7f5b0ea3f6e2d87fd77d986464eb4f8e2" + integrity sha512-pJuFIQbGwn8tMpPf5vtKZqQmXVm2+UnQZXVyyQGXUCBnvyGmGnbKv7lbx0NGUDBZ1AVo8/PAdssd7P/QUn7Cxg== + dependencies: + "@babel/runtime" "^7.16.0" + memize "^2.0.1" + +"@wordpress/style-engine@^1.24.0": + version "1.24.0" + resolved "https://registry.yarnpkg.com/@wordpress/style-engine/-/style-engine-1.24.0.tgz#bffe90bcd3663a03da069663b378fec54df60b9f" + integrity sha512-1qXkNwbuLeliQZ0yjdjjy2kJzWtvm56k0xUtFsF/0thMQ04EV0JJHwWDI6EOUCIVVFnJO6xdj2UK/KtnxGYfVw== + dependencies: + "@babel/runtime" "^7.16.0" + change-case "^4.1.2" + +"@wordpress/stylelint-config@^21.24.0": + version "21.24.0" + resolved "https://registry.npmjs.org/@wordpress/stylelint-config/-/stylelint-config-21.24.0.tgz" + integrity sha512-GJV0rSQL5iTcS/mJ7x/ccZ7Z06yYJhDY0XWNA3qVRNMgkV/iyv2rXNNubpDl+m4kcgi8g3dg3jNccvRO1ZDSgg== + dependencies: + stylelint-config-recommended "^6.0.0" + stylelint-config-recommended-scss "^5.0.2" + +"@wordpress/sync@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@wordpress/sync/-/sync-0.3.0.tgz#3851ae18613b6f09869938d8bd3a2679b21e2f88" + integrity sha512-tFymzqz//2e0pc2Vz9EsBLOsNweAurwZS626a4DIauirNVBVJyD1mde68sD1lJVUBIykuxkjdnfel10oaG8Ejg== + dependencies: + "@babel/runtime" "^7.16.0" + y-indexeddb "~9.0.11" + y-webrtc "~10.2.5" + yjs "~13.6.6" + +"@wordpress/token-list@^2.41.0": + version "2.41.0" + resolved "https://registry.yarnpkg.com/@wordpress/token-list/-/token-list-2.41.0.tgz#e15c13e7b23ed54f2b287cd49ddf765e6de58333" + integrity sha512-GeGPzyoVshaifYiz11KqBwkUDqAbMVVkHn5ccpqLVbn+Yc7Ur3tRJ5ikgqNikSq0EyvnHdy8XdivdLJq2xcduA== + dependencies: + "@babel/runtime" "^7.16.0" + +"@wordpress/url@^3.42.0": + version "3.42.0" + resolved "https://registry.npmjs.org/@wordpress/url/-/url-3.42.0.tgz" + integrity sha512-Q1eZAkgnq/Ji3UDdBPxj2mBiBusGoTkcUH2XnJDGyPIezJjC7fY/9GXE6Jj0bm37CkEH3bP6G4Yrh+YpDwMn6Q== + dependencies: + "@babel/runtime" "^7.16.0" + remove-accents "^0.5.0" + +"@wordpress/warning@^2.41.0": + version "2.41.0" + resolved "https://registry.npmjs.org/@wordpress/warning/-/warning-2.41.0.tgz" + integrity sha512-kSqx1z7MaNjNFg+/b5H9oY5D6hYpsKPvaonpk5CADTXOoWoEdSSkwDnCZWxaXu3Kgz4qB5EmaC4D3bKTFkFldw== + +"@wordpress/wordcount@^3.41.0": + version "3.41.0" + resolved "https://registry.yarnpkg.com/@wordpress/wordcount/-/wordcount-3.41.0.tgz#04dbbd88f963f0804410f0cf772b3229a5bb3257" + integrity sha512-1GjIVx+JIeYl7mmRZf9AA5e/YhmGm043dt1/3Zto1k7/MLIpI5ValPPXlHWBA2GU1lfHdfMkSzSC5CLzBQM2ow== + dependencies: + "@babel/runtime" "^7.16.0" + +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== + +"@xtuc/long@4.2.2": + version "4.2.2" + resolved "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz" + integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== + +abab@^2.0.5, abab@^2.0.6: + version "2.0.6" + resolved "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz" + integrity sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA== + +accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8: + 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== + dependencies: + mime-types "~2.1.34" + negotiator "0.6.3" + +acorn-globals@^7.0.0: + version "7.0.1" + resolved "https://registry.npmjs.org/acorn-globals/-/acorn-globals-7.0.1.tgz" + integrity sha512-umOSDSDrfHbTNPuNpC2NSnnA3LUrqpevPb4T9jRx4MagXNS0rs+gwiTcAvqCRmsD6utzsrzNt+ebm00SNWiC3Q== + dependencies: + acorn "^8.1.0" + acorn-walk "^8.0.2" + +acorn-import-assertions@^1.9.0: + version "1.9.0" + resolved "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz" + integrity sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA== + +acorn-jsx@^5.3.2: + version "5.3.2" + resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" + integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== + +acorn-walk@^8.0.0, acorn-walk@^8.0.2: + version "8.2.0" + resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz" + integrity sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA== + +acorn@^8.0.4, acorn@^8.1.0, acorn@^8.7.1, acorn@^8.8.1, acorn@^8.8.2, acorn@^8.9.0: + version "8.10.0" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz" + integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== + +adm-zip@^0.5.9: + version "0.5.10" + resolved "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.10.tgz" + integrity sha512-x0HvcHqVJNTPk/Bw8JbLWlWoo6Wwnsug0fnYYro1HBrjxZ3G7/AZk7Ahv8JwDe1uIcz8eBqvu86FuF1POiG7vQ== + +agent-base@6: + version "6.0.2" + resolved "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz" + integrity sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ== + dependencies: + debug "4" + +ajv-errors@^1.0.1: + 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== + +ajv-formats@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz" + integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== + dependencies: + ajv "^8.0.0" + +ajv-keywords@^3.5.2: + version "3.5.2" + resolved "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz" + integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== + +ajv-keywords@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz" + integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw== + dependencies: + fast-deep-equal "^3.1.3" + +ajv@^6.12.4, ajv@^6.12.5, ajv@^6.12.6: + version "6.12.6" + resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + 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" + +ajv@^8.0.0, ajv@^8.0.1, ajv@^8.9.0: + version "8.12.0" + resolved "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz" + integrity sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA== + dependencies: + fast-deep-equal "^3.1.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + uri-js "^4.2.2" + +ansi-escapes@^4.2.1: + version "4.3.2" + resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz" + integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== + dependencies: + type-fest "^0.21.3" + +ansi-html-community@^0.0.8: + 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== + +ansi-regex@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.1.tgz#164daac87ab2d6f6db3a29875e2d1766582dabed" + integrity sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g== + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^3.2.0, ansi-styles@^3.2.1: + 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" + +ansi-styles@^4.0.0, ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +ansi-styles@^5.0.0: + version "5.2.0" + resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz" + integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== + +anymatch@^3.0.0, anymatch@^3.0.3, anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +are-docs-informative@^0.0.2: + 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== + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz" + integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== + dependencies: + sprintf-js "~1.0.2" + +argparse@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz" + integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== + +aria-hidden@^1.1.1: + version "1.2.3" + resolved "https://registry.npmjs.org/aria-hidden/-/aria-hidden-1.2.3.tgz" + integrity sha512-xcLxITLe2HYa1cnYnwCjkOO1PqUHQpozB8x9AR0OgWN2woOBi5kSDVxKfd0b7sb1hw5qFeJhXm9H1nu3xSfLeQ== + dependencies: + tslib "^2.0.0" + +aria-query@^5.1.3: + version "5.3.0" + resolved "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz" + integrity sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A== + dependencies: + dequal "^2.0.3" + +arr-union@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz" + integrity sha512-sKpyeERZ02v1FeCZT8lrfJq5u6goHCtpTAzPwJYe7c8SPFOboNjNg1vz2L4VTn9T4PQxEx13TbXLmYUcS6Ug7Q== + +array-buffer-byte-length@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz" + integrity sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A== + dependencies: + call-bind "^1.0.2" + is-array-buffer "^3.0.1" + +array-flatten@1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz" + integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg== + +array-flatten@^2.1.2: + version "2.1.2" + resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz" + integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ== + +array-includes@^3.1.6: + version "3.1.7" + resolved "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz" + integrity sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + get-intrinsic "^1.2.1" + is-string "^1.0.7" + +array-union@^1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz" + integrity sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng== + dependencies: + array-uniq "^1.0.1" + +array-union@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz" + integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== + +array-union@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/array-union/-/array-union-3.0.1.tgz" + integrity sha512-1OvF9IbWwaeiM9VhzYXVQacMibxpXOMYVNIvMtKRyX9SImBXpKcFr8XvFDeEslCyuH/t6KRt7HEO94AlP8Iatw== + +array-uniq@^1.0.1: + version "1.0.3" + resolved "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz" + integrity sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q== + +array.prototype.findlastindex@^1.2.2: + version "1.2.3" + resolved "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz" + integrity sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-shim-unscopables "^1.0.0" + get-intrinsic "^1.2.1" + +array.prototype.flat@^1.3.1: + version "1.3.1" + resolved "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz" + integrity sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + es-shim-unscopables "^1.0.0" + +array.prototype.flatmap@^1.3.1: + version "1.3.1" + resolved "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz" + integrity sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + es-shim-unscopables "^1.0.0" + +array.prototype.tosorted@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz" + integrity sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + es-shim-unscopables "^1.0.0" + get-intrinsic "^1.1.3" + +arraybuffer.prototype.slice@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.1.tgz" + integrity sha512-09x0ZWFEjj4WD8PDbykUwo3t9arLn8NIzmmYEJFpYekOAQjpkGSyrQhNoRTcwwcFRu+ycWF78QZ63oWTqSjBcw== + dependencies: + array-buffer-byte-length "^1.0.0" + call-bind "^1.0.2" + define-properties "^1.2.0" + get-intrinsic "^1.2.1" + is-array-buffer "^3.0.2" + is-shared-array-buffer "^1.0.2" + +arrify@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz" + integrity sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA== + +ast-types-flow@^0.0.7: + version "0.0.7" + resolved "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz" + integrity sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag== + +astral-regex@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz" + integrity sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ== + +asynciterator.prototype@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/asynciterator.prototype/-/asynciterator.prototype-1.0.0.tgz" + integrity sha512-wwHYEIS0Q80f5mosx3L/dfG5t5rjEa9Ft51GTaNt862EnpyGHpgz2RkZvLPp1oF5TnAiTohkEKVEu8pQPJI7Vg== + dependencies: + has-symbols "^1.0.3" + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + +autoprefixer@^10.2.5: + version "10.4.15" + resolved "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.15.tgz" + integrity sha512-KCuPB8ZCIqFdA4HwKXsvz7j6gvSDNhDP7WnUjBleRkKjPdvCmHFuQ77ocavI8FT6NdvlBnE2UFr2H4Mycn8Vew== + dependencies: + browserslist "^4.21.10" + caniuse-lite "^1.0.30001520" + fraction.js "^4.2.0" + normalize-range "^0.1.2" + picocolors "^1.0.0" + postcss-value-parser "^4.2.0" + +autosize@^4.0.2: + version "4.0.4" + resolved "https://registry.yarnpkg.com/autosize/-/autosize-4.0.4.tgz#924f13853a466b633b9309330833936d8bccce03" + integrity sha512-5yxLQ22O0fCRGoxGfeLSNt3J8LB1v+umtpMnPW6XjkTWXKoN0AmXAIhelJcDtFT/Y/wYWmfE+oqU10Q0b8FhaQ== + +available-typed-arrays@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz" + integrity sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw== + +axe-core@^4.6.2: + version "4.7.2" + resolved "https://registry.npmjs.org/axe-core/-/axe-core-4.7.2.tgz" + integrity sha512-zIURGIS1E1Q4pcrMjp+nnEh+16G56eG/MUllJH8yEvw7asDo7Ac9uhC9KIH5jzpITueEZolfYglnCGIuSBz39g== + +axios@^0.25.0: + version "0.25.0" + resolved "https://registry.npmjs.org/axios/-/axios-0.25.0.tgz" + integrity sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g== + dependencies: + follow-redirects "^1.14.7" + +axobject-query@^3.1.1: + version "3.2.1" + resolved "https://registry.npmjs.org/axobject-query/-/axobject-query-3.2.1.tgz" + integrity sha512-jsyHu61e6N4Vbz/v18DHwWYKK0bSWLqn47eeDSKPB7m8tqMHF9YJ+mhIk2lVteyZrY8tnSj/jHOv4YiTCuCJgg== + dependencies: + dequal "^2.0.3" + +babel-jest@^29.6.2, babel-jest@^29.6.4: + version "29.6.4" + resolved "https://registry.npmjs.org/babel-jest/-/babel-jest-29.6.4.tgz" + integrity sha512-meLj23UlSLddj6PC+YTOFRgDAtjnZom8w/ACsrx0gtPtv5cJZk0A5Unk5bV4wixD7XaPCN1fQvpww8czkZURmw== + dependencies: + "@jest/transform" "^29.6.4" + "@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" + +babel-loader@^8.2.3: + version "8.3.0" + resolved "https://registry.npmjs.org/babel-loader/-/babel-loader-8.3.0.tgz" + integrity sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q== + dependencies: + find-cache-dir "^3.3.1" + loader-utils "^2.0.0" + make-dir "^3.1.0" + schema-utils "^2.6.5" + +babel-plugin-istanbul@^6.1.1: + 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== + 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" + +babel-plugin-jest-hoist@^29.6.3: + 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== + dependencies: + "@babel/template" "^7.3.3" + "@babel/types" "^7.3.3" + "@types/babel__core" "^7.1.14" + "@types/babel__traverse" "^7.0.6" + +babel-plugin-macros@^3.1.0: + 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" + +babel-plugin-polyfill-corejs2@^0.4.5: + version "0.4.5" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.5.tgz" + integrity sha512-19hwUH5FKl49JEsvyTcoHakh6BE0wgXLLptIyKZ3PijHc/Ci521wygORCUCCred+E/twuqRyAkE02BAWPmsHOg== + dependencies: + "@babel/compat-data" "^7.22.6" + "@babel/helper-define-polyfill-provider" "^0.4.2" + semver "^6.3.1" + +babel-plugin-polyfill-corejs3@^0.8.3: + version "0.8.3" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.3.tgz" + integrity sha512-z41XaniZL26WLrvjy7soabMXrfPWARN25PZoriDEiLMxAp50AUW3t35BGQUMg5xK3UrpVTtagIDklxYa+MhiNA== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.4.2" + core-js-compat "^3.31.0" + +babel-plugin-polyfill-regenerator@^0.5.2: + version "0.5.2" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.2.tgz" + integrity sha512-tAlOptU0Xj34V1Y2PNTL4Y0FOJMDB6bZmoW39FeCQIhigGLkqu3Fj6uiXpxIf6Ij274ENdYx64y6Au+ZKlb1IA== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.4.2" + +babel-preset-current-node-syntax@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.0.1.tgz" + integrity sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ== + dependencies: + "@babel/plugin-syntax-async-generators" "^7.8.4" + "@babel/plugin-syntax-bigint" "^7.8.3" + "@babel/plugin-syntax-class-properties" "^7.8.3" + "@babel/plugin-syntax-import-meta" "^7.8.3" + "@babel/plugin-syntax-json-strings" "^7.8.3" + "@babel/plugin-syntax-logical-assignment-operators" "^7.8.3" + "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" + "@babel/plugin-syntax-numeric-separator" "^7.8.3" + "@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-top-level-await" "^7.8.3" + +babel-preset-jest@^29.6.3: + 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== + dependencies: + babel-plugin-jest-hoist "^29.6.3" + babel-preset-current-node-syntax "^1.0.0" + +balanced-match@^1.0.0: + version "1.0.2" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz" + integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw== + +balanced-match@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz" + integrity sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA== + +base64-js@^1.3.1: + version "1.5.1" + resolved "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz" + integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA== + +batch@0.6.1: + 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== + +big.js@^5.2.2: + version "5.2.2" + resolved "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz" + integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== + +binary-extensions@^2.0.0: + version "2.2.0" + resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz" + integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA== + +bl@^4.0.3: + version "4.1.0" + resolved "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz" + integrity sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w== + dependencies: + buffer "^5.5.0" + inherits "^2.0.4" + readable-stream "^3.4.0" + +body-parser@1.20.1: + version "1.20.1" + resolved "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz" + integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== + dependencies: + bytes "3.1.2" + content-type "~1.0.4" + 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.11.0" + raw-body "2.5.1" + type-is "~1.6.18" + unpipe "1.0.0" + +body-scroll-lock@^3.1.5: + version "3.1.5" + resolved "https://registry.npmjs.org/body-scroll-lock/-/body-scroll-lock-3.1.5.tgz" + integrity sha512-Yi1Xaml0EvNA0OYWxXiYNqY24AfWkbA6w5vxE7GWxtKfzIbZM+Qw+aSmkgsbWzbHiy/RCSkUZBplVxTA+E4jJg== + +bonjour-service@^1.0.11: + version "1.1.1" + resolved "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.1.1.tgz" + integrity sha512-Z/5lQRMOG9k7W+FkeGTNjh7htqn/2LMnfOvBZ8pynNZCM9MwkQkI3zeI4oz09uWdcgmgHugVvBqxGg4VQJ5PCg== + dependencies: + array-flatten "^2.1.2" + dns-equal "^1.0.0" + fast-deep-equal "^3.1.3" + multicast-dns "^7.2.5" + +boolbase@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz" + integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz" + integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +braces@^3.0.2, braces@~3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz" + integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== + dependencies: + fill-range "^7.0.1" + +browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.21.10, browserslist@^4.21.4, browserslist@^4.21.9: + version "4.21.10" + resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.21.10.tgz" + integrity sha512-bipEBdZfVH5/pwrvqc+Ub0kUPVfGUhlKxbvfD+z1BDnPEO/X98ruXGA1WP5ASpAFKan7Qr6j736IacbZQuAlKQ== + dependencies: + caniuse-lite "^1.0.30001517" + electron-to-chromium "^1.4.477" + node-releases "^2.0.13" + update-browserslist-db "^1.0.11" + +bser@2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz" + integrity sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ== + dependencies: + node-int64 "^0.4.0" + +buffer-crc32@~0.2.3: + version "0.2.13" + resolved "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz" + integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ== + +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +buffer@^5.2.1, buffer@^5.5.0: + version "5.7.1" + resolved "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz" + integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.1.13" + +buffer@^6.0.3: + version "6.0.3" + resolved "https://registry.yarnpkg.com/buffer/-/buffer-6.0.3.tgz#2ace578459cc8fbe2a70aaa8f52ee63b6a74c6c6" + integrity sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA== + dependencies: + base64-js "^1.3.1" + ieee754 "^1.2.1" + +builtin-modules@^3.3.0: + version "3.3.0" + resolved "https://registry.npmjs.org/builtin-modules/-/builtin-modules-3.3.0.tgz" + integrity sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw== + +builtins@^5.0.0: + version "5.0.1" + resolved "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz" + integrity sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ== + dependencies: + semver "^7.0.0" + +bytes@3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz" + integrity sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw== + +bytes@3.1.2: + version "3.1.2" + resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== + +call-bind@^1.0.0, call-bind@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz" + integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA== + dependencies: + function-bind "^1.1.1" + get-intrinsic "^1.0.2" + +callsites@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz" + integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== + +camel-case@^4.1.2: + 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" + +camelcase-keys@^6.2.2: + version "6.2.2" + resolved "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz" + integrity sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg== + dependencies: + camelcase "^5.3.1" + map-obj "^4.0.0" + quick-lru "^4.0.1" + +camelcase@^5.0.0, camelcase@^5.3.1: + version "5.3.1" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz" + integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== + +camelcase@^6.2.0: + version "6.3.0" + resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz" + integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== + +caniuse-api@^3.0.0: + 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== + dependencies: + browserslist "^4.0.0" + caniuse-lite "^1.0.0" + lodash.memoize "^4.1.2" + lodash.uniq "^4.5.0" + +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001517, caniuse-lite@^1.0.30001520: + version "1.0.30001527" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001527.tgz" + integrity sha512-YkJi7RwPgWtXVSgK4lG9AHH57nSzvvOp9MesgXmw4Q7n0C3H04L0foHqfxcmSAm5AcWb8dW9AYj2tR7/5GnddQ== + +capital-case@^1.0.4: + 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" + +chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz" + integrity sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: + version "4.1.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +change-case@^4.1.2: + 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" + +char-regex@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz" + integrity sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw== + +check-node-version@^4.1.0: + 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== + 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" + +"chokidar@>=3.0.0 <4.0.0", chokidar@^3.5.3: + version "3.5.3" + resolved "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz" + integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== + 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" + optionalDependencies: + fsevents "~2.3.2" + +chownr@^1.1.1: + version "1.1.4" + resolved "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz" + integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg== + +chrome-trace-event@^1.0.2: + version "1.0.3" + resolved "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz" + integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg== + +ci-info@^3.2.0: + version "3.8.0" + resolved "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz" + integrity sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw== + +cjs-module-lexer@^1.0.0: + version "1.2.3" + resolved "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz" + integrity sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ== + +classnames@^2.3.1: + version "2.3.2" + resolved "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz" + integrity sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw== + +clean-webpack-plugin@^3.0.0: + 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== + dependencies: + "@types/webpack" "^4.4.31" + del "^4.1.1" + +clipboard@^2.0.8: + 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" + +cliui@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" + integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== + dependencies: + string-width "^3.1.0" + strip-ansi "^5.2.0" + wrap-ansi "^5.1.0" + +cliui@^8.0.1: + 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== + dependencies: + string-width "^4.2.0" + strip-ansi "^6.0.1" + wrap-ansi "^7.0.0" + +clone-deep@^0.2.4: + version "0.2.4" + resolved "https://registry.npmjs.org/clone-deep/-/clone-deep-0.2.4.tgz" + integrity sha512-we+NuQo2DHhSl+DP6jlUiAhyAjBQrYnpOk15rN6c6JSPScjiCLh8IbSU+VTcph6YS3o7mASE8a0+gbZ7ChLpgg== + 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" + +clone-deep@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz" + integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== + dependencies: + is-plain-object "^2.0.4" + kind-of "^6.0.2" + shallow-clone "^3.0.0" + +cmdk@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/cmdk/-/cmdk-0.2.0.tgz#53c52d56d8776c8bb8ced1055b5054100c388f7c" + integrity sha512-JQpKvEOb86SnvMZbYaFKYhvzFntWBeSZdyii0rZPhKJj9uwJBxu4DaVYDrRN7r3mPop56oPhRw+JYWTKs66TYw== + dependencies: + "@radix-ui/react-dialog" "1.0.0" + command-score "0.1.2" + +co@^4.6.0: + version "4.6.0" + resolved "https://registry.npmjs.org/co/-/co-4.6.0.tgz" + integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ== + +collect-v8-coverage@^1.0.0: + 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== + +color-convert@^1.9.0: + 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" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +colord@^2.7.0, colord@^2.9.1, colord@^2.9.3: + version "2.9.3" + resolved "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz" + integrity sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw== + +colorette@^2.0.10, colorette@^2.0.14: + version "2.0.20" + resolved "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz" + integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== + +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +command-score@0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/command-score/-/command-score-0.1.2.tgz#b986ad7e8c0beba17552a56636c44ae38363d381" + integrity sha512-VtDvQpIJBvBatnONUsPzXYFVKQQAhuf3XTNOAsdBxCNO/QCtUUd8LSgjn0GVarBkCad6aJCZfXgrjYbl/KRr7w== + +commander@^2.20.0: + 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== + +commander@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz" + integrity sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg== + +commander@^7.0.0, commander@^7.2.0: + version "7.2.0" + resolved "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz" + integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== + +commander@~9.0.0: + version "9.0.0" + resolved "https://registry.npmjs.org/commander/-/commander-9.0.0.tgz" + integrity sha512-JJfP2saEKbQqvW+FI93OYUB4ByV5cizMpFMiiJI8xDbBvQvSkIk0VvQdn1CZ8mqAO8Loq2h0gYTYtDFUZUeERw== + +comment-parser@1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/comment-parser/-/comment-parser-1.4.0.tgz" + integrity sha512-QLyTNiZ2KDOibvFPlZ6ZngVsZ/0gYnE6uTXi5aoDg8ed3AkJAz4sEje3Y8a29hQ1s6A99MZXe47fLAXQ1rTqaw== + +common-path-prefix@^3.0.0: + 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== + +commondir@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz" + integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg== + +compressible@~2.0.16: + version "2.0.18" + resolved "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz" + integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg== + dependencies: + mime-db ">= 1.43.0 < 2" + +compression@^1.7.4: + version "1.7.4" + resolved "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz" + integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ== + dependencies: + accepts "~1.3.5" + bytes "3.0.0" + compressible "~2.0.16" + debug "2.6.9" + on-headers "~1.0.2" + safe-buffer "5.1.2" + vary "~1.1.2" + +compute-scroll-into-view@^1.0.17: + version "1.0.20" + resolved "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-1.0.20.tgz" + integrity sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg== + +computed-style@~0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/computed-style/-/computed-style-0.1.4.tgz#7f344fd8584b2e425bedca4a1afc0e300bb05d74" + integrity sha512-WpAmaKbMNmS3OProfHIdJiNleNJdgUrJfbKArXua28QF7+0CoZjlLn0lp6vlc+dl5r2/X9GQiQRQQU4BzSa69w== + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" + integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg== + +connect-history-api-fallback@^2.0.0: + 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== + +constant-case@^3.0.4: + 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" + +content-disposition@0.5.4: + version "0.5.4" + resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz" + integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ== + dependencies: + safe-buffer "5.2.1" + +content-type@~1.0.4: + version "1.0.5" + resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz" + integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA== + +convert-source-map@^1.5.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: + 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== + +convert-source-map@^2.0.0: + 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== + +cookie-signature@1.0.6: + version "1.0.6" + resolved "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz" + integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ== + +cookie@0.5.0: + version "0.5.0" + resolved "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz" + integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== + +copy-webpack-plugin@^10.2.0: + 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== + 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" + +core-js-compat@^3.31.0: + version "3.32.1" + resolved "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.32.1.tgz" + integrity sha512-GSvKDv4wE0bPnQtjklV101juQ85g6H3rm5PDP20mqlS5j0kXF3pP97YvAu5hl+uFHqMictp3b2VxOHljWMAtuA== + dependencies: + browserslist "^4.21.10" + +core-js-pure@^3.23.3: + version "3.32.1" + resolved "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.32.1.tgz" + integrity sha512-f52QZwkFVDPf7UEQZGHKx6NYxsxmVGJe5DIvbzOdRMJlmT6yv0KDjR8rmy3ngr/t5wU54c7Sp/qIJH0ppbhVpQ== + +core-js@^3.31.0: + version "3.32.1" + resolved "https://registry.npmjs.org/core-js/-/core-js-3.32.1.tgz" + integrity sha512-lqufgNn9NLnESg5mQeYsxQP5w7wrViSj0jr/kv6ECQiByzQkrn1MKvV0L3acttpDqfQrHLwr2KCMgX5b8X+lyQ== + +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + +cosmiconfig@^7.0.0, cosmiconfig@^7.1.0: + 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" + +cosmiconfig@^8.0.0, cosmiconfig@^8.1.3: + version "8.3.4" + resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.4.tgz" + integrity sha512-SF+2P8+o/PTV05rgsAjDzL4OFdVXAulSfC/L19VaeVT7+tpOOSscCt2QLxDZ+CLxF2WOiq6y1K5asvs8qUJT/Q== + dependencies: + import-fresh "^3.3.0" + js-yaml "^4.1.0" + parse-json "^5.2.0" + path-type "^4.0.0" + +cross-fetch@3.1.5: + version "3.1.5" + resolved "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz" + integrity sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw== + dependencies: + node-fetch "2.6.7" + +cross-spawn@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz" + integrity sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A== + dependencies: + lru-cache "^4.0.1" + shebang-command "^1.2.0" + which "^1.2.9" + +cross-spawn@^7.0.2, cross-spawn@^7.0.3: + version "7.0.3" + resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz" + integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +css-declaration-sorter@^6.3.1: + version "6.4.1" + resolved "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-6.4.1.tgz" + integrity sha512-rtdthzxKuyq6IzqX6jEcIzQF/YqccluefyCYheovBOLhFT/drQA9zj/UbRAa9J7C0o6EG6u3E6g+vKkay7/k3g== + +css-functions-list@^3.1.0: + version "3.2.0" + resolved "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.0.tgz" + integrity sha512-d/jBMPyYybkkLVypgtGv12R+pIFw4/f/IHtCTxWpZc8ofTYOPigIgmA6vu5rMHartZC+WuXhBUHfnyNUIQSYrg== + +css-loader@^6.2.0: + version "6.8.1" + resolved "https://registry.npmjs.org/css-loader/-/css-loader-6.8.1.tgz" + integrity sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g== + dependencies: + icss-utils "^5.1.0" + postcss "^8.4.21" + postcss-modules-extract-imports "^3.0.0" + postcss-modules-local-by-default "^4.0.3" + postcss-modules-scope "^3.0.0" + postcss-modules-values "^4.0.0" + postcss-value-parser "^4.2.0" + semver "^7.3.8" + +css-select@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz" + integrity sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg== + dependencies: + boolbase "^1.0.0" + css-what "^6.1.0" + domhandler "^5.0.2" + domutils "^3.0.1" + nth-check "^2.0.1" + +css-tree@^2.2.1: + 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== + dependencies: + mdn-data "2.0.30" + source-map-js "^1.0.1" + +css-tree@~2.2.0: + version "2.2.1" + resolved "https://registry.npmjs.org/css-tree/-/css-tree-2.2.1.tgz" + integrity sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA== + dependencies: + mdn-data "2.0.28" + source-map-js "^1.0.1" + +css-what@^6.1.0: + version "6.1.0" + resolved "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz" + integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== + +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + +cssnano-preset-default@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-6.0.1.tgz" + integrity sha512-7VzyFZ5zEB1+l1nToKyrRkuaJIx0zi/1npjvZfbBwbtNTzhLtlvYraK/7/uqmX2Wb2aQtd983uuGw79jAjLSuQ== + dependencies: + css-declaration-sorter "^6.3.1" + cssnano-utils "^4.0.0" + postcss-calc "^9.0.0" + postcss-colormin "^6.0.0" + postcss-convert-values "^6.0.0" + postcss-discard-comments "^6.0.0" + postcss-discard-duplicates "^6.0.0" + postcss-discard-empty "^6.0.0" + postcss-discard-overridden "^6.0.0" + postcss-merge-longhand "^6.0.0" + postcss-merge-rules "^6.0.1" + postcss-minify-font-values "^6.0.0" + postcss-minify-gradients "^6.0.0" + postcss-minify-params "^6.0.0" + postcss-minify-selectors "^6.0.0" + postcss-normalize-charset "^6.0.0" + postcss-normalize-display-values "^6.0.0" + postcss-normalize-positions "^6.0.0" + postcss-normalize-repeat-style "^6.0.0" + postcss-normalize-string "^6.0.0" + postcss-normalize-timing-functions "^6.0.0" + postcss-normalize-unicode "^6.0.0" + postcss-normalize-url "^6.0.0" + postcss-normalize-whitespace "^6.0.0" + postcss-ordered-values "^6.0.0" + postcss-reduce-initial "^6.0.0" + postcss-reduce-transforms "^6.0.0" + postcss-svgo "^6.0.0" + postcss-unique-selectors "^6.0.0" + +cssnano-utils@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/cssnano-utils/-/cssnano-utils-4.0.0.tgz" + integrity sha512-Z39TLP+1E0KUcd7LGyF4qMfu8ZufI0rDzhdyAMsa/8UyNUU8wpS0fhdBxbQbv32r64ea00h4878gommRVg2BHw== + +cssnano@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/cssnano/-/cssnano-6.0.1.tgz" + integrity sha512-fVO1JdJ0LSdIGJq68eIxOqFpIJrZqXUsBt8fkrBcztCQqAjQD51OhZp7tc0ImcbwXD4k7ny84QTV90nZhmqbkg== + dependencies: + cssnano-preset-default "^6.0.1" + lilconfig "^2.1.0" + +csso@^5.0.5: + version "5.0.5" + resolved "https://registry.npmjs.org/csso/-/csso-5.0.5.tgz" + integrity sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ== + dependencies: + css-tree "~2.2.0" + +cssom@^0.5.0: + version "0.5.0" + resolved "https://registry.npmjs.org/cssom/-/cssom-0.5.0.tgz" + integrity sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw== + +cssom@~0.3.6: + version "0.3.8" + resolved "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz" + integrity sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg== + +cssstyle@^2.3.0: + version "2.3.0" + resolved "https://registry.npmjs.org/cssstyle/-/cssstyle-2.3.0.tgz" + integrity sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A== + dependencies: + cssom "~0.3.6" + +csstype@^3.0.2: + version "3.1.2" + resolved "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz" + integrity sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ== + +cwd@^0.10.0: + version "0.10.0" + resolved "https://registry.npmjs.org/cwd/-/cwd-0.10.0.tgz" + integrity sha512-YGZxdTTL9lmLkCUTpg4j0zQ7IhRB5ZmqNBbGCl3Tg6MP/d5/6sY7L5mmTjzbc6JKgVZYiqTQTNhPFsbXNGlRaA== + dependencies: + find-pkg "^0.1.2" + fs-exists-sync "^0.1.0" + +damerau-levenshtein@^1.0.8: + version "1.0.8" + resolved "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz" + integrity sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA== + +data-urls@^3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/data-urls/-/data-urls-3.0.2.tgz" + integrity sha512-Jy/tj3ldjZJo63sVAvg6LHt2mHvl4V6AgRAmNDtLdm7faqtsx+aJG42rsyCo9JCoRVKwPFzKlIPx3DIibwSIaQ== + dependencies: + abab "^2.0.6" + whatwg-mimetype "^3.0.0" + whatwg-url "^11.0.0" + +date-fns@^2.28.0, date-fns@^2.29.2: + 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== + dependencies: + "@babel/runtime" "^7.21.0" + +debug@2.6.9: + version "2.6.9" + resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" + integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== + dependencies: + ms "2.0.0" + +debug@4, debug@4.3.4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.2, debug@^4.3.4: + version "4.3.4" + resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== + dependencies: + ms "2.1.2" + +debug@^3.2.7: + version "3.2.7" + resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== + dependencies: + ms "^2.1.1" + +decamelize-keys@^1.1.0: + version "1.1.1" + resolved "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz" + integrity sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg== + dependencies: + decamelize "^1.1.0" + map-obj "^1.0.0" + +decamelize@^1.1.0, decamelize@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz" + integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== + +decimal.js@^10.4.2: + version "10.4.3" + resolved "https://registry.npmjs.org/decimal.js/-/decimal.js-10.4.3.tgz" + integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA== + +dedent@^1.0.0: + version "1.5.1" + resolved "https://registry.npmjs.org/dedent/-/dedent-1.5.1.tgz" + integrity sha512-+LxW+KLWxu3HW3M2w2ympwtqPrqYRzU8fqi6Fhd18fBALe15blJPI/I4+UHveMVG6lJqB4JNd4UG0S5cnVHwIg== + +deep-extend@^0.6.0: + version "0.6.0" + resolved "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz" + integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA== + +deep-is@^0.1.3: + 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== + +deepmerge@^4.2.2, deepmerge@^4.3.0, deepmerge@^4.3.1: + 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== + +default-gateway@^6.0.3: + 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== + dependencies: + execa "^5.0.0" + +define-lazy-prop@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz" + integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og== + +define-properties@^1.1.3, define-properties@^1.1.4, define-properties@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz" + integrity sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA== + dependencies: + has-property-descriptors "^1.0.0" + object-keys "^1.1.1" + +del@^4.1.1: + version "4.1.1" + resolved "https://registry.npmjs.org/del/-/del-4.1.1.tgz" + integrity sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ== + 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" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + +delegate@^3.1.2: + version "3.2.0" + resolved "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz" + integrity sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw== + +depd@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz" + integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== + +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz" + integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== + +dequal@^2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz" + integrity sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA== + +destroy@1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz" + integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== + +detect-newline@^3.0.0: + version "3.1.0" + resolved "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz" + integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== + +detect-node-es@^1.1.0: + 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== + +detect-node@^2.0.4: + version "2.1.0" + resolved "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz" + integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== + +devtools-protocol@0.0.981744: + version "0.0.981744" + resolved "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.981744.tgz" + integrity sha512-0cuGS8+jhR67Fy7qG3i3Pc7Aw494sb9yG9QgpG97SFVWwolgYjlhJg7n+UaHxOQT30d1TYu/EYe9k01ivLErIg== + +diff-sequences@^29.6.3: + version "29.6.3" + resolved "https://registry.npmjs.org/diff-sequences/-/diff-sequences-29.6.3.tgz" + integrity sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q== + +diff@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== + +dir-glob@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" + integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== + dependencies: + path-type "^4.0.0" + +dns-equal@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz" + integrity sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg== + +dns-packet@^5.2.2: + version "5.6.1" + resolved "https://registry.npmjs.org/dns-packet/-/dns-packet-5.6.1.tgz" + integrity sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw== + dependencies: + "@leichtgewicht/ip-codec" "^2.0.1" + +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz" + integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== + dependencies: + esutils "^2.0.2" + +doctrine@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz" + integrity sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w== + dependencies: + esutils "^2.0.2" + +dom-scroll-into-view@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/dom-scroll-into-view/-/dom-scroll-into-view-1.2.1.tgz" + integrity sha512-LwNVg3GJOprWDO+QhLL1Z9MMgWe/KAFLxVWKzjRTxNSPn8/LLDIfmuG71YHznXCqaqTjvHJDYO1MEAgX6XCNbQ== + +dom-serializer@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz" + integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg== + dependencies: + domelementtype "^2.3.0" + domhandler "^5.0.2" + entities "^4.2.0" + +domelementtype@^2.3.0: + version "2.3.0" + resolved "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz" + integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== + +domexception@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/domexception/-/domexception-4.0.0.tgz" + integrity sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw== + dependencies: + webidl-conversions "^7.0.0" + +domhandler@^5.0.2, domhandler@^5.0.3: + version "5.0.3" + resolved "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz" + integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== + dependencies: + domelementtype "^2.3.0" + +domutils@^3.0.1: + version "3.1.0" + resolved "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz" + integrity sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA== + dependencies: + dom-serializer "^2.0.0" + domelementtype "^2.3.0" + domhandler "^5.0.3" + +dot-case@^3.0.4: + 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" + +downshift@^6.0.15: + version "6.1.12" + resolved "https://registry.npmjs.org/downshift/-/downshift-6.1.12.tgz" + integrity sha512-7XB/iaSJVS4T8wGFT3WRXmSF1UlBHAA40DshZtkrIscIN+VC+Lh363skLxFTvJwtNgHxAMDGEHT4xsyQFWL+UA== + dependencies: + "@babel/runtime" "^7.14.8" + compute-scroll-into-view "^1.0.17" + prop-types "^15.7.2" + react-is "^17.0.2" + tslib "^2.3.0" + +duplexer@^0.1.2: + version "0.1.2" + resolved "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz" + integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== + +ee-first@1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" + integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow== + +electron-to-chromium@^1.4.477: + version "1.4.508" + resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.508.tgz" + integrity sha512-FFa8QKjQK/A5QuFr2167myhMesGrhlOBD+3cYNxO9/S4XzHEXesyTD/1/xF644gC8buFPz3ca6G1LOQD0tZrrg== + +emittery@^0.13.1: + version "0.13.1" + resolved "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz" + integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ== + +emoji-regex@^7.0.1: + version "7.0.3" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" + integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +emoji-regex@^9.2.2: + version "9.2.2" + resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz" + integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== + +emojis-list@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz" + integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== + +encodeurl@~1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz" + integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== + +encoding@^0.1.12: + 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" + +end-of-stream@^1.1.0, end-of-stream@^1.4.1: + 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== + dependencies: + once "^1.4.0" + +enhanced-resolve@^5.15.0: + version "5.15.0" + resolved "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz" + integrity sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + +entities@^4.2.0, entities@^4.4.0: + version "4.5.0" + resolved "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz" + integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== + +entities@~2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz" + integrity sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w== + +envinfo@^7.7.3: + version "7.10.0" + resolved "https://registry.npmjs.org/envinfo/-/envinfo-7.10.0.tgz" + integrity sha512-ZtUjZO6l5mwTHvc1L9+1q5p/R3wTopcfqMW8r5t8SJSKqeVI/LtajORwRFEKpEFuekjD0VBjwu1HMxL4UalIRw== + +equivalent-key-map@^0.2.2: + 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== + +err-code@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/err-code/-/err-code-3.0.1.tgz#a444c7b992705f2b120ee320b09972eef331c920" + integrity sha512-GiaH0KJUewYok+eeY05IIgjtAe4Yltygk9Wqp1V5yVWLdhf0hYZchRjNIT9bb0mSwRcIusT3cx7PJUf3zEIfUA== + +error-ex@^1.3.1: + 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" + +error-stack-parser@^2.0.6: + 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== + dependencies: + stackframe "^1.3.4" + +es-abstract@^1.20.4, es-abstract@^1.22.1: + version "1.22.1" + resolved "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.1.tgz" + integrity sha512-ioRRcXMO6OFyRpyzV3kE1IIBd4WG5/kltnzdxSCqoP8CMGs/Li+M1uF5o7lOkZVFjDs+NLesthnF66Pg/0q0Lw== + dependencies: + array-buffer-byte-length "^1.0.0" + arraybuffer.prototype.slice "^1.0.1" + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + es-set-tostringtag "^2.0.1" + es-to-primitive "^1.2.1" + function.prototype.name "^1.1.5" + get-intrinsic "^1.2.1" + get-symbol-description "^1.0.0" + globalthis "^1.0.3" + gopd "^1.0.1" + has "^1.0.3" + has-property-descriptors "^1.0.0" + has-proto "^1.0.1" + has-symbols "^1.0.3" + internal-slot "^1.0.5" + is-array-buffer "^3.0.2" + is-callable "^1.2.7" + is-negative-zero "^2.0.2" + is-regex "^1.1.4" + is-shared-array-buffer "^1.0.2" + is-string "^1.0.7" + is-typed-array "^1.1.10" + is-weakref "^1.0.2" + object-inspect "^1.12.3" + object-keys "^1.1.1" + object.assign "^4.1.4" + regexp.prototype.flags "^1.5.0" + safe-array-concat "^1.0.0" + safe-regex-test "^1.0.0" + string.prototype.trim "^1.2.7" + string.prototype.trimend "^1.0.6" + string.prototype.trimstart "^1.0.6" + typed-array-buffer "^1.0.0" + typed-array-byte-length "^1.0.0" + typed-array-byte-offset "^1.0.0" + typed-array-length "^1.0.4" + unbox-primitive "^1.0.2" + which-typed-array "^1.1.10" + +es-iterator-helpers@^1.0.12: + version "1.0.14" + resolved "https://registry.npmjs.org/es-iterator-helpers/-/es-iterator-helpers-1.0.14.tgz" + integrity sha512-JgtVnwiuoRuzLvqelrvN3Xu7H9bu2ap/kQ2CrM62iidP8SKuD99rWU3CJy++s7IVL2qb/AjXPGR/E7i9ngd/Cw== + dependencies: + asynciterator.prototype "^1.0.0" + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + es-set-tostringtag "^2.0.1" + function-bind "^1.1.1" + get-intrinsic "^1.2.1" + globalthis "^1.0.3" + has-property-descriptors "^1.0.0" + has-proto "^1.0.1" + has-symbols "^1.0.3" + internal-slot "^1.0.5" + iterator.prototype "^1.1.0" + safe-array-concat "^1.0.0" + +es-module-lexer@^1.2.1: + version "1.3.0" + resolved "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.0.tgz" + integrity sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA== + +es-set-tostringtag@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz" + integrity sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg== + dependencies: + get-intrinsic "^1.1.3" + has "^1.0.3" + has-tostringtag "^1.0.0" + +es-shim-unscopables@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz" + integrity sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w== + dependencies: + has "^1.0.3" + +es-to-primitive@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz" + integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA== + dependencies: + is-callable "^1.1.4" + is-date-object "^1.0.1" + is-symbol "^1.0.2" + +escalade@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz" + integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== + +escape-html@~1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz" + integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== + +escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + +escape-string-regexp@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz" + integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== + +escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== + +escodegen@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz" + integrity sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w== + dependencies: + esprima "^4.0.1" + estraverse "^5.2.0" + esutils "^2.0.2" + optionalDependencies: + source-map "~0.6.1" + +eslint-config-prettier@^8.3.0: + 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== + +eslint-import-resolver-node@^0.3.7: + 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== + dependencies: + debug "^3.2.7" + is-core-module "^2.13.0" + resolve "^1.22.4" + +eslint-module-utils@^2.8.0: + version "2.8.0" + resolved "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz" + integrity sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw== + dependencies: + debug "^3.2.7" + +eslint-plugin-import@^2.25.2: + version "2.28.1" + resolved "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.28.1.tgz" + integrity sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A== + dependencies: + array-includes "^3.1.6" + array.prototype.findlastindex "^1.2.2" + array.prototype.flat "^1.3.1" + array.prototype.flatmap "^1.3.1" + debug "^3.2.7" + doctrine "^2.1.0" + eslint-import-resolver-node "^0.3.7" + eslint-module-utils "^2.8.0" + has "^1.0.3" + is-core-module "^2.13.0" + is-glob "^4.0.3" + minimatch "^3.1.2" + object.fromentries "^2.0.6" + object.groupby "^1.0.0" + object.values "^1.1.6" + semver "^6.3.1" + tsconfig-paths "^3.14.2" + +eslint-plugin-jest@^27.2.1: + version "27.2.3" + resolved "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.2.3.tgz" + integrity sha512-sRLlSCpICzWuje66Gl9zvdF6mwD5X86I4u55hJyFBsxYOsBCmT5+kSUjf+fkFWVMMgpzNEupjW8WzUqi83hJAQ== + dependencies: + "@typescript-eslint/utils" "^5.10.0" + +eslint-plugin-jsdoc@^46.4.6: + version "46.5.1" + resolved "https://registry.npmjs.org/eslint-plugin-jsdoc/-/eslint-plugin-jsdoc-46.5.1.tgz" + integrity sha512-CPbvKprmEuJYoxMj5g8gXfPqUGgcqMM6jpH06Kp4pn5Uy5MrPkFKzoD7UFp2E4RBzfXbJz1+TeuEivwFVMkXBg== + dependencies: + "@es-joy/jsdoccomment" "~0.40.1" + are-docs-informative "^0.0.2" + comment-parser "1.4.0" + debug "^4.3.4" + escape-string-regexp "^4.0.0" + esquery "^1.5.0" + is-builtin-module "^3.2.1" + semver "^7.5.4" + spdx-expression-parse "^3.0.1" + +eslint-plugin-jsx-a11y@^6.5.1: + version "6.7.1" + resolved "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.7.1.tgz" + integrity sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA== + dependencies: + "@babel/runtime" "^7.20.7" + aria-query "^5.1.3" + array-includes "^3.1.6" + array.prototype.flatmap "^1.3.1" + ast-types-flow "^0.0.7" + axe-core "^4.6.2" + axobject-query "^3.1.1" + damerau-levenshtein "^1.0.8" + emoji-regex "^9.2.2" + has "^1.0.3" + jsx-ast-utils "^3.3.3" + language-tags "=1.0.5" + minimatch "^3.1.2" + object.entries "^1.1.6" + object.fromentries "^2.0.6" + semver "^6.3.0" + +eslint-plugin-prettier@^3.3.0: + version "3.4.1" + resolved "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-3.4.1.tgz" + integrity sha512-htg25EUYUeIhKHXjOinK4BgCcDwtLHjqaxCDsMy5nbnUMkKFvIhMVCp+5GFUXQ4Nr8lBsPqtGAqBenbpFqAA2g== + dependencies: + prettier-linter-helpers "^1.0.0" + +eslint-plugin-react-hooks@^4.3.0: + version "4.6.0" + resolved "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz" + integrity sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g== + +eslint-plugin-react@^7.27.0: + version "7.33.2" + resolved "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.33.2.tgz" + integrity sha512-73QQMKALArI8/7xGLNI/3LylrEYrlKZSb5C9+q3OtOewTnMQi5cT+aE9E41sLCmli3I9PGGmD1yiZydyo4FEPw== + dependencies: + array-includes "^3.1.6" + array.prototype.flatmap "^1.3.1" + array.prototype.tosorted "^1.1.1" + doctrine "^2.1.0" + es-iterator-helpers "^1.0.12" + estraverse "^5.3.0" + jsx-ast-utils "^2.4.1 || ^3.0.0" + minimatch "^3.1.2" + object.entries "^1.1.6" + object.fromentries "^2.0.6" + object.hasown "^1.1.2" + object.values "^1.1.6" + prop-types "^15.8.1" + resolve "^2.0.0-next.4" + semver "^6.3.1" + string.prototype.matchall "^4.0.8" + +eslint-scope@5.1.1, eslint-scope@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +eslint-scope@^7.2.2: + version "7.2.2" + resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz" + integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== + dependencies: + esrecurse "^4.3.0" + estraverse "^5.2.0" + +eslint-visitor-keys@^2.1.0: + 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== + +eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: + 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== + +eslint@^8.3.0: + version "8.48.0" + resolved "https://registry.npmjs.org/eslint/-/eslint-8.48.0.tgz" + integrity sha512-sb6DLeIuRXxeM1YljSe1KEx9/YYeZFQWcV8Rq9HfigmdDEugjLEVEa1ozDjL6YDjBpQHPJxJzze+alxi4T3OLg== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.6.1" + "@eslint/eslintrc" "^2.1.2" + "@eslint/js" "8.48.0" + "@humanwhocodes/config-array" "^0.11.10" + "@humanwhocodes/module-importer" "^1.0.1" + "@nodelib/fs.walk" "^1.2.8" + 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" + +espree@^9.6.0, espree@^9.6.1: + version "9.6.1" + resolved "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz" + integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== + dependencies: + acorn "^8.9.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.4.1" + +esprima@^4.0.0, esprima@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" + integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== + +esquery@^1.4.2, esquery@^1.5.0: + version "1.5.0" + resolved "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz" + integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== + dependencies: + estraverse "^5.1.0" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.1.0, estraverse@^5.2.0, estraverse@^5.3.0: + version "5.3.0" + resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +etag@~1.8.1: + version "1.8.1" + resolved "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz" + integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg== + +eventemitter3@^4.0.0: + version "4.0.7" + resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz" + integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw== + +events@^3.2.0: + version "3.3.0" + resolved "https://registry.npmjs.org/events/-/events-3.3.0.tgz" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + +execa@^5.0.0: + version "5.1.1" + resolved "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== + 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" + +exit@^0.1.2: + version "0.1.2" + resolved "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz" + integrity sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ== + +expand-tilde@^1.2.2: + 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== + dependencies: + os-homedir "^1.0.1" + +expect-puppeteer@^4.4.0: + version "4.4.0" + resolved "https://registry.npmjs.org/expect-puppeteer/-/expect-puppeteer-4.4.0.tgz" + integrity sha512-6Ey4Xy2xvmuQu7z7YQtMsaMV0EHJRpVxIDOd5GRrm04/I3nkTKIutELfECsLp6le+b3SSa3cXhPiw6PgqzxYWA== + +expect@^29.6.4: + version "29.6.4" + resolved "https://registry.npmjs.org/expect/-/expect-29.6.4.tgz" + integrity sha512-F2W2UyQ8XYyftHT57dtfg8Ue3X5qLgm2sSug0ivvLRH/VKNRL/pDxg/TH7zVzbQB0tu80clNFy6LU7OS/VSEKA== + dependencies: + "@jest/expect-utils" "^29.6.4" + jest-get-type "^29.6.3" + jest-matcher-utils "^29.6.4" + jest-message-util "^29.6.3" + jest-util "^29.6.3" + +express@^4.17.3: + version "4.18.2" + resolved "https://registry.npmjs.org/express/-/express-4.18.2.tgz" + integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== + dependencies: + accepts "~1.3.8" + array-flatten "1.1.1" + body-parser "1.20.1" + content-disposition "0.5.4" + content-type "~1.0.4" + cookie "0.5.0" + cookie-signature "1.0.6" + debug "2.6.9" + depd "2.0.0" + encodeurl "~1.0.2" + escape-html "~1.0.3" + etag "~1.8.1" + finalhandler "1.2.0" + fresh "0.5.2" + http-errors "2.0.0" + merge-descriptors "1.0.1" + methods "~1.1.2" + on-finished "2.4.1" + parseurl "~1.3.3" + path-to-regexp "0.1.7" + proxy-addr "~2.0.7" + qs "6.11.0" + range-parser "~1.2.1" + safe-buffer "5.2.1" + send "0.18.0" + serve-static "1.15.0" + setprototypeof "1.2.0" + statuses "2.0.1" + type-is "~1.6.18" + utils-merge "1.0.1" + vary "~1.1.2" + +extract-zip@2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz" + integrity sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg== + dependencies: + debug "^4.1.1" + get-stream "^5.1.0" + yauzl "^2.10.0" + optionalDependencies: + "@types/yauzl" "^2.9.1" + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + 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== + +fast-diff@^1.1.2: + version "1.3.0" + resolved "https://registry.npmjs.org/fast-diff/-/fast-diff-1.3.0.tgz" + integrity sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw== + +fast-glob@^3.2.12, fast-glob@^3.2.7, fast-glob@^3.2.9: + version "3.3.1" + resolved "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.1.tgz" + integrity sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg== + 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" + +fast-json-stable-stringify@^2.0.0, fast-json-stable-stringify@^2.1.0: + 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== + +fast-levenshtein@^2.0.6: + version "2.0.6" + resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz" + integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw== + +fastest-levenshtein@^1.0.12, fastest-levenshtein@^1.0.16: + version "1.0.16" + resolved "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz" + integrity sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg== + +fastq@^1.6.0: + version "1.15.0" + resolved "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz" + integrity sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw== + dependencies: + reusify "^1.0.4" + +faye-websocket@^0.11.3: + version "0.11.4" + resolved "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz" + integrity sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g== + dependencies: + websocket-driver ">=0.5.1" + +fb-watchman@^2.0.0: + version "2.0.2" + resolved "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz" + integrity sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA== + dependencies: + bser "2.1.1" + +fd-slicer@~1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz" + integrity sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g== + dependencies: + pend "~1.2.0" + +file-entry-cache@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz" + integrity sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg== + dependencies: + flat-cache "^3.0.4" + +filename-reserved-regex@^2.0.0: + 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== + +filenamify@^4.2.0: + version "4.3.0" + resolved "https://registry.npmjs.org/filenamify/-/filenamify-4.3.0.tgz" + integrity sha512-hcFKyUG57yWGAzu1CMt/dPzYZuv+jAJUT85bL8mrXvNe6hWj6yEHEc4EdcgiA6Z3oi1/9wXJdZPXF2dZNgwgOg== + dependencies: + filename-reserved-regex "^2.0.0" + strip-outer "^1.0.1" + trim-repeated "^1.0.0" + +fill-range@^7.0.1: + version "7.0.1" + resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz" + integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== + dependencies: + to-regex-range "^5.0.1" + +finalhandler@1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz" + integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== + dependencies: + debug "2.6.9" + encodeurl "~1.0.2" + escape-html "~1.0.3" + on-finished "2.4.1" + parseurl "~1.3.3" + statuses "2.0.1" + unpipe "~1.0.0" + +find-cache-dir@^3.3.1: + version "3.3.2" + resolved "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz" + integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig== + dependencies: + commondir "^1.0.1" + make-dir "^3.0.2" + pkg-dir "^4.1.0" + +find-file-up@^0.1.2: + 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== + dependencies: + fs-exists-sync "^0.1.0" + resolve-dir "^0.1.0" + +find-parent-dir@~0.3.0: + 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== + +find-pkg@^0.1.2: + version "0.1.2" + resolved "https://registry.npmjs.org/find-pkg/-/find-pkg-0.1.2.tgz" + integrity sha512-0rnQWcFwZr7eO0513HahrWafsc3CTFioEB7DRiEYCUM/70QXSY8f3mCST17HXLcPvEhzH/Ty/Bxd72ZZsr/yvw== + dependencies: + find-file-up "^0.1.2" + +find-process@^1.4.7: + version "1.4.7" + resolved "https://registry.npmjs.org/find-process/-/find-process-1.4.7.tgz" + integrity sha512-/U4CYp1214Xrp3u3Fqr9yNynUrr5Le4y0SsJh2lMDDSbpwYSz3M2SMWQC+wqcx79cN8PQtHQIL8KnuY9M66fdg== + dependencies: + chalk "^4.0.0" + commander "^5.1.0" + debug "^4.1.1" + +find-root@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz" + integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== + +find-up@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz#49169f1d7993430646da61ecc5ae355c21c97b73" + integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg== + dependencies: + locate-path "^3.0.0" + +find-up@^4.0.0, find-up@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +find-up@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz" + integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== + dependencies: + locate-path "^6.0.0" + path-exists "^4.0.0" + +flat-cache@^3.0.4: + version "3.1.0" + resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-3.1.0.tgz" + integrity sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew== + dependencies: + flatted "^3.2.7" + keyv "^4.5.3" + rimraf "^3.0.2" + +flatted@^3.2.7: + version "3.2.7" + resolved "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz" + integrity sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ== + +follow-redirects@^1.0.0, follow-redirects@^1.14.7: + version "1.15.2" + resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz" + integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA== + +for-each@^0.3.3: + version "0.3.3" + resolved "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz" + integrity sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw== + dependencies: + is-callable "^1.1.3" + +for-in@^0.1.3: + version "0.1.8" + resolved "https://registry.npmjs.org/for-in/-/for-in-0.1.8.tgz" + integrity sha512-F0to7vbBSHP8E3l6dCjxNOLuSFAACIxFy3UehTUlG7svlXi37HHsDkyVcHo0Pq8QwrE+pXvWSVX3ZT1T9wAZ9g== + +for-in@^1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz" + integrity sha512-7EwmXrOjyL+ChxMhmG5lnW9MPt1aIeZEwKhQzoBUdTV0N3zuwWDZYVJatDvZ2OyzPUvdIAZDsCetk3coyMfcnQ== + +for-own@^0.1.3: + version "0.1.5" + resolved "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz" + integrity sha512-SKmowqGTJoPzLO1T0BBJpkfp3EMacCMOuH40hOUbrbzElVktk4DioXVM99QkLCyKoiuOmyjgcWMpVz2xjE7LZw== + dependencies: + for-in "^1.0.1" + +form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + +forwarded@0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz" + integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== + +fraction.js@^4.2.0: + version "4.3.6" + resolved "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.6.tgz" + integrity sha512-n2aZ9tNfYDwaHhvFTkhFErqOMIb8uyzSQ+vGJBjZyanAKZVbGUQ1sngfk9FdkBw7G26O7AgNjLcecLffD1c7eg== + +framer-motion@^10.13.0: + version "10.16.4" + resolved "https://registry.npmjs.org/framer-motion/-/framer-motion-10.16.4.tgz" + integrity sha512-p9V9nGomS3m6/CALXqv6nFGMuFOxbWsmaOrdmhyQimMIlLl3LC7h7l86wge/Js/8cRu5ktutS/zlzgR7eBOtFA== + dependencies: + tslib "^2.4.0" + optionalDependencies: + "@emotion/is-prop-valid" "^0.8.2" + +fresh@0.5.2: + version "0.5.2" + resolved "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz" + integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q== + +fs-constants@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz" + integrity sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow== + +fs-exists-sync@^0.1.0: + 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== + +fs-monkey@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.4.tgz" + integrity sha512-INM/fWAxMICjttnD0DX1rBvinKskj5G1w+oy/pnm9u/tSlnBrzFonJMcalKJ30P8RRsPzKcCG7Q8l0jx5Fh9YQ== + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz" + integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw== + +fsevents@^2.3.2, fsevents@~2.3.2: + version "2.3.3" + resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + +function-bind@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz" + integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A== + +function.prototype.name@^1.1.5: + 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== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + functions-have-names "^1.2.3" + +functions-have-names@^1.2.3: + version "1.2.3" + resolved "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz" + integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== + +gensync@^1.0.0-beta.2: + 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== + +get-browser-rtc@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/get-browser-rtc/-/get-browser-rtc-1.1.0.tgz#d1494e299b00f33fc8e9d6d3343ba4ba99711a2c" + integrity sha512-MghbMJ61EJrRsDe7w1Bvqt3ZsBuqhce5nrn/XAwgwOXhcsz53/ltdxOse1h/8eKXj5slzxdsz56g5rzOFSGwfQ== + +get-caller-file@^2.0.1, get-caller-file@^2.0.5: + version "2.0.5" + resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" + integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== + +get-intrinsic@^1.0.2, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3, get-intrinsic@^1.2.0, get-intrinsic@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz" + integrity sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw== + dependencies: + function-bind "^1.1.1" + has "^1.0.3" + has-proto "^1.0.1" + has-symbols "^1.0.3" + +get-nonce@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/get-nonce/-/get-nonce-1.0.1.tgz" + integrity sha512-FJhYRoDaiatfEkUK8HKlicmu/3SGFD51q3itKDGoSTysQJBnfOcxU5GxnhE1E6soB76MbT0MBtnKJuXyAx+96Q== + +get-package-type@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz" + integrity sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q== + +get-stdin@~9.0.0: + version "9.0.0" + resolved "https://registry.npmjs.org/get-stdin/-/get-stdin-9.0.0.tgz" + integrity sha512-dVKBjfWisLAicarI2Sf+JuBE/DghV4UzNAVe9yhEJuzeREd3JhOTE9cUaJTeSa77fsbQUK3pcOpJfM59+VKZaA== + +get-stream@^5.1.0: + version "5.2.0" + resolved "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz" + integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA== + dependencies: + pump "^3.0.0" + +get-stream@^6.0.0: + version "6.0.1" + resolved "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz" + integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg== + +get-symbol-description@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz" + integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + +gettext-parser@^1.3.1: + 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" + +glob-parent@^5.1.2, glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-parent@^6.0.1, glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + +glob-to-regexp@^0.4.1: + 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== + +glob@^7.0.3, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@~7.2.0: + version "7.2.3" + resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" + integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== + 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" + +global-modules@^0.2.3: + version "0.2.3" + resolved "https://registry.npmjs.org/global-modules/-/global-modules-0.2.3.tgz" + integrity sha512-JeXuCbvYzYXcwE6acL9V2bAOeSIGl4dD+iwLY9iUx2VBJJ80R18HCn+JCwHM9Oegdfya3lEkGCdaRkSyc10hDA== + dependencies: + global-prefix "^0.1.4" + is-windows "^0.2.0" + +global-modules@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz" + integrity sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A== + dependencies: + global-prefix "^3.0.0" + +global-prefix@^0.1.4: + version "0.1.5" + resolved "https://registry.npmjs.org/global-prefix/-/global-prefix-0.1.5.tgz" + integrity sha512-gOPiyxcD9dJGCEArAhF4Hd0BAqvAe/JzERP7tYumE4yIkmIedPUVXcJFWbV3/p/ovIIvKjkrTk+f1UVkq7vvbw== + dependencies: + homedir-polyfill "^1.0.0" + ini "^1.3.4" + is-windows "^0.2.0" + which "^1.2.12" + +global-prefix@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz" + integrity sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg== + dependencies: + ini "^1.3.5" + kind-of "^6.0.2" + which "^1.3.1" + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +globals@^13.12.0, globals@^13.19.0: + version "13.21.0" + resolved "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz" + integrity sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg== + dependencies: + type-fest "^0.20.2" + +globalthis@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz" + integrity sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA== + dependencies: + define-properties "^1.1.3" + +globby@^11.1.0: + version "11.1.0" + resolved "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz" + integrity sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g== + 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" + +globby@^12.0.2: + version "12.2.0" + resolved "https://registry.npmjs.org/globby/-/globby-12.2.0.tgz" + integrity sha512-wiSuFQLZ+urS9x2gGPl1H5drc5twabmm4m2gTR27XDFyjUHJUNsS8o/2aKyIF6IoBaR630atdher0XJ5g6OMmA== + 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" + +globby@^6.1.0: + version "6.1.0" + resolved "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz" + integrity sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw== + dependencies: + array-union "^1.0.1" + glob "^7.0.3" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +globjoin@^0.1.4: + version "0.1.4" + resolved "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz" + integrity sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg== + +good-listener@^1.2.2: + 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" + +gopd@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz" + integrity sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA== + dependencies: + get-intrinsic "^1.1.3" + +graceful-fs@^4.1.2, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9: + 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== + +gradient-parser@^0.1.5: + version "0.1.5" + resolved "https://registry.npmjs.org/gradient-parser/-/gradient-parser-0.1.5.tgz" + integrity sha512-+uPlcVbjrKOnTzvz0MjTj7BfACj8OmxIa1moIjJV7btvhUMSJk0D47RfDCgDrZE3dYMz9Cf5xKJwnrKLjUq0KQ== + +graphemer@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz" + integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== + +gzip-size@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/gzip-size/-/gzip-size-6.0.0.tgz" + integrity sha512-ax7ZYomf6jqPTQ4+XCpUGyXKHk5WweS+e05MBO4/y3WJ5RkmPXNKvX+bx1behVILVwr6JSQvZAku021CHPXG3Q== + dependencies: + duplexer "^0.1.2" + +handle-thing@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz" + integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg== + +hard-rejection@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz" + integrity sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA== + +has-bigints@^1.0.1, has-bigints@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz" + integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +has-property-descriptors@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz" + integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ== + dependencies: + get-intrinsic "^1.1.1" + +has-proto@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz" + integrity sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg== + +has-symbols@^1.0.2, has-symbols@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz" + integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A== + +has-tostringtag@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz" + integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ== + dependencies: + has-symbols "^1.0.2" + +has@^1.0.3: + version "1.0.3" + resolved "https://registry.npmjs.org/has/-/has-1.0.3.tgz" + integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw== + dependencies: + function-bind "^1.1.1" + +header-case@^2.0.4: + 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" + +highlight-words-core@^1.2.2: + version "1.2.2" + resolved "https://registry.npmjs.org/highlight-words-core/-/highlight-words-core-1.2.2.tgz" + integrity sha512-BXUKIkUuh6cmmxzi5OIbUJxrG8OAk2MqoL1DtO3Wo9D2faJg2ph5ntyuQeLqaHJmzER6H5tllCDA9ZnNe9BVGg== + +hoist-non-react-statics@^3.3.1: + 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" + +homedir-polyfill@^1.0.0: + version "1.0.3" + resolved "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz" + integrity sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA== + dependencies: + parse-passwd "^1.0.0" + +hosted-git-info@^2.1.4: + 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== + +hosted-git-info@^4.0.1: + 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== + dependencies: + lru-cache "^6.0.0" + +hpack.js@^2.1.6: + version "2.1.6" + resolved "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz" + integrity sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ== + dependencies: + inherits "^2.0.1" + obuf "^1.0.0" + readable-stream "^2.0.1" + wbuf "^1.1.0" + +hpq@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/hpq/-/hpq-1.4.0.tgz#a65ad6ea8e9dfd835d990118597357befa5a88d9" + integrity sha512-ycJQMRaRPBcfnoT1gS5I1XCvbbw9KO94Y0vkwksuOjcJMqNZtb03MF2tCItLI2mQbkZWSSeFinoRDPmjzv4tKg== + +html-encoding-sniffer@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz" + integrity sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA== + dependencies: + whatwg-encoding "^2.0.0" + +html-entities@^2.1.0, html-entities@^2.3.2: + version "2.4.0" + resolved "https://registry.npmjs.org/html-entities/-/html-entities-2.4.0.tgz" + integrity sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ== + +html-escaper@^2.0.0: + version "2.0.2" + resolved "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz" + integrity sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg== + +html-tags@^3.2.0: + version "3.3.1" + resolved "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz" + integrity sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ== + +http-deceiver@^1.2.7: + version "1.2.7" + resolved "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz" + integrity sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw== + +http-errors@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== + dependencies: + depd "2.0.0" + inherits "2.0.4" + setprototypeof "1.2.0" + statuses "2.0.1" + toidentifier "1.0.1" + +http-errors@~1.6.2: + version "1.6.3" + resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz" + integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A== + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + +http-parser-js@>=0.5.1: + version "0.5.8" + resolved "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz" + integrity sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q== + +http-proxy-agent@^5.0.0: + 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== + dependencies: + "@tootallnate/once" "2" + agent-base "6" + debug "4" + +http-proxy-middleware@^2.0.3: + version "2.0.6" + resolved "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz" + integrity sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw== + 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" + +http-proxy@^1.18.1: + version "1.18.1" + resolved "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz" + integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ== + dependencies: + eventemitter3 "^4.0.0" + follow-redirects "^1.0.0" + requires-port "^1.0.0" + +https-proxy-agent@5.0.1, https-proxy-agent@^5.0.1: + 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== + dependencies: + agent-base "6" + debug "4" + +human-signals@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz" + integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== + +iconv-lite@0.4.24: + version "0.4.24" + resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" + integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== + dependencies: + safer-buffer ">= 2.1.2 < 3" + +iconv-lite@0.6.3, iconv-lite@^0.6.2, iconv-lite@^0.6.3: + 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" + +icss-utils@^5.0.0, icss-utils@^5.1.0: + version "5.1.0" + resolved "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz" + integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== + +ieee754@^1.1.13, ieee754@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz" + integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA== + +ignore-walk@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/ignore-walk/-/ignore-walk-4.0.1.tgz" + integrity sha512-rzDQLaW4jQbh2YrOFlJdCtX8qgJTehFRYiUB2r1osqTeDzV/3+Jh8fz1oAPzUThf3iku8Ds4IDqawI5d8mUiQw== + dependencies: + minimatch "^3.0.4" + +ignore@^5.1.9, ignore@^5.2.0, ignore@^5.2.1, ignore@~5.2.0: + version "5.2.4" + resolved "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz" + integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== + +immutable@^4.0.0: + version "4.3.4" + resolved "https://registry.npmjs.org/immutable/-/immutable-4.3.4.tgz" + integrity sha512-fsXeu4J4i6WNWSikpI88v/PcVflZz+6kMhUfIwc5SY+poQRPnaf5V7qds6SUyUN3cVxEzuCab7QIoLOQ+DQ1wA== + +import-fresh@^3.2.1, import-fresh@^3.3.0: + 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" + +import-lazy@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz" + integrity sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw== + +import-local@^3.0.2: + version "3.1.0" + resolved "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz" + integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg== + dependencies: + pkg-dir "^4.2.0" + resolve-cwd "^3.0.0" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz" + integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA== + +indent-string@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz" + integrity sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg== + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz" + integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA== + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.3: + version "2.0.4" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" + integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== + +inherits@2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" + integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== + +ini@^1.3.4, ini@^1.3.5: + version "1.3.8" + resolved "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz" + integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== + +ini@~3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/ini/-/ini-3.0.1.tgz" + integrity sha512-it4HyVAUTKBc6m8e1iXWvXSTdndF7HbdN713+kvLrymxTaU4AUBWrJ4vEooP+V7fexnVD3LKcBshjGGPefSMUQ== + +internal-slot@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz" + integrity sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ== + dependencies: + get-intrinsic "^1.2.0" + has "^1.0.3" + side-channel "^1.0.4" + +interpret@^2.2.0: + version "2.2.0" + resolved "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz" + integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw== + +invariant@^2.2.4: + 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" + +ipaddr.js@1.9.1: + 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== + +ipaddr.js@^2.0.1: + version "2.1.0" + resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.1.0.tgz" + integrity sha512-LlbxQ7xKzfBusov6UMi4MFpEg0m+mAm9xyNGEduwXMEDuf4WfzB/RZwMVYEd7IKGvh4IUkEXYxtAVu9T3OelJQ== + +irregular-plurals@^3.2.0: + 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== + +is-array-buffer@^3.0.1, is-array-buffer@^3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz" + integrity sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.0" + is-typed-array "^1.1.10" + +is-arrayish@^0.2.1: + version "0.2.1" + resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" + integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg== + +is-async-function@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz" + integrity sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA== + dependencies: + has-tostringtag "^1.0.0" + +is-bigint@^1.0.1: + version "1.0.4" + resolved "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz" + integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg== + dependencies: + has-bigints "^1.0.1" + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-boolean-object@^1.1.0: + version "1.1.2" + resolved "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz" + integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-buffer@^1.0.2, is-buffer@^1.1.5: + version "1.1.6" + resolved "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz" + integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== + +is-builtin-module@^3.2.1: + version "3.2.1" + resolved "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-3.2.1.tgz" + integrity sha512-BSLE3HnV2syZ0FK0iMA/yUGplUeMmNz4AW5fnTunbCIqZi4vG3WjJT9FHMy5D69xmAYBHXQhJdALdpwVxV501A== + dependencies: + builtin-modules "^3.3.0" + +is-callable@^1.1.3, is-callable@^1.1.4, is-callable@^1.2.7: + version "1.2.7" + resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz" + integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA== + +is-core-module@^2.13.0, is-core-module@^2.5.0, is-core-module@^2.9.0: + version "2.13.0" + resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.0.tgz" + integrity sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ== + dependencies: + has "^1.0.3" + +is-date-object@^1.0.1, is-date-object@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz" + integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ== + dependencies: + has-tostringtag "^1.0.0" + +is-docker@^2.0.0, is-docker@^2.1.1: + version "2.2.1" + resolved "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz" + integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ== + +is-extendable@^0.1.1: + version "0.1.1" + resolved "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz" + integrity sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw== + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-finalizationregistry@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.0.2.tgz" + integrity sha512-0by5vtUJs8iFQb5TYUHHPudOR+qXYIMKtiUzvLIZITZUjknFmziyBJuLhVRc+Ds0dREFlskDNJKYIdIzu/9pfw== + dependencies: + call-bind "^1.0.2" + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w== + +is-fullwidth-code-point@^3.0.0: + 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== + +is-generator-fn@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz" + integrity sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ== + +is-generator-function@^1.0.10: + version "1.0.10" + resolved "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz" + integrity sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A== + dependencies: + has-tostringtag "^1.0.0" + +is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-map@^2.0.1: + version "2.0.2" + resolved "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz" + integrity sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg== + +is-negative-zero@^2.0.2: + version "2.0.2" + resolved "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz" + integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA== + +is-number-object@^1.0.4: + version "1.0.7" + resolved "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz" + integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ== + dependencies: + has-tostringtag "^1.0.0" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-path-cwd@^2.0.0: + version "2.2.0" + resolved "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz" + integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ== + +is-path-in-cwd@^2.0.0: + 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== + dependencies: + is-path-inside "^2.1.0" + +is-path-inside@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz" + integrity sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg== + dependencies: + path-is-inside "^1.0.2" + +is-path-inside@^3.0.3: + 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== + +is-plain-obj@^1.1.0: + 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== + +is-plain-obj@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz" + integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA== + +is-plain-object@^2.0.1, is-plain-object@^2.0.4: + 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== + dependencies: + isobject "^3.0.1" + +is-plain-object@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz" + integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== + +is-potential-custom-element-name@^1.0.1: + 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== + +is-promise@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz" + integrity sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ== + +is-regex@^1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz" + integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg== + dependencies: + call-bind "^1.0.2" + has-tostringtag "^1.0.0" + +is-set@^2.0.1: + version "2.0.2" + resolved "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz" + integrity sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g== + +is-shared-array-buffer@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz" + integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA== + dependencies: + call-bind "^1.0.2" + +is-stream@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz" + integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg== + +is-string@^1.0.5, is-string@^1.0.7: + version "1.0.7" + resolved "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz" + integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg== + dependencies: + has-tostringtag "^1.0.0" + +is-symbol@^1.0.2, is-symbol@^1.0.3: + version "1.0.4" + resolved "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz" + integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg== + dependencies: + has-symbols "^1.0.2" + +is-typed-array@^1.1.10, is-typed-array@^1.1.9: + version "1.1.12" + resolved "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz" + integrity sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg== + dependencies: + which-typed-array "^1.1.11" + +is-unicode-supported@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz" + integrity sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw== + +is-weakmap@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz" + integrity sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA== + +is-weakref@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz" + integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ== + dependencies: + call-bind "^1.0.2" + +is-weakset@^2.0.1: + version "2.0.2" + resolved "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz" + integrity sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.1" + +is-windows@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/is-windows/-/is-windows-0.2.0.tgz" + integrity sha512-n67eJYmXbniZB7RF4I/FTjK1s6RPOCTxhYrVYLRaCt3lF0mpWZPKr3T2LSZAqyjQsxR2qMmGYXXzK0YWwcPM1Q== + +is-wsl@^2.2.0: + version "2.2.0" + resolved "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz" + integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww== + dependencies: + is-docker "^2.0.0" + +isarray@^2.0.5: + version "2.0.5" + resolved "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz" + integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw== + +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz" + integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz" + integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== + +isomorphic.js@^0.2.4: + version "0.2.5" + resolved "https://registry.yarnpkg.com/isomorphic.js/-/isomorphic.js-0.2.5.tgz#13eecf36f2dba53e85d355e11bf9d4208c6f7f88" + integrity sha512-PIeMbHqMt4DnUP3MA/Flc0HElYjMXArsw1qwJZcm9sqR8mq3l8NYizFMty0pWwE/tzIGH3EKK5+jes5mAr85yw== + +istanbul-lib-coverage@^3.0.0, istanbul-lib-coverage@^3.2.0: + version "3.2.0" + resolved "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz" + integrity sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw== + +istanbul-lib-instrument@^5.0.4: + version "5.2.1" + resolved "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-5.2.1.tgz" + integrity sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg== + 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" + +istanbul-lib-instrument@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.0.tgz" + integrity sha512-x58orMzEVfzPUKqlbLd1hXCnySCxKdDKa6Rjg97CwuLLRI4g3FHTdnExu1OqffVFay6zeMW+T6/DowFLndWnIw== + dependencies: + "@babel/core" "^7.12.3" + "@babel/parser" "^7.14.7" + "@istanbuljs/schema" "^0.1.2" + istanbul-lib-coverage "^3.2.0" + semver "^7.5.4" + +istanbul-lib-report@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz" + integrity sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw== + dependencies: + istanbul-lib-coverage "^3.0.0" + make-dir "^4.0.0" + supports-color "^7.1.0" + +istanbul-lib-source-maps@^4.0.0: + 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== + dependencies: + debug "^4.1.1" + istanbul-lib-coverage "^3.0.0" + source-map "^0.6.1" + +istanbul-reports@^3.1.3: + version "3.1.6" + resolved "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz" + integrity sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg== + dependencies: + html-escaper "^2.0.0" + istanbul-lib-report "^3.0.0" + +iterator.prototype@^1.1.0: + version "1.1.1" + resolved "https://registry.npmjs.org/iterator.prototype/-/iterator.prototype-1.1.1.tgz" + integrity sha512-9E+nePc8C9cnQldmNl6bgpTY6zI4OPRZd97fhJ/iVZ1GifIUDVV5F6x1nEDqpe8KaMEZGT4xgrwKQDxXnjOIZQ== + dependencies: + define-properties "^1.2.0" + get-intrinsic "^1.2.1" + has-symbols "^1.0.3" + reflect.getprototypeof "^1.0.3" + +jest-changed-files@^29.6.3: + version "29.6.3" + resolved "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-29.6.3.tgz" + integrity sha512-G5wDnElqLa4/c66ma5PG9eRjE342lIbF6SUnTJi26C3J28Fv2TVY2rOyKB9YGbSA5ogwevgmxc4j4aVjrEK6Yg== + dependencies: + execa "^5.0.0" + jest-util "^29.6.3" + p-limit "^3.1.0" + +jest-circus@^29.6.4: + version "29.6.4" + resolved "https://registry.npmjs.org/jest-circus/-/jest-circus-29.6.4.tgz" + integrity sha512-YXNrRyntVUgDfZbjXWBMPslX1mQ8MrSG0oM/Y06j9EYubODIyHWP8hMUbjbZ19M3M+zamqEur7O80HODwACoJw== + dependencies: + "@jest/environment" "^29.6.4" + "@jest/expect" "^29.6.4" + "@jest/test-result" "^29.6.4" + "@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.6.3" + jest-matcher-utils "^29.6.4" + jest-message-util "^29.6.3" + jest-runtime "^29.6.4" + jest-snapshot "^29.6.4" + jest-util "^29.6.3" + p-limit "^3.1.0" + pretty-format "^29.6.3" + pure-rand "^6.0.0" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-cli@^29.6.4: + version "29.6.4" + resolved "https://registry.npmjs.org/jest-cli/-/jest-cli-29.6.4.tgz" + integrity sha512-+uMCQ7oizMmh8ZwRfZzKIEszFY9ksjjEQnTEMTaL7fYiL3Kw4XhqT9bYh+A4DQKUb67hZn2KbtEnDuHvcgK4pQ== + dependencies: + "@jest/core" "^29.6.4" + "@jest/test-result" "^29.6.4" + "@jest/types" "^29.6.3" + chalk "^4.0.0" + exit "^0.1.2" + graceful-fs "^4.2.9" + import-local "^3.0.2" + jest-config "^29.6.4" + jest-util "^29.6.3" + jest-validate "^29.6.3" + prompts "^2.0.1" + yargs "^17.3.1" + +jest-config@^29.6.4: + version "29.6.4" + resolved "https://registry.npmjs.org/jest-config/-/jest-config-29.6.4.tgz" + integrity sha512-JWohr3i9m2cVpBumQFv2akMEnFEPVOh+9L2xIBJhJ0zOaci2ZXuKJj0tgMKQCBZAKA09H049IR4HVS/43Qb19A== + dependencies: + "@babel/core" "^7.11.6" + "@jest/test-sequencer" "^29.6.4" + "@jest/types" "^29.6.3" + babel-jest "^29.6.4" + 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.6.4" + jest-environment-node "^29.6.4" + jest-get-type "^29.6.3" + jest-regex-util "^29.6.3" + jest-resolve "^29.6.4" + jest-runner "^29.6.4" + jest-util "^29.6.3" + jest-validate "^29.6.3" + micromatch "^4.0.4" + parse-json "^5.2.0" + pretty-format "^29.6.3" + slash "^3.0.0" + strip-json-comments "^3.1.1" + +jest-dev-server@^6.0.2: + version "6.2.0" + resolved "https://registry.npmjs.org/jest-dev-server/-/jest-dev-server-6.2.0.tgz" + integrity sha512-ZWh8CuvxwjhYfvw4tGeftziqIvw/26R6AG3OTgNTQeXul8aZz48RQjDpnlDwnWX53jxJJl9fcigqIdSU5lYZuw== + dependencies: + chalk "^4.1.2" + cwd "^0.10.0" + find-process "^1.4.7" + prompts "^2.4.2" + spawnd "^6.2.0" + tree-kill "^1.2.2" + wait-on "^6.0.1" + +jest-diff@^29.6.4: + version "29.6.4" + resolved "https://registry.npmjs.org/jest-diff/-/jest-diff-29.6.4.tgz" + integrity sha512-9F48UxR9e4XOEZvoUXEHSWY4qC4zERJaOfrbBg9JpbJOO43R1vN76REt/aMGZoY6GD5g84nnJiBIVlscegefpw== + dependencies: + chalk "^4.0.0" + diff-sequences "^29.6.3" + jest-get-type "^29.6.3" + pretty-format "^29.6.3" + +jest-docblock@^29.6.3: + version "29.6.3" + resolved "https://registry.npmjs.org/jest-docblock/-/jest-docblock-29.6.3.tgz" + integrity sha512-2+H+GOTQBEm2+qFSQ7Ma+BvyV+waiIFxmZF5LdpBsAEjWX8QYjSCa4FrkIYtbfXUJJJnFCYrOtt6TZ+IAiTjBQ== + dependencies: + detect-newline "^3.0.0" + +jest-each@^29.6.3: + version "29.6.3" + resolved "https://registry.npmjs.org/jest-each/-/jest-each-29.6.3.tgz" + integrity sha512-KoXfJ42k8cqbkfshW7sSHcdfnv5agDdHCPA87ZBdmHP+zJstTJc0ttQaJ/x7zK6noAL76hOuTIJ6ZkQRS5dcyg== + dependencies: + "@jest/types" "^29.6.3" + chalk "^4.0.0" + jest-get-type "^29.6.3" + jest-util "^29.6.3" + pretty-format "^29.6.3" + +jest-environment-jsdom@^29.6.2: + version "29.6.4" + resolved "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-29.6.4.tgz" + integrity sha512-K6wfgUJ16DoMs02JYFid9lOsqfpoVtyJxpRlnTxUHzvZWBnnh2VNGRB9EC1Cro96TQdq5TtSjb3qUjNaJP9IyA== + dependencies: + "@jest/environment" "^29.6.4" + "@jest/fake-timers" "^29.6.4" + "@jest/types" "^29.6.3" + "@types/jsdom" "^20.0.0" + "@types/node" "*" + jest-mock "^29.6.3" + jest-util "^29.6.3" + jsdom "^20.0.0" + +jest-environment-node@^29.6.2, jest-environment-node@^29.6.4: + version "29.6.4" + resolved "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-29.6.4.tgz" + integrity sha512-i7SbpH2dEIFGNmxGCpSc2w9cA4qVD+wfvg2ZnfQ7XVrKL0NA5uDVBIiGH8SR4F0dKEv/0qI5r+aDomDf04DpEQ== + dependencies: + "@jest/environment" "^29.6.4" + "@jest/fake-timers" "^29.6.4" + "@jest/types" "^29.6.3" + "@types/node" "*" + jest-mock "^29.6.3" + jest-util "^29.6.3" + +jest-get-type@^29.6.3: + version "29.6.3" + resolved "https://registry.npmjs.org/jest-get-type/-/jest-get-type-29.6.3.tgz" + integrity sha512-zrteXnqYxfQh7l5FHyL38jL39di8H8rHoecLH3JNxH3BwOrBsNeabdap5e0I23lD4HHI8W5VFBZqG4Eaq5LNcw== + +jest-haste-map@^29.6.4: + version "29.6.4" + resolved "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-29.6.4.tgz" + integrity sha512-12Ad+VNTDHxKf7k+M65sviyynRoZYuL1/GTuhEVb8RYsNSNln71nANRb/faSyWvx0j+gHcivChXHIoMJrGYjog== + 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.6.3" + jest-worker "^29.6.4" + micromatch "^4.0.4" + walker "^1.0.8" + optionalDependencies: + fsevents "^2.3.2" + +jest-leak-detector@^29.6.3: + version "29.6.3" + resolved "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-29.6.3.tgz" + integrity sha512-0kfbESIHXYdhAdpLsW7xdwmYhLf1BRu4AA118/OxFm0Ho1b2RcTmO4oF6aAMaxpxdxnJ3zve2rgwzNBD4Zbm7Q== + dependencies: + jest-get-type "^29.6.3" + pretty-format "^29.6.3" + +jest-matcher-utils@^29.6.2, jest-matcher-utils@^29.6.4: + version "29.6.4" + resolved "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-29.6.4.tgz" + integrity sha512-KSzwyzGvK4HcfnserYqJHYi7sZVqdREJ9DMPAKVbS98JsIAvumihaNUbjrWw0St7p9IY7A9UskCW5MYlGmBQFQ== + dependencies: + chalk "^4.0.0" + jest-diff "^29.6.4" + jest-get-type "^29.6.3" + pretty-format "^29.6.3" + +jest-message-util@^29.6.3: + version "29.6.3" + resolved "https://registry.npmjs.org/jest-message-util/-/jest-message-util-29.6.3.tgz" + integrity sha512-FtzaEEHzjDpQp51HX4UMkPZjy46ati4T5pEMyM6Ik48ztu4T9LQplZ6OsimHx7EuM9dfEh5HJa6D3trEftu3dA== + 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.6.3" + slash "^3.0.0" + stack-utils "^2.0.3" + +jest-mock@^29.6.3: + version "29.6.3" + resolved "https://registry.npmjs.org/jest-mock/-/jest-mock-29.6.3.tgz" + integrity sha512-Z7Gs/mOyTSR4yPsaZ72a/MtuK6RnC3JYqWONe48oLaoEcYwEDxqvbXz85G4SJrm2Z5Ar9zp6MiHF4AlFlRM4Pg== + dependencies: + "@jest/types" "^29.6.3" + "@types/node" "*" + jest-util "^29.6.3" + +jest-pnp-resolver@^1.2.2: + version "1.2.3" + resolved "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz" + integrity sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w== + +jest-regex-util@^29.6.3: + version "29.6.3" + resolved "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-29.6.3.tgz" + integrity sha512-KJJBsRCyyLNWCNBOvZyRDnAIfUiRJ8v+hOBQYGn8gDyF3UegwiP4gwRR3/SDa42g1YbVycTidUF3rKjyLFDWbg== + +jest-resolve-dependencies@^29.6.4: + version "29.6.4" + resolved "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-29.6.4.tgz" + integrity sha512-7+6eAmr1ZBF3vOAJVsfLj1QdqeXG+WYhidfLHBRZqGN24MFRIiKG20ItpLw2qRAsW/D2ZUUmCNf6irUr/v6KHA== + dependencies: + jest-regex-util "^29.6.3" + jest-snapshot "^29.6.4" + +jest-resolve@^29.6.4: + version "29.6.4" + resolved "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.6.4.tgz" + integrity sha512-fPRq+0vcxsuGlG0O3gyoqGTAxasagOxEuyoxHeyxaZbc9QNek0AmJWSkhjlMG+mTsj+8knc/mWb3fXlRNVih7Q== + dependencies: + chalk "^4.0.0" + graceful-fs "^4.2.9" + jest-haste-map "^29.6.4" + jest-pnp-resolver "^1.2.2" + jest-util "^29.6.3" + jest-validate "^29.6.3" + resolve "^1.20.0" + resolve.exports "^2.0.0" + slash "^3.0.0" + +jest-runner@^29.6.4: + version "29.6.4" + resolved "https://registry.npmjs.org/jest-runner/-/jest-runner-29.6.4.tgz" + integrity sha512-SDaLrMmtVlQYDuG0iSPYLycG8P9jLI+fRm8AF/xPKhYDB2g6xDWjXBrR5M8gEWsK6KVFlebpZ4QsrxdyIX1Jaw== + dependencies: + "@jest/console" "^29.6.4" + "@jest/environment" "^29.6.4" + "@jest/test-result" "^29.6.4" + "@jest/transform" "^29.6.4" + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + emittery "^0.13.1" + graceful-fs "^4.2.9" + jest-docblock "^29.6.3" + jest-environment-node "^29.6.4" + jest-haste-map "^29.6.4" + jest-leak-detector "^29.6.3" + jest-message-util "^29.6.3" + jest-resolve "^29.6.4" + jest-runtime "^29.6.4" + jest-util "^29.6.3" + jest-watcher "^29.6.4" + jest-worker "^29.6.4" + p-limit "^3.1.0" + source-map-support "0.5.13" + +jest-runtime@^29.6.4: + version "29.6.4" + resolved "https://registry.npmjs.org/jest-runtime/-/jest-runtime-29.6.4.tgz" + integrity sha512-s/QxMBLvmwLdchKEjcLfwzP7h+jsHvNEtxGP5P+Fl1FMaJX2jMiIqe4rJw4tFprzCwuSvVUo9bn0uj4gNRXsbA== + dependencies: + "@jest/environment" "^29.6.4" + "@jest/fake-timers" "^29.6.4" + "@jest/globals" "^29.6.4" + "@jest/source-map" "^29.6.3" + "@jest/test-result" "^29.6.4" + "@jest/transform" "^29.6.4" + "@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.6.4" + jest-message-util "^29.6.3" + jest-mock "^29.6.3" + jest-regex-util "^29.6.3" + jest-resolve "^29.6.4" + jest-snapshot "^29.6.4" + jest-util "^29.6.3" + slash "^3.0.0" + strip-bom "^4.0.0" + +jest-snapshot@^29.6.4: + version "29.6.4" + resolved "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-29.6.4.tgz" + integrity sha512-VC1N8ED7+4uboUKGIDsbvNAZb6LakgIPgAF4RSpF13dN6YaMokfRqO+BaqK4zIh6X3JffgwbzuGqDEjHm/MrvA== + 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.6.4" + "@jest/transform" "^29.6.4" + "@jest/types" "^29.6.3" + babel-preset-current-node-syntax "^1.0.0" + chalk "^4.0.0" + expect "^29.6.4" + graceful-fs "^4.2.9" + jest-diff "^29.6.4" + jest-get-type "^29.6.3" + jest-matcher-utils "^29.6.4" + jest-message-util "^29.6.3" + jest-util "^29.6.3" + natural-compare "^1.4.0" + pretty-format "^29.6.3" + semver "^7.5.3" + +jest-util@^29.6.3: + version "29.6.3" + resolved "https://registry.npmjs.org/jest-util/-/jest-util-29.6.3.tgz" + integrity sha512-QUjna/xSy4B32fzcKTSz1w7YYzgiHrjjJjevdRf61HYk998R5vVMMNmrHESYZVDS5DSWs+1srPLPKxXPkeSDOA== + 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" + +jest-validate@^29.6.3: + version "29.6.3" + resolved "https://registry.npmjs.org/jest-validate/-/jest-validate-29.6.3.tgz" + integrity sha512-e7KWZcAIX+2W1o3cHfnqpGajdCs1jSM3DkXjGeLSNmCazv1EeI1ggTeK5wdZhF+7N+g44JI2Od3veojoaumlfg== + 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.6.3" + +jest-watcher@^29.6.4: + version "29.6.4" + resolved "https://registry.npmjs.org/jest-watcher/-/jest-watcher-29.6.4.tgz" + integrity sha512-oqUWvx6+On04ShsT00Ir9T4/FvBeEh2M9PTubgITPxDa739p4hoQweWPRGyYeaojgT0xTpZKF0Y/rSY1UgMxvQ== + dependencies: + "@jest/test-result" "^29.6.4" + "@jest/types" "^29.6.3" + "@types/node" "*" + ansi-escapes "^4.2.1" + chalk "^4.0.0" + emittery "^0.13.1" + jest-util "^29.6.3" + string-length "^4.0.1" + +jest-worker@^27.4.5: + version "27.5.1" + resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz" + integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +jest-worker@^29.6.4: + version "29.6.4" + resolved "https://registry.npmjs.org/jest-worker/-/jest-worker-29.6.4.tgz" + integrity sha512-6dpvFV4WjcWbDVGgHTWo/aupl8/LbBx2NSKfiwqf79xC/yeJjKHT1+StcKy/2KTmW16hE68ccKVOtXf+WZGz7Q== + dependencies: + "@types/node" "*" + jest-util "^29.6.3" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +jest@^29.6.2: + version "29.6.4" + resolved "https://registry.npmjs.org/jest/-/jest-29.6.4.tgz" + integrity sha512-tEFhVQFF/bzoYV1YuGyzLPZ6vlPrdfvDmmAxudA1dLEuiztqg2Rkx20vkKY32xiDROcD2KXlgZ7Cu8RPeEHRKw== + dependencies: + "@jest/core" "^29.6.4" + "@jest/types" "^29.6.3" + import-local "^3.0.2" + jest-cli "^29.6.4" + +joi@^17.6.0: + version "17.10.1" + resolved "https://registry.npmjs.org/joi/-/joi-17.10.1.tgz" + integrity sha512-vIiDxQKmRidUVp8KngT8MZSOcmRVm2zV7jbMjNYWuHcJWI0bUck3nRTGQjhpPlQenIQIBC5Vp9AhcnHbWQqafw== + dependencies: + "@hapi/hoek" "^9.0.0" + "@hapi/topo" "^5.0.0" + "@sideway/address" "^4.1.3" + "@sideway/formula" "^3.0.1" + "@sideway/pinpoint" "^2.0.0" + +"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +js-yaml@^3.13.1: + version "3.14.1" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz" + integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g== + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +js-yaml@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz" + integrity sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA== + dependencies: + argparse "^2.0.1" + +jsdoc-type-pratt-parser@~4.0.0: + 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== + +jsdom@^20.0.0: + version "20.0.3" + resolved "https://registry.npmjs.org/jsdom/-/jsdom-20.0.3.tgz" + integrity sha512-SYhBvTh89tTfCD/CRdSOm13mOBa42iTaTyfyEWBdKcGdPxPtLFBXuHR8XHb33YNYaP+lLbmSvBTsnoesCNJEsQ== + 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" + +jsesc@^2.5.1: + version "2.5.2" + resolved "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz" + integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA== + +jsesc@~0.5.0: + version "0.5.0" + resolved "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz" + integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA== + +json-buffer@3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz" + integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ== + +json-parse-even-better-errors@^2.3.0, json-parse-even-better-errors@^2.3.1: + 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== + +json-schema-traverse@^0.4.1: + 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== + +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + +json-stable-stringify-without-jsonify@^1.0.1: + 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== + +json2php@^0.0.7: + version "0.0.7" + resolved "https://registry.npmjs.org/json2php/-/json2php-0.0.7.tgz" + integrity sha512-dnSoUiLAoVaMXxFsVi4CrPVYMKOuDBXTghXSmMINX44RZ8WM9cXlY7UqrQnlAcODCVO7FV3+8t/5nDKAjimLfg== + +json5@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz" + integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== + dependencies: + minimist "^1.2.0" + +json5@^2.1.2, json5@^2.2.3: + version "2.2.3" + resolved "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + +jsonc-parser@^3.2.0: + version "3.2.0" + resolved "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.2.0.tgz" + integrity sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w== + +jsonc-parser@~3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.0.0.tgz" + integrity sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA== + +"jsx-ast-utils@^2.4.1 || ^3.0.0", jsx-ast-utils@^3.3.3: + version "3.3.5" + resolved "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.5.tgz" + integrity sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ== + dependencies: + array-includes "^3.1.6" + array.prototype.flat "^1.3.1" + object.assign "^4.1.4" + object.values "^1.1.6" + +keyv@^4.5.3: + version "4.5.3" + resolved "https://registry.npmjs.org/keyv/-/keyv-4.5.3.tgz" + integrity sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug== + dependencies: + json-buffer "3.0.1" + +kind-of@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/kind-of/-/kind-of-2.0.1.tgz" + integrity sha512-0u8i1NZ/mg0b+W3MGGw5I7+6Eib2nx72S/QvXa0hYjEkjTknYmEYQJwGu3mLC0BrhtJjtQafTkyRUQ75Kx0LVg== + dependencies: + is-buffer "^1.0.2" + +kind-of@^3.0.2: + version "3.2.2" + resolved "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz" + integrity sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ== + dependencies: + is-buffer "^1.1.5" + +kind-of@^6.0.2, kind-of@^6.0.3: + version "6.0.3" + resolved "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +kleur@^3.0.3: + version "3.0.3" + resolved "https://registry.npmjs.org/kleur/-/kleur-3.0.3.tgz" + integrity sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w== + +klona@^2.0.4, klona@^2.0.5: + version "2.0.6" + resolved "https://registry.npmjs.org/klona/-/klona-2.0.6.tgz" + integrity sha512-dhG34DXATL5hSxJbIexCft8FChFXtmskoZYnoPWjXQuebWYCNkVeV3KkGegCK9CP1oswI/vQibS2GY7Em/sJJA== + +known-css-properties@^0.26.0: + version "0.26.0" + resolved "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.26.0.tgz" + integrity sha512-5FZRzrZzNTBruuurWpvZnvP9pum+fe0HcK8z/ooo+U+Hmp4vtbyp1/QDsqmufirXy4egGzbaH/y2uCZf+6W5Kg== + +language-subtag-registry@~0.3.2: + version "0.3.22" + resolved "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz" + integrity sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w== + +language-tags@=1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz" + integrity sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ== + dependencies: + language-subtag-registry "~0.3.2" + +launch-editor@^2.6.0: + version "2.6.0" + resolved "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.0.tgz" + integrity sha512-JpDCcQnyAAzZZaZ7vEiSqL690w7dAEyLao+KC96zBplnYbJS7TYNjvM3M7y3dGz+v7aIsJk3hllWuc0kWAjyRQ== + dependencies: + picocolors "^1.0.0" + shell-quote "^1.7.3" + +lazy-cache@^0.2.3: + version "0.2.7" + resolved "https://registry.npmjs.org/lazy-cache/-/lazy-cache-0.2.7.tgz" + integrity sha512-gkX52wvU/R8DVMMt78ATVPFMJqfW8FPz1GZ1sVHBVQHmu/WvhIWE4cE1GBzhJNFicDeYhnwp6Rl35BcAIM3YOQ== + +lazy-cache@^1.0.3: + version "1.0.4" + resolved "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz" + integrity sha512-RE2g0b5VGZsOCFOCgP7omTRYFqydmZkBwl5oNnQ1lDYC57uyO9KqNnNVxT7COSHTxrRCWVcAVOcbjk+tvh/rgQ== + +leven@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz" + integrity sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A== + +levn@^0.4.1: + version "0.4.1" + resolved "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz" + integrity sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ== + dependencies: + prelude-ls "^1.2.1" + type-check "~0.4.0" + +lib0@^0.2.42, lib0@^0.2.74: + version "0.2.83" + resolved "https://registry.yarnpkg.com/lib0/-/lib0-0.2.83.tgz#e94657a44fc6bb1af14c52260dccadd7691638e9" + integrity sha512-O72x2MGVOG3TwQ1aXXkk1Ebb438OrxyQcg60oiWRm66U9uCnE12fDfO+NlQ43OVQkgNLvw2hzHYxkp76YLSxRw== + dependencies: + isomorphic.js "^0.2.4" + +lilconfig@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz" + integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== + +line-height@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/line-height/-/line-height-0.3.1.tgz#4b1205edde182872a5efa3c8f620b3187a9c54c9" + integrity sha512-YExecgqPwnp5gplD2+Y8e8A5+jKpr25+DzMbFdI1/1UAr0FJrTFv4VkHLf8/6B590i1wUPJWMKKldkd/bdQ//w== + dependencies: + computed-style "~0.1.3" + +lines-and-columns@^1.1.6: + version "1.2.4" + resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz" + integrity sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg== + +linkify-it@^3.0.1: + version "3.0.3" + resolved "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.3.tgz" + integrity sha512-ynTsyrFSdE5oZ/O9GEf00kPngmOfVwazR5GKDq6EYfhlpFug3J2zybX56a2PRRpc9P+FuSoGNAwjlbDs9jJBPQ== + dependencies: + uc.micro "^1.0.1" + +loader-runner@^4.2.0: + version "4.3.0" + resolved "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz" + integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== + +loader-utils@^2.0.0, loader-utils@^2.0.4: + version "2.0.4" + resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz" + integrity sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^2.1.2" + +locate-path@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz#dbec3b3ab759758071b58fe59fc41871af21400e" + integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A== + dependencies: + p-locate "^3.0.0" + path-exists "^3.0.0" + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +locate-path@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz" + integrity sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw== + dependencies: + p-locate "^5.0.0" + +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz" + integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== + +lodash.escape@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/lodash.escape/-/lodash.escape-4.0.1.tgz" + integrity sha512-nXEOnb/jK9g0DYMr1/Xvq6l5xMD7GDG55+GSYIYmS0G4tBk/hURD4JR9WCavs04t33WmJx9kCyp9vJ+mr4BOUw== + +lodash.flatten@^4.4.0: + version "4.4.0" + resolved "https://registry.npmjs.org/lodash.flatten/-/lodash.flatten-4.4.0.tgz" + integrity sha512-C5N2Z3DgnnKr0LOpv/hKCgKdb7ZZwafIrsesve6lmzvZIRZRGaZ/l6Q8+2W7NaT+ZwO3fFlSCzCzrDCFdJfZ4g== + +lodash.invokemap@^4.6.0: + version "4.6.0" + resolved "https://registry.npmjs.org/lodash.invokemap/-/lodash.invokemap-4.6.0.tgz" + integrity sha512-CfkycNtMqgUlfjfdh2BhKO/ZXrP8ePOX5lEU/g0R3ItJcnuxWDwokMGKx1hWcfOikmyOVx6X9IwWnDGlgKl61w== + +lodash.memoize@^4.1.2: + version "4.1.2" + resolved "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz" + integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== + +lodash.merge@^4.6.2: + version "4.6.2" + resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" + integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== + +lodash.pullall@^4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/lodash.pullall/-/lodash.pullall-4.2.0.tgz" + integrity sha512-VhqxBKH0ZxPpLhiu68YD1KnHmbhQJQctcipvmFnqIBDYzcIHzf3Zpu0tpeOKtR4x76p9yohc506eGdOjTmyIBg== + +lodash.truncate@^4.4.2: + version "4.4.2" + resolved "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz" + integrity sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw== + +lodash.uniq@^4.5.0: + version "4.5.0" + resolved "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz" + integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== + +lodash.uniqby@^4.7.0: + version "4.7.0" + resolved "https://registry.npmjs.org/lodash.uniqby/-/lodash.uniqby-4.7.0.tgz" + integrity sha512-e/zcLx6CSbmaEgFHCA7BnoQKyCtKMxnuWrJygbwPs/AIn+IMKl66L8/s+wBUn5LRw2pZx3bUHibiV1b6aTWIww== + +lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +log-symbols@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz" + integrity sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg== + dependencies: + chalk "^4.1.0" + is-unicode-supported "^0.1.0" + +loose-envify@^1.0.0, loose-envify@^1.1.0, loose-envify@^1.4.0: + 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" + +lower-case@^2.0.2: + 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" + +lru-cache@^4.0.1: + version "4.1.5" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz" + integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g== + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +lru-cache@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz" + integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== + dependencies: + yallist "^4.0.0" + +make-dir@^3.0.2, make-dir@^3.1.0: + 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== + dependencies: + semver "^6.0.0" + +make-dir@^4.0.0: + 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== + dependencies: + semver "^7.5.3" + +makeerror@1.0.12: + version "1.0.12" + resolved "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz" + integrity sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg== + dependencies: + tmpl "1.0.5" + +map-obj@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz" + integrity sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg== + +map-obj@^4.0.0: + version "4.3.0" + resolved "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz" + integrity sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ== + +map-values@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/map-values/-/map-values-1.0.1.tgz" + integrity sha512-BbShUnr5OartXJe1GeccAWtfro11hhgNJg6G9/UtWKjVGvV5U4C09cg5nk8JUevhXODaXY+hQ3xxMUKSs62ONQ== + +markdown-it@12.3.2: + version "12.3.2" + resolved "https://registry.npmjs.org/markdown-it/-/markdown-it-12.3.2.tgz" + integrity sha512-TchMembfxfNVpHkbtriWltGWc+m3xszaRD0CZup7GFFhzIgQqxIfn3eGj1yZpfuflzPvfkt611B2Q/Bsk1YnGg== + dependencies: + argparse "^2.0.1" + entities "~2.1.0" + linkify-it "^3.0.1" + mdurl "^1.0.1" + uc.micro "^1.0.5" + +markdownlint-cli@^0.31.1: + 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== + 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" + +markdownlint-rule-helpers@~0.16.0: + version "0.16.0" + resolved "https://registry.npmjs.org/markdownlint-rule-helpers/-/markdownlint-rule-helpers-0.16.0.tgz" + integrity sha512-oEacRUVeTJ5D5hW1UYd2qExYI0oELdYK72k1TKGvIeYJIbqQWAz476NAc7LNixSySUhcNl++d02DvX0ccDk9/w== + +markdownlint@~0.25.1: + version "0.25.1" + resolved "https://registry.npmjs.org/markdownlint/-/markdownlint-0.25.1.tgz" + integrity sha512-AG7UkLzNa1fxiOv5B+owPsPhtM4D6DoODhsJgiaNg1xowXovrYgOnLqAgOOFQpWOlHFVQUzjMY5ypNNTeov92g== + dependencies: + markdown-it "12.3.2" + +mathml-tag-names@^2.1.3: + version "2.1.3" + resolved "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz" + integrity sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg== + +mdn-data@2.0.28: + version "2.0.28" + resolved "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz" + integrity sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g== + +mdn-data@2.0.30: + version "2.0.30" + resolved "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz" + integrity sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA== + +mdurl@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz" + integrity sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g== + +media-typer@0.3.0: + version "0.3.0" + resolved "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz" + integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ== + +memfs@^3.4.3: + version "3.6.0" + resolved "https://registry.npmjs.org/memfs/-/memfs-3.6.0.tgz" + integrity sha512-EGowvkkgbMcIChjMTMkESFDbZeSh8xZ7kNSF0hAiAN4Jh6jgHCRS0Ga/+C8y6Au+oqpezRHCfPsmJ2+DwAgiwQ== + dependencies: + fs-monkey "^1.0.4" + +memize@^2.0.1, memize@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/memize/-/memize-2.1.0.tgz" + integrity sha512-yywVJy8ctVlN5lNPxsep5urnZ6TTclwPEyigM9M3Bi8vseJBOfqNrGWN/r8NzuIt3PovM323W04blJfGQfQSVg== + +meow@^9.0.0: + version "9.0.0" + resolved "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz" + integrity sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ== + 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" + +merge-deep@^3.0.3: + version "3.0.3" + resolved "https://registry.npmjs.org/merge-deep/-/merge-deep-3.0.3.tgz" + integrity sha512-qtmzAS6t6grwEkNrunqTBdn0qKwFgNWvlxUbAV8es9M7Ot1EbyApytCnvE0jALPa46ZpKDUo527kKiaWplmlFA== + dependencies: + arr-union "^3.1.0" + clone-deep "^0.2.4" + kind-of "^3.0.2" + +merge-descriptors@1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz" + integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w== + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +merge2@^1.3.0, merge2@^1.4.1: + version "1.4.1" + resolved "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz" + integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== + +methods@~1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz" + integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w== + +micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.5: + version "4.0.5" + resolved "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz" + integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA== + dependencies: + braces "^3.0.2" + picomatch "^2.3.1" + +mime-db@1.52.0, "mime-db@>= 1.43.0 < 2": + version "1.52.0" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.12, mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.24, mime-types@~2.1.34: + version "2.1.35" + resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mime@1.6.0: + version "1.6.0" + resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz" + integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== + +mimic-fn@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" + integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== + +min-indent@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz" + integrity sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg== + +mini-css-extract-plugin@^2.5.1: + version "2.7.6" + resolved "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.6.tgz" + integrity sha512-Qk7HcgaPkGG6eD77mLvZS1nmxlao3j+9PkrT9Uc7HAE1id3F41+DdBRYRYkbyfNRGzm8/YWtzhw7nVPmwhqTQw== + dependencies: + schema-utils "^4.0.0" + +minimalistic-assert@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz" + integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== + +minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: + version "3.1.2" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" + integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== + dependencies: + brace-expansion "^1.1.7" + +minimatch@~3.0.5: + version "3.0.8" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz" + integrity sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q== + dependencies: + brace-expansion "^1.1.7" + +minimist-options@4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz" + integrity sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A== + dependencies: + arrify "^1.0.1" + is-plain-obj "^1.1.0" + kind-of "^6.0.3" + +minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6, minimist@^1.2.8: + version "1.2.8" + resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz" + integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA== + +mixin-object@^2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/mixin-object/-/mixin-object-2.0.1.tgz" + integrity sha512-ALGF1Jt9ouehcaXaHhn6t1yGWRqGaHkPFndtFVHfZXOvkIZ/yoGaSi0AHVTafb3ZBGg4dr/bDwnaEKqCXzchMA== + dependencies: + for-in "^0.1.3" + is-extendable "^0.1.1" + +mkdirp-classic@^0.5.2: + version "0.5.3" + resolved "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz" + integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A== + +moment-timezone@^0.5.40: + version "0.5.43" + resolved "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.43.tgz" + integrity sha512-72j3aNyuIsDxdF1i7CEgV2FfxM1r6aaqJyLB2vwb33mXYyoyLly+F1zbWqhA3/bVIoJ4szlUoMbUnVdid32NUQ== + dependencies: + moment "^2.29.4" + +moment@^2.29.4: + version "2.29.4" + resolved "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz" + integrity sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w== + +mousetrap@^1.6.5: + version "1.6.5" + resolved "https://registry.npmjs.org/mousetrap/-/mousetrap-1.6.5.tgz" + integrity sha512-QNo4kEepaIBwiT8CDhP98umTetp+JNfQYBWvC1pc6/OAibuXtRcxZ58Qz8skvEHYvURne/7R8T5VoOI7rDsEUA== + +mrmime@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/mrmime/-/mrmime-1.0.1.tgz" + integrity sha512-hzzEagAgDyoU1Q6yg5uI+AorQgdvMCur3FcKf7NhMKWsaYg+RnbTyHRa/9IlLF9rf455MOCtcqqrQQ83pPP7Uw== + +ms@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" + integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== + +ms@2.1.2: + version "2.1.2" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz" + integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== + +ms@2.1.3, ms@^2.1.1: + version "2.1.3" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +multicast-dns@^7.2.5: + version "7.2.5" + resolved "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz" + integrity sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg== + dependencies: + dns-packet "^5.2.2" + thunky "^1.0.2" + +nanoid@^3.3.6: + version "3.3.6" + resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz" + integrity sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA== + +natural-compare-lite@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz" + integrity sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g== + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" + integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== + +negotiator@0.6.3: + version "0.6.3" + resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== + +neo-async@^2.6.2: + version "2.6.2" + resolved "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + +no-case@^3.0.4: + 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-fetch@2.6.7: + version "2.6.7" + resolved "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz" + integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ== + dependencies: + whatwg-url "^5.0.0" + +node-forge@^1: + version "1.3.1" + resolved "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz" + integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA== + +node-int64@^0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz" + integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== + +node-releases@^2.0.13: + version "2.0.13" + resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.13.tgz" + integrity sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ== + +normalize-package-data@^2.5.0: + 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== + dependencies: + hosted-git-info "^2.1.4" + resolve "^1.10.0" + semver "2 || 3 || 4 || 5" + validate-npm-package-license "^3.0.1" + +normalize-package-data@^3.0.0: + version "3.0.3" + resolved "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz" + integrity sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA== + dependencies: + hosted-git-info "^4.0.1" + is-core-module "^2.5.0" + semver "^7.3.4" + validate-npm-package-license "^3.0.1" + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +normalize-range@^0.1.2: + version "0.1.2" + resolved "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz" + integrity sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA== + +normalize-wheel@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/normalize-wheel/-/normalize-wheel-1.0.1.tgz#aec886affdb045070d856447df62ecf86146ec45" + integrity sha512-1OnlAPZ3zgrk8B91HyRj+eVv+kS5u+Z0SCsak6Xil/kmgEia50ga7zfkumayonZrImffAxPU/5WcyGhzetHNPA== + +npm-bundled@^1.1.1: + version "1.1.2" + resolved "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.2.tgz" + integrity sha512-x5DHup0SuyQcmL3s7Rx/YQ8sbw/Hzg0rj48eN0dV7hf5cmQq5PXIeioroH3raV1QC1yh3uTYuMThvEQF3iKgGQ== + dependencies: + npm-normalize-package-bin "^1.0.1" + +npm-normalize-package-bin@^1.0.1: + 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== + +npm-package-json-lint@^6.4.0: + 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== + 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" + +npm-packlist@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/npm-packlist/-/npm-packlist-3.0.0.tgz" + integrity sha512-L/cbzmutAwII5glUcf2DBRNY/d0TFd4e/FnaZigJV6JD85RHZXJFGwCndjMWiiViiWSsWt3tiOLpI3ByTnIdFQ== + dependencies: + glob "^7.1.6" + ignore-walk "^4.0.1" + npm-bundled "^1.1.1" + npm-normalize-package-bin "^1.0.1" + +npm-run-path@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz" + integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw== + dependencies: + path-key "^3.0.0" + +nth-check@^2.0.1: + 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== + dependencies: + boolbase "^1.0.0" + +nwsapi@^2.2.2: + version "2.2.7" + resolved "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz" + integrity sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ== + +object-assign@^4.0.1, object-assign@^4.1.1: + version "4.1.1" + resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz" + integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg== + +object-filter@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/object-filter/-/object-filter-1.0.2.tgz" + integrity sha512-NahvP2vZcy1ZiiYah30CEPw0FpDcSkSePJBMpzl5EQgCmISijiGuJm3SPYp7U+Lf2TljyaIw3E5EgkEx/TNEVA== + +object-inspect@^1.12.3, object-inspect@^1.9.0: + version "1.12.3" + resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz" + integrity sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g== + +object-keys@^1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz" + integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== + +object.assign@^4.1.4: + version "4.1.4" + resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz" + integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + has-symbols "^1.0.3" + object-keys "^1.1.1" + +object.entries@^1.1.6: + version "1.1.7" + resolved "https://registry.npmjs.org/object.entries/-/object.entries-1.1.7.tgz" + integrity sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + +object.fromentries@^2.0.6: + version "2.0.7" + resolved "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz" + integrity sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + +object.groupby@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz" + integrity sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + get-intrinsic "^1.2.1" + +object.hasown@^1.1.2: + version "1.1.3" + resolved "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.3.tgz" + integrity sha512-fFI4VcYpRHvSLXxP7yiZOMAd331cPfd2p7PFDVbgUsYOfCT3tICVqXWngbjr4m49OvsBwUBQ6O2uQoJvy3RexA== + dependencies: + define-properties "^1.2.0" + es-abstract "^1.22.1" + +object.values@^1.1.6: + version "1.1.7" + resolved "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz" + integrity sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + +obuf@^1.0.0, obuf@^1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz" + integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg== + +on-finished@2.4.1: + version "2.4.1" + resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== + dependencies: + ee-first "1.1.1" + +on-headers@~1.0.2: + 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== + +once@^1.3.0, once@^1.3.1, once@^1.4.0: + version "1.4.0" + resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz" + integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w== + dependencies: + wrappy "1" + +onetime@^5.1.2: + version "5.1.2" + resolved "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz" + integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== + dependencies: + mimic-fn "^2.1.0" + +open@^8.0.9: + version "8.4.2" + resolved "https://registry.npmjs.org/open/-/open-8.4.2.tgz" + integrity sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ== + dependencies: + define-lazy-prop "^2.0.0" + is-docker "^2.1.1" + is-wsl "^2.2.0" + +opener@^1.5.2: + version "1.5.2" + resolved "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz" + integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== + +optionator@^0.9.3: + version "0.9.3" + resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz" + integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== + dependencies: + "@aashutoshrathi/word-wrap" "^1.2.3" + deep-is "^0.1.3" + fast-levenshtein "^2.0.6" + levn "^0.4.1" + prelude-ls "^1.2.1" + type-check "^0.4.0" + +os-homedir@^1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz" + integrity sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ== + +p-limit@^2.0.0, p-limit@^2.2.0: + 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" + +p-limit@^3.0.2, p-limit@^3.1.0: + version "3.1.0" + resolved "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz" + integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ== + dependencies: + yocto-queue "^0.1.0" + +p-locate@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz#322d69a05c0264b25997d9f40cd8a891ab0064a4" + integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ== + dependencies: + p-limit "^2.0.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-locate@^5.0.0: + 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== + dependencies: + p-limit "^3.0.2" + +p-map@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz" + integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw== + +p-retry@^4.5.0: + version "4.6.2" + resolved "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz" + integrity sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ== + dependencies: + "@types/retry" "0.12.0" + retry "^0.13.1" + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +param-case@^3.0.4: + 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" + +parent-module@^1.0.0: + 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" + +parse-json@^5.0.0, parse-json@^5.2.0: + 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" + +parse-passwd@^1.0.0: + 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== + +parse5@^7.0.0, parse5@^7.1.1: + version "7.1.2" + resolved "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz" + integrity sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw== + dependencies: + entities "^4.4.0" + +parseurl@~1.3.2, parseurl@~1.3.3: + version "1.3.3" + resolved "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz" + integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== + +pascal-case@^3.1.2: + 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" + +path-case@^3.0.4: + 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" + +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ== + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-is-absolute@^1.0.0: + version "1.0.1" + resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg== + +path-is-inside@^1.0.2: + 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== + +path-key@^3.0.0, path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +path-to-regexp@0.1.7: + version "0.1.7" + resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz" + integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== + +path-to-regexp@^6.2.1: + version "6.2.1" + resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.1.tgz" + integrity sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw== + +path-type@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz" + integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== + +pend@~1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz" + integrity sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg== + +picocolors@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz" + integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1: + version "2.3.1" + resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pify@^2.0.0: + version "2.3.0" + resolved "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz" + integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== + +pify@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz" + integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== + +pinkie-promise@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz" + integrity sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw== + dependencies: + pinkie "^2.0.0" + +pinkie@^2.0.0: + version "2.0.4" + resolved "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz" + integrity sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg== + +pirates@^4.0.4: + version "4.0.6" + resolved "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz" + integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== + +pkg-dir@4.2.0, pkg-dir@^4.1.0, pkg-dir@^4.2.0: + 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== + dependencies: + find-up "^4.0.0" + +plur@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/plur/-/plur-4.0.0.tgz" + integrity sha512-4UGewrYgqDFw9vV6zNV+ADmPAUAfJPKtGvb/VdpQAx25X5f3xXdGdyOEVFwkl8Hl/tl7+xbeHqSEM+D5/TirUg== + dependencies: + irregular-plurals "^3.2.0" + +postcss-calc@^9.0.0: + version "9.0.1" + resolved "https://registry.npmjs.org/postcss-calc/-/postcss-calc-9.0.1.tgz" + integrity sha512-TipgjGyzP5QzEhsOZUaIkeO5mKeMFpebWzRogWG/ysonUlnHcq5aJe0jOjpfzUU8PeSaBQnrE8ehR0QA5vs8PQ== + dependencies: + postcss-selector-parser "^6.0.11" + postcss-value-parser "^4.2.0" + +postcss-colormin@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-6.0.0.tgz" + integrity sha512-EuO+bAUmutWoZYgHn2T1dG1pPqHU6L4TjzPlu4t1wZGXQ/fxV16xg2EJmYi0z+6r+MGV1yvpx1BHkUaRrPa2bw== + dependencies: + browserslist "^4.21.4" + caniuse-api "^3.0.0" + colord "^2.9.1" + postcss-value-parser "^4.2.0" + +postcss-convert-values@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-6.0.0.tgz" + integrity sha512-U5D8QhVwqT++ecmy8rnTb+RL9n/B806UVaS3m60lqle4YDFcpbS3ae5bTQIh3wOGUSDHSEtMYLs/38dNG7EYFw== + dependencies: + browserslist "^4.21.4" + postcss-value-parser "^4.2.0" + +postcss-discard-comments@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-6.0.0.tgz" + integrity sha512-p2skSGqzPMZkEQvJsgnkBhCn8gI7NzRH2683EEjrIkoMiwRELx68yoUJ3q3DGSGuQ8Ug9Gsn+OuDr46yfO+eFw== + +postcss-discard-duplicates@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-6.0.0.tgz" + integrity sha512-bU1SXIizMLtDW4oSsi5C/xHKbhLlhek/0/yCnoMQany9k3nPBq+Ctsv/9oMmyqbR96HYHxZcHyK2HR5P/mqoGA== + +postcss-discard-empty@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-6.0.0.tgz" + integrity sha512-b+h1S1VT6dNhpcg+LpyiUrdnEZfICF0my7HAKgJixJLW7BnNmpRH34+uw/etf5AhOlIhIAuXApSzzDzMI9K/gQ== + +postcss-discard-overridden@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-6.0.0.tgz" + integrity sha512-4VELwssYXDFigPYAZ8vL4yX4mUepF/oCBeeIT4OXsJPYOtvJumyz9WflmJWTfDwCUcpDR+z0zvCWBXgTx35SVw== + +postcss-loader@^6.2.1: + version "6.2.1" + resolved "https://registry.npmjs.org/postcss-loader/-/postcss-loader-6.2.1.tgz" + integrity sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q== + dependencies: + cosmiconfig "^7.0.0" + klona "^2.0.5" + semver "^7.3.5" + +postcss-media-query-parser@^0.2.3: + version "0.2.3" + resolved "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz" + integrity sha512-3sOlxmbKcSHMjlUXQZKQ06jOswE7oVkXPxmZdoB1r5l0q6gTFTQSHxNxOrCccElbW7dxNytifNEo8qidX2Vsig== + +postcss-merge-longhand@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-6.0.0.tgz" + integrity sha512-4VSfd1lvGkLTLYcxFuISDtWUfFS4zXe0FpF149AyziftPFQIWxjvFSKhA4MIxMe4XM3yTDgQMbSNgzIVxChbIg== + dependencies: + postcss-value-parser "^4.2.0" + stylehacks "^6.0.0" + +postcss-merge-rules@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-6.0.1.tgz" + integrity sha512-a4tlmJIQo9SCjcfiCcCMg/ZCEe0XTkl/xK0XHBs955GWg9xDX3NwP9pwZ78QUOWB8/0XCjZeJn98Dae0zg6AAw== + dependencies: + browserslist "^4.21.4" + caniuse-api "^3.0.0" + cssnano-utils "^4.0.0" + postcss-selector-parser "^6.0.5" + +postcss-minify-font-values@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-6.0.0.tgz" + integrity sha512-zNRAVtyh5E8ndZEYXA4WS8ZYsAp798HiIQ1V2UF/C/munLp2r1UGHwf1+6JFu7hdEhJFN+W1WJQKBrtjhFgEnA== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-minify-gradients@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-6.0.0.tgz" + integrity sha512-wO0F6YfVAR+K1xVxF53ueZJza3L+R3E6cp0VwuXJQejnNUH0DjcAFe3JEBeTY1dLwGa0NlDWueCA1VlEfiKgAA== + dependencies: + colord "^2.9.1" + cssnano-utils "^4.0.0" + postcss-value-parser "^4.2.0" + +postcss-minify-params@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-6.0.0.tgz" + integrity sha512-Fz/wMQDveiS0n5JPcvsMeyNXOIMrwF88n7196puSuQSWSa+/Ofc1gDOSY2xi8+A4PqB5dlYCKk/WfqKqsI+ReQ== + dependencies: + browserslist "^4.21.4" + cssnano-utils "^4.0.0" + postcss-value-parser "^4.2.0" + +postcss-minify-selectors@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-6.0.0.tgz" + integrity sha512-ec/q9JNCOC2CRDNnypipGfOhbYPuUkewGwLnbv6omue/PSASbHSU7s6uSQ0tcFRVv731oMIx8k0SP4ZX6be/0g== + dependencies: + postcss-selector-parser "^6.0.5" + +postcss-modules-extract-imports@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz" + integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== + +postcss-modules-local-by-default@^4.0.3: + version "4.0.3" + resolved "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz" + integrity sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA== + dependencies: + icss-utils "^5.0.0" + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.1.0" + +postcss-modules-scope@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz" + integrity sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg== + dependencies: + postcss-selector-parser "^6.0.4" + +postcss-modules-values@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz" + integrity sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ== + dependencies: + icss-utils "^5.0.0" + +postcss-normalize-charset@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-6.0.0.tgz" + integrity sha512-cqundwChbu8yO/gSWkuFDmKrCZ2vJzDAocheT2JTd0sFNA4HMGoKMfbk2B+J0OmO0t5GUkiAkSM5yF2rSLUjgQ== + +postcss-normalize-display-values@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-6.0.0.tgz" + integrity sha512-Qyt5kMrvy7dJRO3OjF7zkotGfuYALETZE+4lk66sziWSPzlBEt7FrUshV6VLECkI4EN8Z863O6Nci4NXQGNzYw== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize-positions@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-6.0.0.tgz" + integrity sha512-mPCzhSV8+30FZyWhxi6UoVRYd3ZBJgTRly4hOkaSifo0H+pjDYcii/aVT4YE6QpOil15a5uiv6ftnY3rm0igPg== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize-repeat-style@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-6.0.0.tgz" + integrity sha512-50W5JWEBiOOAez2AKBh4kRFm2uhrT3O1Uwdxz7k24aKtbD83vqmcVG7zoIwo6xI2FZ/HDlbrCopXhLeTpQib1A== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize-string@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-6.0.0.tgz" + integrity sha512-KWkIB7TrPOiqb8ZZz6homet2KWKJwIlysF5ICPZrXAylGe2hzX/HSf4NTX2rRPJMAtlRsj/yfkrWGavFuB+c0w== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize-timing-functions@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-6.0.0.tgz" + integrity sha512-tpIXWciXBp5CiFs8sem90IWlw76FV4oi6QEWfQwyeREVwUy39VSeSqjAT7X0Qw650yAimYW5gkl2Gd871N5SQg== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize-unicode@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-6.0.0.tgz" + integrity sha512-ui5crYkb5ubEUDugDc786L/Me+DXp2dLg3fVJbqyAl0VPkAeALyAijF2zOsnZyaS1HyfPuMH0DwyY18VMFVNkg== + dependencies: + browserslist "^4.21.4" + postcss-value-parser "^4.2.0" + +postcss-normalize-url@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-6.0.0.tgz" + integrity sha512-98mvh2QzIPbb02YDIrYvAg4OUzGH7s1ZgHlD3fIdTHLgPLRpv1ZTKJDnSAKr4Rt21ZQFzwhGMXxpXlfrUBKFHw== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize-whitespace@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-6.0.0.tgz" + integrity sha512-7cfE1AyLiK0+ZBG6FmLziJzqQCpTQY+8XjMhMAz8WSBSCsCNNUKujgIgjCAmDT3cJ+3zjTXFkoD15ZPsckArVw== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-ordered-values@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-6.0.0.tgz" + integrity sha512-K36XzUDpvfG/nWkjs6d1hRBydeIxGpKS2+n+ywlKPzx1nMYDYpoGbcjhj5AwVYJK1qV2/SDoDEnHzlPD6s3nMg== + dependencies: + cssnano-utils "^4.0.0" + postcss-value-parser "^4.2.0" + +postcss-reduce-initial@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-6.0.0.tgz" + integrity sha512-s2UOnidpVuXu6JiiI5U+fV2jamAw5YNA9Fdi/GRK0zLDLCfXmSGqQtzpUPtfN66RtCbb9fFHoyZdQaxOB3WxVA== + dependencies: + browserslist "^4.21.4" + caniuse-api "^3.0.0" + +postcss-reduce-transforms@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-6.0.0.tgz" + integrity sha512-FQ9f6xM1homnuy1wLe9lP1wujzxnwt1EwiigtWwuyf8FsqqXUDUp2Ulxf9A5yjlUOTdCJO6lonYjg1mgqIIi2w== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-resolve-nested-selector@^0.1.1: + version "0.1.1" + resolved "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz" + integrity sha512-HvExULSwLqHLgUy1rl3ANIqCsvMS0WHss2UOsXhXnQaZ9VCc2oBvIpXrl00IUFT5ZDITME0o6oiXeiHr2SAIfw== + +postcss-safe-parser@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz" + integrity sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ== + +postcss-scss@^4.0.2: + version "4.0.7" + resolved "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.7.tgz" + integrity sha512-xPv2GseoyXPa58Nro7M73ZntttusuCmZdeOojUFR5PZDz2BR62vfYx1w9TyOnp1+nYFowgOMipsCBhxzVkAEPw== + +postcss-selector-parser@^6.0.11, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.5: + version "6.0.13" + resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz" + integrity sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" + +postcss-svgo@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-6.0.0.tgz" + integrity sha512-r9zvj/wGAoAIodn84dR/kFqwhINp5YsJkLoujybWG59grR/IHx+uQ2Zo+IcOwM0jskfYX3R0mo+1Kip1VSNcvw== + dependencies: + postcss-value-parser "^4.2.0" + svgo "^3.0.2" + +postcss-unique-selectors@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-6.0.0.tgz" + integrity sha512-EPQzpZNxOxP7777t73RQpZE5e9TrnCrkvp7AH7a0l89JmZiPnS82y216JowHXwpBCQitfyxrof9TK3rYbi7/Yw== + dependencies: + postcss-selector-parser "^6.0.5" + +postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz" + integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== + +postcss@^8.4.19, postcss@^8.4.21, postcss@^8.4.5: + version "8.4.29" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.29.tgz" + integrity sha512-cbI+jaqIeu/VGqXEarWkRCCffhjgXc0qjBtXpqJhTBohMUjUQnbBr0xqX3vEKudc4iviTewcJo5ajcec5+wdJw== + dependencies: + nanoid "^3.3.6" + picocolors "^1.0.0" + source-map-js "^1.0.2" + +prelude-ls@^1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" + integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== + +prettier-linter-helpers@^1.0.0: + 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== + dependencies: + fast-diff "^1.1.2" + +"prettier@npm:wp-prettier@2.8.5": + version "2.8.5" + resolved "https://registry.npmjs.org/wp-prettier/-/wp-prettier-2.8.5.tgz" + integrity sha512-gkphzYtVksWV6D7/V530bTehKkhrABUru/Gy4reOLOHJoKH4i9lcE1SxqU2VDxC3gCOx/Nk9alZmWk6xL/IBCw== + +pretty-format@^29.6.3: + version "29.6.3" + resolved "https://registry.npmjs.org/pretty-format/-/pretty-format-29.6.3.tgz" + integrity sha512-ZsBgjVhFAj5KeK+nHfF1305/By3lechHQSMWCTl8iHSbfOm2TN5nHEtFc/+W7fAyUeCs2n5iow72gld4gW0xDw== + dependencies: + "@jest/schemas" "^29.6.3" + ansi-styles "^5.0.0" + react-is "^18.0.0" + +process-nextick-args@~2.0.0: + 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== + +progress@2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz" + integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA== + +prompts@^2.0.1, prompts@^2.4.2: + version "2.4.2" + resolved "https://registry.npmjs.org/prompts/-/prompts-2.4.2.tgz" + integrity sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q== + dependencies: + kleur "^3.0.3" + sisteransi "^1.0.5" + +prop-types@^15.5.6, prop-types@^15.7.2, prop-types@^15.8.1: + 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" + +proxy-addr@~2.0.7: + 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== + dependencies: + forwarded "0.2.0" + ipaddr.js "1.9.1" + +proxy-compare@2.3.0: + version "2.3.0" + resolved "https://registry.npmjs.org/proxy-compare/-/proxy-compare-2.3.0.tgz" + integrity sha512-c3L2CcAi7f7pvlD0D7xsF+2CQIW8C3HaYx2Pfgq8eA4HAl3GAH6/dVYsyBbYF/0XJs2ziGLrzmz5fmzPm6A0pQ== + +proxy-from-env@1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== + +pseudomap@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz" + integrity sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ== + +psl@^1.1.33: + version "1.9.0" + resolved "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz" + integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag== + +pump@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz" + integrity sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww== + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + +punycode@^2.1.0, punycode@^2.1.1: + version "2.3.0" + resolved "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz" + integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA== + +puppeteer-core@^13.2.0: + version "13.7.0" + resolved "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-13.7.0.tgz" + integrity sha512-rXja4vcnAzFAP1OVLq/5dWNfwBGuzcOARJ6qGV7oAZhnLmVRU8G5MsdeQEAOy332ZhkIOnn9jp15R89LKHyp2Q== + dependencies: + cross-fetch "3.1.5" + debug "4.3.4" + devtools-protocol "0.0.981744" + extract-zip "2.0.1" + https-proxy-agent "5.0.1" + pkg-dir "4.2.0" + progress "2.0.3" + proxy-from-env "1.1.0" + rimraf "3.0.2" + tar-fs "2.1.1" + unbzip2-stream "1.4.3" + ws "8.5.0" + +pure-rand@^6.0.0: + version "6.0.3" + resolved "https://registry.npmjs.org/pure-rand/-/pure-rand-6.0.3.tgz" + integrity sha512-KddyFewCsO0j3+np81IQ+SweXLDnDQTs5s67BOnrYmYe/yNmUhttQyGsYzy8yUnoljGAQ9sl38YB4vH8ur7Y+w== + +qs@6.11.0: + version "6.11.0" + resolved "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz" + integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== + dependencies: + side-channel "^1.0.4" + +querystringify@^2.1.1: + version "2.2.0" + resolved "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz" + integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ== + +queue-microtask@^1.2.2, queue-microtask@^1.2.3: + version "1.2.3" + resolved "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz" + integrity sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A== + +quick-lru@^4.0.1: + version "4.0.1" + resolved "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz" + integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g== + +randombytes@^2.1.0: + 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" + +range-parser@^1.2.1, range-parser@~1.2.1: + version "1.2.1" + resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz" + integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== + +raw-body@2.5.1: + version "2.5.1" + resolved "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz" + integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== + dependencies: + bytes "3.1.2" + http-errors "2.0.0" + iconv-lite "0.4.24" + unpipe "1.0.0" + +re-resizable@^6.4.0: + version "6.9.11" + resolved "https://registry.npmjs.org/re-resizable/-/re-resizable-6.9.11.tgz" + integrity sha512-a3hiLWck/NkmyLvGWUuvkAmN1VhwAz4yOhS6FdMTaxCUVN9joIWkT11wsO68coG/iEYuwn+p/7qAmfQzRhiPLQ== + +react-autosize-textarea@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/react-autosize-textarea/-/react-autosize-textarea-7.1.0.tgz#902c84fc395a689ca3a484dfb6bc2be9ba3694d1" + integrity sha512-BHpjCDkuOlllZn3nLazY2F8oYO1tS2jHnWhcjTWQdcKiiMU6gHLNt/fzmqMSyerR0eTdKtfSIqtSeTtghNwS+g== + dependencies: + autosize "^4.0.2" + line-height "^0.3.1" + prop-types "^15.5.6" + +react-colorful@^5.3.1: + version "5.6.1" + resolved "https://registry.npmjs.org/react-colorful/-/react-colorful-5.6.1.tgz" + integrity sha512-1exovf0uGTGyq5mXQT0zgQ80uvj2PCwvF8zY1RN9/vbJVSjSo3fsB/4L3ObbF7u70NduSiK4xu4Y6q1MHoUGEw== + +react-dom@^18.2.0: + version "18.2.0" + resolved "https://registry.npmjs.org/react-dom/-/react-dom-18.2.0.tgz" + integrity sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g== + dependencies: + loose-envify "^1.1.0" + scheduler "^0.23.0" + +react-easy-crop@^4.5.1: + version "4.7.5" + resolved "https://registry.yarnpkg.com/react-easy-crop/-/react-easy-crop-4.7.5.tgz#1526827fc83e38b079372310f983bc0517ba6442" + integrity sha512-qKfI4PuhaH1jOLC3DQfQB0cE0z+3N7bfyPkPejQmylXNb8nstfPMH+oHj3gKgpBHLFUiQp/C1rY7sVCVgtjn3Q== + dependencies: + normalize-wheel "^1.0.1" + tslib "2.0.1" + +react-is@^16.13.1, react-is@^16.7.0: + version "16.13.1" + resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" + integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== + +react-is@^17.0.2: + version "17.0.2" + resolved "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz" + integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== + +react-is@^18.0.0: + version "18.2.0" + resolved "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz" + integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== + +react-refresh@^0.10.0: + version "0.10.0" + resolved "https://registry.npmjs.org/react-refresh/-/react-refresh-0.10.0.tgz" + integrity sha512-PgidR3wST3dDYKr6b4pJoqQFpPGNKDSCDx4cZoshjXipw3LzO7mG1My2pwEzz2JVkF+inx3xRpDeQLFQGH/hsQ== + +react-remove-scroll-bar@^2.3.3: + version "2.3.4" + resolved "https://registry.npmjs.org/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.4.tgz" + integrity sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A== + dependencies: + react-style-singleton "^2.2.1" + tslib "^2.0.0" + +react-remove-scroll@2.5.4: + version "2.5.4" + resolved "https://registry.yarnpkg.com/react-remove-scroll/-/react-remove-scroll-2.5.4.tgz#afe6491acabde26f628f844b67647645488d2ea0" + integrity sha512-xGVKJJr0SJGQVirVFAUZ2k1QLyO6m+2fy0l8Qawbp5Jgrv3DeLalrfMNBFSlmz5kriGGzsVBtGVnf4pTKIhhWA== + dependencies: + react-remove-scroll-bar "^2.3.3" + react-style-singleton "^2.2.1" + tslib "^2.1.0" + use-callback-ref "^1.3.0" + use-sidecar "^1.1.2" + +react-remove-scroll@2.5.5: + version "2.5.5" + resolved "https://registry.npmjs.org/react-remove-scroll/-/react-remove-scroll-2.5.5.tgz" + integrity sha512-ImKhrzJJsyXJfBZ4bzu8Bwpka14c/fQt0k+cyFp/PBhTfyDnU5hjOtM4AG/0AMyy8oKzOTR0lDgJIM7pYXI0kw== + dependencies: + react-remove-scroll-bar "^2.3.3" + react-style-singleton "^2.2.1" + tslib "^2.1.0" + use-callback-ref "^1.3.0" + use-sidecar "^1.1.2" + +react-style-singleton@^2.2.1: + 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" + +react@^18.2.0: + version "18.2.0" + resolved "https://registry.npmjs.org/react/-/react-18.2.0.tgz" + integrity sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ== + dependencies: + loose-envify "^1.1.0" + +read-pkg-up@^7.0.1: + 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== + dependencies: + find-up "^4.1.0" + read-pkg "^5.2.0" + type-fest "^0.8.1" + +read-pkg@^5.2.0: + version "5.2.0" + resolved "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz" + integrity sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg== + dependencies: + "@types/normalize-package-data" "^2.4.0" + normalize-package-data "^2.5.0" + parse-json "^5.0.0" + type-fest "^0.6.0" + +readable-stream@^2.0.1: + version "2.3.8" + resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz" + integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== + 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" + +readable-stream@^3.0.6, readable-stream@^3.1.1, readable-stream@^3.4.0, readable-stream@^3.6.0: + 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" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +reakit-system@^0.15.2: + version "0.15.2" + resolved "https://registry.npmjs.org/reakit-system/-/reakit-system-0.15.2.tgz" + integrity sha512-TvRthEz0DmD0rcJkGamMYx+bATwnGNWJpe/lc8UV2Js8nnPvkaxrHk5fX9cVASFrWbaIyegZHCWUBfxr30bmmA== + dependencies: + reakit-utils "^0.15.2" + +reakit-utils@^0.15.2: + version "0.15.2" + resolved "https://registry.npmjs.org/reakit-utils/-/reakit-utils-0.15.2.tgz" + integrity sha512-i/RYkq+W6hvfFmXw5QW7zvfJJT/K8a4qZ0hjA79T61JAFPGt23DsfxwyBbyK91GZrJ9HMrXFVXWMovsKBc1qEQ== + +reakit-warning@^0.6.2: + version "0.6.2" + resolved "https://registry.npmjs.org/reakit-warning/-/reakit-warning-0.6.2.tgz" + integrity sha512-z/3fvuc46DJyD3nJAUOto6inz2EbSQTjvI/KBQDqxwB0y02HDyeP8IWOJxvkuAUGkWpeSx+H3QWQFSNiPcHtmw== + dependencies: + reakit-utils "^0.15.2" + +reakit@^1.3.11: + version "1.3.11" + resolved "https://registry.npmjs.org/reakit/-/reakit-1.3.11.tgz" + integrity sha512-mYxw2z0fsJNOQKAEn5FJCPTU3rcrY33YZ/HzoWqZX0G7FwySp1wkCYW79WhuYMNIUFQ8s3Baob1RtsEywmZSig== + dependencies: + "@popperjs/core" "^2.5.4" + body-scroll-lock "^3.1.5" + reakit-system "^0.15.2" + reakit-utils "^0.15.2" + reakit-warning "^0.6.2" + +rechoir@^0.7.0: + version "0.7.1" + resolved "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz" + integrity sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg== + dependencies: + resolve "^1.9.0" + +redent@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz" + integrity sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg== + dependencies: + indent-string "^4.0.0" + strip-indent "^3.0.0" + +redux@^4.1.2: + 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" + +reflect.getprototypeof@^1.0.3: + version "1.0.4" + resolved "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.4.tgz" + integrity sha512-ECkTw8TmJwW60lOTR+ZkODISW6RQ8+2CL3COqtiJKLd6MmB45hN51HprHFziKLGkAuTGQhBb91V8cy+KHlaCjw== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + get-intrinsic "^1.2.1" + globalthis "^1.0.3" + which-builtin-type "^1.1.3" + +regenerate-unicode-properties@^10.1.0: + version "10.1.0" + resolved "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz" + integrity sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ== + dependencies: + regenerate "^1.4.2" + +regenerate@^1.4.2: + version "1.4.2" + resolved "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz" + integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== + +regenerator-runtime@^0.14.0: + version "0.14.0" + resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz" + integrity sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA== + +regenerator-transform@^0.15.2: + version "0.15.2" + resolved "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz" + integrity sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg== + dependencies: + "@babel/runtime" "^7.8.4" + +regexp.prototype.flags@^1.5.0: + version "1.5.0" + resolved "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz" + integrity sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + functions-have-names "^1.2.3" + +regexpu-core@^5.3.1: + version "5.3.2" + resolved "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.3.2.tgz" + integrity sha512-RAM5FlZz+Lhmo7db9L298p2vHP5ZywrVXmVXpmAD9GuL5MPH6t9ROw1iA/wfHkQ76Qe7AaPF0nGuim96/IrQMQ== + dependencies: + "@babel/regjsgen" "^0.8.0" + regenerate "^1.4.2" + regenerate-unicode-properties "^10.1.0" + regjsparser "^0.9.1" + unicode-match-property-ecmascript "^2.0.0" + unicode-match-property-value-ecmascript "^2.1.0" + +regjsparser@^0.9.1: + version "0.9.1" + resolved "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz" + integrity sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ== + dependencies: + jsesc "~0.5.0" + +rememo@^4.0.2: + version "4.0.2" + resolved "https://registry.npmjs.org/rememo/-/rememo-4.0.2.tgz" + integrity sha512-NVfSP9NstE3QPNs/TnegQY0vnJnstKQSpcrsI2kBTB3dB2PkdfKdTa+abbjMIDqpc63fE5LfjLgfMst0ULMFxQ== + +remove-accents@^0.5.0: + 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== + +requestidlecallback@^0.3.0: + version "0.3.0" + resolved "https://registry.npmjs.org/requestidlecallback/-/requestidlecallback-0.3.0.tgz" + integrity sha512-TWHFkT7S9p7IxLC5A1hYmAYQx2Eb9w1skrXmQ+dS1URyvR8tenMLl4lHbqEOUnpEYxNKpkVMXUgknVpBZWXXfQ== + +require-directory@^2.1.1: + 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== + +require-from-string@^2.0.2: + 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== + +require-main-filename@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" + integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== + +requireindex@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/requireindex/-/requireindex-1.2.0.tgz" + integrity sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww== + +requires-port@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz" + integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ== + +resolve-bin@^0.4.0: + version "0.4.3" + resolved "https://registry.npmjs.org/resolve-bin/-/resolve-bin-0.4.3.tgz" + integrity sha512-9u8TMpc+SEHXxQXblXHz5yRvRZERkCZimFN9oz85QI3uhkh7nqfjm6OGTLg+8vucpXGcY4jLK6WkylPmt7GSvw== + dependencies: + find-parent-dir "~0.3.0" + +resolve-cwd@^3.0.0: + 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== + dependencies: + resolve-from "^5.0.0" + +resolve-dir@^0.1.0: + version "0.1.1" + resolved "https://registry.npmjs.org/resolve-dir/-/resolve-dir-0.1.1.tgz" + integrity sha512-QxMPqI6le2u0dCLyiGzgy92kjkkL6zO0XyvHzjdTNH3zM6e5Hz3BwG6+aEyNgiQ5Xz6PwTwgQEj3U50dByPKIA== + dependencies: + expand-tilde "^1.2.2" + global-modules "^0.2.3" + +resolve-from@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz" + integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== + +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +resolve.exports@^2.0.0: + version "2.0.2" + resolved "https://registry.npmjs.org/resolve.exports/-/resolve.exports-2.0.2.tgz" + integrity sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg== + +resolve@^1.10.0, resolve@^1.14.2, resolve@^1.19.0, resolve@^1.20.0, resolve@^1.22.4, resolve@^1.9.0: + version "1.22.4" + resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.4.tgz" + integrity sha512-PXNdCiPqDqeUou+w1C2eTQbNfxKSuMxqTCuvlmmMsk1NWHL5fRrhY6Pl0qEYYc6+QqGClco1Qj8XnjPego4wfg== + dependencies: + is-core-module "^2.13.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +resolve@^2.0.0-next.4: + version "2.0.0-next.4" + resolved "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz" + integrity sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ== + dependencies: + is-core-module "^2.9.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +retry@^0.13.1: + version "0.13.1" + resolved "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz" + integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg== + +reusify@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz" + integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== + +rimraf@3.0.2, rimraf@^3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz" + integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA== + dependencies: + glob "^7.1.3" + +rimraf@^2.6.3: + version "2.7.1" + resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz" + integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w== + dependencies: + glob "^7.1.3" + +run-con@~1.2.10: + version "1.2.12" + resolved "https://registry.npmjs.org/run-con/-/run-con-1.2.12.tgz" + integrity sha512-5257ILMYIF4RztL9uoZ7V9Q97zHtNHn5bN3NobeAnzB1P3ASLgg8qocM2u+R18ttp+VEM78N2LK8XcNVtnSRrg== + dependencies: + deep-extend "^0.6.0" + ini "~3.0.0" + minimist "^1.2.8" + strip-json-comments "~3.1.1" + +run-parallel@^1.1.4, run-parallel@^1.1.9: + version "1.2.0" + resolved "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz" + integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== + dependencies: + queue-microtask "^1.2.2" + +rungen@^0.3.2: + version "0.3.2" + resolved "https://registry.npmjs.org/rungen/-/rungen-0.3.2.tgz" + integrity sha512-zWl10xu2D7zoR8zSC2U6bg5bYF6T/Wk7rxwp8IPaJH7f0Ge21G03kNHVgHR7tyVkSSfAOG0Rqf/Cl38JftSmtw== + +rxjs@^7.5.4: + version "7.8.1" + resolved "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz" + integrity sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg== + dependencies: + tslib "^2.1.0" + +safe-array-concat@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.0.tgz" + integrity sha512-9dVEFruWIsnie89yym+xWTAYASdpw3CJV7Li/6zBewGf9z2i1j31rP6jnY0pHEO4QZh6N0K11bFjWmdR8UGdPQ== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.0" + has-symbols "^1.0.3" + isarray "^2.0.5" + +safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz" + integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== + +safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@~5.2.0: + version "5.2.1" + resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +safe-regex-test@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz" + integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.1.3" + is-regex "^1.1.4" + +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": + version "2.1.2" + resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" + integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== + +sass-loader@^12.1.0: + version "12.6.0" + resolved "https://registry.npmjs.org/sass-loader/-/sass-loader-12.6.0.tgz" + integrity sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA== + dependencies: + klona "^2.0.4" + neo-async "^2.6.2" + +sass@^1.35.2: + version "1.66.1" + resolved "https://registry.npmjs.org/sass/-/sass-1.66.1.tgz" + integrity sha512-50c+zTsZOJVgFfTgwwEzkjA3/QACgdNsKueWPyAR0mRINIvLAStVQBbPg14iuqEQ74NPDbXzJARJ/O4SI1zftA== + dependencies: + chokidar ">=3.0.0 <4.0.0" + immutable "^4.0.0" + source-map-js ">=0.6.2 <2.0.0" + +saxes@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/saxes/-/saxes-6.0.0.tgz" + integrity sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA== + dependencies: + xmlchars "^2.2.0" + +scheduler@^0.23.0: + version "0.23.0" + resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz" + integrity sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw== + dependencies: + loose-envify "^1.1.0" + +schema-utils@^2.6.5: + version "2.7.1" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz" + integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg== + dependencies: + "@types/json-schema" "^7.0.5" + ajv "^6.12.4" + ajv-keywords "^3.5.2" + +schema-utils@^3.0.0, schema-utils@^3.1.1, schema-utils@^3.2.0: + 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== + dependencies: + "@types/json-schema" "^7.0.8" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + +schema-utils@^4.0.0: + version "4.2.0" + resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-4.2.0.tgz" + integrity sha512-L0jRsrPpjdckP3oPug3/VxNKt2trR8TcabrM6FOAAlvC/9Phcmm+cuAgTlxBqdBR1WJx7Naj9WHw+aOmheSVbw== + dependencies: + "@types/json-schema" "^7.0.9" + ajv "^8.9.0" + ajv-formats "^2.1.1" + ajv-keywords "^5.1.0" + +select-hose@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz" + integrity sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg== + +select@^1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/select/-/select-1.1.2.tgz" + integrity sha512-OwpTSOfy6xSs1+pwcNrv0RBMOzI39Lp3qQKUTPVVPRjCdNa5JH/oPRiqsesIskK8TVgmRiHwO4KXlV2Li9dANA== + +selfsigned@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/selfsigned/-/selfsigned-2.1.1.tgz" + integrity sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ== + dependencies: + node-forge "^1" + +"semver@2 || 3 || 4 || 5": + version "5.7.2" + resolved "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz" + integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== + +semver@^6.0.0, semver@^6.3.0, semver@^6.3.1: + version "6.3.1" + resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +semver@^7.0.0, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8, semver@^7.5.3, semver@^7.5.4: + version "7.5.4" + resolved "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz" + integrity sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA== + dependencies: + lru-cache "^6.0.0" + +send@0.18.0: + version "0.18.0" + resolved "https://registry.npmjs.org/send/-/send-0.18.0.tgz" + integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== + 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" + +sentence-case@^3.0.4: + 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" + +serialize-javascript@^6.0.0, serialize-javascript@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz" + integrity sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w== + dependencies: + randombytes "^2.1.0" + +serve-index@^1.9.1: + version "1.9.1" + resolved "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz" + integrity sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw== + 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" + +serve-static@1.15.0: + version "1.15.0" + resolved "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz" + integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== + dependencies: + encodeurl "~1.0.2" + escape-html "~1.0.3" + parseurl "~1.3.3" + send "0.18.0" + +set-blocking@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" + integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw== + +setprototypeof@1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz" + integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ== + +setprototypeof@1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz" + integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw== + +shallow-clone@^0.1.2: + version "0.1.2" + resolved "https://registry.npmjs.org/shallow-clone/-/shallow-clone-0.1.2.tgz" + integrity sha512-J1zdXCky5GmNnuauESROVu31MQSnLoYvlyEn6j2Ztk6Q5EHFIhxkMhYcv6vuDzl2XEzoRr856QwzMgWM/TmZgw== + dependencies: + is-extendable "^0.1.1" + kind-of "^2.0.1" + lazy-cache "^0.2.3" + mixin-object "^2.0.1" + +shallow-clone@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz" + integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== + dependencies: + kind-of "^6.0.2" + +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz" + integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg== + dependencies: + shebang-regex "^1.0.0" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz" + integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ== + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +shell-quote@^1.7.3: + version "1.8.1" + resolved "https://registry.npmjs.org/shell-quote/-/shell-quote-1.8.1.tgz" + integrity sha512-6j1W9l1iAs/4xYBI1SYOVZyFcCis9b4KCLQ8fgAGG07QvzaRLVVRQvAy85yNmmZSjYjg4MWh4gNvlPujU/5LpA== + +showdown@^1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/showdown/-/showdown-1.9.1.tgz#134e148e75cd4623e09c21b0511977d79b5ad0ef" + integrity sha512-9cGuS382HcvExtf5AHk7Cb4pAeQQ+h0eTr33V1mu+crYWV4KvWAw6el92bDrqGEk5d46Ai/fhbEUwqJ/mTCNEA== + dependencies: + yargs "^14.2" + +side-channel@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz" + integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw== + dependencies: + call-bind "^1.0.0" + get-intrinsic "^1.0.2" + object-inspect "^1.9.0" + +signal-exit@^3.0.3, signal-exit@^3.0.7: + version "3.0.7" + resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" + integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== + +simple-html-tokenizer@^0.5.7: + version "0.5.11" + resolved "https://registry.yarnpkg.com/simple-html-tokenizer/-/simple-html-tokenizer-0.5.11.tgz#4c5186083c164ba22a7b477b7687ac056ad6b1d9" + integrity sha512-C2WEK/Z3HoSFbYq8tI7ni3eOo/NneSPRoPpcM7WdLjFOArFuyXEjAoCdOC3DgMfRyziZQ1hCNR4mrNdWEvD0og== + +simple-peer@^9.11.0: + version "9.11.1" + resolved "https://registry.yarnpkg.com/simple-peer/-/simple-peer-9.11.1.tgz#9814d5723f821b778b7fb011bdefcbd1e788e6cc" + integrity sha512-D1SaWpOW8afq1CZGWB8xTfrT3FekjQmPValrqncJMX7QFl8YwhrPTZvMCANLtgBwwdS+7zURyqxDDEmY558tTw== + 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" + +sirv@^2.0.3: + version "2.0.3" + resolved "https://registry.npmjs.org/sirv/-/sirv-2.0.3.tgz" + integrity sha512-O9jm9BsID1P+0HOi81VpXPoDxYP374pkOLzACAoyUQ/3OUVndNpsz6wMnY2z+yOxzbllCKZrM+9QrWsv4THnyA== + dependencies: + "@polka/url" "^1.0.0-next.20" + mrmime "^1.0.0" + totalist "^3.0.0" + +sisteransi@^1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz" + integrity sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg== + +slash@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" + integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== + +slash@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/slash/-/slash-4.0.0.tgz" + integrity sha512-3dOsAHXXUkQTpOYcoAxLIorMTp4gIQr5IW3iVb7A7lFIp0VHhnynm9izx6TssdrIcVIESAlVjtnO2K8bg+Coew== + +slice-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz" + integrity sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ== + dependencies: + ansi-styles "^4.0.0" + astral-regex "^2.0.0" + is-fullwidth-code-point "^3.0.0" + +snake-case@^3.0.4: + 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" + +sockjs@^0.3.24: + version "0.3.24" + resolved "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz" + integrity sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ== + dependencies: + faye-websocket "^0.11.3" + uuid "^8.3.2" + websocket-driver "^0.7.4" + +"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.1, source-map-js@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz" + integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== + +source-map-loader@^3.0.0: + 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== + dependencies: + abab "^2.0.5" + iconv-lite "^0.6.3" + source-map-js "^1.0.1" + +source-map-support@0.5.13: + version "0.5.13" + resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz" + integrity sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map-support@~0.5.20: + 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== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@^0.5.7: + version "0.5.7" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz" + integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== + +source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: + version "0.6.1" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +source-map@^0.7.3: + version "0.7.4" + resolved "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz" + integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA== + +spawnd@^6.2.0: + version "6.2.0" + resolved "https://registry.npmjs.org/spawnd/-/spawnd-6.2.0.tgz" + integrity sha512-qX/I4lQy4KgVEcNle0kuc4FxFWHISzBhZW1YemPfwmrmQjyZmfTK/OhBKkhrD2ooAaFZEm1maEBLE6/6enwt+g== + dependencies: + exit "^0.1.2" + signal-exit "^3.0.7" + tree-kill "^1.2.2" + +spdx-correct@^3.0.0: + version "3.2.0" + resolved "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.2.0.tgz" + integrity sha512-kN9dJbvnySHULIluDHy32WHRUu3Og7B9sbY7tsFLctQkIqnMh3hErYgdMjTYuqmcXX+lK5T1lnUt3G7zNswmZA== + dependencies: + spdx-expression-parse "^3.0.0" + spdx-license-ids "^3.0.0" + +spdx-exceptions@^2.1.0: + version "2.3.0" + resolved "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz" + integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== + +spdx-expression-parse@^3.0.0, spdx-expression-parse@^3.0.1: + version "3.0.1" + resolved "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz" + integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q== + dependencies: + spdx-exceptions "^2.1.0" + spdx-license-ids "^3.0.0" + +spdx-license-ids@^3.0.0: + version "3.0.13" + resolved "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz" + integrity sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w== + +spdy-transport@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz" + integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw== + 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" + +spdy@^4.0.2: + version "4.0.2" + resolved "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz" + integrity sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA== + 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" + +sprintf-js@^1.1.1: + version "1.1.2" + resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.2.tgz" + integrity sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug== + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" + integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g== + +stack-utils@^2.0.3: + version "2.0.6" + resolved "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz" + integrity sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ== + dependencies: + escape-string-regexp "^2.0.0" + +stackframe@^1.3.4: + version "1.3.4" + resolved "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz" + integrity sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw== + +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== + +"statuses@>= 1.4.0 < 2": + version "1.5.0" + resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz" + integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== + +string-length@^4.0.1: + version "4.0.2" + resolved "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz" + integrity sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ== + dependencies: + char-regex "^1.0.2" + strip-ansi "^6.0.0" + +string-width@^3.0.0, string-width@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" + integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== + dependencies: + emoji-regex "^7.0.1" + is-fullwidth-code-point "^2.0.0" + strip-ansi "^5.1.0" + +string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +string.prototype.matchall@^4.0.8: + version "4.0.9" + resolved "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.9.tgz" + integrity sha512-6i5hL3MqG/K2G43mWXWgP+qizFW/QH/7kCNN13JrJS5q48FN5IKksLDscexKP3dnmB6cdm9jlNgAsWNLpSykmA== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + get-intrinsic "^1.2.1" + has-symbols "^1.0.3" + internal-slot "^1.0.5" + regexp.prototype.flags "^1.5.0" + side-channel "^1.0.4" + +string.prototype.trim@^1.2.7: + version "1.2.7" + resolved "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz" + integrity sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +string.prototype.trimend@^1.0.6: + version "1.0.6" + resolved "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz" + integrity sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ== + dependencies: + call-bind "^1.0.2" + define-properties "^1.1.4" + es-abstract "^1.20.4" + +string.prototype.trimstart@^1.0.6: + version "1.0.7" + resolved "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz" + integrity sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg== + dependencies: + call-bind "^1.0.2" + define-properties "^1.2.0" + es-abstract "^1.22.1" + +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + 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" + +strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + dependencies: + ansi-regex "^4.1.0" + +strip-ansi@^6.0.0, strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +strip-bom@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz" + integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA== + +strip-bom@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz" + integrity sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w== + +strip-final-newline@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz" + integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA== + +strip-indent@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz" + integrity sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ== + dependencies: + min-indent "^1.0.0" + +strip-json-comments@^3.1.1, strip-json-comments@~3.1.1: + 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== + +strip-outer@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/strip-outer/-/strip-outer-1.0.1.tgz" + integrity sha512-k55yxKHwaXnpYGsOzg4Vl8+tDrWylxDEpknGjhTiZB8dFRU5rTo9CAzeycivxV3s+zlTKwrs6WxMxR95n26kwg== + dependencies: + escape-string-regexp "^1.0.2" + +style-search@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz" + integrity sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg== + +stylehacks@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/stylehacks/-/stylehacks-6.0.0.tgz" + integrity sha512-+UT589qhHPwz6mTlCLSt/vMNTJx8dopeJlZAlBMJPWA3ORqu6wmQY7FBXf+qD+FsqoBJODyqNxOUP3jdntFRdw== + dependencies: + browserslist "^4.21.4" + postcss-selector-parser "^6.0.4" + +stylelint-config-recommended-scss@^5.0.2: + version "5.0.2" + resolved "https://registry.npmjs.org/stylelint-config-recommended-scss/-/stylelint-config-recommended-scss-5.0.2.tgz" + integrity sha512-b14BSZjcwW0hqbzm9b0S/ScN2+3CO3O4vcMNOw2KGf8lfVSwJ4p5TbNEXKwKl1+0FMtgRXZj6DqVUe/7nGnuBg== + dependencies: + postcss-scss "^4.0.2" + stylelint-config-recommended "^6.0.0" + stylelint-scss "^4.0.0" + +stylelint-config-recommended@^6.0.0: + version "6.0.0" + resolved "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-6.0.0.tgz" + integrity sha512-ZorSSdyMcxWpROYUvLEMm0vSZud2uB7tX1hzBZwvVY9SV/uly4AvvJPPhCcymZL3fcQhEQG5AELmrxWqtmzacw== + +stylelint-scss@^4.0.0: + version "4.7.0" + resolved "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-4.7.0.tgz" + integrity sha512-TSUgIeS0H3jqDZnby1UO1Qv3poi1N8wUYIJY6D1tuUq2MN3lwp/rITVo0wD+1SWTmRm0tNmGO0b7nKInnqF6Hg== + dependencies: + postcss-media-query-parser "^0.2.3" + postcss-resolve-nested-selector "^0.1.1" + postcss-selector-parser "^6.0.11" + postcss-value-parser "^4.2.0" + +stylelint@^14.2.0: + version "14.16.1" + resolved "https://registry.npmjs.org/stylelint/-/stylelint-14.16.1.tgz" + integrity sha512-ErlzR/T3hhbV+a925/gbfc3f3Fep9/bnspMiJPorfGEmcBbXdS+oo6LrVtoUZ/w9fqD6o6k7PtUlCOsCRdjX/A== + dependencies: + "@csstools/selector-specificity" "^2.0.2" + balanced-match "^2.0.0" + colord "^2.9.3" + cosmiconfig "^7.1.0" + css-functions-list "^3.1.0" + debug "^4.3.4" + fast-glob "^3.2.12" + fastest-levenshtein "^1.0.16" + file-entry-cache "^6.0.1" + global-modules "^2.0.0" + globby "^11.1.0" + globjoin "^0.1.4" + html-tags "^3.2.0" + ignore "^5.2.1" + import-lazy "^4.0.0" + imurmurhash "^0.1.4" + is-plain-object "^5.0.0" + known-css-properties "^0.26.0" + mathml-tag-names "^2.1.3" + meow "^9.0.0" + micromatch "^4.0.5" + normalize-path "^3.0.0" + picocolors "^1.0.0" + postcss "^8.4.19" + postcss-media-query-parser "^0.2.3" + postcss-resolve-nested-selector "^0.1.1" + postcss-safe-parser "^6.0.0" + postcss-selector-parser "^6.0.11" + postcss-value-parser "^4.2.0" + resolve-from "^5.0.0" + string-width "^4.2.3" + strip-ansi "^6.0.1" + style-search "^0.1.0" + supports-hyperlinks "^2.3.0" + svg-tags "^1.0.0" + table "^6.8.1" + v8-compile-cache "^2.3.0" + write-file-atomic "^4.0.2" + +stylis@4.2.0: + version "4.2.0" + resolved "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz" + integrity sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw== + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.0.0, supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-color@^8.0.0: + version "8.1.1" + resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-hyperlinks@^2.3.0: + version "2.3.0" + resolved "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz" + integrity sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA== + dependencies: + has-flag "^4.0.0" + supports-color "^7.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + 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== + +svg-parser@^2.0.4: + version "2.0.4" + resolved "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz" + integrity sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ== + +svg-tags@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz" + integrity sha512-ovssysQTa+luh7A5Weu3Rta6FJlFBBbInjOh722LIt6klpU2/HtdUbszju/G4devcvk8PGt7FCLv5wftu3THUA== + +svgo@^3.0.2: + version "3.0.2" + resolved "https://registry.npmjs.org/svgo/-/svgo-3.0.2.tgz" + integrity sha512-Z706C1U2pb1+JGP48fbazf3KxHrWOsLme6Rv7imFBn5EnuanDW1GPaA/P1/dvObE670JDePC3mnj0k0B7P0jjQ== + dependencies: + "@trysound/sax" "0.2.0" + commander "^7.2.0" + css-select "^5.1.0" + css-tree "^2.2.1" + csso "^5.0.5" + picocolors "^1.0.0" + +symbol-tree@^3.2.4: + 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== + +table@^6.8.1: + version "6.8.1" + resolved "https://registry.npmjs.org/table/-/table-6.8.1.tgz" + integrity sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA== + 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" + +tannin@^1.2.0: + 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" + +tapable@^2.1.1, tapable@^2.2.0: + version "2.2.1" + resolved "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz" + integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== + +tar-fs@2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz" + integrity sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng== + dependencies: + chownr "^1.1.1" + mkdirp-classic "^0.5.2" + pump "^3.0.0" + tar-stream "^2.1.4" + +tar-stream@^2.1.4: + version "2.2.0" + resolved "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz" + integrity sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ== + dependencies: + bl "^4.0.3" + end-of-stream "^1.4.1" + fs-constants "^1.0.0" + inherits "^2.0.3" + readable-stream "^3.1.1" + +terser-webpack-plugin@^5.3.7, terser-webpack-plugin@^5.3.9: + version "5.3.9" + resolved "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz" + integrity sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA== + dependencies: + "@jridgewell/trace-mapping" "^0.3.17" + jest-worker "^27.4.5" + schema-utils "^3.1.1" + serialize-javascript "^6.0.1" + terser "^5.16.8" + +terser@^5.16.8: + version "5.19.4" + resolved "https://registry.npmjs.org/terser/-/terser-5.19.4.tgz" + integrity sha512-6p1DjHeuluwxDXcuT9VR8p64klWJKo1ILiy19s6C9+0Bh2+NWTX6nD9EPppiER4ICkHDVB1RkVpin/YW2nQn/g== + dependencies: + "@jridgewell/source-map" "^0.3.3" + acorn "^8.8.2" + commander "^2.20.0" + source-map-support "~0.5.20" + +test-exclude@^6.0.0: + 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== + dependencies: + "@istanbuljs/schema" "^0.1.2" + glob "^7.1.4" + minimatch "^3.0.4" + +text-table@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz" + integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw== + +through@^2.3.8: + version "2.3.8" + resolved "https://registry.npmjs.org/through/-/through-2.3.8.tgz" + integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg== + +thunky@^1.0.2: + version "1.1.0" + resolved "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz" + integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== + +tiny-emitter@^2.0.0: + version "2.1.0" + resolved "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz" + integrity sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q== + +tmpl@1.0.5: + version "1.0.5" + resolved "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz" + integrity sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw== + +to-fast-properties@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz" + integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog== + +to-regex-range@^5.0.1: + 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== + dependencies: + is-number "^7.0.0" + +toidentifier@1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz" + integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA== + +totalist@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz" + integrity sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ== + +tough-cookie@^4.1.2: + version "4.1.3" + resolved "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz" + integrity sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw== + dependencies: + psl "^1.1.33" + punycode "^2.1.1" + universalify "^0.2.0" + url-parse "^1.5.3" + +tr46@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/tr46/-/tr46-3.0.0.tgz" + integrity sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA== + dependencies: + punycode "^2.1.1" + +tr46@~0.0.3: + version "0.0.3" + resolved "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz" + integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw== + +traverse@^0.6.6: + version "0.6.7" + resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.6.7.tgz#46961cd2d57dd8706c36664acde06a248f1173fe" + integrity sha512-/y956gpUo9ZNCb99YjxG7OaslxZWHfCHAUUfshwqOXmxUIvqLjVO581BT+gM59+QV9tFe6/CGG53tsA1Y7RSdg== + +tree-kill@^1.2.2: + version "1.2.2" + resolved "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz" + integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== + +trim-newlines@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz" + integrity sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw== + +trim-repeated@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/trim-repeated/-/trim-repeated-1.0.0.tgz" + integrity sha512-pkonvlKk8/ZuR0D5tLW8ljt5I8kmxp2XKymhepUeOdCEfKpZaktSArkLHZt76OB1ZvO9bssUsDty4SWhLvZpLg== + dependencies: + escape-string-regexp "^1.0.2" + +tsconfig-paths@^3.14.2: + version "3.14.2" + resolved "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz" + integrity sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g== + dependencies: + "@types/json5" "^0.0.29" + json5 "^1.0.2" + minimist "^1.2.6" + strip-bom "^3.0.0" + +tslib@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.0.1.tgz#410eb0d113e5b6356490eec749603725b021b43e" + integrity sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ== + +tslib@^1.8.1: + version "1.14.1" + resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" + integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== + +tslib@^2.0.0, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.0, tslib@^2.4.0: + version "2.6.2" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz" + integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== + +tsutils@^3.21.0: + version "3.21.0" + resolved "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz" + integrity sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA== + dependencies: + tslib "^1.8.1" + +turbo-combine-reducers@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/turbo-combine-reducers/-/turbo-combine-reducers-1.0.2.tgz" + integrity sha512-gHbdMZlA6Ym6Ur5pSH/UWrNQMIM9IqTH6SoL1DbHpqEdQ8i+cFunSmSlFykPt0eGQwZ4d/XTHOl74H0/kFBVWw== + +type-check@^0.4.0, type-check@~0.4.0: + version "0.4.0" + resolved "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz" + integrity sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew== + dependencies: + prelude-ls "^1.2.1" + +type-detect@4.0.8: + 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== + +type-fest@^0.18.0: + 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== + +type-fest@^0.20.2: + 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== + +type-fest@^0.21.3: + 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== + +type-fest@^0.6.0: + version "0.6.0" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz" + integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== + +type-fest@^0.8.1: + version "0.8.1" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz" + integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== + +type-fest@^3.2.0: + version "3.13.1" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz" + integrity sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g== + +type-is@~1.6.18: + version "1.6.18" + resolved "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz" + integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g== + dependencies: + media-typer "0.3.0" + mime-types "~2.1.24" + +typed-array-buffer@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz" + integrity sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw== + dependencies: + call-bind "^1.0.2" + get-intrinsic "^1.2.1" + is-typed-array "^1.1.10" + +typed-array-byte-length@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz" + integrity sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA== + dependencies: + call-bind "^1.0.2" + for-each "^0.3.3" + has-proto "^1.0.1" + is-typed-array "^1.1.10" + +typed-array-byte-offset@^1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz" + integrity sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + has-proto "^1.0.1" + is-typed-array "^1.1.10" + +typed-array-length@^1.0.4: + version "1.0.4" + resolved "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz" + integrity sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng== + dependencies: + call-bind "^1.0.2" + for-each "^0.3.3" + is-typed-array "^1.1.9" + +uc.micro@^1.0.1, uc.micro@^1.0.5: + version "1.0.6" + resolved "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz" + integrity sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA== + +unbox-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz" + integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw== + dependencies: + call-bind "^1.0.2" + has-bigints "^1.0.2" + has-symbols "^1.0.3" + which-boxed-primitive "^1.0.2" + +unbzip2-stream@1.4.3: + version "1.4.3" + resolved "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz" + integrity sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg== + dependencies: + buffer "^5.2.1" + through "^2.3.8" + +unicode-canonical-property-names-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz" + integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ== + +unicode-match-property-ecmascript@^2.0.0: + 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== + dependencies: + unicode-canonical-property-names-ecmascript "^2.0.0" + unicode-property-aliases-ecmascript "^2.0.0" + +unicode-match-property-value-ecmascript@^2.1.0: + version "2.1.0" + resolved "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.1.0.tgz" + integrity sha512-qxkjQt6qjg/mYscYMC0XKRn3Rh0wFPlfxB0xkt9CfyTvpX1Ra0+rAmdX2QyAobptSEvuy4RtpPRui6XkV+8wjA== + +unicode-property-aliases-ecmascript@^2.0.0: + 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== + +universalify@^0.2.0: + version "0.2.0" + resolved "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz" + integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg== + +unpipe@1.0.0, unpipe@~1.0.0: + version "1.0.0" + resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" + integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== + +update-browserslist-db@^1.0.11: + version "1.0.11" + resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz" + integrity sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA== + dependencies: + escalade "^3.1.1" + picocolors "^1.0.0" + +upper-case-first@^2.0.2: + 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" + +upper-case@^2.0.2: + 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" + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +url-loader@^4.1.1: + version "4.1.1" + resolved "https://registry.npmjs.org/url-loader/-/url-loader-4.1.1.tgz" + integrity sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA== + dependencies: + loader-utils "^2.0.0" + mime-types "^2.1.27" + schema-utils "^3.0.0" + +url-parse@^1.5.3: + version "1.5.10" + resolved "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz" + integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ== + dependencies: + querystringify "^2.1.1" + requires-port "^1.0.0" + +use-callback-ref@^1.3.0: + version "1.3.0" + resolved "https://registry.npmjs.org/use-callback-ref/-/use-callback-ref-1.3.0.tgz" + integrity sha512-3FT9PRuRdbB9HfXhEq35u4oZkvpJ5kuYbpqhCfmiZyReuRgpnhDlbr2ZEnnuS0RrJAPn6l23xjFg9kpDM+Ms7w== + dependencies: + tslib "^2.0.0" + +use-isomorphic-layout-effect@^1.1.1: + version "1.1.2" + resolved "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz" + integrity sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA== + +use-lilius@^2.0.1: + version "2.0.3" + resolved "https://registry.npmjs.org/use-lilius/-/use-lilius-2.0.3.tgz" + integrity sha512-+Q7nspdv+QGnyHGVMd6yAdLrqv5EGB4n3ix4GJH0JEE27weKCLCLmZSuAr5Nw+yPBCZn/iZ+KjL5+UykLCWXrw== + dependencies: + date-fns "^2.29.2" + +use-memo-one@^1.1.1: + 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== + +use-sidecar@^1.1.2: + 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" + +use-sync-external-store@1.2.0, use-sync-external-store@^1.2.0: + version "1.2.0" + resolved "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz" + integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA== + +util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +utils-merge@1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz" + integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== + +uuid@^8.3.0, uuid@^8.3.2: + version "8.3.2" + resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz" + integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== + +v8-compile-cache@^2.3.0: + version "2.4.0" + resolved "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.4.0.tgz" + integrity sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw== + +v8-to-istanbul@^9.0.1: + version "9.1.0" + resolved "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.1.0.tgz" + integrity sha512-6z3GW9x8G1gd+JIIgQQQxXuiJtCXeAjp6RaPEPLv62mH3iPHPxV6W3robxtCzNErRo6ZwTmzWhsbNvjyEBKzKA== + dependencies: + "@jridgewell/trace-mapping" "^0.3.12" + "@types/istanbul-lib-coverage" "^2.0.1" + convert-source-map "^1.6.0" + +validate-npm-package-license@^3.0.1: + 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== + dependencies: + spdx-correct "^3.0.0" + spdx-expression-parse "^3.0.0" + +validate-npm-package-name@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-5.0.0.tgz" + integrity sha512-YuKoXDAhBYxY7SfOKxHBDoSyENFeW5VvIIQp2TGQuit8gpK6MnWaQelBKxso72DoxTZfZdcP3W90LqpSkgPzLQ== + dependencies: + builtins "^5.0.0" + +valtio@1.7.0: + version "1.7.0" + resolved "https://registry.npmjs.org/valtio/-/valtio-1.7.0.tgz" + integrity sha512-3Tnix66EERwMcrl1rfB3ylcewOcL5L/GiPmC3FlVNreQzqf2jufEeqlNmgnLgSGchkEmH3WYVtS+x6Qw4r+yzQ== + dependencies: + proxy-compare "2.3.0" + use-sync-external-store "1.2.0" + +vary@~1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz" + integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg== + +w3c-xmlserializer@^4.0.0: + 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== + dependencies: + xml-name-validator "^4.0.0" + +wait-on@^6.0.1: + version "6.0.1" + resolved "https://registry.npmjs.org/wait-on/-/wait-on-6.0.1.tgz" + integrity sha512-zht+KASY3usTY5u2LgaNqn/Cd8MukxLGjdcZxT2ns5QzDmTFc4XoWBgC+C/na+sMRZTuVygQoMYwdcVjHnYIVw== + dependencies: + axios "^0.25.0" + joi "^17.6.0" + lodash "^4.17.21" + minimist "^1.2.5" + rxjs "^7.5.4" + +walker@^1.0.8: + version "1.0.8" + resolved "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz" + integrity sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ== + dependencies: + makeerror "1.0.12" + +watchpack@^2.4.0: + version "2.4.0" + resolved "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz" + integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== + dependencies: + glob-to-regexp "^0.4.1" + graceful-fs "^4.1.2" + +wbuf@^1.1.0, wbuf@^1.7.3: + version "1.7.3" + resolved "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz" + integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA== + dependencies: + minimalistic-assert "^1.0.0" + +webidl-conversions@^3.0.0: + version "3.0.1" + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz" + integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ== + +webidl-conversions@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz" + integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g== + +webpack-bundle-analyzer@^4.4.2: + version "4.9.1" + resolved "https://registry.npmjs.org/webpack-bundle-analyzer/-/webpack-bundle-analyzer-4.9.1.tgz" + integrity sha512-jnd6EoYrf9yMxCyYDPj8eutJvtjQNp8PHmni/e/ulydHBWhT5J3menXt3HEkScsu9YqMAcG4CfFjs3rj5pVU1w== + dependencies: + "@discoveryjs/json-ext" "0.5.7" + acorn "^8.0.4" + acorn-walk "^8.0.0" + commander "^7.2.0" + escape-string-regexp "^4.0.0" + gzip-size "^6.0.0" + is-plain-object "^5.0.0" + lodash.debounce "^4.0.8" + lodash.escape "^4.0.1" + lodash.flatten "^4.4.0" + lodash.invokemap "^4.6.0" + lodash.pullall "^4.2.0" + lodash.uniqby "^4.7.0" + opener "^1.5.2" + picocolors "^1.0.0" + sirv "^2.0.3" + ws "^7.3.1" + +webpack-cli@^4.9.1: + version "4.10.0" + resolved "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.10.0.tgz" + integrity sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w== + dependencies: + "@discoveryjs/json-ext" "^0.5.0" + "@webpack-cli/configtest" "^1.2.0" + "@webpack-cli/info" "^1.5.0" + "@webpack-cli/serve" "^1.7.0" + colorette "^2.0.14" + commander "^7.0.0" + cross-spawn "^7.0.3" + fastest-levenshtein "^1.0.12" + import-local "^3.0.2" + interpret "^2.2.0" + rechoir "^0.7.0" + webpack-merge "^5.7.3" + +webpack-dev-middleware@^5.3.1: + version "5.3.3" + resolved "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz" + integrity sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA== + dependencies: + colorette "^2.0.10" + memfs "^3.4.3" + mime-types "^2.1.31" + range-parser "^1.2.1" + schema-utils "^4.0.0" + +webpack-dev-server@^4.4.0: + version "4.15.1" + resolved "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.1.tgz" + integrity sha512-5hbAst3h3C3L8w6W4P96L5vaV0PxSmJhxZvWKYIdgxOQm8pNZ5dEOmmSLBVpP85ReeyRt6AS1QJNyo/oFFPeVA== + 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.1" + ws "^8.13.0" + +webpack-merge@^5.7.3: + version "5.9.0" + resolved "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.9.0.tgz" + integrity sha512-6NbRQw4+Sy50vYNTw7EyOn41OZItPiXB8GNv3INSoe3PSFaHJEz3SHTrYVaRm2LilNGnFUzh0FAwqPEmU/CwDg== + dependencies: + clone-deep "^4.0.1" + wildcard "^2.0.0" + +webpack-sources@^3.2.2, webpack-sources@^3.2.3: + 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== + +webpack@^5.47.1: + version "5.88.2" + resolved "https://registry.npmjs.org/webpack/-/webpack-5.88.2.tgz" + integrity sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ== + dependencies: + "@types/eslint-scope" "^3.7.3" + "@types/estree" "^1.0.0" + "@webassemblyjs/ast" "^1.11.5" + "@webassemblyjs/wasm-edit" "^1.11.5" + "@webassemblyjs/wasm-parser" "^1.11.5" + acorn "^8.7.1" + acorn-import-assertions "^1.9.0" + browserslist "^4.14.5" + chrome-trace-event "^1.0.2" + enhanced-resolve "^5.15.0" + 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.9" + 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.7" + watchpack "^2.4.0" + webpack-sources "^3.2.3" + +websocket-driver@>=0.5.1, websocket-driver@^0.7.4: + version "0.7.4" + resolved "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz" + integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== + dependencies: + http-parser-js ">=0.5.1" + safe-buffer ">=5.1.0" + websocket-extensions ">=0.1.1" + +websocket-extensions@>=0.1.1: + version "0.1.4" + resolved "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz" + integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg== + +whatwg-encoding@^2.0.0: + 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== + dependencies: + iconv-lite "0.6.3" + +whatwg-mimetype@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz" + integrity sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q== + +whatwg-url@^11.0.0: + 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== + dependencies: + tr46 "^3.0.0" + webidl-conversions "^7.0.0" + +whatwg-url@^5.0.0: + version "5.0.0" + resolved "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz" + integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw== + dependencies: + tr46 "~0.0.3" + webidl-conversions "^3.0.0" + +which-boxed-primitive@^1.0.2: + version "1.0.2" + resolved "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz" + integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg== + 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" + +which-builtin-type@^1.1.3: + version "1.1.3" + resolved "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.1.3.tgz" + integrity sha512-YmjsSMDBYsM1CaFiayOVT06+KJeXf0o5M/CAd4o1lTadFAtacTUM49zoYxr/oroopFDfhvN6iEcBxUyc3gvKmw== + dependencies: + function.prototype.name "^1.1.5" + has-tostringtag "^1.0.0" + is-async-function "^2.0.0" + is-date-object "^1.0.5" + is-finalizationregistry "^1.0.2" + is-generator-function "^1.0.10" + is-regex "^1.1.4" + is-weakref "^1.0.2" + isarray "^2.0.5" + which-boxed-primitive "^1.0.2" + which-collection "^1.0.1" + which-typed-array "^1.1.9" + +which-collection@^1.0.1: + version "1.0.1" + resolved "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz" + integrity sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A== + dependencies: + is-map "^2.0.1" + is-set "^2.0.1" + is-weakmap "^2.0.1" + is-weakset "^2.0.1" + +which-module@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.1.tgz#776b1fe35d90aebe99e8ac15eb24093389a4a409" + integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ== + +which-typed-array@^1.1.10, which-typed-array@^1.1.11, which-typed-array@^1.1.9: + version "1.1.11" + resolved "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.11.tgz" + integrity sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew== + dependencies: + available-typed-arrays "^1.0.5" + call-bind "^1.0.2" + for-each "^0.3.3" + gopd "^1.0.1" + has-tostringtag "^1.0.0" + +which@^1.2.12, which@^1.2.9, which@^1.3.1: + version "1.3.1" + resolved "https://registry.npmjs.org/which/-/which-1.3.1.tgz" + integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== + dependencies: + isexe "^2.0.0" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.npmjs.org/which/-/which-2.0.2.tgz" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +wildcard@^2.0.0: + version "2.0.1" + resolved "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz" + integrity sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ== + +wrap-ansi@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" + integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== + dependencies: + ansi-styles "^3.2.0" + string-width "^3.0.0" + strip-ansi "^5.0.0" + +wrap-ansi@^7.0.0: + version "7.0.0" + resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" + integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== + dependencies: + ansi-styles "^4.0.0" + string-width "^4.1.0" + strip-ansi "^6.0.0" + +wrappy@1: + version "1.0.2" + resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ== + +write-file-atomic@^4.0.2: + 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== + dependencies: + imurmurhash "^0.1.4" + signal-exit "^3.0.7" + +ws@8.5.0: + version "8.5.0" + resolved "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz" + integrity sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg== + +ws@^7.2.0, ws@^7.3.1: + version "7.5.9" + resolved "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz" + integrity sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q== + +ws@^8.11.0, ws@^8.13.0: + version "8.13.0" + resolved "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz" + integrity sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA== + +xml-name-validator@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz" + integrity sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw== + +xmlchars@^2.2.0: + version "2.2.0" + resolved "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz" + integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw== + +y-indexeddb@~9.0.11: + version "9.0.11" + resolved "https://registry.yarnpkg.com/y-indexeddb/-/y-indexeddb-9.0.11.tgz#eb4e4a1816caae9a2c906e64e7b41f78e0d75fda" + integrity sha512-HOKQ70qW1h2WJGtOKu9rE8fbX86ExVZedecndMuhwax3yM4DQsQzCTGHt/jvTrFZr/9Ahvd8neD6aZ4dMMjtdg== + dependencies: + lib0 "^0.2.74" + +y-protocols@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/y-protocols/-/y-protocols-1.0.5.tgz#91d574250060b29fcac8f8eb5e276fbad594245e" + integrity sha512-Wil92b7cGk712lRHDqS4T90IczF6RkcvCwAD0A2OPg+adKmOe+nOiT/N2hvpQIWS3zfjmtL4CPaH5sIW1Hkm/A== + dependencies: + lib0 "^0.2.42" + +y-webrtc@~10.2.5: + version "10.2.5" + resolved "https://registry.yarnpkg.com/y-webrtc/-/y-webrtc-10.2.5.tgz#ceb2f5d9bf9047ed56c290106b989ad95ed0ea18" + integrity sha512-ZyBNvTI5L28sQ2PQI0T/JvyWgvuTq05L21vGkIlcvNLNSJqAaLCBJRe3FHEqXoaogqWmRcEAKGfII4ErNXMnNw== + dependencies: + lib0 "^0.2.42" + simple-peer "^9.11.0" + y-protocols "^1.0.5" + optionalDependencies: + ws "^7.2.0" + +y18n@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" + integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== + +y18n@^5.0.5: + version "5.0.8" + resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz" + integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== + +yallist@^2.1.2: + version "2.1.2" + resolved "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz" + integrity sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A== + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yallist@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz" + integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== + +yaml@^1.10.0: + version "1.10.2" + resolved "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz" + integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg== + +yargs-parser@^15.0.1: + version "15.0.3" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-15.0.3.tgz#316e263d5febe8b38eef61ac092b33dfcc9b1115" + integrity sha512-/MVEVjTXy/cGAjdtQf8dW3V9b97bPN7rNn8ETj6BmAQL7ibC7O1Q9SPJbGjgh3SlwoBNXMzj/ZGIj8mBgl12YA== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + +yargs-parser@^20.2.3: + version "20.2.9" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz" + integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w== + +yargs-parser@^21.1.1: + version "21.1.1" + resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + +yargs@^14.2: + version "14.2.3" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-14.2.3.tgz#1a1c3edced1afb2a2fea33604bc6d1d8d688a414" + 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" + +yargs@^17.3.1: + version "17.7.2" + resolved "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz" + integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== + 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" + +yauzl@^2.10.0: + version "2.10.0" + resolved "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz" + integrity sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g== + dependencies: + buffer-crc32 "~0.2.3" + fd-slicer "~1.1.0" + +yjs@~13.6.6: + version "13.6.7" + resolved "https://registry.yarnpkg.com/yjs/-/yjs-13.6.7.tgz#f1176c37f65eb566cf390bd813e2099d598795f4" + integrity sha512-mCZTh4kjvUS2DnaktsYN6wLH3WZCJBLqrTdkWh1bIDpA/sB/GNFaLA/dyVJj2Hc7KwONuuoC/vWe9bwBBosZLQ== + dependencies: + lib0 "^0.2.74" + +yocto-queue@^0.1.0: + version "0.1.0" + resolved "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz" + integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== diff --git a/includes/class-jwt-auth.php b/includes/class-jwt-auth.php index 8d2a494..2b7503e 100755 --- a/includes/class-jwt-auth.php +++ b/includes/class-jwt-auth.php @@ -164,6 +164,9 @@ private function define_public_hooks() { private function define_admin_hooks() { $plugin_admin = new Jwt_Auth_Admin( $this->get_plugin_name(), $this->get_version() ); $this->loader->add_action( 'admin_menu', $plugin_admin, 'register_menu_page' ); + $this->loader->add_action( 'admin_enqueue_scripts', $plugin_admin, 'enqueue_plugin_assets' ); + $this->loader->add_action( 'admin_init', $plugin_admin, 'register_plugin_settings' ); + $this->loader->add_action( 'rest_api_init', $plugin_admin, 'register_plugin_settings' ); } /** From 3c5f2c725f86343d902568ecf2128e7c8a417bb8 Mon Sep 17 00:00:00 2001 From: Enrique Chavez Date: Wed, 6 Sep 2023 17:17:14 -0600 Subject: [PATCH 48/79] Add setiings page text and toggle --- admin/class-jwt-auth-admin.php | 2 + admin/ui/build/index.asset.php | 2 +- admin/ui/build/index.css | 2 +- admin/ui/build/index.js | 2 +- admin/ui/src/components/cta.js | 36 ++++++--- admin/ui/src/components/main-view.js | 94 +++++++++++++++++++++- admin/ui/src/components/settings-screen.js | 33 +------- admin/ui/src/index.scss | 17 ++++ 8 files changed, 144 insertions(+), 44 deletions(-) diff --git a/admin/class-jwt-auth-admin.php b/admin/class-jwt-auth-admin.php index 6b300f7..5d1bca4 100644 --- a/admin/class-jwt-auth-admin.php +++ b/admin/class-jwt-auth-admin.php @@ -91,6 +91,8 @@ public function enqueue_plugin_assets( $suffix ) { ); } + + public function register_plugin_settings() { register_setting( 'jwt_auth', 'jwt_auth_options', [ 'type' => 'object', diff --git a/admin/ui/build/index.asset.php b/admin/ui/build/index.asset.php index b558b83..08f6325 100644 --- a/admin/ui/build/index.asset.php +++ b/admin/ui/build/index.asset.php @@ -1 +1 @@ - array('wp-core-data', 'wp-data', 'wp-element'), 'version' => 'e8fe4187f9575f448963'); + array('wp-components', 'wp-core-data', 'wp-data', 'wp-element'), 'version' => '9511a99996501b74bd44'); diff --git a/admin/ui/build/index.css b/admin/ui/build/index.css index 2b8ceb8..210457f 100644 --- a/admin/ui/build/index.css +++ b/admin/ui/build/index.css @@ -1 +1 @@ -.jwt-auth-box{border:1px solid #ddd;border-radius:4px;box-shadow:0 0 10px rgba(0,0,0,.1);padding:1rem;position:relative}.jwt-auth-settings{display:flex;gap:2rem;margin-top:2rem}.jwt-auth-settings .jwt-auth-options{width:66.6%}.jwt-auth-settings .jwt-auth-cta{max-width:360px;width:33.3%}.jwt-auth-settings .jwt-auth-cta .jwt-auth-cta-wrapper{display:inline-block;position:relative;width:100%}.jwt-auth-settings .jwt-auth-cta .jwt-auth-cta-wrapper .jwt-auth-cta-button{background:#0073aa;border-radius:4px;color:#fff;display:block;font-size:1rem;padding:1rem;text-align:center;text-decoration:none} +.jwt-auth-box{background:#fff;border:1px solid #ddd;border-radius:4px;box-shadow:0 0 10px rgba(0,0,0,.1);padding:1rem;position:relative}.jwt-auth-text-small{font-size:12px;font-weight:400}.jwt-auth-settings{display:flex;gap:2rem;margin-top:2rem}.jwt-auth-settings .jwt-auth-options{width:66.6%}.jwt-auth-settings .jwt-auth-cta{max-width:360px;width:33.3%}.jwt-auth-settings .jwt-auth-cta .jwt-auth-cta-wrapper{display:inline-block;position:relative;width:100%}.jwt-auth-settings .jwt-auth-cta .jwt-auth-cta-wrapper .jwt-auth-cta-button{background:#0073aa;border-radius:4px;color:#fff;display:block;font-size:1rem;padding:1rem;text-align:center;text-decoration:none}.jwt-auth-settings .jwt-auth-toggle-holder{padding:1rem 0}.jwt-auth-settings .jwt-auth-toggle-holder .jwt-auth-toggle-control{display:flex;font-weight:700;gap:1rem;margin-bottom:4px} diff --git a/admin/ui/build/index.js b/admin/ui/build/index.js index 058e808..252ab28 100644 --- a/admin/ui/build/index.js +++ b/admin/ui/build/index.js @@ -1 +1 @@ -!function(){"use strict";var e=window.wp.element,t=window.wp.coreData,a=window.wp.data,n=()=>(0,e.createElement)("div",{className:"jwt-auth-cta jwt-auth-box"},(0,e.createElement)("h3",null,"Need Freelance Support?"),(0,e.createElement)("p",null,"Hello! I'm ",(0,e.createElement)("a",{href:"#"},"Enrique Chavez"),", a freelance WordPress developer. I've been working with WordPress for over 10 years and I'd love to help you with your next project."),(0,e.createElement)("div",{className:"jwt-auth-cta-wrapper"},(0,e.createElement)("a",{href:"#",className:"jwt-auth-cta-button"},"Get in touch"))),r=()=>(0,e.createElement)("div",{className:"jwt-auth-options"},(0,e.createElement)("div",{className:"jwt-auth-box"},"Intro")),l=()=>{const[l,c]=(0,t.useEntityProp)("root","site","jwt_auth_options"),{saveEditedEntityRecord:o}=(0,a.useDispatch)("core");return(0,e.createElement)("div",{className:"wrap"},(0,e.createElement)("h1",{className:"wp-heading-inline"},"JWT Authentication"),l&&(0,e.createElement)("div",{className:"jwt-auth-settings"},(0,e.createElement)(r,null),(0,e.createElement)(n,null)))};const c=document.getElementById("jwt-auth-holder");e.createRoot?(0,e.createRoot)(c).render((0,e.createElement)(l,null)):(0,e.render)((0,e.createElement)(l,null),c)}(); \ No newline at end of file +!function(){"use strict";var e=window.wp.element,t=()=>(0,e.createElement)("div",{className:"jwt-auth-cta"},(0,e.createElement)("div",{className:"jwt-auth-box"},(0,e.createElement)("h3",null,"Need Priority Support?"),(0,e.createElement)("p",null,"Hello! I'm"," ",(0,e.createElement)("a",{href:"https://76.digital/",target:"_blank"},"Enrique Chavez"),", a freelance WordPress developer. I've been working with WordPress for over 10 years."),(0,e.createElement)("p",null,"If you need priority support, I'm available for hire. I can help you troubleshoot any issues you're having with the plugin, or even build a custom solution for your project."),(0,e.createElement)("div",{className:"jwt-auth-cta-wrapper"},(0,e.createElement)("a",{href:"https://www.codeable.io/developers/enrique-chavez/",target:"_blank",className:"jwt-auth-cta-button"},"Get in touch")))),n=window.wp.coreData,l=window.wp.data,a=window.wp.components,r=()=>{const[t,r]=(0,n.useEntityProp)("root","site","jwt_auth_options"),{saveEditedEntityRecord:o}=(0,l.useDispatch)("core");return(0,e.createElement)("div",{className:"jwt-auth-options"},(0,e.createElement)("div",{className:"jwt-auth-box"},(0,e.createElement)("div",null,(0,e.createElement)("div",null,(0,e.createElement)("h2",null,"Help Me Improve JWT Authentication for WP REST API!"),(0,e.createElement)("p",null,"Hello there! I'm always working to make the JWT Authentication for WP REST API plugin better for you. To do this, I'd like to understand the environment where the plugin is being used. Would you be willing to share the following information with me?"),(0,e.createElement)("ul",null,(0,e.createElement)("li",null,(0,e.createElement)("strong",null,"- PHP Version:")," This helps me ensure compatibility and decide when it's time to phase out older versions."),(0,e.createElement)("li",null,(0,e.createElement)("strong",null,"- WordPress Version:")," Knowing this helps me optimize the plugin for the most common WordPress setups.")),(0,e.createElement)("p",null,"I promise that:"),(0,e.createElement)("ol",null,(0,e.createElement)("li",null,"I'll only collect the above information."),(0,e.createElement)("li",null,"Your data will remain confidential and won't be shared with third parties."),(0,e.createElement)("li",null,"This will in no way affect your website's performance.")),(0,e.createElement)("p",null,"By sharing this information, you're helping me make JWT Authentication for WP REST API even better for everyone."),(0,e.createElement)("p",null,"Thank you for your trust and support!"),(0,e.createElement)("p",null,"Enrique Chavez"),(0,e.createElement)("hr",null),t&&(0,e.createElement)("div",{className:"jwt-auth-toggle-holder"},(0,e.createElement)("div",{className:"jwt-auth-toggle-control"},(0,e.createElement)("span",null,t.share_data?"You are currently sharing data.":"You are not currently sharing data."),(0,e.createElement)(a.FormToggle,{checked:t.share_data,onChange:()=>(r({...t,share_data:!t.share_data}),void o("root","site"))})),(0,e.createElement)("span",{className:"jwt-auth-text-small"},"Click the toggle button to change your preferences."))))))},o=()=>(0,e.createElement)("div",{className:"wrap"},(0,e.createElement)("h1",{className:"wp-heading-inline"},"JWT Authentication"),(0,e.createElement)("div",{className:"jwt-auth-settings"},(0,e.createElement)(r,null),(0,e.createElement)(t,null)));const i=document.getElementById("jwt-auth-holder");e.createRoot?(0,e.createRoot)(i).render((0,e.createElement)(o,null)):(0,e.render)((0,e.createElement)(o,null),i)}(); \ No newline at end of file diff --git a/admin/ui/src/components/cta.js b/admin/ui/src/components/cta.js index db9db09..84d690f 100644 --- a/admin/ui/src/components/cta.js +++ b/admin/ui/src/components/cta.js @@ -1,16 +1,30 @@ const CTA = () => { return ( -
-

Need Freelance Support?

-

- Hello! I'm Enrique Chavez, a freelance WordPress - developer. I've been working with WordPress for over 10 years - and I'd love to help you with your next project. -

-
- - Get in touch - +
+
+

Need Priority Support?

+

+ Hello! I'm{ ' ' } + + Enrique Chavez + + , a freelance WordPress developer. I've been working with + WordPress for over 10 years. +

+

+ If you need priority support, I'm available for hire. I can + help you troubleshoot any issues you're having with the + plugin, or even build a custom solution for your project. +

+
); diff --git a/admin/ui/src/components/main-view.js b/admin/ui/src/components/main-view.js index f2a7fb4..c982c27 100644 --- a/admin/ui/src/components/main-view.js +++ b/admin/ui/src/components/main-view.js @@ -1,7 +1,99 @@ +import { useEntityProp } from '@wordpress/core-data'; +import { useDispatch } from '@wordpress/data'; +import { FormToggle } from '@wordpress/components'; + const MainView = () => { + // Get the plugin settings + const [ settings, setSettings ] = useEntityProp( + 'root', + 'site', + 'jwt_auth_options' + ); + // Get the save edited entity record function + const { saveEditedEntityRecord } = useDispatch( 'core' ); + + // Handle the save settings action + const saveSettings = () => { + // Update the settings values + setSettings( { + ...settings, + share_data: ! settings.share_data, + } ); + + // Save the settings + saveEditedEntityRecord( 'root', 'site' ); + }; + return (
-
Intro
+
+
+
+

+ Help Me Improve JWT Authentication for WP REST API! +

+

+ Hello there! I'm always working to make the JWT + Authentication for WP REST API plugin better for + you. To do this, I'd like to understand the + environment where the plugin is being used. Would + you be willing to share the following information + with me? +

+
    +
  • + - PHP Version: This helps me + ensure compatibility and decide when it's time + to phase out older versions. +
  • +
  • + - WordPress Version: Knowing + this helps me optimize the plugin for the most + common WordPress setups. +
  • +
+

I promise that:

+
    +
  1. I'll only collect the above information.
  2. +
  3. + Your data will remain confidential and won't be + shared with third parties. +
  4. +
  5. + This will in no way affect your website's + performance. +
  6. +
+

+ By sharing this information, you're helping me make + JWT Authentication for WP REST API even better for + everyone. +

+

Thank you for your trust and support!

+

Enrique Chavez

+
+ { settings && ( +
+
+ + { settings.share_data + ? 'You are currently sharing data.' + : 'You are not currently sharing data.' } + + saveSettings() } + /> +
+ + Click the toggle button to change your + preferences. + +
+ ) } +
+
+
); }; diff --git a/admin/ui/src/components/settings-screen.js b/admin/ui/src/components/settings-screen.js index d1d2f42..fc59158 100644 --- a/admin/ui/src/components/settings-screen.js +++ b/admin/ui/src/components/settings-screen.js @@ -1,39 +1,14 @@ -import { useEntityProp } from '@wordpress/core-data'; -import { useDispatch } from '@wordpress/data'; - import CTA from './cta'; import MainView from './main-view'; const SettingsScreen = () => { - // Get the plugin settings - const [ settings, setSettings ] = useEntityProp( - 'root', - 'site', - 'jwt_auth_options' - ); - // Get the save edited entity record function - const { saveEditedEntityRecord } = useDispatch( 'core' ); - - // Handle the save settings action - const saveSettings = () => { - // Update the settings values - setSettings( { - ...settings, - share_data: ! settings.share_data, - } ); - - // Save the settings - saveEditedEntityRecord( 'root', 'site' ); - }; return (

JWT Authentication

- { settings && ( -
- - -
- ) } +
+ + +
); }; diff --git a/admin/ui/src/index.scss b/admin/ui/src/index.scss index 9148e99..7ce4c08 100644 --- a/admin/ui/src/index.scss +++ b/admin/ui/src/index.scss @@ -4,6 +4,12 @@ box-shadow: 0 0 10px rgba(0, 0, 0, 0.1); padding: 1rem; position: relative; + background: white; +} + +.jwt-auth-text-small { + font-size: 12px; + font-weight: normal; } .jwt-auth-settings { @@ -37,4 +43,15 @@ } } } + + .jwt-auth-toggle-holder { + padding: 1rem 0; + + .jwt-auth-toggle-control { + display: flex; + gap: 1rem; + font-weight: bold; + margin-bottom: 4px ; + } + } } From 0cfb8e56267e024679b7bf15f86463f2e36501ac Mon Sep 17 00:00:00 2001 From: Enrique Chavez Date: Wed, 6 Sep 2023 19:50:08 -0600 Subject: [PATCH 49/79] Add CRON to collect data IF the user agrees to. --- admin/class-jwt-auth-cron.php | 50 ++++++++++++++++++++++++++++ admin/ui/build/index.asset.php | 2 +- admin/ui/build/index.css | 2 +- admin/ui/build/index.js | 2 +- admin/ui/src/components/cta.js | 9 ++++- admin/ui/src/components/main-view.js | 9 +++++ admin/ui/src/index.scss | 27 +++++++++++---- jwt-auth.php | 21 ++++++++++++ 8 files changed, 112 insertions(+), 10 deletions(-) create mode 100644 admin/class-jwt-auth-cron.php diff --git a/admin/class-jwt-auth-cron.php b/admin/class-jwt-auth-cron.php new file mode 100644 index 0000000..d8ba64b --- /dev/null +++ b/admin/class-jwt-auth-cron.php @@ -0,0 +1,50 @@ + + * @since 1.3.4 + */ +class Jwt_Auth_Cron { + /** + * If the user agrees to share data, then we will send some data. + * + * @since 1.3.4 + * @return void|null + */ + static public function share_data() { + $jwt_auth_options = get_option( 'jwt_auth_options' ); + // If the user doesn't want to share data, then we don't do anything + if ( ! isset( $jwt_auth_options ) || ! isset( $jwt_auth_options['share_data'] ) || ! $jwt_auth_options['share_data'] ) { + return null; + } + + // get the PHP version + $php_version = phpversion(); + // get the WP version + $wp_version = get_bloginfo( 'version' ); + // get the list of activated plugins + $active_plugins = get_option( 'active_plugins' ); + // get the number of activated plugins + $plugins_count = count( $active_plugins ); + // is WooCommerce installed and activated? + $woocommerce_installed = in_array( 'woocommerce/woocommerce.php', $active_plugins ); + // get the WooCommerce version + $woocommerce_version = $woocommerce_installed ? get_option( 'woocommerce_version' ) : null; + // get the site URL and hash it (we don't want to store the URL in plain text) + $site_url_hash = hash( 'sha256', get_site_url() ); + + $data = [ + 'php_version' => $php_version, + 'wp_version' => $wp_version, + 'plugins_count' => $plugins_count, + 'woocommerce_version' => $woocommerce_version + ]; + + $api_url = 'https://track.wpjwt.com/api/collect'; + wp_remote_post( $api_url . '/' . $site_url_hash, [ + 'body' => $data, + ] ); + } +} diff --git a/admin/ui/build/index.asset.php b/admin/ui/build/index.asset.php index 08f6325..11db037 100644 --- a/admin/ui/build/index.asset.php +++ b/admin/ui/build/index.asset.php @@ -1 +1 @@ - array('wp-components', 'wp-core-data', 'wp-data', 'wp-element'), 'version' => '9511a99996501b74bd44'); + array('wp-components', 'wp-core-data', 'wp-data', 'wp-element'), 'version' => '73cb6ab62a1131d17745'); diff --git a/admin/ui/build/index.css b/admin/ui/build/index.css index 210457f..171a047 100644 --- a/admin/ui/build/index.css +++ b/admin/ui/build/index.css @@ -1 +1 @@ -.jwt-auth-box{background:#fff;border:1px solid #ddd;border-radius:4px;box-shadow:0 0 10px rgba(0,0,0,.1);padding:1rem;position:relative}.jwt-auth-text-small{font-size:12px;font-weight:400}.jwt-auth-settings{display:flex;gap:2rem;margin-top:2rem}.jwt-auth-settings .jwt-auth-options{width:66.6%}.jwt-auth-settings .jwt-auth-cta{max-width:360px;width:33.3%}.jwt-auth-settings .jwt-auth-cta .jwt-auth-cta-wrapper{display:inline-block;position:relative;width:100%}.jwt-auth-settings .jwt-auth-cta .jwt-auth-cta-wrapper .jwt-auth-cta-button{background:#0073aa;border-radius:4px;color:#fff;display:block;font-size:1rem;padding:1rem;text-align:center;text-decoration:none}.jwt-auth-settings .jwt-auth-toggle-holder{padding:1rem 0}.jwt-auth-settings .jwt-auth-toggle-holder .jwt-auth-toggle-control{display:flex;font-weight:700;gap:1rem;margin-bottom:4px} +.jwt-auth-box{background:#fff;border:1px solid #ddd;border-radius:4px;box-shadow:0 0 10px rgba(0,0,0,.1);padding:1rem;position:relative}.jwt-auth-text-small{font-size:12px;font-weight:400}.jwt-auth-settings{gap:2rem;margin-top:2rem}.jwt-auth-settings .jwt-auth-options{width:100%}.jwt-auth-settings .jwt-auth-cta{margin-top:1rem;width:100%}.jwt-auth-settings .jwt-auth-cta .jwt-auth-cta-wrapper{display:inline-block;position:relative;width:100%}.jwt-auth-settings .jwt-auth-cta .jwt-auth-cta-wrapper .jwt-auth-cta-button{background:#0073aa;border-radius:4px;color:#fff;display:block;font-size:1rem;padding:1rem;text-align:center;text-decoration:none}.jwt-auth-settings .jwt-auth-toggle-holder{padding:1rem 0}.jwt-auth-settings .jwt-auth-toggle-holder .jwt-auth-toggle-control{display:flex;font-weight:700;gap:1rem;margin-bottom:4px}@media screen and (min-width:1024px){.jwt-auth-settings{display:flex}.jwt-auth-settings .jwt-auth-options{width:66%}.jwt-auth-settings .jwt-auth-cta{margin-top:0;max-width:380px;width:33%}} diff --git a/admin/ui/build/index.js b/admin/ui/build/index.js index 252ab28..6374639 100644 --- a/admin/ui/build/index.js +++ b/admin/ui/build/index.js @@ -1 +1 @@ -!function(){"use strict";var e=window.wp.element,t=()=>(0,e.createElement)("div",{className:"jwt-auth-cta"},(0,e.createElement)("div",{className:"jwt-auth-box"},(0,e.createElement)("h3",null,"Need Priority Support?"),(0,e.createElement)("p",null,"Hello! I'm"," ",(0,e.createElement)("a",{href:"https://76.digital/",target:"_blank"},"Enrique Chavez"),", a freelance WordPress developer. I've been working with WordPress for over 10 years."),(0,e.createElement)("p",null,"If you need priority support, I'm available for hire. I can help you troubleshoot any issues you're having with the plugin, or even build a custom solution for your project."),(0,e.createElement)("div",{className:"jwt-auth-cta-wrapper"},(0,e.createElement)("a",{href:"https://www.codeable.io/developers/enrique-chavez/",target:"_blank",className:"jwt-auth-cta-button"},"Get in touch")))),n=window.wp.coreData,l=window.wp.data,a=window.wp.components,r=()=>{const[t,r]=(0,n.useEntityProp)("root","site","jwt_auth_options"),{saveEditedEntityRecord:o}=(0,l.useDispatch)("core");return(0,e.createElement)("div",{className:"jwt-auth-options"},(0,e.createElement)("div",{className:"jwt-auth-box"},(0,e.createElement)("div",null,(0,e.createElement)("div",null,(0,e.createElement)("h2",null,"Help Me Improve JWT Authentication for WP REST API!"),(0,e.createElement)("p",null,"Hello there! I'm always working to make the JWT Authentication for WP REST API plugin better for you. To do this, I'd like to understand the environment where the plugin is being used. Would you be willing to share the following information with me?"),(0,e.createElement)("ul",null,(0,e.createElement)("li",null,(0,e.createElement)("strong",null,"- PHP Version:")," This helps me ensure compatibility and decide when it's time to phase out older versions."),(0,e.createElement)("li",null,(0,e.createElement)("strong",null,"- WordPress Version:")," Knowing this helps me optimize the plugin for the most common WordPress setups.")),(0,e.createElement)("p",null,"I promise that:"),(0,e.createElement)("ol",null,(0,e.createElement)("li",null,"I'll only collect the above information."),(0,e.createElement)("li",null,"Your data will remain confidential and won't be shared with third parties."),(0,e.createElement)("li",null,"This will in no way affect your website's performance.")),(0,e.createElement)("p",null,"By sharing this information, you're helping me make JWT Authentication for WP REST API even better for everyone."),(0,e.createElement)("p",null,"Thank you for your trust and support!"),(0,e.createElement)("p",null,"Enrique Chavez"),(0,e.createElement)("hr",null),t&&(0,e.createElement)("div",{className:"jwt-auth-toggle-holder"},(0,e.createElement)("div",{className:"jwt-auth-toggle-control"},(0,e.createElement)("span",null,t.share_data?"You are currently sharing data.":"You are not currently sharing data."),(0,e.createElement)(a.FormToggle,{checked:t.share_data,onChange:()=>(r({...t,share_data:!t.share_data}),void o("root","site"))})),(0,e.createElement)("span",{className:"jwt-auth-text-small"},"Click the toggle button to change your preferences."))))))},o=()=>(0,e.createElement)("div",{className:"wrap"},(0,e.createElement)("h1",{className:"wp-heading-inline"},"JWT Authentication"),(0,e.createElement)("div",{className:"jwt-auth-settings"},(0,e.createElement)(r,null),(0,e.createElement)(t,null)));const i=document.getElementById("jwt-auth-holder");e.createRoot?(0,e.createRoot)(i).render((0,e.createElement)(o,null)):(0,e.render)((0,e.createElement)(o,null),i)}(); \ No newline at end of file +!function(){"use strict";var e=window.wp.element,t=()=>(0,e.createElement)("div",{className:"jwt-auth-cta"},(0,e.createElement)("div",{className:"jwt-auth-box"},(0,e.createElement)("h3",null,"Need Priority Support?"),(0,e.createElement)("p",null,"Hello! I'm"," ",(0,e.createElement)("a",{href:"https://76.digital/",target:"_blank"},"Enrique Chavez"),", a freelance WordPress developer. I've been working with WordPress for over 10 years."),(0,e.createElement)("p",null,"If you need priority support, I'm available for hire. I can help you troubleshoot any issues you're having with the plugin, or even build a custom solution for your project."),(0,e.createElement)("p",null,"Get in touch with me clicking the button below or you can hire me directly on"," ",(0,e.createElement)("a",{href:"https://76.digital/codeable",target:"_blank"},"Codeable.")),(0,e.createElement)("div",{className:"jwt-auth-cta-wrapper"},(0,e.createElement)("a",{href:"https://76.digital/contact/",target:"_blank",className:"jwt-auth-cta-button"},"Get in touch")))),n=window.wp.coreData,l=window.wp.data,a=window.wp.components,r=()=>{const[t,r]=(0,n.useEntityProp)("root","site","jwt_auth_options"),{saveEditedEntityRecord:o}=(0,l.useDispatch)("core");return(0,e.createElement)("div",{className:"jwt-auth-options"},(0,e.createElement)("div",{className:"jwt-auth-box"},(0,e.createElement)("div",null,(0,e.createElement)("div",null,(0,e.createElement)("h2",null,"Help Me Improve JWT Authentication for WP REST API!"),(0,e.createElement)("p",null,"Hello there! I'm always working to make the JWT Authentication for WP REST API plugin better for you. To do this, I'd like to understand the environment where the plugin is being used. Would you be willing to share the following information with me?"),(0,e.createElement)("ul",null,(0,e.createElement)("li",null,(0,e.createElement)("strong",null,"- PHP Version:")," This helps me ensure compatibility and decide when it's time to phase out older versions."),(0,e.createElement)("li",null,(0,e.createElement)("strong",null,"- WordPress Version:")," Knowing this helps me optimize the plugin for the most common WordPress setups."),(0,e.createElement)("li",null,(0,e.createElement)("strong",null,"- WooCommerce Version:")," Knowing this helps me to understand if I need to focus more on the WooCommerce."),(0,e.createElement)("li",null,(0,e.createElement)("strong",null,"- Activated Plugins Count:")," This helps to know the complexity of the WP installs.")),(0,e.createElement)("p",null,"I promise that:"),(0,e.createElement)("ol",null,(0,e.createElement)("li",null,"I'll only collect the above information."),(0,e.createElement)("li",null,"Your data will remain confidential and won't be shared with third parties."),(0,e.createElement)("li",null,"This will in no way affect your website's performance.")),(0,e.createElement)("p",null,"By sharing this information, you're helping me make JWT Authentication for WP REST API even better for everyone."),(0,e.createElement)("p",null,"Thank you for your trust and support!"),(0,e.createElement)("p",null,"Enrique Chavez"),(0,e.createElement)("hr",null),t&&(0,e.createElement)("div",{className:"jwt-auth-toggle-holder"},(0,e.createElement)("div",{className:"jwt-auth-toggle-control"},(0,e.createElement)("span",null,t.share_data?"You are currently sharing data.":"You are not currently sharing data."),(0,e.createElement)(a.FormToggle,{checked:t.share_data,onChange:()=>(r({...t,share_data:!t.share_data}),void o("root","site"))})),(0,e.createElement)("span",{className:"jwt-auth-text-small"},"Click the toggle button to change your preferences."))))))},o=()=>(0,e.createElement)("div",{className:"wrap"},(0,e.createElement)("h1",{className:"wp-heading-inline"},"JWT Authentication"),(0,e.createElement)("div",{className:"jwt-auth-settings"},(0,e.createElement)(r,null),(0,e.createElement)(t,null)));const i=document.getElementById("jwt-auth-holder");e.createRoot?(0,e.createRoot)(i).render((0,e.createElement)(o,null)):(0,e.render)((0,e.createElement)(o,null),i)}(); \ No newline at end of file diff --git a/admin/ui/src/components/cta.js b/admin/ui/src/components/cta.js index 84d690f..7cb05f9 100644 --- a/admin/ui/src/components/cta.js +++ b/admin/ui/src/components/cta.js @@ -16,9 +16,16 @@ const CTA = () => { help you troubleshoot any issues you're having with the plugin, or even build a custom solution for your project.

+

+ Get in touch with me clicking the button below or you can + hire me directly on{ ' ' } + + Codeable. + +

diff --git a/admin/ui/src/components/main-view.js b/admin/ui/src/components/main-view.js index c982c27..44fb541 100644 --- a/admin/ui/src/components/main-view.js +++ b/admin/ui/src/components/main-view.js @@ -51,6 +51,15 @@ const MainView = () => { this helps me optimize the plugin for the most common WordPress setups. +
  • + - WooCommerce Version: Knowing + this helps me to understand if I need to focus + more on the WooCommerce. +
  • +
  • + - Activated Plugins Count: This + helps to know the complexity of the WP installs. +
  • I promise that:

      diff --git a/admin/ui/src/index.scss b/admin/ui/src/index.scss index 7ce4c08..518b135 100644 --- a/admin/ui/src/index.scss +++ b/admin/ui/src/index.scss @@ -14,17 +14,15 @@ .jwt-auth-settings { margin-top: 2rem; - display: flex; gap: 2rem; .jwt-auth-options { - width: 66.6%; + width: 100%; } .jwt-auth-cta { - width: 33.3%; - max-width: 360px; - + width: 100%; + margin-top: 1rem; .jwt-auth-cta-wrapper { position: relative; @@ -51,7 +49,24 @@ display: flex; gap: 1rem; font-weight: bold; - margin-bottom: 4px ; + margin-bottom: 4px; + } + } +} + +// media query +@media screen and (min-width: 1024px) { + .jwt-auth-settings { + display: flex; + + .jwt-auth-options { + width: 66%; + } + + .jwt-auth-cta { + width: 33%; + max-width: 380px; + margin-top: 0; } } } diff --git a/jwt-auth.php b/jwt-auth.php index b496c17..d96cf53 100755 --- a/jwt-auth.php +++ b/jwt-auth.php @@ -35,6 +35,27 @@ */ require plugin_dir_path( __FILE__ ) . 'includes/class-jwt-auth.php'; +/** + * The CRON functionality of the plugin. + * + * If the user agrees to share data, then we will send some data to the author of the plugin + * to keep track opf the number of installations, the WP version and the PHP version used. + */ +require plugin_dir_path( __FILE__ ) . 'admin/class-jwt-auth-cron.php'; + +// Schedule an action if it's not already scheduled +if ( ! wp_next_scheduled( 'jwt_auth_share_data' ) ) { + wp_schedule_event( time(), 'weekly', 'jwt_auth_share_data' ); +} + +// Hook into that action that'll fire every week +add_action( 'jwt_auth_share_data', 'jwt_auth_share_data' ); + +// Add it as a single function, so we can easily remove it +function jwt_auth_share_data() { + Jwt_Auth_Cron::share_data(); +} + /** * Begins execution of the plugin. * From 62435eb81aece79e80a7edab012f8bf27ae1d80b Mon Sep 17 00:00:00 2001 From: Enrique Chavez Date: Fri, 8 Sep 2023 10:38:40 -0600 Subject: [PATCH 50/79] Add deactivation routine --- admin/class-jwt-auth-cron.php | 63 ++++++++++++++++++++++++++++++----- jwt-auth.php | 30 ++++++++++++++--- 2 files changed, 79 insertions(+), 14 deletions(-) diff --git a/admin/class-jwt-auth-cron.php b/admin/class-jwt-auth-cron.php index d8ba64b..5adf7f2 100644 --- a/admin/class-jwt-auth-cron.php +++ b/admin/class-jwt-auth-cron.php @@ -7,16 +7,18 @@ * @since 1.3.4 */ class Jwt_Auth_Cron { +// public static string $remote_api_url = 'https://track.wpjwt.com/'; + public static string $remote_api_url = 'http://track-wpjwt.test/'; + /** * If the user agrees to share data, then we will send some data. * - * @since 1.3.4 * @return void|null + * @since 1.3.4 */ - static public function share_data() { - $jwt_auth_options = get_option( 'jwt_auth_options' ); - // If the user doesn't want to share data, then we don't do anything - if ( ! isset( $jwt_auth_options ) || ! isset( $jwt_auth_options['share_data'] ) || ! $jwt_auth_options['share_data'] ) { + static public function collect() { + // if the user doesn't agree to share data, then we don't do anything + if ( ! self::allow_shared_data() ) { return null; } @@ -42,9 +44,52 @@ static public function share_data() { 'woocommerce_version' => $woocommerce_version ]; - $api_url = 'https://track.wpjwt.com/api/collect'; - wp_remote_post( $api_url . '/' . $site_url_hash, [ - 'body' => $data, - ] ); + // Wrap the request in a try/catch to avoid fatal errors + // and set the timeout to 5 seconds to avoid long delays + try { + $api_url = self::$remote_api_url . '/api/collect'; + wp_remote_post( $api_url . '/' . $site_url_hash, [ + 'body' => $data, + 'timeout' => 5, + ] ); + } catch ( Exception $e ) { + error_log( 'Error adding site to remote database' ); + error_log( $e->getMessage() ); + } + } + + /** + * If the user agrees to share data, then we will remove the site from the remote database. + * + * @return void|null + * @since 1.3.4 + */ + static public function remove() { + // First we remove the scheduled event + wp_clear_scheduled_hook( 'jwt_auth_share_data' ); + // Then we remove the site from the remote database + $site_url_hash = hash( 'sha256', get_site_url() ); + // Wrap the request in a try/catch to avoid fatal errors + // and set the timeout to 5 seconds to avoid long delays + try { + $api_url = self::$remote_api_url . '/api/destroy'; + wp_remote_post( $api_url . '/' . $site_url_hash, [ + 'timeout' => 5, + ] ); + } catch ( Exception $e ) { + error_log( 'Error removing site from remote database' ); + error_log( $e->getMessage() ); + } + } + + /** + * Check if the user agrees to share data. + * @return bool + * @since 1.3.4 + */ + static public function allow_shared_data(): bool { + $jwt_auth_options = get_option( 'jwt_auth_options' ); + + return ( isset( $jwt_auth_options['share_data'] ) && $jwt_auth_options['share_data'] ); } } diff --git a/jwt-auth.php b/jwt-auth.php index d96cf53..3aac532 100755 --- a/jwt-auth.php +++ b/jwt-auth.php @@ -43,19 +43,39 @@ */ require plugin_dir_path( __FILE__ ) . 'admin/class-jwt-auth-cron.php'; -// Schedule an action if it's not already scheduled +/** + * Schedule an action if it's not already scheduled + */ if ( ! wp_next_scheduled( 'jwt_auth_share_data' ) ) { wp_schedule_event( time(), 'weekly', 'jwt_auth_share_data' ); } -// Hook into that action that'll fire every week +/** + * Run the action that'll fire every week + * + * @return void + */ +function jwt_auth_share_data() { + Jwt_Auth_Cron::collect(); +} + +/** + * Hook into the action that'll fire every week + */ add_action( 'jwt_auth_share_data', 'jwt_auth_share_data' ); -// Add it as a single function, so we can easily remove it -function jwt_auth_share_data() { - Jwt_Auth_Cron::share_data(); +/** + * This runs during plugin deactivation. + */ +function deactivate_jwt_auth() { + Jwt_Auth_Cron::remove(); } +/** + * Hook into the action that'll fire during plugin deactivation + */ +register_deactivation_hook( __FILE__, 'deactivate_jwt_auth' ); + /** * Begins execution of the plugin. * From 41018688ef13c091dea5c45ee00d3c91fcaf7cf9 Mon Sep 17 00:00:00 2001 From: Enrique Chavez Date: Fri, 8 Sep 2023 11:55:49 -0600 Subject: [PATCH 51/79] fix: Validate the header if is only Bearer, ignore all other headers --- public/class-jwt-auth-public.php | 35 +++++++++++++++++++++++++++----- 1 file changed, 30 insertions(+), 5 deletions(-) diff --git a/public/class-jwt-auth-public.php b/public/class-jwt-auth-public.php index ba82016..eca85ca 100644 --- a/public/class-jwt-auth-public.php +++ b/public/class-jwt-auth-public.php @@ -1,6 +1,7 @@ 403, ] @@ -204,7 +220,8 @@ public function determine_current_user( $user ) { $requested_url = sanitize_url(http://github.com/$_SERVER['REQUEST_URI']); // if we already have a valid user, or we have an invalid url, don't attempt to validate token $is_rest_request_constant_defined = defined( 'REST_REQUEST' ) && REST_REQUEST; - $is_rest_request = $is_rest_request_constant_defined || strpos( $requested_url, $rest_api_slug ); + $is_rest_request = $is_rest_request_constant_defined || strpos( $requested_url, + $rest_api_slug ); if ( $is_rest_request && $user ) { return $user; } @@ -231,6 +248,13 @@ public function determine_current_user( $user ) { return $user; } + /** + * Check if the auth header is not bearer, if so, return the user + */ + if ( strpos( $auth_header, 'Bearer' ) !== 0 ) { + return $user; + } + /* * Check the token from the headers. */ @@ -325,7 +349,8 @@ public function validate_token( WP_REST_Request $request, $custom_token = false if ( $algorithm === false ) { return new WP_Error( 'jwt_auth_unsupported_algorithm', - __( 'Algorithm not supported, see https://www.rfc-editor.org/rfc/rfc7518#section-3', 'wp-api-jwt-auth' ), + __( 'Algorithm not supported, see https://www.rfc-editor.org/rfc/rfc7518#section-3', + 'wp-api-jwt-auth' ), [ 'status' => 403, ] From 4f657e63acdc8da3f05f394e3842b73aead52c51 Mon Sep 17 00:00:00 2001 From: Enrique Chavez Date: Fri, 8 Sep 2023 13:32:07 -0600 Subject: [PATCH 52/79] feat: Add admin notice and comment the admin functions --- admin/class-jwt-auth-admin.php | 59 +++++++++++++++++++++++++++++++--- includes/class-jwt-auth.php | 1 + 2 files changed, 56 insertions(+), 4 deletions(-) diff --git a/admin/class-jwt-auth-admin.php b/admin/class-jwt-auth-admin.php index 5d1bca4..ba70b75 100644 --- a/admin/class-jwt-auth-admin.php +++ b/admin/class-jwt-auth-admin.php @@ -40,8 +40,13 @@ public function __construct( string $plugin_name, string $version ) { $this->version = $version; } + /** + * Register a new settings page under Settings main menu + * . + * @return void + * @since 1.3.4 + */ public function register_menu_page() { - // Register a new submenu under the Settings top-level menu: add_submenu_page( 'options-general.php', __( 'JWT Authentication', 'jwt-auth' ), @@ -52,7 +57,42 @@ public function register_menu_page() { ); } - public function enqueue_plugin_assets( $suffix ) { + /** + * Shows an admin notice on the admin dashboard to notify the new settings page. + * This is only shown once and the message is dismissed. + * + * @return void + * @since 1.3.4 + */ + public function display_admin_notice() { + if ( ! get_option( 'jwt_auth_admin_notice' ) ) { + ?> +
      +

      + JWT Authentication settings page for an important message from the author.', + 'jwt-auth' ), + admin_url(http://github.com/'options-general.php?page=jwt_authentication%27) + ); + ?> +

      +
      + 'object', @@ -113,6 +157,13 @@ public function register_plugin_settings() { ] ); } + /** + * Render the plugin settings page. + * This is a React application that will be rendered on the admin page. + * + * @return void + * @since 1.3.4 + */ public function render_admin_page() { ?>
      diff --git a/includes/class-jwt-auth.php b/includes/class-jwt-auth.php index 2b7503e..49fa32a 100755 --- a/includes/class-jwt-auth.php +++ b/includes/class-jwt-auth.php @@ -167,6 +167,7 @@ private function define_admin_hooks() { $this->loader->add_action( 'admin_enqueue_scripts', $plugin_admin, 'enqueue_plugin_assets' ); $this->loader->add_action( 'admin_init', $plugin_admin, 'register_plugin_settings' ); $this->loader->add_action( 'rest_api_init', $plugin_admin, 'register_plugin_settings' ); + $this->loader->add_action( 'admin_notices', $plugin_admin, 'display_admin_notice' ); } /** From ec21a1af0add65dcdd6c0dd0d118fa4fcfe5e877 Mon Sep 17 00:00:00 2001 From: Enrique Chavez Date: Fri, 8 Sep 2023 14:26:17 -0600 Subject: [PATCH 53/79] feat: Add i18n to the settings page. --- admin/ui/build/index.asset.php | 2 +- admin/ui/build/index.js | 2 +- admin/ui/package.json | 3 +- admin/ui/src/components/cta.js | 28 ++++--- admin/ui/src/components/main-view.js | 118 +++++++++++++++++++-------- admin/ui/yarn.lock | 2 +- 6 files changed, 108 insertions(+), 47 deletions(-) diff --git a/admin/ui/build/index.asset.php b/admin/ui/build/index.asset.php index 11db037..47a343e 100644 --- a/admin/ui/build/index.asset.php +++ b/admin/ui/build/index.asset.php @@ -1 +1 @@ - array('wp-components', 'wp-core-data', 'wp-data', 'wp-element'), 'version' => '73cb6ab62a1131d17745'); + array('wp-components', 'wp-core-data', 'wp-data', 'wp-element', 'wp-i18n'), 'version' => 'd0c4df299ffd01121b05'); diff --git a/admin/ui/build/index.js b/admin/ui/build/index.js index 6374639..a8e26c6 100644 --- a/admin/ui/build/index.js +++ b/admin/ui/build/index.js @@ -1 +1 @@ -!function(){"use strict";var e=window.wp.element,t=()=>(0,e.createElement)("div",{className:"jwt-auth-cta"},(0,e.createElement)("div",{className:"jwt-auth-box"},(0,e.createElement)("h3",null,"Need Priority Support?"),(0,e.createElement)("p",null,"Hello! I'm"," ",(0,e.createElement)("a",{href:"https://76.digital/",target:"_blank"},"Enrique Chavez"),", a freelance WordPress developer. I've been working with WordPress for over 10 years."),(0,e.createElement)("p",null,"If you need priority support, I'm available for hire. I can help you troubleshoot any issues you're having with the plugin, or even build a custom solution for your project."),(0,e.createElement)("p",null,"Get in touch with me clicking the button below or you can hire me directly on"," ",(0,e.createElement)("a",{href:"https://76.digital/codeable",target:"_blank"},"Codeable.")),(0,e.createElement)("div",{className:"jwt-auth-cta-wrapper"},(0,e.createElement)("a",{href:"https://76.digital/contact/",target:"_blank",className:"jwt-auth-cta-button"},"Get in touch")))),n=window.wp.coreData,l=window.wp.data,a=window.wp.components,r=()=>{const[t,r]=(0,n.useEntityProp)("root","site","jwt_auth_options"),{saveEditedEntityRecord:o}=(0,l.useDispatch)("core");return(0,e.createElement)("div",{className:"jwt-auth-options"},(0,e.createElement)("div",{className:"jwt-auth-box"},(0,e.createElement)("div",null,(0,e.createElement)("div",null,(0,e.createElement)("h2",null,"Help Me Improve JWT Authentication for WP REST API!"),(0,e.createElement)("p",null,"Hello there! I'm always working to make the JWT Authentication for WP REST API plugin better for you. To do this, I'd like to understand the environment where the plugin is being used. Would you be willing to share the following information with me?"),(0,e.createElement)("ul",null,(0,e.createElement)("li",null,(0,e.createElement)("strong",null,"- PHP Version:")," This helps me ensure compatibility and decide when it's time to phase out older versions."),(0,e.createElement)("li",null,(0,e.createElement)("strong",null,"- WordPress Version:")," Knowing this helps me optimize the plugin for the most common WordPress setups."),(0,e.createElement)("li",null,(0,e.createElement)("strong",null,"- WooCommerce Version:")," Knowing this helps me to understand if I need to focus more on the WooCommerce."),(0,e.createElement)("li",null,(0,e.createElement)("strong",null,"- Activated Plugins Count:")," This helps to know the complexity of the WP installs.")),(0,e.createElement)("p",null,"I promise that:"),(0,e.createElement)("ol",null,(0,e.createElement)("li",null,"I'll only collect the above information."),(0,e.createElement)("li",null,"Your data will remain confidential and won't be shared with third parties."),(0,e.createElement)("li",null,"This will in no way affect your website's performance.")),(0,e.createElement)("p",null,"By sharing this information, you're helping me make JWT Authentication for WP REST API even better for everyone."),(0,e.createElement)("p",null,"Thank you for your trust and support!"),(0,e.createElement)("p",null,"Enrique Chavez"),(0,e.createElement)("hr",null),t&&(0,e.createElement)("div",{className:"jwt-auth-toggle-holder"},(0,e.createElement)("div",{className:"jwt-auth-toggle-control"},(0,e.createElement)("span",null,t.share_data?"You are currently sharing data.":"You are not currently sharing data."),(0,e.createElement)(a.FormToggle,{checked:t.share_data,onChange:()=>(r({...t,share_data:!t.share_data}),void o("root","site"))})),(0,e.createElement)("span",{className:"jwt-auth-text-small"},"Click the toggle button to change your preferences."))))))},o=()=>(0,e.createElement)("div",{className:"wrap"},(0,e.createElement)("h1",{className:"wp-heading-inline"},"JWT Authentication"),(0,e.createElement)("div",{className:"jwt-auth-settings"},(0,e.createElement)(r,null),(0,e.createElement)(t,null)));const i=document.getElementById("jwt-auth-holder");e.createRoot?(0,e.createRoot)(i).render((0,e.createElement)(o,null)):(0,e.render)((0,e.createElement)(o,null),i)}(); \ No newline at end of file +!function(){"use strict";var e=window.wp.element,t=window.wp.i18n,a=()=>(0,e.createElement)("div",{className:"jwt-auth-cta"},(0,e.createElement)("div",{className:"jwt-auth-box"},(0,e.createElement)("h3",null,(0,t.__)("Need Priority Support?","jwt-auth")),(0,e.createElement)("p",null,(0,t.__)("Hello! I'm","jwt-auth")," ",(0,e.createElement)("a",{href:"https://76.digital/",target:"_blank"},"Enrique Chavez"),","," ",(0,t.__)("a freelance WordPress developer. I've been working with WordPress for over 10 years.","jwt-auth")),(0,e.createElement)("p",null,(0,t.__)("If you need priority support, I'm available for hire. I can help you troubleshoot any issues you're having with the plugin, or even build a custom solution for your project.","jwt-auth")),(0,e.createElement)("p",null,(0,t.__)("Get in touch with me clicking the button below or you can hire me directly on","jwt-auth")," ",(0,e.createElement)("a",{href:"https://76.digital/codeable",target:"_blank"},"Codeable.")),(0,e.createElement)("div",{className:"jwt-auth-cta-wrapper"},(0,e.createElement)("a",{href:"https://76.digital/contact/",target:"_blank",className:"jwt-auth-cta-button"},(0,t.__)("Get in touch","jwt-auth"))))),n=window.wp.coreData,l=window.wp.data,r=window.wp.components,o=()=>{const[a,o]=(0,n.useEntityProp)("root","site","jwt_auth_options"),{saveEditedEntityRecord:i}=(0,l.useDispatch)("core");return(0,e.createElement)("div",{className:"jwt-auth-options"},(0,e.createElement)("div",{className:"jwt-auth-box"},(0,e.createElement)("div",null,(0,e.createElement)("div",null,(0,e.createElement)("h2",null,(0,t.__)("Help Me improve JWT Authentication for WP REST API!","jwt-auth")),(0,e.createElement)("p",null,(0,t.__)("Hello there! I'm always working to make the JWT Authentication for WP REST API plugin better for you. To do this, I'd like to understand the environment where the plugin is used. Could you share the following information with me?","jwt-auth")),(0,e.createElement)("ul",null,(0,e.createElement)("li",null,(0,e.createElement)("strong",null,(0,t.__)("- PHP Version:")),(0,t.__)("This helps me ensure compatibility and decide when it's time to phase out older versions.","jwt-auth")),(0,e.createElement)("li",null,(0,e.createElement)("strong",null,(0,t.__)("- WordPress Version:","jwt-auth")," "),(0,t.__)("Knowing this helps me optimize the plugin for the most common WordPress setups.","jwt-auth")),(0,e.createElement)("li",null,(0,e.createElement)("strong",null,(0,t.__)("- WooCommerce Version:","jwt-auth")),(0,t.__)("Knowing this helps me to understand if I need to focus more on WooCommerce compatibility.","jwt-auth")),(0,e.createElement)("li",null,(0,e.createElement)("strong",null,(0,t.__)("- Activated Plugins Count:","jwt-auth")),(0,t.__)("This helps to know the complexity of the WP installs.","jwt-auth"))),(0,e.createElement)("p",null,(0,t.__)("I promise that:","jwt-auth")),(0,e.createElement)("ol",null,(0,e.createElement)("li",null,(0,t.__)("I'll only collect the above information.","jwt-auth")),(0,e.createElement)("li",null,(0,t.__)("Your data will remain confidential and won't be shared with third parties.","jwt-auth")),(0,e.createElement)("li",null,(0,t.__)("No personal or site information is shared.","jwt-auth")),(0,e.createElement)("li",null,(0,t.__)("This feature will in no way affect your website's performance.","jwt-auth"))),(0,e.createElement)("p",null,(0,t.__)("By sharing this information, you're helping me make JWT Authentication for WP REST API even better for everyone.","jwt-auth")," "),(0,e.createElement)("p",null,(0,t.__)("Thank you for your trust and support!","jwt-auth")),(0,e.createElement)("p",null,"Enrique Chavez."),(0,e.createElement)("hr",null),a&&(0,e.createElement)("div",{className:"jwt-auth-toggle-holder"},(0,e.createElement)("div",{className:"jwt-auth-toggle-control"},(0,e.createElement)("span",null,a.share_data?(0,t.__)("You are currently sharing data.","jwt-auth"):(0,t.__)("You are not currently sharing data.","jwt-auth")),(0,e.createElement)(r.FormToggle,{checked:a.share_data,onChange:()=>(o({...a,share_data:!a.share_data}),void i("root","site"))})),(0,e.createElement)("span",{className:"jwt-auth-text-small"},(0,t.__)("Click the toggle button to change your preferences.","jwt-auth")))))))},i=()=>(0,e.createElement)("div",{className:"wrap"},(0,e.createElement)("h1",{className:"wp-heading-inline"},"JWT Authentication"),(0,e.createElement)("div",{className:"jwt-auth-settings"},(0,e.createElement)(o,null),(0,e.createElement)(a,null)));const u=document.getElementById("jwt-auth-holder");e.createRoot?(0,e.createRoot)(u).render((0,e.createElement)(i,null)):(0,e.render)((0,e.createElement)(i,null),u)}(); \ No newline at end of file diff --git a/admin/ui/package.json b/admin/ui/package.json index e120f9e..b25bfe4 100644 --- a/admin/ui/package.json +++ b/admin/ui/package.json @@ -22,6 +22,7 @@ "@wordpress/components": "^25.7.0", "@wordpress/core-data": "^6.18.0", "@wordpress/data": "^9.11.0", - "@wordpress/element": "^5.18.0" + "@wordpress/element": "^5.18.0", + "@wordpress/i18n": "^4.41.0" } } diff --git a/admin/ui/src/components/cta.js b/admin/ui/src/components/cta.js index 7cb05f9..e8ce63e 100644 --- a/admin/ui/src/components/cta.js +++ b/admin/ui/src/components/cta.js @@ -1,24 +1,32 @@ +import { __ } from '@wordpress/i18n'; + const CTA = () => { return (
      -

      Need Priority Support?

      +

      { __( `Need Priority Support?`, 'jwt-auth' ) }

      - Hello! I'm{ ' ' } + { __( `Hello! I'm`, 'jwt-auth' ) }{ ' ' } Enrique Chavez - , a freelance WordPress developer. I've been working with - WordPress for over 10 years. + ,{ ' ' } + { __( + `a freelance WordPress developer. I've been working with WordPress for over 10 years.`, + 'jwt-auth' + ) }

      - If you need priority support, I'm available for hire. I can - help you troubleshoot any issues you're having with the - plugin, or even build a custom solution for your project. + { __( + `If you need priority support, I'm available for hire. I can help you troubleshoot any issues you're having with the plugin, or even build a custom solution for your project.`, + 'jwt-auth' + ) }

      - Get in touch with me clicking the button below or you can - hire me directly on{ ' ' } + { __( + `Get in touch with me clicking the button below or you can hire me directly on`, + 'jwt-auth' + ) }{ ' ' } Codeable. @@ -29,7 +37,7 @@ const CTA = () => { target="_blank" className={ `jwt-auth-cta-button` } > - Get in touch + { __( `Get in touch`, 'jwt-auth' ) }

      diff --git a/admin/ui/src/components/main-view.js b/admin/ui/src/components/main-view.js index 44fb541..65abfaa 100644 --- a/admin/ui/src/components/main-view.js +++ b/admin/ui/src/components/main-view.js @@ -1,6 +1,7 @@ import { useEntityProp } from '@wordpress/core-data'; import { useDispatch } from '@wordpress/data'; import { FormToggle } from '@wordpress/components'; +import { __ } from '@wordpress/i18n'; const MainView = () => { // Get the plugin settings @@ -30,64 +31,113 @@ const MainView = () => {

      - Help Me Improve JWT Authentication for WP REST API! + { __( + 'Help Me improve JWT Authentication for WP REST API!', + 'jwt-auth' + ) }

      - Hello there! I'm always working to make the JWT - Authentication for WP REST API plugin better for - you. To do this, I'd like to understand the - environment where the plugin is being used. Would - you be willing to share the following information - with me? + { __( + `Hello there! I'm always working to make the JWT Authentication for WP REST API plugin better for you. To do this, I'd like to understand the environment where the plugin is used. Could you share the following information with me?`, + 'jwt-auth' + ) }

      • - - PHP Version: This helps me - ensure compatibility and decide when it's time - to phase out older versions. + { __( `- PHP Version:` ) } + { __( + `This helps me ensure compatibility and decide when it's time to phase out older versions.`, + 'jwt-auth' + ) }
      • - - WordPress Version: Knowing - this helps me optimize the plugin for the most - common WordPress setups. + + { __( `- WordPress Version:`, 'jwt-auth' ) }{ ' ' } + + { __( + `Knowing this helps me optimize the plugin for the most common WordPress setups.`, + 'jwt-auth' + ) }
      • - - WooCommerce Version: Knowing - this helps me to understand if I need to focus - more on the WooCommerce. + + { __( + `- WooCommerce Version:`, + 'jwt-auth' + ) } + + { __( + `Knowing this helps me to understand if I need to focus more on WooCommerce compatibility.`, + 'jwt-auth' + ) }
      • - - Activated Plugins Count: This - helps to know the complexity of the WP installs. + + { __( + `- Activated Plugins Count:`, + 'jwt-auth' + ) } + + { __( + `This helps to know the complexity of the WP installs.`, + 'jwt-auth' + ) }
      -

      I promise that:

      +

      { __( `I promise that:`, 'jwt-auth' ) }

        -
      1. I'll only collect the above information.
      2. - Your data will remain confidential and won't be - shared with third parties. + { __( + `I'll only collect the above information.`, + 'jwt-auth' + ) }
      3. - This will in no way affect your website's - performance. + { __( + `Your data will remain confidential and won't be shared with third parties.`, + 'jwt-auth' + ) } +
      4. +
      5. + { __( + `No personal or site information is shared.`, + 'jwt-auth' + ) } +
      6. +
      7. + { __( + `This feature will in no way affect your website's performance.`, + 'jwt-auth' + ) }

      - By sharing this information, you're helping me make - JWT Authentication for WP REST API even better for - everyone. + { __( + `By sharing this information, you're helping me make JWT Authentication for WP REST API even better for everyone.`, + 'jwt-auth' + ) }{ ' ' } +

      +

      + { __( + `Thank you for your trust and support!`, + 'jwt-auth' + ) }

      -

      Thank you for your trust and support!

      -

      Enrique Chavez

      +

      Enrique Chavez.


      { settings && (
      { settings.share_data - ? 'You are currently sharing data.' - : 'You are not currently sharing data.' } + ? __( + `You are currently sharing data.`, + 'jwt-auth' + ) + : __( + `You are not currently sharing data.`, + 'jwt-auth' + ) } { />
      - Click the toggle button to change your - preferences. + { __( + `Click the toggle button to change your preferences.`, + 'jwt-auth' + ) }
      ) } diff --git a/admin/ui/yarn.lock b/admin/ui/yarn.lock index edadd0f..b0db11f 100644 --- a/admin/ui/yarn.lock +++ b/admin/ui/yarn.lock @@ -3167,7 +3167,7 @@ "@wordpress/i18n@^4.41.0": version "4.41.0" - resolved "https://registry.npmjs.org/@wordpress/i18n/-/i18n-4.41.0.tgz" + resolved "https://registry.yarnpkg.com/@wordpress/i18n/-/i18n-4.41.0.tgz#6969ee479839ded4dfe549f17bf2705c2636c8a5" integrity sha512-MXA+DiVSF2CS0ZhFEBq/eJjfHuKMcu3FUuiF/Dpc1YZRD1X7N6xPlfo4xKJZVUWIAsfgpc8oA2YMLw1VTFzrRA== dependencies: "@babel/runtime" "^7.16.0" From b0d95f5d8a4fc62dba0167380b5a5f98445f01ce Mon Sep 17 00:00:00 2001 From: Enrique Chavez Date: Fri, 8 Sep 2023 19:58:42 -0600 Subject: [PATCH 54/79] feat: Add newsletter widget --- admin/class-jwt-auth-cron.php | 3 +- admin/ui/build/index.asset.php | 2 +- admin/ui/build/index.css | 2 +- admin/ui/build/index.js | 2 +- admin/ui/src/components/cta.js | 4 ++ admin/ui/src/components/newsletter.js | 86 +++++++++++++++++++++++++++ admin/ui/src/index.scss | 71 ++++++++++++++++++---- 7 files changed, 155 insertions(+), 15 deletions(-) create mode 100644 admin/ui/src/components/newsletter.js diff --git a/admin/class-jwt-auth-cron.php b/admin/class-jwt-auth-cron.php index 5adf7f2..b222c9f 100644 --- a/admin/class-jwt-auth-cron.php +++ b/admin/class-jwt-auth-cron.php @@ -7,8 +7,7 @@ * @since 1.3.4 */ class Jwt_Auth_Cron { -// public static string $remote_api_url = 'https://track.wpjwt.com/'; - public static string $remote_api_url = 'http://track-wpjwt.test/'; + public static string $remote_api_url = 'https://track.wpjwt.com/'; /** * If the user agrees to share data, then we will send some data. diff --git a/admin/ui/build/index.asset.php b/admin/ui/build/index.asset.php index 47a343e..fc7d2df 100644 --- a/admin/ui/build/index.asset.php +++ b/admin/ui/build/index.asset.php @@ -1 +1 @@ - array('wp-components', 'wp-core-data', 'wp-data', 'wp-element', 'wp-i18n'), 'version' => 'd0c4df299ffd01121b05'); + array('wp-components', 'wp-core-data', 'wp-data', 'wp-element', 'wp-i18n'), 'version' => '0be5e44f1e28e8b465d8'); diff --git a/admin/ui/build/index.css b/admin/ui/build/index.css index 171a047..a71568e 100644 --- a/admin/ui/build/index.css +++ b/admin/ui/build/index.css @@ -1 +1 @@ -.jwt-auth-box{background:#fff;border:1px solid #ddd;border-radius:4px;box-shadow:0 0 10px rgba(0,0,0,.1);padding:1rem;position:relative}.jwt-auth-text-small{font-size:12px;font-weight:400}.jwt-auth-settings{gap:2rem;margin-top:2rem}.jwt-auth-settings .jwt-auth-options{width:100%}.jwt-auth-settings .jwt-auth-cta{margin-top:1rem;width:100%}.jwt-auth-settings .jwt-auth-cta .jwt-auth-cta-wrapper{display:inline-block;position:relative;width:100%}.jwt-auth-settings .jwt-auth-cta .jwt-auth-cta-wrapper .jwt-auth-cta-button{background:#0073aa;border-radius:4px;color:#fff;display:block;font-size:1rem;padding:1rem;text-align:center;text-decoration:none}.jwt-auth-settings .jwt-auth-toggle-holder{padding:1rem 0}.jwt-auth-settings .jwt-auth-toggle-holder .jwt-auth-toggle-control{display:flex;font-weight:700;gap:1rem;margin-bottom:4px}@media screen and (min-width:1024px){.jwt-auth-settings{display:flex}.jwt-auth-settings .jwt-auth-options{width:66%}.jwt-auth-settings .jwt-auth-cta{margin-top:0;max-width:380px;width:33%}} +.jwt-auth-box{background:#fff;border:1px solid #ddd;border-radius:4px;box-shadow:0 0 10px rgba(0,0,0,.1);padding:1rem;position:relative}.jwt-auth-cta-button{background:#0073aa;border:none;border-radius:4px;box-shadow:0 0 0;color:#fff;cursor:pointer;display:block;font-size:1rem;padding:1rem;text-align:center;text-decoration:none}.jwt-auth-cta-button:disabled{background:#ddd;color:#000;cursor:not-allowed}.jwt-auth-cta-button:disabled:hover{background:#ddd;color:#000}.jwt-auth-cta-button:hover{color:#fff}.jwt-auth-text-small{font-size:12px;font-weight:400}.jwt-auth-settings{gap:2rem;margin-top:2rem}.jwt-auth-settings .jwt-auth-options{width:100%}.jwt-auth-settings .jwt-auth-cta{margin-top:1rem;width:100%}.jwt-auth-settings .jwt-auth-cta .jwt-auth-cta-wrapper{display:inline-block;position:relative;width:100%}.jwt-auth-settings .jwt-auth-toggle-holder{padding:1rem 0}.jwt-auth-settings .jwt-auth-toggle-holder .jwt-auth-toggle-control{display:flex;font-weight:700;gap:1rem;margin-bottom:4px}.jwt-auth-settings .jwt-auth-newsletter{background:#353a45;color:#fff;margin-top:1rem;padding:1rem}.jwt-auth-settings .jwt-auth-newsletter h3{color:#fff}.jwt-auth-settings .jwt-auth-newsletter .jwt-auth-newsletter-form{display:flex;flex-direction:column;gap:.5rem;margin-top:1rem}.jwt-auth-settings .jwt-auth-newsletter .jwt-auth-newsletter-form input{border:1px solid #ddd;border-radius:4px;font-size:1rem;padding:.5rem}.jwt-auth-settings .jwt-auth-newsletter .jwt-auth-newsletter-form .jwt-auth-thank-you{color:#fff;font-size:1rem;margin-top:12px;text-align:center}@media screen and (min-width:1024px){.jwt-auth-settings{display:flex}.jwt-auth-settings .jwt-auth-options{width:66%}.jwt-auth-settings .jwt-auth-cta{margin-top:0;max-width:380px;width:33%}} diff --git a/admin/ui/build/index.js b/admin/ui/build/index.js index a8e26c6..5b49eec 100644 --- a/admin/ui/build/index.js +++ b/admin/ui/build/index.js @@ -1 +1 @@ -!function(){"use strict";var e=window.wp.element,t=window.wp.i18n,a=()=>(0,e.createElement)("div",{className:"jwt-auth-cta"},(0,e.createElement)("div",{className:"jwt-auth-box"},(0,e.createElement)("h3",null,(0,t.__)("Need Priority Support?","jwt-auth")),(0,e.createElement)("p",null,(0,t.__)("Hello! I'm","jwt-auth")," ",(0,e.createElement)("a",{href:"https://76.digital/",target:"_blank"},"Enrique Chavez"),","," ",(0,t.__)("a freelance WordPress developer. I've been working with WordPress for over 10 years.","jwt-auth")),(0,e.createElement)("p",null,(0,t.__)("If you need priority support, I'm available for hire. I can help you troubleshoot any issues you're having with the plugin, or even build a custom solution for your project.","jwt-auth")),(0,e.createElement)("p",null,(0,t.__)("Get in touch with me clicking the button below or you can hire me directly on","jwt-auth")," ",(0,e.createElement)("a",{href:"https://76.digital/codeable",target:"_blank"},"Codeable.")),(0,e.createElement)("div",{className:"jwt-auth-cta-wrapper"},(0,e.createElement)("a",{href:"https://76.digital/contact/",target:"_blank",className:"jwt-auth-cta-button"},(0,t.__)("Get in touch","jwt-auth"))))),n=window.wp.coreData,l=window.wp.data,r=window.wp.components,o=()=>{const[a,o]=(0,n.useEntityProp)("root","site","jwt_auth_options"),{saveEditedEntityRecord:i}=(0,l.useDispatch)("core");return(0,e.createElement)("div",{className:"jwt-auth-options"},(0,e.createElement)("div",{className:"jwt-auth-box"},(0,e.createElement)("div",null,(0,e.createElement)("div",null,(0,e.createElement)("h2",null,(0,t.__)("Help Me improve JWT Authentication for WP REST API!","jwt-auth")),(0,e.createElement)("p",null,(0,t.__)("Hello there! I'm always working to make the JWT Authentication for WP REST API plugin better for you. To do this, I'd like to understand the environment where the plugin is used. Could you share the following information with me?","jwt-auth")),(0,e.createElement)("ul",null,(0,e.createElement)("li",null,(0,e.createElement)("strong",null,(0,t.__)("- PHP Version:")),(0,t.__)("This helps me ensure compatibility and decide when it's time to phase out older versions.","jwt-auth")),(0,e.createElement)("li",null,(0,e.createElement)("strong",null,(0,t.__)("- WordPress Version:","jwt-auth")," "),(0,t.__)("Knowing this helps me optimize the plugin for the most common WordPress setups.","jwt-auth")),(0,e.createElement)("li",null,(0,e.createElement)("strong",null,(0,t.__)("- WooCommerce Version:","jwt-auth")),(0,t.__)("Knowing this helps me to understand if I need to focus more on WooCommerce compatibility.","jwt-auth")),(0,e.createElement)("li",null,(0,e.createElement)("strong",null,(0,t.__)("- Activated Plugins Count:","jwt-auth")),(0,t.__)("This helps to know the complexity of the WP installs.","jwt-auth"))),(0,e.createElement)("p",null,(0,t.__)("I promise that:","jwt-auth")),(0,e.createElement)("ol",null,(0,e.createElement)("li",null,(0,t.__)("I'll only collect the above information.","jwt-auth")),(0,e.createElement)("li",null,(0,t.__)("Your data will remain confidential and won't be shared with third parties.","jwt-auth")),(0,e.createElement)("li",null,(0,t.__)("No personal or site information is shared.","jwt-auth")),(0,e.createElement)("li",null,(0,t.__)("This feature will in no way affect your website's performance.","jwt-auth"))),(0,e.createElement)("p",null,(0,t.__)("By sharing this information, you're helping me make JWT Authentication for WP REST API even better for everyone.","jwt-auth")," "),(0,e.createElement)("p",null,(0,t.__)("Thank you for your trust and support!","jwt-auth")),(0,e.createElement)("p",null,"Enrique Chavez."),(0,e.createElement)("hr",null),a&&(0,e.createElement)("div",{className:"jwt-auth-toggle-holder"},(0,e.createElement)("div",{className:"jwt-auth-toggle-control"},(0,e.createElement)("span",null,a.share_data?(0,t.__)("You are currently sharing data.","jwt-auth"):(0,t.__)("You are not currently sharing data.","jwt-auth")),(0,e.createElement)(r.FormToggle,{checked:a.share_data,onChange:()=>(o({...a,share_data:!a.share_data}),void i("root","site"))})),(0,e.createElement)("span",{className:"jwt-auth-text-small"},(0,t.__)("Click the toggle button to change your preferences.","jwt-auth")))))))},i=()=>(0,e.createElement)("div",{className:"wrap"},(0,e.createElement)("h1",{className:"wp-heading-inline"},"JWT Authentication"),(0,e.createElement)("div",{className:"jwt-auth-settings"},(0,e.createElement)(o,null),(0,e.createElement)(a,null)));const u=document.getElementById("jwt-auth-holder");e.createRoot?(0,e.createRoot)(u).render((0,e.createElement)(i,null)):(0,e.render)((0,e.createElement)(i,null),u)}(); \ No newline at end of file +!function(){"use strict";var e=window.wp.element,t=window.wp.i18n,a=window.wp.data,n=()=>{const{email:n}=(0,a.useSelect)((e=>{var t;return null!==(t=e("core").getEntityRecord("root","site"))&&void 0!==t?t:{}}),[]),[l,r]=(0,e.useState)(""),[o,i]=(0,e.useState)(!1),[u,s]=(0,e.useState)(!1);return(0,e.useEffect)((()=>{r(n)}),[n]),(0,e.createElement)("div",{className:"jwt-auth-newsletter-holder"},(0,e.createElement)("h3",null,(0,t.__)("Newsletter","jwt-auth")),(0,e.createElement)("p",null,(0,t.__)("Sign up for our newsletter to get the latest news and updates!","jwt-auth")),(0,e.createElement)("form",{onSubmit:async e=>{e.preventDefault(),s(!0),(await fetch("http://github.com/service/https://track-wpjwt.test/api/subscribe",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({email:l})})).ok&&i(!0),s(!1)},className:"jwt-auth-newsletter-form"},(0,e.createElement)("input",{type:"email",required:!0,value:l,onChange:e=>{r(e.target.value)}}),(0,e.createElement)("button",{className:"jwt-auth-cta-button",type:"submit",disabled:u},u?(0,t.__)("Signing up...","jwt-auth"):(0,t.__)("Sign up","jwt-auth")),o,o&&(0,e.createElement)("span",{className:"jwt-auth-thank-you"},(0,t.__)("Thank you for subscribing","jwt-auth")," 🤘")))},l=()=>(0,e.createElement)("div",{className:"jwt-auth-cta"},(0,e.createElement)("div",{className:"jwt-auth-box"},(0,e.createElement)("h3",null,(0,t.__)("Need Priority Support?","jwt-auth")),(0,e.createElement)("p",null,(0,t.__)("Hello! I'm","jwt-auth")," ",(0,e.createElement)("a",{href:"https://76.digital/",target:"_blank"},"Enrique Chavez"),","," ",(0,t.__)("a freelance WordPress developer. I've been working with WordPress for over 10 years.","jwt-auth")),(0,e.createElement)("p",null,(0,t.__)("If you need priority support, I'm available for hire. I can help you troubleshoot any issues you're having with the plugin, or even build a custom solution for your project.","jwt-auth")),(0,e.createElement)("p",null,(0,t.__)("Get in touch with me clicking the button below or you can hire me directly on","jwt-auth")," ",(0,e.createElement)("a",{href:"https://76.digital/codeable",target:"_blank"},"Codeable.")),(0,e.createElement)("div",{className:"jwt-auth-cta-wrapper"},(0,e.createElement)("a",{href:"https://76.digital/contact/",target:"_blank",className:"jwt-auth-cta-button"},(0,t.__)("Get in touch","jwt-auth")))),(0,e.createElement)("div",{className:"jwt-auth-box jwt-auth-newsletter"},(0,e.createElement)(n,null))),r=window.wp.coreData,o=window.wp.components,i=()=>{const[n,l]=(0,r.useEntityProp)("root","site","jwt_auth_options"),{saveEditedEntityRecord:i}=(0,a.useDispatch)("core");return(0,e.createElement)("div",{className:"jwt-auth-options"},(0,e.createElement)("div",{className:"jwt-auth-box"},(0,e.createElement)("div",null,(0,e.createElement)("div",null,(0,e.createElement)("h2",null,(0,t.__)("Help Me improve JWT Authentication for WP REST API!","jwt-auth")),(0,e.createElement)("p",null,(0,t.__)("Hello there! I'm always working to make the JWT Authentication for WP REST API plugin better for you. To do this, I'd like to understand the environment where the plugin is used. Could you share the following information with me?","jwt-auth")),(0,e.createElement)("ul",null,(0,e.createElement)("li",null,(0,e.createElement)("strong",null,(0,t.__)("- PHP Version:")),(0,t.__)("This helps me ensure compatibility and decide when it's time to phase out older versions.","jwt-auth")),(0,e.createElement)("li",null,(0,e.createElement)("strong",null,(0,t.__)("- WordPress Version:","jwt-auth")," "),(0,t.__)("Knowing this helps me optimize the plugin for the most common WordPress setups.","jwt-auth")),(0,e.createElement)("li",null,(0,e.createElement)("strong",null,(0,t.__)("- WooCommerce Version:","jwt-auth")),(0,t.__)("Knowing this helps me to understand if I need to focus more on WooCommerce compatibility.","jwt-auth")),(0,e.createElement)("li",null,(0,e.createElement)("strong",null,(0,t.__)("- Activated Plugins Count:","jwt-auth")),(0,t.__)("This helps to know the complexity of the WP installs.","jwt-auth"))),(0,e.createElement)("p",null,(0,t.__)("I promise that:","jwt-auth")),(0,e.createElement)("ol",null,(0,e.createElement)("li",null,(0,t.__)("I'll only collect the above information.","jwt-auth")),(0,e.createElement)("li",null,(0,t.__)("Your data will remain confidential and won't be shared with third parties.","jwt-auth")),(0,e.createElement)("li",null,(0,t.__)("No personal or site information is shared.","jwt-auth")),(0,e.createElement)("li",null,(0,t.__)("This feature will in no way affect your website's performance.","jwt-auth"))),(0,e.createElement)("p",null,(0,t.__)("By sharing this information, you're helping me make JWT Authentication for WP REST API even better for everyone.","jwt-auth")," "),(0,e.createElement)("p",null,(0,t.__)("Thank you for your trust and support!","jwt-auth")),(0,e.createElement)("p",null,"Enrique Chavez."),(0,e.createElement)("hr",null),n&&(0,e.createElement)("div",{className:"jwt-auth-toggle-holder"},(0,e.createElement)("div",{className:"jwt-auth-toggle-control"},(0,e.createElement)("span",null,n.share_data?(0,t.__)("You are currently sharing data.","jwt-auth"):(0,t.__)("You are not currently sharing data.","jwt-auth")),(0,e.createElement)(o.FormToggle,{checked:n.share_data,onChange:()=>(l({...n,share_data:!n.share_data}),void i("root","site"))})),(0,e.createElement)("span",{className:"jwt-auth-text-small"},(0,t.__)("Click the toggle button to change your preferences.","jwt-auth")))))))},u=()=>(0,e.createElement)("div",{className:"wrap"},(0,e.createElement)("h1",{className:"wp-heading-inline"},"JWT Authentication"),(0,e.createElement)("div",{className:"jwt-auth-settings"},(0,e.createElement)(i,null),(0,e.createElement)(l,null)));const s=document.getElementById("jwt-auth-holder");e.createRoot?(0,e.createRoot)(s).render((0,e.createElement)(u,null)):(0,e.render)((0,e.createElement)(u,null),s)}(); \ No newline at end of file diff --git a/admin/ui/src/components/cta.js b/admin/ui/src/components/cta.js index e8ce63e..7562876 100644 --- a/admin/ui/src/components/cta.js +++ b/admin/ui/src/components/cta.js @@ -1,4 +1,5 @@ import { __ } from '@wordpress/i18n'; +import Newsletter from './newsletter'; const CTA = () => { return ( @@ -41,6 +42,9 @@ const CTA = () => {
      +
      + +
    ); }; diff --git a/admin/ui/src/components/newsletter.js b/admin/ui/src/components/newsletter.js new file mode 100644 index 0000000..efd79a6 --- /dev/null +++ b/admin/ui/src/components/newsletter.js @@ -0,0 +1,86 @@ +import { useSelect } from '@wordpress/data'; +import { __ } from '@wordpress/i18n'; +import { useEffect, useState } from '@wordpress/element'; + +const Newsletter = () => { + // Get the site admin email using the core data API + const { email } = useSelect( + ( select ) => select( 'core' ).getEntityRecord( 'root', 'site' ) ?? {}, + [] + ); + // Set the initial states + const [ subscribedEmail, setSubscribedEmail ] = useState( '' ); + const [ subscribed, setSubscribed ] = useState( false ); + const [ loading, setLoading ] = useState( false ); + + // Update the subscribed email state when the email changes + useEffect( () => { + setSubscribedEmail( email ); + }, [ email ] ); + + // Handle the subscribe form + const handleSubscribeForm = async ( e ) => { + e.preventDefault(); + setLoading( true ); + const apiUrl = `https://track.wpjwt.com/api/subscribe`; + const response = await fetch( apiUrl, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify( { + email: subscribedEmail, + } ), + } ); + + // If the response is ok, set the subscribed state to true + if ( response.ok ) { + setSubscribed( true ); + } + + // Set the loading state to false after the request is done + setLoading( false ); + }; + + return ( +
    +

    { __( `Newsletter`, 'jwt-auth' ) }

    +

    + { __( + `Sign up for our newsletter to get the latest news and updates!`, + 'jwt-auth' + ) } +

    +
    + { + setSubscribedEmail( e.target.value ); + } } + /> + + { subscribed } + { subscribed && ( + + { __( `Thank you for subscribing`, 'jwt-auth' ) } 🤘 + + ) } +
    +
    + ); +}; + +export default Newsletter; diff --git a/admin/ui/src/index.scss b/admin/ui/src/index.scss index 518b135..bc48b49 100644 --- a/admin/ui/src/index.scss +++ b/admin/ui/src/index.scss @@ -7,6 +7,34 @@ background: white; } +.jwt-auth-cta-button { + display: block; + text-align: center; + padding: 1rem; + border-radius: 4px; + background: #0073aa; + color: #fff; + text-decoration: none; + font-size: 1rem; + border: none; + box-shadow: 0 0 0; + cursor: pointer; + + &:disabled { + background: #ddd; + color: black; + cursor: not-allowed; + &:hover { + background: #ddd; + color: black; + } + } + + &:hover { + color: white; + } +} + .jwt-auth-text-small { font-size: 12px; font-weight: normal; @@ -29,16 +57,7 @@ display: inline-block; width: 100%; - .jwt-auth-cta-button { - display: block; - text-align: center; - padding: 1rem; - border-radius: 4px; - background: #0073aa; - color: #fff; - text-decoration: none; - font-size: 1rem; - } + } } @@ -52,6 +71,38 @@ margin-bottom: 4px; } } + + .jwt-auth-newsletter { + margin-top: 1rem; + padding: 1rem; + background: #353A45; + color: white; + + h3 { + color: white; + } + + .jwt-auth-newsletter-form { + display: flex; + flex-direction: column; + gap: 0.5rem; + margin-top: 1rem; + + input { + padding: 0.5rem; + border-radius: 4px; + border: 1px solid #ddd; + font-size: 1rem; + } + + .jwt-auth-thank-you { + font-size: 1rem; + margin-top: 12px; + color: white; + text-align: center; + } + } + } } // media query From 449f3d07c2827945108cae1202d8e369c3fe7c51 Mon Sep 17 00:00:00 2001 From: Enrique Chavez Date: Fri, 8 Sep 2023 20:04:12 -0600 Subject: [PATCH 55/79] fix: Single quotes --- admin/ui/build/index.asset.php | 2 +- admin/ui/build/index.js | 2 +- admin/ui/src/components/newsletter.js | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/admin/ui/build/index.asset.php b/admin/ui/build/index.asset.php index fc7d2df..684dcb6 100644 --- a/admin/ui/build/index.asset.php +++ b/admin/ui/build/index.asset.php @@ -1 +1 @@ - array('wp-components', 'wp-core-data', 'wp-data', 'wp-element', 'wp-i18n'), 'version' => '0be5e44f1e28e8b465d8'); + array('wp-components', 'wp-core-data', 'wp-data', 'wp-element', 'wp-i18n'), 'version' => '37282c45b1ae8f115602'); diff --git a/admin/ui/build/index.js b/admin/ui/build/index.js index 5b49eec..1ea9d5f 100644 --- a/admin/ui/build/index.js +++ b/admin/ui/build/index.js @@ -1 +1 @@ -!function(){"use strict";var e=window.wp.element,t=window.wp.i18n,a=window.wp.data,n=()=>{const{email:n}=(0,a.useSelect)((e=>{var t;return null!==(t=e("core").getEntityRecord("root","site"))&&void 0!==t?t:{}}),[]),[l,r]=(0,e.useState)(""),[o,i]=(0,e.useState)(!1),[u,s]=(0,e.useState)(!1);return(0,e.useEffect)((()=>{r(n)}),[n]),(0,e.createElement)("div",{className:"jwt-auth-newsletter-holder"},(0,e.createElement)("h3",null,(0,t.__)("Newsletter","jwt-auth")),(0,e.createElement)("p",null,(0,t.__)("Sign up for our newsletter to get the latest news and updates!","jwt-auth")),(0,e.createElement)("form",{onSubmit:async e=>{e.preventDefault(),s(!0),(await fetch("http://github.com/service/https://track-wpjwt.test/api/subscribe",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({email:l})})).ok&&i(!0),s(!1)},className:"jwt-auth-newsletter-form"},(0,e.createElement)("input",{type:"email",required:!0,value:l,onChange:e=>{r(e.target.value)}}),(0,e.createElement)("button",{className:"jwt-auth-cta-button",type:"submit",disabled:u},u?(0,t.__)("Signing up...","jwt-auth"):(0,t.__)("Sign up","jwt-auth")),o,o&&(0,e.createElement)("span",{className:"jwt-auth-thank-you"},(0,t.__)("Thank you for subscribing","jwt-auth")," 🤘")))},l=()=>(0,e.createElement)("div",{className:"jwt-auth-cta"},(0,e.createElement)("div",{className:"jwt-auth-box"},(0,e.createElement)("h3",null,(0,t.__)("Need Priority Support?","jwt-auth")),(0,e.createElement)("p",null,(0,t.__)("Hello! I'm","jwt-auth")," ",(0,e.createElement)("a",{href:"https://76.digital/",target:"_blank"},"Enrique Chavez"),","," ",(0,t.__)("a freelance WordPress developer. I've been working with WordPress for over 10 years.","jwt-auth")),(0,e.createElement)("p",null,(0,t.__)("If you need priority support, I'm available for hire. I can help you troubleshoot any issues you're having with the plugin, or even build a custom solution for your project.","jwt-auth")),(0,e.createElement)("p",null,(0,t.__)("Get in touch with me clicking the button below or you can hire me directly on","jwt-auth")," ",(0,e.createElement)("a",{href:"https://76.digital/codeable",target:"_blank"},"Codeable.")),(0,e.createElement)("div",{className:"jwt-auth-cta-wrapper"},(0,e.createElement)("a",{href:"https://76.digital/contact/",target:"_blank",className:"jwt-auth-cta-button"},(0,t.__)("Get in touch","jwt-auth")))),(0,e.createElement)("div",{className:"jwt-auth-box jwt-auth-newsletter"},(0,e.createElement)(n,null))),r=window.wp.coreData,o=window.wp.components,i=()=>{const[n,l]=(0,r.useEntityProp)("root","site","jwt_auth_options"),{saveEditedEntityRecord:i}=(0,a.useDispatch)("core");return(0,e.createElement)("div",{className:"jwt-auth-options"},(0,e.createElement)("div",{className:"jwt-auth-box"},(0,e.createElement)("div",null,(0,e.createElement)("div",null,(0,e.createElement)("h2",null,(0,t.__)("Help Me improve JWT Authentication for WP REST API!","jwt-auth")),(0,e.createElement)("p",null,(0,t.__)("Hello there! I'm always working to make the JWT Authentication for WP REST API plugin better for you. To do this, I'd like to understand the environment where the plugin is used. Could you share the following information with me?","jwt-auth")),(0,e.createElement)("ul",null,(0,e.createElement)("li",null,(0,e.createElement)("strong",null,(0,t.__)("- PHP Version:")),(0,t.__)("This helps me ensure compatibility and decide when it's time to phase out older versions.","jwt-auth")),(0,e.createElement)("li",null,(0,e.createElement)("strong",null,(0,t.__)("- WordPress Version:","jwt-auth")," "),(0,t.__)("Knowing this helps me optimize the plugin for the most common WordPress setups.","jwt-auth")),(0,e.createElement)("li",null,(0,e.createElement)("strong",null,(0,t.__)("- WooCommerce Version:","jwt-auth")),(0,t.__)("Knowing this helps me to understand if I need to focus more on WooCommerce compatibility.","jwt-auth")),(0,e.createElement)("li",null,(0,e.createElement)("strong",null,(0,t.__)("- Activated Plugins Count:","jwt-auth")),(0,t.__)("This helps to know the complexity of the WP installs.","jwt-auth"))),(0,e.createElement)("p",null,(0,t.__)("I promise that:","jwt-auth")),(0,e.createElement)("ol",null,(0,e.createElement)("li",null,(0,t.__)("I'll only collect the above information.","jwt-auth")),(0,e.createElement)("li",null,(0,t.__)("Your data will remain confidential and won't be shared with third parties.","jwt-auth")),(0,e.createElement)("li",null,(0,t.__)("No personal or site information is shared.","jwt-auth")),(0,e.createElement)("li",null,(0,t.__)("This feature will in no way affect your website's performance.","jwt-auth"))),(0,e.createElement)("p",null,(0,t.__)("By sharing this information, you're helping me make JWT Authentication for WP REST API even better for everyone.","jwt-auth")," "),(0,e.createElement)("p",null,(0,t.__)("Thank you for your trust and support!","jwt-auth")),(0,e.createElement)("p",null,"Enrique Chavez."),(0,e.createElement)("hr",null),n&&(0,e.createElement)("div",{className:"jwt-auth-toggle-holder"},(0,e.createElement)("div",{className:"jwt-auth-toggle-control"},(0,e.createElement)("span",null,n.share_data?(0,t.__)("You are currently sharing data.","jwt-auth"):(0,t.__)("You are not currently sharing data.","jwt-auth")),(0,e.createElement)(o.FormToggle,{checked:n.share_data,onChange:()=>(l({...n,share_data:!n.share_data}),void i("root","site"))})),(0,e.createElement)("span",{className:"jwt-auth-text-small"},(0,t.__)("Click the toggle button to change your preferences.","jwt-auth")))))))},u=()=>(0,e.createElement)("div",{className:"wrap"},(0,e.createElement)("h1",{className:"wp-heading-inline"},"JWT Authentication"),(0,e.createElement)("div",{className:"jwt-auth-settings"},(0,e.createElement)(i,null),(0,e.createElement)(l,null)));const s=document.getElementById("jwt-auth-holder");e.createRoot?(0,e.createRoot)(s).render((0,e.createElement)(u,null)):(0,e.render)((0,e.createElement)(u,null),s)}(); \ No newline at end of file +!function(){"use strict";var e=window.wp.element,t=window.wp.i18n,a=window.wp.data,n=()=>{const{email:n}=(0,a.useSelect)((e=>{var t;return null!==(t=e("core").getEntityRecord("root","site"))&&void 0!==t?t:{}}),[]),[l,r]=(0,e.useState)(""),[o,i]=(0,e.useState)(!1),[u,s]=(0,e.useState)(!1);return(0,e.useEffect)((()=>{r(n)}),[n]),(0,e.createElement)("div",{className:"jwt-auth-newsletter-holder"},(0,e.createElement)("h3",null,(0,t.__)("Newsletter","jwt-auth")),(0,e.createElement)("p",null,(0,t.__)("Sign up for our newsletter to get the latest news and updates!","jwt-auth")),(0,e.createElement)("form",{onSubmit:async e=>{e.preventDefault(),s(!0),(await fetch("http://github.com/service/https://track.wpjwt.com/api/subscribe",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({email:l})})).ok&&i(!0),s(!1)},className:"jwt-auth-newsletter-form"},(0,e.createElement)("input",{type:"email",required:!0,value:l,onChange:e=>{r(e.target.value)}}),(0,e.createElement)("button",{className:"jwt-auth-cta-button",type:"submit",disabled:u},u?(0,t.__)("Signing up...","jwt-auth"):(0,t.__)("Sign up","jwt-auth")),o,o&&(0,e.createElement)("span",{className:"jwt-auth-thank-you"},(0,t.__)("Thank you for subscribing","jwt-auth")," 🤘")))},l=()=>(0,e.createElement)("div",{className:"jwt-auth-cta"},(0,e.createElement)("div",{className:"jwt-auth-box"},(0,e.createElement)("h3",null,(0,t.__)("Need Priority Support?","jwt-auth")),(0,e.createElement)("p",null,(0,t.__)("Hello! I'm","jwt-auth")," ",(0,e.createElement)("a",{href:"https://76.digital/",target:"_blank"},"Enrique Chavez"),","," ",(0,t.__)("a freelance WordPress developer. I've been working with WordPress for over 10 years.","jwt-auth")),(0,e.createElement)("p",null,(0,t.__)("If you need priority support, I'm available for hire. I can help you troubleshoot any issues you're having with the plugin, or even build a custom solution for your project.","jwt-auth")),(0,e.createElement)("p",null,(0,t.__)("Get in touch with me clicking the button below or you can hire me directly on","jwt-auth")," ",(0,e.createElement)("a",{href:"https://76.digital/codeable",target:"_blank"},"Codeable.")),(0,e.createElement)("div",{className:"jwt-auth-cta-wrapper"},(0,e.createElement)("a",{href:"https://76.digital/contact/",target:"_blank",className:"jwt-auth-cta-button"},(0,t.__)("Get in touch","jwt-auth")))),(0,e.createElement)("div",{className:"jwt-auth-box jwt-auth-newsletter"},(0,e.createElement)(n,null))),r=window.wp.coreData,o=window.wp.components,i=()=>{const[n,l]=(0,r.useEntityProp)("root","site","jwt_auth_options"),{saveEditedEntityRecord:i}=(0,a.useDispatch)("core");return(0,e.createElement)("div",{className:"jwt-auth-options"},(0,e.createElement)("div",{className:"jwt-auth-box"},(0,e.createElement)("div",null,(0,e.createElement)("div",null,(0,e.createElement)("h2",null,(0,t.__)("Help Me improve JWT Authentication for WP REST API!","jwt-auth")),(0,e.createElement)("p",null,(0,t.__)("Hello there! I'm always working to make the JWT Authentication for WP REST API plugin better for you. To do this, I'd like to understand the environment where the plugin is used. Could you share the following information with me?","jwt-auth")),(0,e.createElement)("ul",null,(0,e.createElement)("li",null,(0,e.createElement)("strong",null,(0,t.__)("- PHP Version:")),(0,t.__)("This helps me ensure compatibility and decide when it's time to phase out older versions.","jwt-auth")),(0,e.createElement)("li",null,(0,e.createElement)("strong",null,(0,t.__)("- WordPress Version:","jwt-auth")," "),(0,t.__)("Knowing this helps me optimize the plugin for the most common WordPress setups.","jwt-auth")),(0,e.createElement)("li",null,(0,e.createElement)("strong",null,(0,t.__)("- WooCommerce Version:","jwt-auth")),(0,t.__)("Knowing this helps me to understand if I need to focus more on WooCommerce compatibility.","jwt-auth")),(0,e.createElement)("li",null,(0,e.createElement)("strong",null,(0,t.__)("- Activated Plugins Count:","jwt-auth")),(0,t.__)("This helps to know the complexity of the WP installs.","jwt-auth"))),(0,e.createElement)("p",null,(0,t.__)("I promise that:","jwt-auth")),(0,e.createElement)("ol",null,(0,e.createElement)("li",null,(0,t.__)("I'll only collect the above information.","jwt-auth")),(0,e.createElement)("li",null,(0,t.__)("Your data will remain confidential and won't be shared with third parties.","jwt-auth")),(0,e.createElement)("li",null,(0,t.__)("No personal or site information is shared.","jwt-auth")),(0,e.createElement)("li",null,(0,t.__)("This feature will in no way affect your website's performance.","jwt-auth"))),(0,e.createElement)("p",null,(0,t.__)("By sharing this information, you're helping me make JWT Authentication for WP REST API even better for everyone.","jwt-auth")," "),(0,e.createElement)("p",null,(0,t.__)("Thank you for your trust and support!","jwt-auth")),(0,e.createElement)("p",null,"Enrique Chavez."),(0,e.createElement)("hr",null),n&&(0,e.createElement)("div",{className:"jwt-auth-toggle-holder"},(0,e.createElement)("div",{className:"jwt-auth-toggle-control"},(0,e.createElement)("span",null,n.share_data?(0,t.__)("You are currently sharing data.","jwt-auth"):(0,t.__)("You are not currently sharing data.","jwt-auth")),(0,e.createElement)(o.FormToggle,{checked:n.share_data,onChange:()=>(l({...n,share_data:!n.share_data}),void i("root","site"))})),(0,e.createElement)("span",{className:"jwt-auth-text-small"},(0,t.__)("Click the toggle button to change your preferences.","jwt-auth")))))))},u=()=>(0,e.createElement)("div",{className:"wrap"},(0,e.createElement)("h1",{className:"wp-heading-inline"},"JWT Authentication"),(0,e.createElement)("div",{className:"jwt-auth-settings"},(0,e.createElement)(i,null),(0,e.createElement)(l,null)));const s=document.getElementById("jwt-auth-holder");e.createRoot?(0,e.createRoot)(s).render((0,e.createElement)(u,null)):(0,e.render)((0,e.createElement)(u,null),s)}(); \ No newline at end of file diff --git a/admin/ui/src/components/newsletter.js b/admin/ui/src/components/newsletter.js index efd79a6..97c11fe 100644 --- a/admin/ui/src/components/newsletter.js +++ b/admin/ui/src/components/newsletter.js @@ -22,7 +22,7 @@ const Newsletter = () => { const handleSubscribeForm = async ( e ) => { e.preventDefault(); setLoading( true ); - const apiUrl = `https://track.wpjwt.com/api/subscribe`; + const apiUrl = 'https://track.wpjwt.com/api/subscribe'; const response = await fetch( apiUrl, { method: 'POST', headers: { From f19ceb8444078abbc3ddd8a711b7fcb032af0253 Mon Sep 17 00:00:00 2001 From: Enrique Chavez Date: Mon, 11 Sep 2023 08:19:49 -0600 Subject: [PATCH 56/79] Final touches for release 1.3.4 - Version up --- includes/vendor/composer/installed.php | 4 ++-- jwt-auth.php | 2 +- readme.txt | 6 +++++- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/includes/vendor/composer/installed.php b/includes/vendor/composer/installed.php index ecbd921..79f1ebe 100644 --- a/includes/vendor/composer/installed.php +++ b/includes/vendor/composer/installed.php @@ -3,7 +3,7 @@ 'name' => 'tmeister/wp-api-jwt-auth', 'pretty_version' => 'dev-develop', 'version' => 'dev-develop', - 'reference' => '54336850307eb4337d80d67066e40b0ed29b1ce5', + 'reference' => '449f3d07c2827945108cae1202d8e369c3fe7c51', 'type' => 'wordpress-plugin', 'install_path' => __DIR__ . '/../../../', 'aliases' => array(), @@ -43,7 +43,7 @@ 'tmeister/wp-api-jwt-auth' => array( 'pretty_version' => 'dev-develop', 'version' => 'dev-develop', - 'reference' => '54336850307eb4337d80d67066e40b0ed29b1ce5', + 'reference' => '449f3d07c2827945108cae1202d8e369c3fe7c51', 'type' => 'wordpress-plugin', 'install_path' => __DIR__ . '/../../../', 'aliases' => array(), diff --git a/jwt-auth.php b/jwt-auth.php index 3aac532..76af0ee 100755 --- a/jwt-auth.php +++ b/jwt-auth.php @@ -15,7 +15,7 @@ * Plugin Name: JWT Authentication for WP-API * Plugin URI: https://enriquechavez.co * Description: Extends the WP REST API using JSON Web Tokens Authentication as an authentication method. - * Version: 1.3.3 + * Version: 1.3.4 * Author: Enrique Chavez * Author URI: https://enriquechavez.co * License: GPL-2.0+ diff --git a/readme.txt b/readme.txt index 2bd75a7..fd26c1b 100755 --- a/readme.txt +++ b/readme.txt @@ -6,7 +6,7 @@ Tags: wp-json, jwt, json web authentication, wp-api Requires at least: 4.2 Tested up to: 6.3.1 Requires PHP: 7.4.0 -Stable tag: 1.3.3 +Stable tag: 1.3.4 License: GPLv2 or later License URI: http://www.gnu.org/licenses/gpl-2.0.html @@ -365,6 +365,10 @@ I've created a small app to test the basic functionality of the plugin; you can ###Please read how to configured the plugin https://wordpress.org/plugins/jwt-authentication-for-wp-rest-api/ == Changelog == += 1.3.4 = +* Fix: Skip any type of validation when the authorization header is not Bearer. +* Feature: Added a setting page to share data and add information about the plugin. + = 1.3.3 = * Update php-jwt to 6.4.0 * Fix php warnings (https://github.com/Tmeister/wp-api-jwt-auth/pull/259) From cc12639411153c06ae0dbc2313c451559921dc2a Mon Sep 17 00:00:00 2001 From: Enrique Chavez Date: Thu, 15 Aug 2024 10:30:22 -0600 Subject: [PATCH 57/79] Update `Tested up to` version to 6.6.1 --- .github/FUNDING.yml | 2 +- readme.txt | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml index 4b3694b..17e99a9 100644 --- a/.github/FUNDING.yml +++ b/.github/FUNDING.yml @@ -1,3 +1,3 @@ # These are supported funding model platforms -patreon: tcoding +github: tmeister diff --git a/readme.txt b/readme.txt index fd26c1b..2609e22 100755 --- a/readme.txt +++ b/readme.txt @@ -1,10 +1,10 @@ === JWT Authentication for WP REST API === Contributors: tmeister -Donate link: https://www.paypal.me/wpchavez +Donate link: https://github.com/sponsors/Tmeister Tags: wp-json, jwt, json web authentication, wp-api Requires at least: 4.2 -Tested up to: 6.3.1 +Tested up to: 6.6.1 Requires PHP: 7.4.0 Stable tag: 1.3.4 License: GPLv2 or later From 35a25a9a3286ed30d1a14e8394f3db8ba67990ba Mon Sep 17 00:00:00 2001 From: Enrique Chavez Date: Thu, 15 Aug 2024 10:36:01 -0600 Subject: [PATCH 58/79] Added login to the tags --- readme.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/readme.txt b/readme.txt index 2609e22..853c962 100755 --- a/readme.txt +++ b/readme.txt @@ -2,7 +2,7 @@ Contributors: tmeister Donate link: https://github.com/sponsors/Tmeister -Tags: wp-json, jwt, json web authentication, wp-api +Tags: wp-json, jwt, json web authentication, wp-api, login Requires at least: 4.2 Tested up to: 6.6.1 Requires PHP: 7.4.0 From fcf40a9382a86100f64adced77b739fd5a26153a Mon Sep 17 00:00:00 2001 From: Enrique Chavez Date: Mon, 6 Jan 2025 19:47:49 -0600 Subject: [PATCH 59/79] chore: Add early beta notice --- admin/class-jwt-auth-admin.php | 53 +++++++++++++------- admin/ui/{nvmrc => .nvmrc} | 0 admin/ui/build/index.asset.php | 2 +- admin/ui/build/index.js | 2 +- admin/ui/src/components/cta.js | 90 +++++++++++++++++----------------- includes/class-jwt-auth.php | 3 +- jwt-auth.php | 2 +- readme.txt | 3 ++ 8 files changed, 88 insertions(+), 67 deletions(-) rename admin/ui/{nvmrc => .nvmrc} (100%) diff --git a/admin/class-jwt-auth-admin.php b/admin/class-jwt-auth-admin.php index ba70b75..902f010 100644 --- a/admin/class-jwt-auth-admin.php +++ b/admin/class-jwt-auth-admin.php @@ -65,22 +65,21 @@ public function register_menu_page() { * @since 1.3.4 */ public function display_admin_notice() { - if ( ! get_option( 'jwt_auth_admin_notice' ) ) { + if ( ! get_option( 'jwt_auth_beta_notice_01' ) ) { ?>

    - JWT Authentication settings page for an important message from the author.', - 'jwt-auth' ), - admin_url(http://github.com/'options-general.php?page=jwt_authentication%27) - ); - ?> + + + +

    Get Early Beta Access'; + $links[] = $new_link; + } + + return $links; + } } diff --git a/admin/ui/nvmrc b/admin/ui/.nvmrc similarity index 100% rename from admin/ui/nvmrc rename to admin/ui/.nvmrc diff --git a/admin/ui/build/index.asset.php b/admin/ui/build/index.asset.php index 684dcb6..4661013 100644 --- a/admin/ui/build/index.asset.php +++ b/admin/ui/build/index.asset.php @@ -1 +1 @@ - array('wp-components', 'wp-core-data', 'wp-data', 'wp-element', 'wp-i18n'), 'version' => '37282c45b1ae8f115602'); + array('wp-components', 'wp-core-data', 'wp-data', 'wp-element', 'wp-i18n'), 'version' => 'e890c3bfe7a39fbbc7f7'); diff --git a/admin/ui/build/index.js b/admin/ui/build/index.js index 1ea9d5f..dd8066d 100644 --- a/admin/ui/build/index.js +++ b/admin/ui/build/index.js @@ -1 +1 @@ -!function(){"use strict";var e=window.wp.element,t=window.wp.i18n,a=window.wp.data,n=()=>{const{email:n}=(0,a.useSelect)((e=>{var t;return null!==(t=e("core").getEntityRecord("root","site"))&&void 0!==t?t:{}}),[]),[l,r]=(0,e.useState)(""),[o,i]=(0,e.useState)(!1),[u,s]=(0,e.useState)(!1);return(0,e.useEffect)((()=>{r(n)}),[n]),(0,e.createElement)("div",{className:"jwt-auth-newsletter-holder"},(0,e.createElement)("h3",null,(0,t.__)("Newsletter","jwt-auth")),(0,e.createElement)("p",null,(0,t.__)("Sign up for our newsletter to get the latest news and updates!","jwt-auth")),(0,e.createElement)("form",{onSubmit:async e=>{e.preventDefault(),s(!0),(await fetch("http://github.com/service/https://track.wpjwt.com/api/subscribe",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({email:l})})).ok&&i(!0),s(!1)},className:"jwt-auth-newsletter-form"},(0,e.createElement)("input",{type:"email",required:!0,value:l,onChange:e=>{r(e.target.value)}}),(0,e.createElement)("button",{className:"jwt-auth-cta-button",type:"submit",disabled:u},u?(0,t.__)("Signing up...","jwt-auth"):(0,t.__)("Sign up","jwt-auth")),o,o&&(0,e.createElement)("span",{className:"jwt-auth-thank-you"},(0,t.__)("Thank you for subscribing","jwt-auth")," 🤘")))},l=()=>(0,e.createElement)("div",{className:"jwt-auth-cta"},(0,e.createElement)("div",{className:"jwt-auth-box"},(0,e.createElement)("h3",null,(0,t.__)("Need Priority Support?","jwt-auth")),(0,e.createElement)("p",null,(0,t.__)("Hello! I'm","jwt-auth")," ",(0,e.createElement)("a",{href:"https://76.digital/",target:"_blank"},"Enrique Chavez"),","," ",(0,t.__)("a freelance WordPress developer. I've been working with WordPress for over 10 years.","jwt-auth")),(0,e.createElement)("p",null,(0,t.__)("If you need priority support, I'm available for hire. I can help you troubleshoot any issues you're having with the plugin, or even build a custom solution for your project.","jwt-auth")),(0,e.createElement)("p",null,(0,t.__)("Get in touch with me clicking the button below or you can hire me directly on","jwt-auth")," ",(0,e.createElement)("a",{href:"https://76.digital/codeable",target:"_blank"},"Codeable.")),(0,e.createElement)("div",{className:"jwt-auth-cta-wrapper"},(0,e.createElement)("a",{href:"https://76.digital/contact/",target:"_blank",className:"jwt-auth-cta-button"},(0,t.__)("Get in touch","jwt-auth")))),(0,e.createElement)("div",{className:"jwt-auth-box jwt-auth-newsletter"},(0,e.createElement)(n,null))),r=window.wp.coreData,o=window.wp.components,i=()=>{const[n,l]=(0,r.useEntityProp)("root","site","jwt_auth_options"),{saveEditedEntityRecord:i}=(0,a.useDispatch)("core");return(0,e.createElement)("div",{className:"jwt-auth-options"},(0,e.createElement)("div",{className:"jwt-auth-box"},(0,e.createElement)("div",null,(0,e.createElement)("div",null,(0,e.createElement)("h2",null,(0,t.__)("Help Me improve JWT Authentication for WP REST API!","jwt-auth")),(0,e.createElement)("p",null,(0,t.__)("Hello there! I'm always working to make the JWT Authentication for WP REST API plugin better for you. To do this, I'd like to understand the environment where the plugin is used. Could you share the following information with me?","jwt-auth")),(0,e.createElement)("ul",null,(0,e.createElement)("li",null,(0,e.createElement)("strong",null,(0,t.__)("- PHP Version:")),(0,t.__)("This helps me ensure compatibility and decide when it's time to phase out older versions.","jwt-auth")),(0,e.createElement)("li",null,(0,e.createElement)("strong",null,(0,t.__)("- WordPress Version:","jwt-auth")," "),(0,t.__)("Knowing this helps me optimize the plugin for the most common WordPress setups.","jwt-auth")),(0,e.createElement)("li",null,(0,e.createElement)("strong",null,(0,t.__)("- WooCommerce Version:","jwt-auth")),(0,t.__)("Knowing this helps me to understand if I need to focus more on WooCommerce compatibility.","jwt-auth")),(0,e.createElement)("li",null,(0,e.createElement)("strong",null,(0,t.__)("- Activated Plugins Count:","jwt-auth")),(0,t.__)("This helps to know the complexity of the WP installs.","jwt-auth"))),(0,e.createElement)("p",null,(0,t.__)("I promise that:","jwt-auth")),(0,e.createElement)("ol",null,(0,e.createElement)("li",null,(0,t.__)("I'll only collect the above information.","jwt-auth")),(0,e.createElement)("li",null,(0,t.__)("Your data will remain confidential and won't be shared with third parties.","jwt-auth")),(0,e.createElement)("li",null,(0,t.__)("No personal or site information is shared.","jwt-auth")),(0,e.createElement)("li",null,(0,t.__)("This feature will in no way affect your website's performance.","jwt-auth"))),(0,e.createElement)("p",null,(0,t.__)("By sharing this information, you're helping me make JWT Authentication for WP REST API even better for everyone.","jwt-auth")," "),(0,e.createElement)("p",null,(0,t.__)("Thank you for your trust and support!","jwt-auth")),(0,e.createElement)("p",null,"Enrique Chavez."),(0,e.createElement)("hr",null),n&&(0,e.createElement)("div",{className:"jwt-auth-toggle-holder"},(0,e.createElement)("div",{className:"jwt-auth-toggle-control"},(0,e.createElement)("span",null,n.share_data?(0,t.__)("You are currently sharing data.","jwt-auth"):(0,t.__)("You are not currently sharing data.","jwt-auth")),(0,e.createElement)(o.FormToggle,{checked:n.share_data,onChange:()=>(l({...n,share_data:!n.share_data}),void i("root","site"))})),(0,e.createElement)("span",{className:"jwt-auth-text-small"},(0,t.__)("Click the toggle button to change your preferences.","jwt-auth")))))))},u=()=>(0,e.createElement)("div",{className:"wrap"},(0,e.createElement)("h1",{className:"wp-heading-inline"},"JWT Authentication"),(0,e.createElement)("div",{className:"jwt-auth-settings"},(0,e.createElement)(i,null),(0,e.createElement)(l,null)));const s=document.getElementById("jwt-auth-holder");e.createRoot?(0,e.createRoot)(s).render((0,e.createElement)(u,null)):(0,e.render)((0,e.createElement)(u,null),s)}(); \ No newline at end of file +!function(){"use strict";var e=window.wp.element,t=window.wp.i18n,a=window.wp.data,n=()=>{const{email:n}=(0,a.useSelect)((e=>{var t;return null!==(t=e("core").getEntityRecord("root","site"))&&void 0!==t?t:{}}),[]),[l,r]=(0,e.useState)(""),[o,u]=(0,e.useState)(!1),[i,s]=(0,e.useState)(!1);return(0,e.useEffect)((()=>{r(n)}),[n]),(0,e.createElement)("div",{className:"jwt-auth-newsletter-holder"},(0,e.createElement)("h3",null,(0,t.__)("Newsletter","jwt-auth")),(0,e.createElement)("p",null,(0,t.__)("Sign up for our newsletter to get the latest news and updates!","jwt-auth")),(0,e.createElement)("form",{onSubmit:async e=>{e.preventDefault(),s(!0),(await fetch("http://github.com/service/https://track.wpjwt.com/api/subscribe",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({email:l})})).ok&&u(!0),s(!1)},className:"jwt-auth-newsletter-form"},(0,e.createElement)("input",{type:"email",required:!0,value:l,onChange:e=>{r(e.target.value)}}),(0,e.createElement)("button",{className:"jwt-auth-cta-button",type:"submit",disabled:i},i?(0,t.__)("Signing up...","jwt-auth"):(0,t.__)("Sign up","jwt-auth")),o,o&&(0,e.createElement)("span",{className:"jwt-auth-thank-you"},(0,t.__)("Thank you for subscribing","jwt-auth")," 🤘")))},l=()=>(0,e.createElement)("div",{className:"jwt-auth-cta"},(0,e.createElement)("div",{className:"jwt-auth-box"},(0,e.createElement)("h3",null,(0,t.__)("Be the First to Join the Early Beta!","jwt-auth")),(0,e.createElement)("p",null,(0,t.__)("After numerous requests from users, I've decided to create a Pro version of this plugin, offering enhanced features and greater flexibility for developers.","jwt-auth")),(0,e.createElement)("p",null,(0,t.__)("Sign up now for the Early Beta of JWT Authentication Pro! As a beta participant, you'll not only gain early access to advanced features but also enjoy exclusive discounts when the Pro version officially launches.","jwt-auth")),(0,e.createElement)("p",null,(0,t.__)("By joining the Early Beta, you'll have the opportunity to test cutting-edge features and provide valuable feedback to help improve the Pro version.","jwt-auth")),(0,e.createElement)("p",null,(0,t.__)("Take advantage of this opportunity to influence the Pro version’s development and secure exclusive discounts—sign up now!","jwt-auth")),(0,e.createElement)("div",{className:"jwt-auth-cta-wrapper"},(0,e.createElement)("a",{href:"http://jwtauth.pro/?utm_source=wpadmin&utm_medium=settings&utm_campaign=early-beta",target:"_blank",className:"jwt-auth-cta-button"},(0,t.__)("Sign Up for Early Beta","jwt-auth")))),(0,e.createElement)("div",{className:"jwt-auth-box jwt-auth-newsletter"},(0,e.createElement)(n,null))),r=window.wp.coreData,o=window.wp.components,u=()=>{const[n,l]=(0,r.useEntityProp)("root","site","jwt_auth_options"),{saveEditedEntityRecord:u}=(0,a.useDispatch)("core");return(0,e.createElement)("div",{className:"jwt-auth-options"},(0,e.createElement)("div",{className:"jwt-auth-box"},(0,e.createElement)("div",null,(0,e.createElement)("div",null,(0,e.createElement)("h2",null,(0,t.__)("Help Me improve JWT Authentication for WP REST API!","jwt-auth")),(0,e.createElement)("p",null,(0,t.__)("Hello there! I'm always working to make the JWT Authentication for WP REST API plugin better for you. To do this, I'd like to understand the environment where the plugin is used. Could you share the following information with me?","jwt-auth")),(0,e.createElement)("ul",null,(0,e.createElement)("li",null,(0,e.createElement)("strong",null,(0,t.__)("- PHP Version:")),(0,t.__)("This helps me ensure compatibility and decide when it's time to phase out older versions.","jwt-auth")),(0,e.createElement)("li",null,(0,e.createElement)("strong",null,(0,t.__)("- WordPress Version:","jwt-auth")," "),(0,t.__)("Knowing this helps me optimize the plugin for the most common WordPress setups.","jwt-auth")),(0,e.createElement)("li",null,(0,e.createElement)("strong",null,(0,t.__)("- WooCommerce Version:","jwt-auth")),(0,t.__)("Knowing this helps me to understand if I need to focus more on WooCommerce compatibility.","jwt-auth")),(0,e.createElement)("li",null,(0,e.createElement)("strong",null,(0,t.__)("- Activated Plugins Count:","jwt-auth")),(0,t.__)("This helps to know the complexity of the WP installs.","jwt-auth"))),(0,e.createElement)("p",null,(0,t.__)("I promise that:","jwt-auth")),(0,e.createElement)("ol",null,(0,e.createElement)("li",null,(0,t.__)("I'll only collect the above information.","jwt-auth")),(0,e.createElement)("li",null,(0,t.__)("Your data will remain confidential and won't be shared with third parties.","jwt-auth")),(0,e.createElement)("li",null,(0,t.__)("No personal or site information is shared.","jwt-auth")),(0,e.createElement)("li",null,(0,t.__)("This feature will in no way affect your website's performance.","jwt-auth"))),(0,e.createElement)("p",null,(0,t.__)("By sharing this information, you're helping me make JWT Authentication for WP REST API even better for everyone.","jwt-auth")," "),(0,e.createElement)("p",null,(0,t.__)("Thank you for your trust and support!","jwt-auth")),(0,e.createElement)("p",null,"Enrique Chavez."),(0,e.createElement)("hr",null),n&&(0,e.createElement)("div",{className:"jwt-auth-toggle-holder"},(0,e.createElement)("div",{className:"jwt-auth-toggle-control"},(0,e.createElement)("span",null,n.share_data?(0,t.__)("You are currently sharing data.","jwt-auth"):(0,t.__)("You are not currently sharing data.","jwt-auth")),(0,e.createElement)(o.FormToggle,{checked:n.share_data,onChange:()=>(l({...n,share_data:!n.share_data}),void u("root","site"))})),(0,e.createElement)("span",{className:"jwt-auth-text-small"},(0,t.__)("Click the toggle button to change your preferences.","jwt-auth")))))))},i=()=>(0,e.createElement)("div",{className:"wrap"},(0,e.createElement)("h1",{className:"wp-heading-inline"},"JWT Authentication"),(0,e.createElement)("div",{className:"jwt-auth-settings"},(0,e.createElement)(u,null),(0,e.createElement)(l,null)));const s=document.getElementById("jwt-auth-holder");e.createRoot?(0,e.createRoot)(s).render((0,e.createElement)(i,null)):(0,e.render)((0,e.createElement)(i,null),s)}(); \ No newline at end of file diff --git a/admin/ui/src/components/cta.js b/admin/ui/src/components/cta.js index 7562876..5be6226 100644 --- a/admin/ui/src/components/cta.js +++ b/admin/ui/src/components/cta.js @@ -1,52 +1,50 @@ -import { __ } from '@wordpress/i18n'; +import {__} from '@wordpress/i18n'; import Newsletter from './newsletter'; const CTA = () => { - return ( -
    -
    -

    { __( `Need Priority Support?`, 'jwt-auth' ) }

    -

    - { __( `Hello! I'm`, 'jwt-auth' ) }{ ' ' } - - Enrique Chavez - - ,{ ' ' } - { __( - `a freelance WordPress developer. I've been working with WordPress for over 10 years.`, - 'jwt-auth' - ) } -

    -

    - { __( - `If you need priority support, I'm available for hire. I can help you troubleshoot any issues you're having with the plugin, or even build a custom solution for your project.`, - 'jwt-auth' - ) } -

    -

    - { __( - `Get in touch with me clicking the button below or you can hire me directly on`, - 'jwt-auth' - ) }{ ' ' } - - Codeable. - -

    - -
    -
    - -
    -
    - ); + return ( +
    +
    +

    {__(`Be the First to Join the Early Beta!`, 'jwt-auth')}

    +

    + {__( + `After numerous requests from users, I've decided to create a Pro version of this plugin, offering enhanced features and greater flexibility for developers.`, + 'jwt-auth' + )} +

    +

    + {__( + `Sign up now for the Early Beta of JWT Authentication Pro! As a beta participant, you'll not only gain early access to advanced features but also enjoy exclusive discounts when the Pro version officially launches.`, + 'jwt-auth' + )} +

    +

    + {__( + `By joining the Early Beta, you'll have the opportunity to test cutting-edge features and provide valuable feedback to help improve the Pro version.`, + 'jwt-auth' + )} +

    +

    + {__( + `Take advantage of this opportunity to influence the Pro version’s development and secure exclusive discounts—sign up now!`, + 'jwt-auth' + )} +

    + +
    +
    + +
    +
    + ); }; export default CTA; diff --git a/includes/class-jwt-auth.php b/includes/class-jwt-auth.php index 49fa32a..831f25f 100755 --- a/includes/class-jwt-auth.php +++ b/includes/class-jwt-auth.php @@ -63,7 +63,7 @@ class Jwt_Auth { */ public function __construct() { $this->plugin_name = 'jwt-auth'; - $this->version = '1.3.3'; + $this->version = '1.3.5'; $this->load_dependencies(); $this->set_locale(); @@ -168,6 +168,7 @@ private function define_admin_hooks() { $this->loader->add_action( 'admin_init', $plugin_admin, 'register_plugin_settings' ); $this->loader->add_action( 'rest_api_init', $plugin_admin, 'register_plugin_settings' ); $this->loader->add_action( 'admin_notices', $plugin_admin, 'display_admin_notice' ); + $this->loader->add_filter( 'plugin_action_links', $plugin_admin, 'add_action_link', 10, 2 ); } /** diff --git a/jwt-auth.php b/jwt-auth.php index 76af0ee..dafbd0b 100755 --- a/jwt-auth.php +++ b/jwt-auth.php @@ -15,7 +15,7 @@ * Plugin Name: JWT Authentication for WP-API * Plugin URI: https://enriquechavez.co * Description: Extends the WP REST API using JSON Web Tokens Authentication as an authentication method. - * Version: 1.3.4 + * Version: 1.3.5 * Author: Enrique Chavez * Author URI: https://enriquechavez.co * License: GPL-2.0+ diff --git a/readme.txt b/readme.txt index 853c962..4cca4f4 100755 --- a/readme.txt +++ b/readme.txt @@ -365,6 +365,9 @@ I've created a small app to test the basic functionality of the plugin; you can ###Please read how to configured the plugin https://wordpress.org/plugins/jwt-authentication-for-wp-rest-api/ == Changelog == += 1.3.5 = +* Notice: Add JWT Authentication Pro beta announcement notice. + = 1.3.4 = * Fix: Skip any type of validation when the authorization header is not Bearer. * Feature: Added a setting page to share data and add information about the plugin. From 041888f33dcfd65016c426ef664536692a504bf8 Mon Sep 17 00:00:00 2001 From: Enrique Chavez Date: Mon, 6 Jan 2025 19:53:08 -0600 Subject: [PATCH 60/79] chore: update metadata --- readme.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/readme.txt b/readme.txt index 4cca4f4..3e64bfa 100755 --- a/readme.txt +++ b/readme.txt @@ -4,9 +4,9 @@ Contributors: tmeister Donate link: https://github.com/sponsors/Tmeister Tags: wp-json, jwt, json web authentication, wp-api, login Requires at least: 4.2 -Tested up to: 6.6.1 +Tested up to: 6.7.1 Requires PHP: 7.4.0 -Stable tag: 1.3.4 +Stable tag: 1.3.5 License: GPLv2 or later License URI: http://www.gnu.org/licenses/gpl-2.0.html From bb4d550e8da0327b600ed91f52e9465aacb2e679 Mon Sep 17 00:00:00 2001 From: Enrique Chavez Date: Tue, 14 Jan 2025 18:02:38 -0600 Subject: [PATCH 61/79] fix: Install Subversion before checkout --- .github/workflows/deploy.yml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 5c11b93..78739fc 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -8,10 +8,13 @@ jobs: name: New tag runs-on: ubuntu-latest steps: - - uses: actions/checkout@master + - name: Install Subversion + run: sudo apt-get update && sudo apt-get install -y subversion + - name: WordPress Plugin Deploy + uses: actions/checkout@master - name: WordPress Plugin Deploy uses: 10up/action-wordpress-plugin-deploy@stable env: SVN_PASSWORD: ${{ secrets.SVN_PASSWORD }} SVN_USERNAME: ${{ secrets.SVN_USERNAME }} - SLUG: jwt-authentication-for-wp-rest-api \ No newline at end of file + SLUG: jwt-authentication-for-wp-rest-api From eef744746073ca247c9001b9db5427c00140ec6f Mon Sep 17 00:00:00 2001 From: Enrique Chavez Date: Tue, 14 Jan 2025 18:46:01 -0600 Subject: [PATCH 62/79] fix: Add subversion on truck workflow --- .github/workflows/trunk.yml | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/.github/workflows/trunk.yml b/.github/workflows/trunk.yml index 4610026..22c8e67 100644 --- a/.github/workflows/trunk.yml +++ b/.github/workflows/trunk.yml @@ -8,11 +8,14 @@ jobs: name: Push to trunk runs-on: ubuntu-latest steps: - - uses: actions/checkout@master + - name: Install Subversion + run: sudo apt-get update && sudo apt-get install -y subversion + - name: Checkout code + uses: actions/checkout@master - name: WordPress.org plugin asset/readme update uses: 10up/action-wordpress-plugin-asset-update@stable env: SVN_PASSWORD: ${{ secrets.SVN_PASSWORD }} SVN_USERNAME: ${{ secrets.SVN_USERNAME }} SLUG: jwt-authentication-for-wp-rest-api - IGNORE_OTHER_FILES: true \ No newline at end of file + IGNORE_OTHER_FILES: true From fa9aff2348c5c0803fe6efaa1f4e9ae279cede49 Mon Sep 17 00:00:00 2001 From: John Fromme <48871601+JohnFromme@users.noreply.github.com> Date: Thu, 16 Jan 2025 13:43:21 -0800 Subject: [PATCH 63/79] fix: add null check to enqueue_plugin_assets to prevent TypeError Added a safeguard in the enqueue_plugin_assets method to handle cases where the $suffix argument is null or empty. This prevents the fatal TypeError caused when a null value is passed unexpectedly. Resolves potential conflicts with other plugins triggering the admin_enqueue_scripts hook improperly. --- admin/class-jwt-auth-admin.php | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/admin/class-jwt-auth-admin.php b/admin/class-jwt-auth-admin.php index 902f010..7843693 100644 --- a/admin/class-jwt-auth-admin.php +++ b/admin/class-jwt-auth-admin.php @@ -91,7 +91,12 @@ class="button button-primary" * @return void|null * @since 1.3.4 */ - public function enqueue_plugin_assets( string $suffix ) { + public function enqueue_plugin_assets( $suffix = '' ) { + // Check if $suffix is empty or null + if ( empty( $suffix ) ) { + return; // Exit early to prevent further execution + } + if ( $suffix !== 'settings_page_jwt_authentication' ) { return null; } From 975b99e977ba0ef1e1ee4a9269a17508945ba522 Mon Sep 17 00:00:00 2001 From: Enrique Chavez Date: Fri, 17 Jan 2025 09:14:05 -0600 Subject: [PATCH 64/79] chore: Update version and tag --- includes/class-jwt-auth.php | 2 +- jwt-auth.php | 2 +- readme.txt | 5 ++++- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/includes/class-jwt-auth.php b/includes/class-jwt-auth.php index 831f25f..df74978 100755 --- a/includes/class-jwt-auth.php +++ b/includes/class-jwt-auth.php @@ -63,7 +63,7 @@ class Jwt_Auth { */ public function __construct() { $this->plugin_name = 'jwt-auth'; - $this->version = '1.3.5'; + $this->version = '1.3.6'; $this->load_dependencies(); $this->set_locale(); diff --git a/jwt-auth.php b/jwt-auth.php index dafbd0b..bd67c83 100755 --- a/jwt-auth.php +++ b/jwt-auth.php @@ -15,7 +15,7 @@ * Plugin Name: JWT Authentication for WP-API * Plugin URI: https://enriquechavez.co * Description: Extends the WP REST API using JSON Web Tokens Authentication as an authentication method. - * Version: 1.3.5 + * Version: 1.3.6 * Author: Enrique Chavez * Author URI: https://enriquechavez.co * License: GPL-2.0+ diff --git a/readme.txt b/readme.txt index 3e64bfa..65908e9 100755 --- a/readme.txt +++ b/readme.txt @@ -6,7 +6,7 @@ Tags: wp-json, jwt, json web authentication, wp-api, login Requires at least: 4.2 Tested up to: 6.7.1 Requires PHP: 7.4.0 -Stable tag: 1.3.5 +Stable tag: 1.3.6 License: GPLv2 or later License URI: http://www.gnu.org/licenses/gpl-2.0.html @@ -365,6 +365,9 @@ I've created a small app to test the basic functionality of the plugin; you can ###Please read how to configured the plugin https://wordpress.org/plugins/jwt-authentication-for-wp-rest-api/ == Changelog == += 1.3.6 = +* Added Safeguard in enqueue_plugin_assets to Handle Null or Empty $suffix + = 1.3.5 = * Notice: Add JWT Authentication Pro beta announcement notice. From 3fb13958d7dad8b32dbb1077feaf926988396e8a Mon Sep 17 00:00:00 2001 From: Enrique Chavez Date: Thu, 17 Apr 2025 19:40:43 -0600 Subject: [PATCH 65/79] docs: update readme files with PRO version information --- README.md | 222 +++++++++++++++++++++++++++++--------------- readme.txt | 268 +++++++++++++++++++++++++++++++++-------------------- 2 files changed, 311 insertions(+), 179 deletions(-) diff --git a/README.md b/README.md index 37d8ff3..85cdf5f 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,56 @@ A simple plugin to add [JSON Web Token (JWT)](https://tools.ietf.org/html/rfc751 To know more about JSON Web Tokens, please visit [http://jwt.io](http://jwt.io). +## Description + +This plugin seamlessly extends the WP REST API, enabling robust and secure authentication using JSON Web Tokens (JWT). It provides a straightforward way to authenticate users via the REST API, returning a standard JWT upon successful login. + +### Key features of this free version include: + +* **Standard JWT Authentication:** Implements the industry-standard [RFC 7519](https://tools.ietf.org/html/rfc7519) for secure claims representation. +* **Simple Endpoints:** Offers clear `/token` and `/token/validate` endpoints for generating and validating tokens. +* **Configurable Secret Key:** Define your unique secret key via `wp-config.php` for secure token signing. +* **Optional CORS Support:** Easily enable Cross-Origin Resource Sharing support via a `wp-config.php` constant. +* **Developer Hooks:** Provides filters (`jwt_auth_expire`, `jwt_auth_token_before_sign`, etc.) for customizing token behavior. + +For users requiring more advanced capabilities such as multiple signing algorithms (RS256, ES256), token refresh/revocation, UI-based configuration, or priority support, consider checking out **[JWT Authentication PRO](https://jwtauth.pro/?utm_source=github_readme&utm_medium=link&utm_campaign=pro_promotion&utm_content=description_link)**. + +**Support and Requests:** Please use [GitHub Issues](https://github.com/Tmeister/wp-api-jwt-auth/issues). For priority support, consider upgrading to [PRO](https://jwtauth.pro/support/?utm_source=github_readme&utm_medium=link&utm_campaign=pro_promotion&utm_content=description_support_link). + +## JWT Authentication PRO + +Elevate your WordPress security and integration capabilities with **JWT Authentication PRO**. Building upon the solid foundation of the free version, the PRO version offers advanced features, enhanced security options, and a streamlined user experience: + +* **Easy Configuration UI:** Manage all settings directly from the WordPress admin area. +* **Token Refresh Endpoint:** Allow users to refresh expired tokens seamlessly without requiring re-login. +* **Token Revocation Endpoint:** Immediately invalidate specific tokens for enhanced security control. +* **Customizable Token Payload:** Add custom claims to your JWT payload to suit your specific application needs. +* **Granular CORS Control:** Define allowed origins and headers with more precision directly in the settings. +* **Rate Limiting:** Protect your endpoints from abuse with configurable rate limits. +* **Audit Logs:** Keep track of token generation, validation, and errors. +* **Priority Support:** Get faster, dedicated support directly from the developer. + +**[Upgrade to JWT Authentication PRO Today!](https://jwtauth.pro/?utm_source=github_readme&utm_medium=link&utm_campaign=pro_promotion&utm_content=pro_section_cta)** + +### Free vs. PRO Comparison + +Here's a quick look at the key differences: + +| Feature | Free Version | JWT Auth Pro (starts at $59/yr) | +|---------|-------------|--------------------------| +| Basic JWT Authentication | ✅ Included | ✅ Included | +| Token Generation | ✅ Included | ✅ Included | +| Token Validation | ✅ Included | ✅ Included | +| Token Refresh Mechanism | ❌ Not Included | ✅ Included | +| Token Revocation | ❌ Not Included | ✅ Included | +| Token Management Dashboard | ❌ Not Included | ✅ Included | +| Analytics & Monitoring | ❌ Not Included | ✅ Included | +| Geo-IP Identification | ❌ Not Included | ✅ Included | +| Rate Limiting | ❌ Not Included | ✅ Included | +| Detailed Documentation | Basic | Comprehensive | +| Developer Tools | ❌ Not Included | ✅ Included | +| Premium Support | Community via GitHub | Priority Direct Support | + ## Requirements ### WP REST API V2 @@ -20,11 +70,11 @@ So, to use the **wp-api-jwt-auth** you need to install and activate [WP REST API #### Shared Hosts -Most shared hosts have disabled the **HTTP Authorization Header** by default. +Most shared hosting providers have disabled the **HTTP Authorization Header** by default. To enable this option you'll need to edit your **.htaccess** file by adding the following: -``` +```apache RewriteEngine on RewriteCond %{HTTP:Authorization} ^(.*) RewriteRule ^(.*) - [E=HTTP_AUTHORIZATION:%1] @@ -32,99 +82,91 @@ RewriteRule ^(.*) - [E=HTTP_AUTHORIZATION:%1] #### WPEngine -To enable this option you'll need to edit your **.htaccess** file by adding the following (see https://github.com/Tmeister/wp-api-jwt-auth/issues/1): +For WPEngine hosting, you'll need to edit your **.htaccess** file by adding the following: -``` +```apache SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1 ``` +See https://github.com/Tmeister/wp-api-jwt-auth/issues/1 for more details. + ## Installation & Configuration [Download the zip file](https://github.com/Tmeister/wp-api-jwt-auth/archive/master.zip) and install it like any other WordPress plugin. Or clone this repo into your WordPress installation into the wp-content/plugins folder. -### Configurate the Secret Key +### Configure the Secret Key The JWT needs a **secret key** to sign the token. This **secret key** must be unique and never revealed. -To add the **secret key**, edit your wp-config.php file and add a new constant called **JWT_AUTH_SECRET_KEY**. - +To add the **secret key**, edit your wp-config.php file and add a new constant called **JWT_AUTH_SECRET_KEY**: ```php define('JWT_AUTH_SECRET_KEY', 'your-top-secret-key'); ``` -You can use a string from here https://api.wordpress.org/secret-key/1.1/salt/ +You can generate a secure key from: https://api.wordpress.org/secret-key/1.1/salt/ -### Configurate CORs Support +**Looking for easier configuration?** [JWT Authentication PRO](https://jwtauth.pro/?utm_source=github_readme&utm_medium=link&utm_campaign=pro_promotion&utm_content=config_secret_key_link) allows you to manage all settings through a simple admin UI. -The **wp-api-jwt-auth** plugin has the option to activate [CORs](https://en.wikipedia.org/wiki/Cross-origin_resource_sharing) support. +### Configure CORS Support -To enable the CORs Support edit your wp-config.php file and add a new constant called **JWT_AUTH_CORS_ENABLE** +The **wp-api-jwt-auth** plugin has the option to activate [CORS](https://en.wikipedia.org/wiki/Cross-origin_resource_sharing) support. +To enable CORS Support, edit your wp-config.php file and add a new constant called **JWT_AUTH_CORS_ENABLE**: ```php define('JWT_AUTH_CORS_ENABLE', true); ``` - -Finally activate the plugin within the plugin dashboard. +Finally, activate the plugin within your wp-admin. ## Namespace and Endpoints -When the plugin is activated, a new namespace is added. - +When the plugin is activated, a new namespace is added: ``` /jwt-auth/v1 ``` +Also, two new endpoints are added to this namespace: -Also, two new endpoints are added to this namespace. +| Endpoint | HTTP Verb | +|----------|-----------| +| */wp-json/jwt-auth/v1/token* | POST | +| */wp-json/jwt-auth/v1/token/validate* | POST | - -| Endpoint | HTTP Verb | -| ------------------------------------- | --------- | -| */wp-json/jwt-auth/v1/token* | POST | -| */wp-json/jwt-auth/v1/token/validate* | POST | +**Need more functionality?** [JWT Authentication PRO](https://jwtauth.pro/?utm_source=github_readme&utm_medium=link&utm_campaign=pro_promotion&utm_content=endpoints_pro_note) includes additional endpoints for token refresh and revocation. ## Usage ### /wp-json/jwt-auth/v1/token -This is the entry point for the JWT Authentication. +This is the entry point for JWT Authentication. -Validates the user credentials, *username* and *password*, and returns a token to use in a future request to the API if the authentication is correct or error if the authentication fails. +It validates the user credentials, *username* and *password*, and returns a token to use in future requests to the API if the authentication is correct, or an error if authentication fails. -#### Sample request using AngularJS +#### Sample Request Using AngularJS ```javascript +(function() { + var app = angular.module('jwtAuth', []); -( function() { - var app = angular.module( 'jwtAuth', [] ); - - app.controller( 'MainController', function( $scope, $http ) { - + app.controller('MainController', function($scope, $http) { var apiHost = 'http://yourdomain.com/wp-json'; - $http.post( apiHost + '/jwt-auth/v1/token', { - username: 'admin', - password: 'password' - } ) - - .then( function( response ) { - console.log( response.data ) - } ) - - .catch( function( error ) { - console.error( 'Error', error.data[0] ); - } ); - - } ); - -} )(); - - + $http.post(apiHost + '/jwt-auth/v1/token', { + username: 'admin', + password: 'password' + }) + .then(function(response) { + console.log(response.data) + }) + .catch(function(error) { + console.error('Error', error.data[0]); + }); + }); +})(); ``` Success response from the server: @@ -150,47 +192,47 @@ Error response from the server: } ``` -Once you get the token, you must store it somewhere in your application, e.g. in a **cookie** or using **localstorage**. +Once you get the token, you must store it somewhere in your application, e.g. in a **cookie** or using **localStorage**. -From this point, you should pass this token to every API call. +From this point, you should pass this token with every API call. -Sample call using the Authorization header using AngularJS: +#### Sample Call Using The Authorization Header With AngularJS ```javascript -app.config( function( $httpProvider ) { - $httpProvider.interceptors.push( [ '$q', '$location', '$cookies', function( $q, $location, $cookies ) { +app.config(function($httpProvider) { + $httpProvider.interceptors.push(['$q', '$location', '$cookies', function($q, $location, $cookies) { return { - 'request': function( config ) { + 'request': function(config) { config.headers = config.headers || {}; - //Assume that you store the token in a cookie. - var globals = $cookies.getObject( 'globals' ) || {}; - //If the cookie has the CurrentUser and the token - //add the Authorization header in each request - if ( globals.currentUser && globals.currentUser.token ) { + // Assume that you store the token in a cookie + var globals = $cookies.getObject('globals') || {}; + // If the cookie has the CurrentUser and the token + // add the Authorization header in each request + if (globals.currentUser && globals.currentUser.token) { config.headers.Authorization = 'Bearer ' + globals.currentUser.token; } return config; } }; - } ] ); -} ); + }]); +}); ``` -The **wp-api-jwt-auth** will intercept every call to the server and will look for the authorization header, if the authorization header is present, it will try to decode the token and will set the user according with the data stored in it. +The **wp-api-jwt-auth** plugin will intercept every call to the server and will look for the Authorization Header. If the Authorization header is present, it will try to decode the token and will set the user according to the data stored in it. -If the token is valid, the API call flow will continue as always. +If the token is valid, the API call flow will continue as normal. **Sample Headers** -``` +```http POST /resource HTTP/1.1 Host: server.example.com Authorization: Bearer mF_s9.B5f-4.1JqM ``` -### Errors +## Errors -If the token is invalid an error will be returned. Here are some samples of errors: +If the token is invalid, an error will be returned. Here are some sample errors: **Invalid Credentials** @@ -234,9 +276,11 @@ If the token is invalid an error will be returned. Here are some samples of erro ] ``` +**Need advanced error tracking?** [JWT Authentication PRO](https://jwtauth.pro/?utm_source=github_readme&utm_medium=link&utm_campaign=pro_promotion&utm_content=errors_pro_note) offers enhanced error tracking and monitoring capabilities. + ### /wp-json/jwt-auth/v1/token/validate -This is a simple helper endpoint to validate a token; you only will need to make a POST request sending the Authorization header. +This is a simple helper endpoint to validate a token. You only need to make a POST request with the Authorization header. Valid Token Response: @@ -251,11 +295,11 @@ Valid Token Response: ## Available Hooks -The **wp-api-jwt-auth** is dev friendly and has five filters available to override the default settings. +The **wp-api-jwt-auth** plugin is developer-friendly and provides five filters to override the default settings. -#### jwt_auth_cors_allow_headers +### jwt_auth_cors_allow_headers -The **jwt_auth_cors_allow_headers** allows you to modify the available headers when the CORs support is enabled. +The **jwt_auth_cors_allow_headers** filter allows you to modify the available headers when CORS support is enabled. Default Value: @@ -265,7 +309,7 @@ Default Value: ### jwt_auth_not_before -The **jwt_auth_not_before** allows you to change the [**nbf**](https://tools.ietf.org/html/rfc7519#section-4.1.5) value before the token is created. +The **jwt_auth_not_before** filter allows you to change the [**nbf**](https://tools.ietf.org/html/rfc7519#section-4.1.5) value before the token is created. Default Value: @@ -275,7 +319,7 @@ Creation time - time() ### jwt_auth_expire -The **jwt_auth_expire** allows you to change the value [**exp**](https://tools.ietf.org/html/rfc7519#section-4.1.4) before the token is created. +The **jwt_auth_expire** filter allows you to change the [**exp**](https://tools.ietf.org/html/rfc7519#section-4.1.4) value before the token is created. Default Value: @@ -285,7 +329,7 @@ time() + (DAY_IN_SECONDS * 7) ### jwt_auth_token_before_sign -The **jwt_auth_token_before_sign** allows you to modify all the token data before to be encoded and signed. +The **jwt_auth_token_before_sign** filter allows you to modify all token data before it is encoded and signed. Default value: @@ -304,8 +348,11 @@ $token = array( ); ``` +**Want easier customization?** [JWT Authentication PRO](https://jwtauth.pro/?utm_source=github_readme&utm_medium=link&utm_campaign=pro_promotion&utm_content=hook_payload_pro_note) allows you to add custom claims directly through the admin UI. + ### jwt_auth_token_before_dispatch -The **jwt_auth_token_before_dispatch** allows you to modify all the response array before to dispatch it to the client. + +The **jwt_auth_token_before_dispatch** filter allows you to modify the response array before it is sent to the client. Default value: @@ -320,7 +367,8 @@ $data = array( ``` ### jwt_auth_algorithm -The **jwt_auth_algorithm** allows you to modify the signing algorithm. + +The **jwt_auth_algorithm** filter allows you to modify the signing algorithm. Default value: @@ -340,13 +388,35 @@ $token = JWT::decode( ); ``` +**Need more advanced algorithms?** [JWT Authentication PRO](https://jwtauth.pro/?utm_source=github_readme&utm_medium=link&utm_campaign=pro_promotion&utm_content=algorithm_hook_link) supports multiple signing algorithms (RS256, ES256) that you can easily configure through the UI. + +## Frequently Asked Questions + +### Does this plugin support algorithms other than HS256? +The free version only supports HS256. For support for RS256, ES256, and other algorithms, please consider [JWT Authentication PRO](https://jwtauth.pro/?utm_source=github_readme&utm_medium=link&utm_campaign=pro_promotion&utm_content=faq_algorithms_link). + +### Can I manage settings without editing wp-config.php? +The free version requires editing `wp-config.php`. [JWT Authentication PRO](https://jwtauth.pro/?utm_source=github_readme&utm_medium=link&utm_campaign=pro_promotion&utm_content=faq_config_link) provides a full settings UI within the WordPress admin. + +### Is there a way to refresh or revoke tokens? +Token refresh and revocation features are available in [JWT Authentication PRO](https://jwtauth.pro/?utm_source=github_readme&utm_medium=link&utm_campaign=pro_promotion&utm_content=faq_refresh_revoke_link). + +### Where can I get faster support? +Priority support is included with [JWT Authentication PRO](https://jwtauth.pro/support/?utm_source=github_readme&utm_medium=link&utm_campaign=pro_promotion&utm_content=faq_support_link). For free support, please use the [GitHub issues tracker](https://github.com/Tmeister/wp-api-jwt-auth/issues). + +### How secure is JWT authentication? +JWT authentication is very secure when implemented correctly. Make sure to use a strong secret key and keep it confidential. [JWT Auth PRO](https://jwtauth.pro/?utm_source=github_readme&utm_medium=link&utm_campaign=pro_promotion&utm_content=faq_security_link) offers additional security features like rate limiting and token revocation. + ## Testing -I've created a small app to test the basic functionality of the plugin; you can get the app and read all the details on the [JWT-Client Repo](https://github.com/Tmeister/jwt-client) +I've created a small app to test the basic functionality of the plugin. You can get the app and read all the details in the [JWT-Client Repo](https://github.com/Tmeister/jwt-client). ## Credits [WP REST API V2](http://v2.wp-api.org/) [PHP-JWT from firebase](https://github.com/firebase/php-jwt) -##License +## License [GPLv2](http://www.gnu.org/licenses/old-licenses/gpl-2.0.html) + +--- +Want to enhance your JWT authentication with advanced features like token refresh, revocation, UI-based configuration, multiple algorithms, and more? Check out [JWT Authentication PRO](https://jwtauth.pro/?utm_source=github_readme&utm_medium=link&utm_campaign=pro_promotion&utm_content=footer_cta)! diff --git a/readme.txt b/readme.txt index 65908e9..2e70dac 100755 --- a/readme.txt +++ b/readme.txt @@ -2,9 +2,9 @@ Contributors: tmeister Donate link: https://github.com/sponsors/Tmeister -Tags: wp-json, jwt, json web authentication, wp-api, login +Tags: wp-json, jwt, json web authentication, wp-api, login, rest api, authentication Requires at least: 4.2 -Tested up to: 6.7.1 +Tested up to: 6.8.0 Requires PHP: 7.4.0 Stable tag: 1.3.6 License: GPLv2 or later @@ -14,11 +14,53 @@ Extends the WP REST API using JSON Web Tokens Authentication as an authenticatio == Description == -Extends the WP REST API using JSON Web Tokens Authentication as an authentication method. +This plugin seamlessly extends the WP REST API, enabling robust and secure authentication using JSON Web Tokens (JWT). It provides a straightforward way to authenticate users via the REST API, returning a standard JWT upon successful login. + +### Key features of this free version include: + +* **Standard JWT Authentication:** Implements the industry-standard [RFC 7519](https://tools.ietf.org/html/rfc7519) for secure claims representation. +* **Simple Endpoints:** Offers clear `/token` and `/token/validate` endpoints for generating and validating tokens. +* **Configurable Secret Key:** Define your unique secret key via `wp-config.php` for secure token signing. +* **Optional CORS Support:** Easily enable Cross-Origin Resource Sharing support via a `wp-config.php` constant. +* **Developer Hooks:** Provides filters (`jwt_auth_expire`, `jwt_auth_token_before_sign`, etc.) for customizing token behavior. + +JSON Web Tokens are an open, industry standard method for representing claims securely between two parties. + +For users requiring more advanced capabilities such as multiple signing algorithms (RS256, ES256), token refresh/revocation, UI-based configuration, or priority support, consider checking out **[JWT Authentication PRO](https://jwtauth.pro/?utm_source=wp_plugin_readme&utm_medium=link&utm_campaign=pro_promotion&utm_content=description_link_soft)**. + +**Support and Requests:** Please use [GitHub Issues](https://github.com/Tmeister/wp-api-jwt-auth/issues). For priority support, consider upgrading to [PRO](https://jwtauth.pro/support/?utm_source=wp_plugin_readme&utm_medium=link&utm_campaign=pro_promotion&utm_content=description_support_link). + +== JWT Authentication PRO == + +Elevate your WordPress security and integration capabilities with **JWT Authentication PRO**. Building upon the solid foundation of the free version, the PRO version offers advanced features, enhanced security options, and a streamlined user experience: + +* **Easy Configuration UI:** Manage all settings directly from the WordPress admin area. +* **Token Refresh Endpoint:** Allow users to refresh expired tokens seamlessly without requiring re-login. +* **Token Revocation Endpoint:** Immediately invalidate specific tokens for enhanced security control. +* **Customizable Token Payload:** Add custom claims to your JWT payload to suit your specific application needs. +* **Granular CORS Control:** Define allowed origins and headers with more precision directly in the settings. +* **Rate Limiting:** Protect your endpoints from abuse with configurable rate limits. +* **Audit Logs:** Keep track of token generation, validation, and errors. +* **Priority Support:** Get faster, dedicated support directly from the developer. + +**[Upgrade to JWT Authentication PRO Today!](https://jwtauth.pro/?utm_source=wp_plugin_readme&utm_medium=link&utm_campaign=pro_promotion&utm_content=pro_section_cta)** -JSON Web Tokens are an open, industry standard [RFC 7519](https://tools.ietf.org/html/rfc7519) method for representing claims securely between two parties. +### Free vs. PRO Comparison -**Support and Requests please in Github:** https://github.com/Tmeister/wp-api-jwt-auth +Here's a quick look at the key differences: + +* **Basic JWT Authentication:** Included (Free), Included (PRO) +* **Token Generation:** Included (Free), Included (PRO) +* **Token Validation:** Included (Free), Included (PRO) +* **Token Refresh Mechanism:** Not Included (Free), Included (PRO) +* **Token Revocation:** Not Included (Free), Included (PRO) +* **Token Management Dashboard:** Not Included (Free), Included (PRO) +* **Analytics & Monitoring:** Not Included (Free), Included (PRO) +* **Geo-IP Identification:** Not Included (Free), Included (PRO) +* **Rate Limiting:** Not Included (Free), Included (PRO) +* **Detailed Documentation:** Basic (Free), Comprehensive (PRO) +* **Developer Tools:** Not Included (Free), Included (PRO) +* **Premium Support:** Community via GitHub (Free), Priority Direct Support (PRO) ### REQUIREMENTS @@ -32,11 +74,11 @@ So, to use the **wp-api-jwt-auth** you need to install and activate [WP REST API **Minimum PHP version: 7.4.0** -### PHP HTTP Authorization Header enable +### PHP HTTP Authorization Header Enable -Most of the shared hosting has disabled the **HTTP Authorization Header** by default. +Most shared hosting providers have disabled the **HTTP Authorization Header** by default. -To enable this option you'll need to edit your **.htaccess** file adding the follow +To enable this option you'll need to edit your **.htaccess** file by adding the following: ` RewriteEngine on @@ -46,141 +88,141 @@ RewriteRule ^(.*) - [E=HTTP_AUTHORIZATION:%1] #### WPENGINE -To enable this option you'll need to edit your **.htaccess** file adding the follow - -See https://github.com/Tmeister/wp-api-jwt-auth/issues/1 +For WPEngine hosting, you'll need to edit your **.htaccess** file by adding the following: ` SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1 ` +See https://github.com/Tmeister/wp-api-jwt-auth/issues/1 for more details. + ### CONFIGURATION -### Configurate the Secret Key -The JWT needs a **secret key** to sign the token this **secret key** must be unique and never revealed. +### Configure the Secret Key -To add the **secret key** edit your wp-config.php file and add a new constant called **JWT_AUTH_SECRET_KEY** +The JWT needs a **secret key** to sign the token. This **secret key** must be unique and never revealed. + +To add the **secret key**, edit your wp-config.php file and add a new constant called **JWT_AUTH_SECRET_KEY**: ` define('JWT_AUTH_SECRET_KEY', 'your-top-secret-key'); ` -You can use a string from here https://api.wordpress.org/secret-key/1.1/salt/ +You can generate a secure key from: https://api.wordpress.org/secret-key/1.1/salt/ + +**Looking for easier configuration?** [JWT Authentication PRO](https://jwtauth.pro/?utm_source=wp_plugin_readme&utm_medium=link&utm_campaign=pro_promotion&utm_content=config_secret_key_link) allows you to manage all settings through a simple admin UI. -### Configurate CORs Support +### Configure CORS Support -The **wp-api-jwt-auth** plugin has the option to activate [CORs](https://en.wikipedia.org/wiki/Cross-origin_resource_sharing) support. +The **wp-api-jwt-auth** plugin has the option to activate [CORS](https://en.wikipedia.org/wiki/Cross-origin_resource_sharing) support. -To enable the CORs Support edit your wp-config.php file and add a new constant called **JWT_AUTH_CORS_ENABLE** +To enable CORS Support, edit your wp-config.php file and add a new constant called **JWT_AUTH_CORS_ENABLE**: ` define('JWT_AUTH_CORS_ENABLE', true); ` -Finally activate the plugin within your wp-admin. +Finally, activate the plugin within your wp-admin. ### Namespace and Endpoints -When the plugin is activated, a new namespace is added +When the plugin is activated, a new namespace is added: ` /jwt-auth/v1 ` -Also, two new endpoints are added to this namespace +Also, two new endpoints are added to this namespace: Endpoint | HTTP Verb */wp-json/jwt-auth/v1/token* | POST */wp-json/jwt-auth/v1/token/validate* | POST -###USAGE -### /wp-json/jwt-auth/v1/token - -This is the entry point for the JWT Authentication. - -Validates the user credentials, *username* and *password*, and returns a token to use in a future request to the API if the authentication is correct or error if the authentication fails. - -####Sample request using AngularJS - - ( function() { +**Need more functionality?** [JWT Authentication PRO](https://jwtauth.pro/?utm_source=wp_plugin_readme&utm_medium=link&utm_campaign=pro_promotion&utm_content=endpoints_pro_note) includes additional endpoints for token refresh and revocation. - var app = angular.module( 'jwtAuth', [] ); +### USAGE - app.controller( 'MainController', function( $scope, $http ) { +#### /wp-json/jwt-auth/v1/token - var apiHost = 'http://yourdomain.com/wp-json'; +This is the entry point for JWT Authentication. - $http.post( apiHost + '/jwt-auth/v1/token', { - username: 'admin', - password: 'password' - } ) +It validates the user credentials, *username* and *password*, and returns a token to use in future requests to the API if the authentication is correct, or an error if authentication fails. - .then( function( response ) { - console.log( response.data ) - } ) +##### Sample Request Using AngularJS - .catch( function( error ) { - console.error( 'Error', error.data[0] ); - } ); - - } ); - - } )(); +` +(function() { + var app = angular.module('jwtAuth', []); + app.controller('MainController', function($scope, $http) { + var apiHost = 'http://yourdomain.com/wp-json'; + $http.post(apiHost + '/jwt-auth/v1/token', { + username: 'admin', + password: 'password' + }) + .then(function(response) { + console.log(response.data) + }) + .catch(function(error) { + console.error('Error', error.data[0]); + }); + }); +})(); +` -Success response from the server +##### Success Response From The Server ` { - "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC9qd3QuZGV2IiwiaWF0IjoxNDM4NTcxMDUwLCJuYmYiOjE0Mzg1NzEwNTAsImV4cCI6MTQzOTE3NTg1MCwiZGF0YSI6eyJ1c2VyIjp7ImlkIjoiMSJ9fX0.YNe6AyWW4B7ZwfFE5wJ0O6qQ8QFcYizimDmBy6hCH_8", - "user_display_name": "admin", - "user_email": "admin@localhost.dev", - "user_nicename": "admin" + "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC9qd3QuZGV2IiwiaWF0IjoxNDM4NTcxMDUwLCJuYmYiOjE0Mzg1NzEwNTAsImV4cCI6MTQzOTE3NTg1MCwiZGF0YSI6eyJ1c2VyIjp7ImlkIjoiMSJ9fX0.YNe6AyWW4B7ZwfFE5wJ0O6qQ8QFcYizimDmBy6hCH_8", + "user_display_name": "admin", + "user_email": "admin@localhost.dev", + "user_nicename": "admin" } ` -Error response from the server +##### Error Response From The Server ` { - "code": "jwt_auth_failed", - "data": { - "status": 403 - }, - "message": "Invalid Credentials." + "code": "jwt_auth_failed", + "data": { + "status": 403 + }, + "message": "Invalid Credentials." } ` -Once you get the token, you must store it somewhere in your application, ex. in a **cookie** or using **localstorage**. +Once you get the token, you must store it somewhere in your application, e.g., in a **cookie** or using **localStorage**. -From this point, you should pass this token to every API call +From this point, you should pass this token with every API call. -Sample call using the Authorization header using AngularJS +##### Sample Call Using The Authorization Header With AngularJS ` -app.config( function( $httpProvider ) { - $httpProvider.interceptors.push( [ '$q', '$location', '$cookies', function( $q, $location, $cookies ) { +app.config(function($httpProvider) { + $httpProvider.interceptors.push(['$q', '$location', '$cookies', function($q, $location, $cookies) { return { - 'request': function( config ) { + 'request': function(config) { config.headers = config.headers || {}; - //Assume that you store the token in a cookie. - var globals = $cookies.getObject( 'globals' ) || {}; - //If the cookie has the CurrentUser and the token - //add the Authorization header in each request - if ( globals.currentUser && globals.currentUser.token ) { + // Assume that you store the token in a cookie + var globals = $cookies.getObject('globals') || {}; + // If the cookie has the CurrentUser and the token + // add the Authorization header in each request + if (globals.currentUser && globals.currentUser.token) { config.headers.Authorization = 'Bearer ' + globals.currentUser.token; } return config; } }; - } ] ); -} ); + }]); +}); ` -The **wp-api-jwt-auth** will intercept every call to the server and will look for the Authorization Header, if the Authorization header is present will try to decode the token and will set the user according with the data stored in it. +The **wp-api-jwt-auth** plugin will intercept every call to the server and will look for the Authorization Header. If the Authorization header is present, it will try to decode the token and will set the user according to the data stored in it. -If the token is valid, the API call flow will continue as always. +If the token is valid, the API call flow will continue as normal. **Sample Headers** @@ -190,9 +232,9 @@ Host: server.example.com Authorization: Bearer mF_s9.B5f-4.1JqM ` -###ERRORS +### ERRORS -If the token is invalid an error will be returned, here are some samples of errors. +If the token is invalid, an error will be returned. Here are some sample errors: **Invalid Credentials** @@ -236,11 +278,13 @@ If the token is invalid an error will be returned, here are some samples of erro ] ` -### /wp-json/jwt-auth/v1/token/validate +**Need advanced error tracking?** [JWT Authentication PRO](https://jwtauth.pro/?utm_source=wp_plugin_readme&utm_medium=link&utm_campaign=pro_promotion&utm_content=errors_pro_note) offers enhanced error tracking and monitoring capabilities. + +#### /wp-json/jwt-auth/v1/token/validate -This is a simple helper endpoint to validate a token; you only will need to make a POST request sending the Authorization header. +This is a simple helper endpoint to validate a token. You only need to make a POST request with the Authorization header. -Valid Token Response +**Valid Token Response** ` { @@ -251,13 +295,13 @@ Valid Token Response } ` -###AVAILABLE HOOKS +### AVAILABLE HOOKS -The **wp-api-jwt-auth** is dev friendly and has five filters available to override the default settings. +The **wp-api-jwt-auth** plugin is developer-friendly and provides five filters to override the default settings. -####jwt_auth_cors_allow_headers +#### jwt_auth_cors_allow_headers -The **jwt_auth_cors_allow_headers** allows you to modify the available headers when the CORs support is enabled. +The **jwt_auth_cors_allow_headers** filter allows you to modify the available headers when CORS support is enabled. Default Value: @@ -265,9 +309,9 @@ Default Value: 'Access-Control-Allow-Headers, Content-Type, Authorization' ` -###jwt_auth_not_before +#### jwt_auth_not_before -The **jwt_auth_not_before** allows you to change the [**nbf**](https://tools.ietf.org/html/rfc7519#section-4.1.5) value before the token is created. +The **jwt_auth_not_before** filter allows you to change the [**nbf**](https://tools.ietf.org/html/rfc7519#section-4.1.5) value before the token is created. Default Value: @@ -275,9 +319,9 @@ Default Value: Creation time - time() ` -###jwt_auth_expire +#### jwt_auth_expire -The **jwt_auth_expire** allows you to change the value [**exp**](https://tools.ietf.org/html/rfc7519#section-4.1.4) before the token is created. +The **jwt_auth_expire** filter allows you to change the [**exp**](https://tools.ietf.org/html/rfc7519#section-4.1.4) value before the token is created. Default Value: @@ -285,14 +329,13 @@ Default Value: time() + (DAY_IN_SECONDS * 7) ` -###jwt_auth_token_before_sign +#### jwt_auth_token_before_sign -The **jwt_auth_token_before_sign** allows you to modify all the token data before to be encoded and signed. +The **jwt_auth_token_before_sign** filter allows you to modify all token data before it is encoded and signed. -Default Value +Default Value: ` - get_bloginfo('url'), 'iat' => $issuedAt, @@ -306,13 +349,15 @@ $token = array( ); ` -###jwt_auth_token_before_dispatch -The **jwt_auth_token_before_dispatch** allows you to modify all the response array before to dispatch it to the client. +**Want easier customization?** [JWT Authentication PRO](https://jwtauth.pro/?utm_source=wp_plugin_readme&utm_medium=link&utm_campaign=pro_promotion&utm_content=hook_payload_pro_note) allows you to add custom claims directly through the admin UI. + +#### jwt_auth_token_before_dispatch + +The **jwt_auth_token_before_dispatch** filter allows you to modify the response array before it is sent to the client. Default Value: ` - $token, 'user_email' => $user->data->user_email, @@ -321,13 +366,13 @@ $data = array( ); ` -### jwt_auth_algorithm -The **jwt_auth_algorithm** allows you to modify the signing algorithm. +#### jwt_auth_algorithm + +The **jwt_auth_algorithm** filter allows you to modify the signing algorithm. Default value: ` - Date: Mon, 21 Apr 2025 19:37:32 -0600 Subject: [PATCH 66/79] feat: add dynamic PRO promotion link to plugin actions for AB tests --- admin/class-jwt-auth-admin.php | 36 ++++++++++++++++++++++++++++------ 1 file changed, 30 insertions(+), 6 deletions(-) diff --git a/admin/class-jwt-auth-admin.php b/admin/class-jwt-auth-admin.php index 7843693..f141ac3 100644 --- a/admin/class-jwt-auth-admin.php +++ b/admin/class-jwt-auth-admin.php @@ -96,8 +96,8 @@ public function enqueue_plugin_assets( $suffix = '' ) { if ( empty( $suffix ) ) { return; // Exit early to prevent further execution } - - if ( $suffix !== 'settings_page_jwt_authentication' ) { + + if ($suffix !== 'settings_page_jwt_authentication') { return null; } // get full path to admin/ui/build/index.asset.php @@ -185,10 +185,34 @@ public function render_admin_page() { */ public function add_action_link( array $links, string $file): array { - // Check if this is the target plugin - if ( $file === 'jwt-authentication-for-wp-rest-api/jwt-auth.php' ) { - $new_link = 'Get Early Beta Access'; - $links[] = $new_link; + if ($file === 'jwt-authentication-for-wp-rest-api/jwt-auth.php') { + $cta_variations = [ + 0 => [ + 'text' => 'Get JWT Auth Pro', + 'utm_content' => 'get-jwt-auth-pro-cta', + ], + 1 => [ + 'text' => 'Unlock Pro Features', + 'utm_content' => 'unlock-pro-features-cta', + ], + ]; + + $selected_variation_key = rand(0, 1); + $selected_variation = $cta_variations[$selected_variation_key]; + + $base_pro_url = 'https://jwtauth.pro/'; + $utm_params = [ + 'utm_source' => 'wpadmin', + 'utm_medium' => 'plugin-link', + 'utm_campaign' => 'pro-plugin-action-link', + 'utm_content' => $selected_variation['utm_content'], + ]; + + $pro_link_url = add_query_arg($utm_params, $base_pro_url); + $pro_link_style = 'style="color: #00a32a; font-weight: 700; text-decoration: none;" onmouseover="this.style.color=\'#008a20\';" onmouseout="this.style.color=\'#00a32a\';"'; + + $pro_link_text = $selected_variation['text']; + $links[] = '' . $pro_link_text . ''; } return $links; From a80b481a923304333e4f5a51e6cc220386a54e75 Mon Sep 17 00:00:00 2001 From: Enrique Chavez Date: Mon, 21 Apr 2025 19:48:00 -0600 Subject: [PATCH 67/79] feat: add and style 'Upgrade to PRO' submenu link --- admin/class-jwt-auth-admin.php | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/admin/class-jwt-auth-admin.php b/admin/class-jwt-auth-admin.php index f141ac3..8818c65 100644 --- a/admin/class-jwt-auth-admin.php +++ b/admin/class-jwt-auth-admin.php @@ -55,6 +55,25 @@ public function register_menu_page() { 'jwt_authentication', [ $this, 'render_admin_page' ] ); + + // Add Upgrade to PRO submenu item + $base_pro_url = 'https://jwtauth.pro/'; + $utm_params = [ + 'utm_source' => 'wpadmin', + 'utm_medium' => 'submenu', + 'utm_campaign' => 'pro-submenu-link', + 'utm_content' => 'upgrade-to-pro', + ]; + $pro_link_url = add_query_arg($utm_params, $base_pro_url); + + add_submenu_page( + 'options-general.php', + __('Upgrade to PRO', 'jwt-auth'), + '' . __('   ↳ Upgrade to PRO', 'jwt-auth') . '', + 'manage_options', + esc_url(http://github.com/$pro_link_url), + null // No callback function needed for external link + ); } /** From 655efd5136369b1fdac35f8a53685beab18b5ae7 Mon Sep 17 00:00:00 2001 From: Enrique Chavez Date: Mon, 21 Apr 2025 20:09:39 -0600 Subject: [PATCH 68/79] feat: version up and update notice --- admin/class-jwt-auth-admin.php | 8 ++++---- includes/class-jwt-auth.php | 2 +- jwt-auth.php | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/admin/class-jwt-auth-admin.php b/admin/class-jwt-auth-admin.php index 8818c65..4ce5de1 100644 --- a/admin/class-jwt-auth-admin.php +++ b/admin/class-jwt-auth-admin.php @@ -88,17 +88,17 @@ public function display_admin_notice() { ?>

    - - - +

    plugin_name = 'jwt-auth'; - $this->version = '1.3.6'; + $this->version = '1.3.7'; $this->load_dependencies(); $this->set_locale(); diff --git a/jwt-auth.php b/jwt-auth.php index bd67c83..44b8039 100755 --- a/jwt-auth.php +++ b/jwt-auth.php @@ -15,7 +15,7 @@ * Plugin Name: JWT Authentication for WP-API * Plugin URI: https://enriquechavez.co * Description: Extends the WP REST API using JSON Web Tokens Authentication as an authentication method. - * Version: 1.3.6 + * Version: 1.3.7 * Author: Enrique Chavez * Author URI: https://enriquechavez.co * License: GPL-2.0+ From a6478d1890fd5d54e9f325a99a5e7e691c49636e Mon Sep 17 00:00:00 2001 From: Enrique Chavez Date: Mon, 21 Apr 2025 20:14:15 -0600 Subject: [PATCH 69/79] docs: Update stable tag --- readme.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/readme.txt b/readme.txt index 2e70dac..38c010c 100755 --- a/readme.txt +++ b/readme.txt @@ -6,7 +6,7 @@ Tags: wp-json, jwt, json web authentication, wp-api, login, rest api, authentica Requires at least: 4.2 Tested up to: 6.8.0 Requires PHP: 7.4.0 -Stable tag: 1.3.6 +Stable tag: 1.3.7 License: GPLv2 or later License URI: http://www.gnu.org/licenses/gpl-2.0.html From 53330942cfda81dbcd13e283d7b162241fd72973 Mon Sep 17 00:00:00 2001 From: Enrique Chavez Date: Thu, 15 May 2025 09:48:43 -0600 Subject: [PATCH 70/79] fix: ensure admin notice stays dismissed after closing - Fix option name mismatch in display_admin_notice method - Change get_option check from jwt_auth_beta_notice_01 to jwt_auth_pro_notice_01 - Ensure notice is only shown once and remains dismissed --- admin/class-jwt-auth-admin.php | 2 +- jwt-auth.php | 2 +- readme.txt | 10 ++++++++-- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/admin/class-jwt-auth-admin.php b/admin/class-jwt-auth-admin.php index 4ce5de1..24b57d7 100644 --- a/admin/class-jwt-auth-admin.php +++ b/admin/class-jwt-auth-admin.php @@ -84,7 +84,7 @@ public function register_menu_page() { * @since 1.3.4 */ public function display_admin_notice() { - if ( ! get_option( 'jwt_auth_beta_notice_01' ) ) { + if (! get_option('jwt_auth_pro_notice_01')) { ?>

    diff --git a/jwt-auth.php b/jwt-auth.php index 44b8039..7a282da 100755 --- a/jwt-auth.php +++ b/jwt-auth.php @@ -15,7 +15,7 @@ * Plugin Name: JWT Authentication for WP-API * Plugin URI: https://enriquechavez.co * Description: Extends the WP REST API using JSON Web Tokens Authentication as an authentication method. - * Version: 1.3.7 + * Version: 1.3.8 * Author: Enrique Chavez * Author URI: https://enriquechavez.co * License: GPL-2.0+ diff --git a/readme.txt b/readme.txt index 38c010c..18c5a0a 100755 --- a/readme.txt +++ b/readme.txt @@ -4,9 +4,9 @@ Contributors: tmeister Donate link: https://github.com/sponsors/Tmeister Tags: wp-json, jwt, json web authentication, wp-api, login, rest api, authentication Requires at least: 4.2 -Tested up to: 6.8.0 +Tested up to: 6.8.1 Requires PHP: 7.4.0 -Stable tag: 1.3.7 +Stable tag: 1.3.8 License: GPLv2 or later License URI: http://www.gnu.org/licenses/gpl-2.0.html @@ -428,6 +428,12 @@ Priority support is included with [JWT Authentication PRO](https://jwtauth.pro/s JWT authentication is very secure when implemented correctly. Make sure to use a strong secret key and keep it confidential. [JWT Auth PRO](https://jwtauth.pro/?utm_source=wp_plugin_readme&utm_medium=link&utm_campaign=pro_promotion&utm_content=faq_security_link) offers additional security features like rate limiting and token revocation. == Changelog == += 1.3.8 = +* Fix upsell notice bug, now it is show only one time + += 1.3.7 = +* Added PRO announcement + = 1.3.6 = * Added Safeguard in enqueue_plugin_assets to Handle Null or Empty $suffix From 9dcaeaa7171dc556ac35d569ece9c297c8bdc1bc Mon Sep 17 00:00:00 2001 From: Enrique Chavez Date: Thu, 10 Jul 2025 18:12:17 -0600 Subject: [PATCH 71/79] feat(admin): modernize interface with React dashboard and API explorer - Migrate admin UI from legacy JavaScript to React + TypeScript + Vite - Add interactive Live API Explorer for testing JWT endpoints with real calls - Implement enhanced configuration dashboard with real-time health monitoring - Consolidate dashboard API calls into a single endpoint for better performance - Add professional UI components with a modern card-based layout --- .distignore | 99 + .editorconfig | 18 + .github/workflows/deploy.yml | 20 - .github/workflows/test-github-release.yml | 62 + .github/workflows/test-wordpress-deploy.yml | 59 + ...{trunk.yml => wordpress-assets-update.yml} | 4 +- .github/workflows/wordpress-release.yml | 55 + .gitignore | 38 +- .husky/pre-commit | 3 + .prettierignore | 42 + .prettierrc | 15 + .vscode/settings.json | 111 + .wp-env.json | 17 + admin/class-jwt-auth-admin.php | 1277 +- admin/class-jwt-auth-cron.php | 25 +- admin/ui/.nvmrc | 1 - admin/ui/build/index.asset.php | 1 - admin/ui/build/index.css | 1 - admin/ui/build/index.js | 1 - admin/ui/package.json | 28 - admin/ui/src/App.tsx | 9 + admin/ui/src/components/Dashboard.tsx | 171 + admin/ui/src/components/cta.js | 50 - .../authentication-status-overview.tsx | 9 + .../dashboard/configuration-health-check.tsx | 89 + .../dashboard/floating-survey-cta.tsx | 63 + .../src/components/dashboard/help-improve.tsx | 39 + .../dashboard/live-api-explorer.tsx | 420 + .../dashboard/setup-configuration.tsx | 145 + .../dashboard/system-environment.tsx | 58 + admin/ui/src/components/dashboard/topbar.tsx | 49 + admin/ui/src/components/main-view.js | 162 - admin/ui/src/components/newsletter.js | 86 - admin/ui/src/components/settings-screen.js | 16 - .../ui/src/components/survey/ConsentFlow.tsx | 84 + .../ui/src/components/survey/SuccessFlow.tsx | 103 + admin/ui/src/components/survey/SurveyForm.tsx | 464 + admin/ui/src/components/survey/SurveyPage.tsx | 92 + admin/ui/src/components/ui/badge.tsx | 34 + admin/ui/src/components/ui/button.tsx | 52 + admin/ui/src/components/ui/card.tsx | 69 + admin/ui/src/components/ui/check-icon.tsx | 3 + .../components/ui/code-snippet-display.tsx | 66 + admin/ui/src/components/ui/collapsible.tsx | 9 + admin/ui/src/components/ui/cta-card.tsx | 47 + .../components/ui/feature-comparison-row.tsx | 29 + .../src/components/ui/feature-comparison.tsx | 21 + admin/ui/src/components/ui/info-card.tsx | 47 + admin/ui/src/components/ui/input.tsx | 22 + admin/ui/src/components/ui/label.tsx | 19 + admin/ui/src/components/ui/page-header.tsx | 13 + admin/ui/src/components/ui/radio-group.tsx | 44 + admin/ui/src/components/ui/select.tsx | 157 + admin/ui/src/components/ui/status-item.tsx | 28 + admin/ui/src/components/ui/status-row.tsx | 15 + admin/ui/src/components/ui/switch.tsx | 53 + admin/ui/src/components/ui/tabs.tsx | 53 + admin/ui/src/components/ui/textarea.tsx | 21 + admin/ui/src/index.js | 13 - admin/ui/src/index.scss | 123 - admin/ui/src/lib/api-code-snippets.ts | 137 + admin/ui/src/lib/utils.ts | 6 + admin/ui/src/lib/wordpress-api.ts | 279 + admin/ui/src/main.tsx | 17 + admin/ui/src/styles/globals.css | 120 + admin/ui/yarn.lock | 10912 ---------- components.json | 21 + composer.json | 11 +- composer.lock | 2600 ++- eslint.config.js | 96 + includes/class-jwt-auth.php | 28 +- includes/vendor/autoload.php | 25 - includes/vendor/composer/ClassLoader.php | 585 - .../vendor/composer/InstalledVersions.php | 359 - includes/vendor/composer/LICENSE | 21 - .../vendor/composer/autoload_classmap.php | 119 - .../vendor/composer/autoload_namespaces.php | 9 - includes/vendor/composer/autoload_psr4.php | 11 - includes/vendor/composer/autoload_real.php | 38 - includes/vendor/composer/autoload_static.php | 153 - includes/vendor/composer/installed.json | 226 - includes/vendor/composer/installed.php | 53 - .../workflows/continuous-integration.yml | 76 - .../installers/.github/workflows/lint.yml | 30 - .../installers/.github/workflows/phpstan.yml | 51 - includes/vendor/composer/installers/LICENSE | 19 - .../vendor/composer/installers/composer.json | 122 - .../composer/installers/phpstan.neon.dist | 10 - .../src/Composer/Installers/AglInstaller.php | 21 - .../Composer/Installers/AimeosInstaller.php | 9 - .../Installers/AnnotateCmsInstaller.php | 11 - .../Composer/Installers/AsgardInstaller.php | 49 - .../Composer/Installers/AttogramInstaller.php | 9 - .../src/Composer/Installers/BaseInstaller.php | 137 - .../Composer/Installers/BitrixInstaller.php | 126 - .../Composer/Installers/BonefishInstaller.php | 9 - .../Composer/Installers/CakePHPInstaller.php | 66 - .../src/Composer/Installers/ChefInstaller.php | 11 - .../Composer/Installers/CiviCrmInstaller.php | 9 - .../Installers/ClanCatsFrameworkInstaller.php | 10 - .../Composer/Installers/CockpitInstaller.php | 32 - .../Installers/CodeIgniterInstaller.php | 11 - .../Installers/Concrete5Installer.php | 13 - .../Composer/Installers/CraftInstaller.php | 35 - .../Composer/Installers/CroogoInstaller.php | 21 - .../Composer/Installers/DecibelInstaller.php | 10 - .../Composer/Installers/DframeInstaller.php | 10 - .../Composer/Installers/DokuWikiInstaller.php | 50 - .../Composer/Installers/DolibarrInstaller.php | 16 - .../Composer/Installers/DrupalInstaller.php | 22 - .../src/Composer/Installers/ElggInstaller.php | 9 - .../Composer/Installers/EliasisInstaller.php | 12 - .../Installers/ExpressionEngineInstaller.php | 29 - .../Installers/EzPlatformInstaller.php | 10 - .../src/Composer/Installers/FuelInstaller.php | 11 - .../Composer/Installers/FuelphpInstaller.php | 9 - .../src/Composer/Installers/GravInstaller.php | 30 - .../Composer/Installers/HuradInstaller.php | 25 - .../Composer/Installers/ImageCMSInstaller.php | 11 - .../src/Composer/Installers/Installer.php | 298 - .../src/Composer/Installers/ItopInstaller.php | 9 - .../Composer/Installers/JoomlaInstaller.php | 15 - .../Composer/Installers/KanboardInstaller.php | 18 - .../Composer/Installers/KirbyInstaller.php | 11 - .../Composer/Installers/KnownInstaller.php | 11 - .../Composer/Installers/KodiCMSInstaller.php | 10 - .../Composer/Installers/KohanaInstaller.php | 9 - .../LanManagementSystemInstaller.php | 27 - .../Composer/Installers/LaravelInstaller.php | 9 - .../Composer/Installers/LavaLiteInstaller.php | 10 - .../Composer/Installers/LithiumInstaller.php | 10 - .../Installers/MODULEWorkInstaller.php | 9 - .../Composer/Installers/MODXEvoInstaller.php | 16 - .../Composer/Installers/MagentoInstaller.php | 11 - .../Composer/Installers/MajimaInstaller.php | 37 - .../src/Composer/Installers/MakoInstaller.php | 9 - .../Composer/Installers/MantisBTInstaller.php | 23 - .../Composer/Installers/MauticInstaller.php | 48 - .../src/Composer/Installers/MayaInstaller.php | 33 - .../Installers/MediaWikiInstaller.php | 51 - .../Composer/Installers/MiaoxingInstaller.php | 10 - .../Installers/MicroweberInstaller.php | 119 - .../src/Composer/Installers/ModxInstaller.php | 12 - .../Composer/Installers/MoodleInstaller.php | 59 - .../Composer/Installers/OctoberInstaller.php | 48 - .../Composer/Installers/OntoWikiInstaller.php | 24 - .../Composer/Installers/OsclassInstaller.php | 14 - .../src/Composer/Installers/OxidInstaller.php | 59 - .../src/Composer/Installers/PPIInstaller.php | 9 - .../Composer/Installers/PantheonInstaller.php | 12 - .../Composer/Installers/PhiftyInstaller.php | 11 - .../Composer/Installers/PhpBBInstaller.php | 11 - .../Composer/Installers/PimcoreInstaller.php | 21 - .../Composer/Installers/PiwikInstaller.php | 32 - .../Installers/PlentymarketsInstaller.php | 29 - .../src/Composer/Installers/Plugin.php | 27 - .../Composer/Installers/PortoInstaller.php | 9 - .../Installers/PrestashopInstaller.php | 10 - .../Installers/ProcessWireInstaller.php | 22 - .../Composer/Installers/PuppetInstaller.php | 11 - .../Composer/Installers/PxcmsInstaller.php | 63 - .../Composer/Installers/RadPHPInstaller.php | 24 - .../Composer/Installers/ReIndexInstaller.php | 10 - .../Composer/Installers/Redaxo5Installer.php | 10 - .../Composer/Installers/RedaxoInstaller.php | 10 - .../Installers/RoundcubeInstaller.php | 22 - .../src/Composer/Installers/SMFInstaller.php | 10 - .../Composer/Installers/ShopwareInstaller.php | 60 - .../Installers/SilverStripeInstaller.php | 35 - .../Installers/SiteDirectInstaller.php | 25 - .../Composer/Installers/StarbugInstaller.php | 12 - .../Composer/Installers/SyDESInstaller.php | 47 - .../Composer/Installers/SyliusInstaller.php | 9 - .../Composer/Installers/Symfony1Installer.php | 26 - .../Composer/Installers/TYPO3CmsInstaller.php | 16 - .../Installers/TYPO3FlowInstaller.php | 38 - .../src/Composer/Installers/TaoInstaller.php | 30 - .../Installers/TastyIgniterInstaller.php | 32 - .../Composer/Installers/TheliaInstaller.php | 12 - .../src/Composer/Installers/TuskInstaller.php | 14 - .../Installers/UserFrostingInstaller.php | 9 - .../Composer/Installers/VanillaInstaller.php | 10 - .../Composer/Installers/VgmcpInstaller.php | 49 - .../Composer/Installers/WHMCSInstaller.php | 21 - .../Composer/Installers/WinterInstaller.php | 58 - .../Composer/Installers/WolfCMSInstaller.php | 9 - .../Installers/WordPressInstaller.php | 12 - .../Composer/Installers/YawikInstaller.php | 32 - .../src/Composer/Installers/ZendInstaller.php | 11 - .../Composer/Installers/ZikulaInstaller.php | 10 - .../composer/installers/src/bootstrap.php | 13 - includes/vendor/composer/platform_check.php | 26 - includes/vendor/firebase/php-jwt/CHANGELOG.md | 105 - includes/vendor/firebase/php-jwt/LICENSE | 30 - includes/vendor/firebase/php-jwt/README.md | 332 - .../vendor/firebase/php-jwt/composer.json | 42 - .../php-jwt/src/BeforeValidException.php | 7 - .../firebase/php-jwt/src/CachedKeySet.php | 258 - .../firebase/php-jwt/src/ExpiredException.php | 7 - includes/vendor/firebase/php-jwt/src/JWK.php | 323 - includes/vendor/firebase/php-jwt/src/JWT.php | 638 - includes/vendor/firebase/php-jwt/src/Key.php | 64 - .../php-jwt/src/SignatureInvalidException.php | 7 - jwt-auth.php | 2 +- package-lock.json | 17920 ++++++++++++++++ package.json | 90 + phpunit.xml.dist | 22 + postcss.config.js | 6 + readme.txt | 75 +- scripts/create-release.sh | 113 + scripts/run-tests.sh | 402 + tailwind.config.js | 58 + tests/Unit/JwtAuthAdminIntegrationTest.php | 330 + tests/Unit/JwtAuthMainIntegrationTest.php | 174 + tests/Unit/JwtAuthPublicIntegrationTest.php | 250 + tests/Unit/TestCase.php | 95 + tests/bootstrap.php | 64 + tests/bruno/wp-api-jwt-auth/bruno.json | 10 + .../wp-api-jwt-auth/environments/jwt.bru | 5 + .../wp-api-jwt-auth/environments/local.bru | 5 + tests/bruno/wp-api-jwt-auth/me.bru | 27 + tests/bruno/wp-api-jwt-auth/token.bru | 51 + tests/bruno/wp-api-jwt-auth/validate.bru | 33 + tsconfig.json | 32 + tsconfig.node.json | 10 + vite.config.ts | 73 + 226 files changed, 27254 insertions(+), 18285 deletions(-) create mode 100644 .distignore create mode 100644 .editorconfig delete mode 100644 .github/workflows/deploy.yml create mode 100644 .github/workflows/test-github-release.yml create mode 100644 .github/workflows/test-wordpress-deploy.yml rename .github/workflows/{trunk.yml => wordpress-assets-update.yml} (91%) create mode 100644 .github/workflows/wordpress-release.yml create mode 100755 .husky/pre-commit create mode 100644 .prettierignore create mode 100644 .prettierrc create mode 100644 .vscode/settings.json create mode 100644 .wp-env.json delete mode 100644 admin/ui/.nvmrc delete mode 100644 admin/ui/build/index.asset.php delete mode 100644 admin/ui/build/index.css delete mode 100644 admin/ui/build/index.js delete mode 100644 admin/ui/package.json create mode 100644 admin/ui/src/App.tsx create mode 100644 admin/ui/src/components/Dashboard.tsx delete mode 100644 admin/ui/src/components/cta.js create mode 100644 admin/ui/src/components/dashboard/authentication-status-overview.tsx create mode 100644 admin/ui/src/components/dashboard/configuration-health-check.tsx create mode 100644 admin/ui/src/components/dashboard/floating-survey-cta.tsx create mode 100644 admin/ui/src/components/dashboard/help-improve.tsx create mode 100644 admin/ui/src/components/dashboard/live-api-explorer.tsx create mode 100644 admin/ui/src/components/dashboard/setup-configuration.tsx create mode 100644 admin/ui/src/components/dashboard/system-environment.tsx create mode 100644 admin/ui/src/components/dashboard/topbar.tsx delete mode 100644 admin/ui/src/components/main-view.js delete mode 100644 admin/ui/src/components/newsletter.js delete mode 100644 admin/ui/src/components/settings-screen.js create mode 100644 admin/ui/src/components/survey/ConsentFlow.tsx create mode 100644 admin/ui/src/components/survey/SuccessFlow.tsx create mode 100644 admin/ui/src/components/survey/SurveyForm.tsx create mode 100644 admin/ui/src/components/survey/SurveyPage.tsx create mode 100644 admin/ui/src/components/ui/badge.tsx create mode 100644 admin/ui/src/components/ui/button.tsx create mode 100644 admin/ui/src/components/ui/card.tsx create mode 100644 admin/ui/src/components/ui/check-icon.tsx create mode 100644 admin/ui/src/components/ui/code-snippet-display.tsx create mode 100644 admin/ui/src/components/ui/collapsible.tsx create mode 100644 admin/ui/src/components/ui/cta-card.tsx create mode 100644 admin/ui/src/components/ui/feature-comparison-row.tsx create mode 100644 admin/ui/src/components/ui/feature-comparison.tsx create mode 100644 admin/ui/src/components/ui/info-card.tsx create mode 100644 admin/ui/src/components/ui/input.tsx create mode 100644 admin/ui/src/components/ui/label.tsx create mode 100644 admin/ui/src/components/ui/page-header.tsx create mode 100644 admin/ui/src/components/ui/radio-group.tsx create mode 100644 admin/ui/src/components/ui/select.tsx create mode 100644 admin/ui/src/components/ui/status-item.tsx create mode 100644 admin/ui/src/components/ui/status-row.tsx create mode 100644 admin/ui/src/components/ui/switch.tsx create mode 100644 admin/ui/src/components/ui/tabs.tsx create mode 100644 admin/ui/src/components/ui/textarea.tsx delete mode 100644 admin/ui/src/index.js delete mode 100644 admin/ui/src/index.scss create mode 100644 admin/ui/src/lib/api-code-snippets.ts create mode 100644 admin/ui/src/lib/utils.ts create mode 100644 admin/ui/src/lib/wordpress-api.ts create mode 100644 admin/ui/src/main.tsx create mode 100644 admin/ui/src/styles/globals.css delete mode 100644 admin/ui/yarn.lock create mode 100644 components.json create mode 100644 eslint.config.js delete mode 100644 includes/vendor/autoload.php delete mode 100644 includes/vendor/composer/ClassLoader.php delete mode 100644 includes/vendor/composer/InstalledVersions.php delete mode 100644 includes/vendor/composer/LICENSE delete mode 100644 includes/vendor/composer/autoload_classmap.php delete mode 100644 includes/vendor/composer/autoload_namespaces.php delete mode 100644 includes/vendor/composer/autoload_psr4.php delete mode 100644 includes/vendor/composer/autoload_real.php delete mode 100644 includes/vendor/composer/autoload_static.php delete mode 100644 includes/vendor/composer/installed.json delete mode 100644 includes/vendor/composer/installed.php delete mode 100644 includes/vendor/composer/installers/.github/workflows/continuous-integration.yml delete mode 100644 includes/vendor/composer/installers/.github/workflows/lint.yml delete mode 100644 includes/vendor/composer/installers/.github/workflows/phpstan.yml delete mode 100644 includes/vendor/composer/installers/LICENSE delete mode 100644 includes/vendor/composer/installers/composer.json delete mode 100644 includes/vendor/composer/installers/phpstan.neon.dist delete mode 100644 includes/vendor/composer/installers/src/Composer/Installers/AglInstaller.php delete mode 100644 includes/vendor/composer/installers/src/Composer/Installers/AimeosInstaller.php delete mode 100644 includes/vendor/composer/installers/src/Composer/Installers/AnnotateCmsInstaller.php delete mode 100644 includes/vendor/composer/installers/src/Composer/Installers/AsgardInstaller.php delete mode 100644 includes/vendor/composer/installers/src/Composer/Installers/AttogramInstaller.php delete mode 100644 includes/vendor/composer/installers/src/Composer/Installers/BaseInstaller.php delete mode 100644 includes/vendor/composer/installers/src/Composer/Installers/BitrixInstaller.php delete mode 100644 includes/vendor/composer/installers/src/Composer/Installers/BonefishInstaller.php delete mode 100644 includes/vendor/composer/installers/src/Composer/Installers/CakePHPInstaller.php delete mode 100644 includes/vendor/composer/installers/src/Composer/Installers/ChefInstaller.php delete mode 100644 includes/vendor/composer/installers/src/Composer/Installers/CiviCrmInstaller.php delete mode 100644 includes/vendor/composer/installers/src/Composer/Installers/ClanCatsFrameworkInstaller.php delete mode 100644 includes/vendor/composer/installers/src/Composer/Installers/CockpitInstaller.php delete mode 100644 includes/vendor/composer/installers/src/Composer/Installers/CodeIgniterInstaller.php delete mode 100644 includes/vendor/composer/installers/src/Composer/Installers/Concrete5Installer.php delete mode 100644 includes/vendor/composer/installers/src/Composer/Installers/CraftInstaller.php delete mode 100644 includes/vendor/composer/installers/src/Composer/Installers/CroogoInstaller.php delete mode 100644 includes/vendor/composer/installers/src/Composer/Installers/DecibelInstaller.php delete mode 100644 includes/vendor/composer/installers/src/Composer/Installers/DframeInstaller.php delete mode 100644 includes/vendor/composer/installers/src/Composer/Installers/DokuWikiInstaller.php delete mode 100644 includes/vendor/composer/installers/src/Composer/Installers/DolibarrInstaller.php delete mode 100644 includes/vendor/composer/installers/src/Composer/Installers/DrupalInstaller.php delete mode 100644 includes/vendor/composer/installers/src/Composer/Installers/ElggInstaller.php delete mode 100644 includes/vendor/composer/installers/src/Composer/Installers/EliasisInstaller.php delete mode 100644 includes/vendor/composer/installers/src/Composer/Installers/ExpressionEngineInstaller.php delete mode 100644 includes/vendor/composer/installers/src/Composer/Installers/EzPlatformInstaller.php delete mode 100644 includes/vendor/composer/installers/src/Composer/Installers/FuelInstaller.php delete mode 100644 includes/vendor/composer/installers/src/Composer/Installers/FuelphpInstaller.php delete mode 100644 includes/vendor/composer/installers/src/Composer/Installers/GravInstaller.php delete mode 100644 includes/vendor/composer/installers/src/Composer/Installers/HuradInstaller.php delete mode 100644 includes/vendor/composer/installers/src/Composer/Installers/ImageCMSInstaller.php delete mode 100644 includes/vendor/composer/installers/src/Composer/Installers/Installer.php delete mode 100644 includes/vendor/composer/installers/src/Composer/Installers/ItopInstaller.php delete mode 100644 includes/vendor/composer/installers/src/Composer/Installers/JoomlaInstaller.php delete mode 100644 includes/vendor/composer/installers/src/Composer/Installers/KanboardInstaller.php delete mode 100644 includes/vendor/composer/installers/src/Composer/Installers/KirbyInstaller.php delete mode 100644 includes/vendor/composer/installers/src/Composer/Installers/KnownInstaller.php delete mode 100644 includes/vendor/composer/installers/src/Composer/Installers/KodiCMSInstaller.php delete mode 100644 includes/vendor/composer/installers/src/Composer/Installers/KohanaInstaller.php delete mode 100644 includes/vendor/composer/installers/src/Composer/Installers/LanManagementSystemInstaller.php delete mode 100644 includes/vendor/composer/installers/src/Composer/Installers/LaravelInstaller.php delete mode 100644 includes/vendor/composer/installers/src/Composer/Installers/LavaLiteInstaller.php delete mode 100644 includes/vendor/composer/installers/src/Composer/Installers/LithiumInstaller.php delete mode 100644 includes/vendor/composer/installers/src/Composer/Installers/MODULEWorkInstaller.php delete mode 100644 includes/vendor/composer/installers/src/Composer/Installers/MODXEvoInstaller.php delete mode 100644 includes/vendor/composer/installers/src/Composer/Installers/MagentoInstaller.php delete mode 100644 includes/vendor/composer/installers/src/Composer/Installers/MajimaInstaller.php delete mode 100644 includes/vendor/composer/installers/src/Composer/Installers/MakoInstaller.php delete mode 100644 includes/vendor/composer/installers/src/Composer/Installers/MantisBTInstaller.php delete mode 100644 includes/vendor/composer/installers/src/Composer/Installers/MauticInstaller.php delete mode 100644 includes/vendor/composer/installers/src/Composer/Installers/MayaInstaller.php delete mode 100644 includes/vendor/composer/installers/src/Composer/Installers/MediaWikiInstaller.php delete mode 100644 includes/vendor/composer/installers/src/Composer/Installers/MiaoxingInstaller.php delete mode 100644 includes/vendor/composer/installers/src/Composer/Installers/MicroweberInstaller.php delete mode 100644 includes/vendor/composer/installers/src/Composer/Installers/ModxInstaller.php delete mode 100644 includes/vendor/composer/installers/src/Composer/Installers/MoodleInstaller.php delete mode 100644 includes/vendor/composer/installers/src/Composer/Installers/OctoberInstaller.php delete mode 100644 includes/vendor/composer/installers/src/Composer/Installers/OntoWikiInstaller.php delete mode 100644 includes/vendor/composer/installers/src/Composer/Installers/OsclassInstaller.php delete mode 100644 includes/vendor/composer/installers/src/Composer/Installers/OxidInstaller.php delete mode 100644 includes/vendor/composer/installers/src/Composer/Installers/PPIInstaller.php delete mode 100644 includes/vendor/composer/installers/src/Composer/Installers/PantheonInstaller.php delete mode 100644 includes/vendor/composer/installers/src/Composer/Installers/PhiftyInstaller.php delete mode 100644 includes/vendor/composer/installers/src/Composer/Installers/PhpBBInstaller.php delete mode 100644 includes/vendor/composer/installers/src/Composer/Installers/PimcoreInstaller.php delete mode 100644 includes/vendor/composer/installers/src/Composer/Installers/PiwikInstaller.php delete mode 100644 includes/vendor/composer/installers/src/Composer/Installers/PlentymarketsInstaller.php delete mode 100644 includes/vendor/composer/installers/src/Composer/Installers/Plugin.php delete mode 100644 includes/vendor/composer/installers/src/Composer/Installers/PortoInstaller.php delete mode 100644 includes/vendor/composer/installers/src/Composer/Installers/PrestashopInstaller.php delete mode 100644 includes/vendor/composer/installers/src/Composer/Installers/ProcessWireInstaller.php delete mode 100644 includes/vendor/composer/installers/src/Composer/Installers/PuppetInstaller.php delete mode 100644 includes/vendor/composer/installers/src/Composer/Installers/PxcmsInstaller.php delete mode 100644 includes/vendor/composer/installers/src/Composer/Installers/RadPHPInstaller.php delete mode 100644 includes/vendor/composer/installers/src/Composer/Installers/ReIndexInstaller.php delete mode 100644 includes/vendor/composer/installers/src/Composer/Installers/Redaxo5Installer.php delete mode 100644 includes/vendor/composer/installers/src/Composer/Installers/RedaxoInstaller.php delete mode 100644 includes/vendor/composer/installers/src/Composer/Installers/RoundcubeInstaller.php delete mode 100644 includes/vendor/composer/installers/src/Composer/Installers/SMFInstaller.php delete mode 100644 includes/vendor/composer/installers/src/Composer/Installers/ShopwareInstaller.php delete mode 100644 includes/vendor/composer/installers/src/Composer/Installers/SilverStripeInstaller.php delete mode 100644 includes/vendor/composer/installers/src/Composer/Installers/SiteDirectInstaller.php delete mode 100644 includes/vendor/composer/installers/src/Composer/Installers/StarbugInstaller.php delete mode 100644 includes/vendor/composer/installers/src/Composer/Installers/SyDESInstaller.php delete mode 100644 includes/vendor/composer/installers/src/Composer/Installers/SyliusInstaller.php delete mode 100644 includes/vendor/composer/installers/src/Composer/Installers/Symfony1Installer.php delete mode 100644 includes/vendor/composer/installers/src/Composer/Installers/TYPO3CmsInstaller.php delete mode 100644 includes/vendor/composer/installers/src/Composer/Installers/TYPO3FlowInstaller.php delete mode 100644 includes/vendor/composer/installers/src/Composer/Installers/TaoInstaller.php delete mode 100644 includes/vendor/composer/installers/src/Composer/Installers/TastyIgniterInstaller.php delete mode 100644 includes/vendor/composer/installers/src/Composer/Installers/TheliaInstaller.php delete mode 100644 includes/vendor/composer/installers/src/Composer/Installers/TuskInstaller.php delete mode 100644 includes/vendor/composer/installers/src/Composer/Installers/UserFrostingInstaller.php delete mode 100644 includes/vendor/composer/installers/src/Composer/Installers/VanillaInstaller.php delete mode 100644 includes/vendor/composer/installers/src/Composer/Installers/VgmcpInstaller.php delete mode 100644 includes/vendor/composer/installers/src/Composer/Installers/WHMCSInstaller.php delete mode 100644 includes/vendor/composer/installers/src/Composer/Installers/WinterInstaller.php delete mode 100644 includes/vendor/composer/installers/src/Composer/Installers/WolfCMSInstaller.php delete mode 100644 includes/vendor/composer/installers/src/Composer/Installers/WordPressInstaller.php delete mode 100644 includes/vendor/composer/installers/src/Composer/Installers/YawikInstaller.php delete mode 100644 includes/vendor/composer/installers/src/Composer/Installers/ZendInstaller.php delete mode 100644 includes/vendor/composer/installers/src/Composer/Installers/ZikulaInstaller.php delete mode 100644 includes/vendor/composer/installers/src/bootstrap.php delete mode 100644 includes/vendor/composer/platform_check.php delete mode 100644 includes/vendor/firebase/php-jwt/CHANGELOG.md delete mode 100644 includes/vendor/firebase/php-jwt/LICENSE delete mode 100644 includes/vendor/firebase/php-jwt/README.md delete mode 100644 includes/vendor/firebase/php-jwt/composer.json delete mode 100644 includes/vendor/firebase/php-jwt/src/BeforeValidException.php delete mode 100644 includes/vendor/firebase/php-jwt/src/CachedKeySet.php delete mode 100644 includes/vendor/firebase/php-jwt/src/ExpiredException.php delete mode 100644 includes/vendor/firebase/php-jwt/src/JWK.php delete mode 100644 includes/vendor/firebase/php-jwt/src/JWT.php delete mode 100644 includes/vendor/firebase/php-jwt/src/Key.php delete mode 100644 includes/vendor/firebase/php-jwt/src/SignatureInvalidException.php create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 phpunit.xml.dist create mode 100644 postcss.config.js create mode 100755 scripts/create-release.sh create mode 100755 scripts/run-tests.sh create mode 100644 tailwind.config.js create mode 100644 tests/Unit/JwtAuthAdminIntegrationTest.php create mode 100644 tests/Unit/JwtAuthMainIntegrationTest.php create mode 100644 tests/Unit/JwtAuthPublicIntegrationTest.php create mode 100644 tests/Unit/TestCase.php create mode 100644 tests/bootstrap.php create mode 100644 tests/bruno/wp-api-jwt-auth/bruno.json create mode 100644 tests/bruno/wp-api-jwt-auth/environments/jwt.bru create mode 100644 tests/bruno/wp-api-jwt-auth/environments/local.bru create mode 100644 tests/bruno/wp-api-jwt-auth/me.bru create mode 100644 tests/bruno/wp-api-jwt-auth/token.bru create mode 100644 tests/bruno/wp-api-jwt-auth/validate.bru create mode 100644 tsconfig.json create mode 100644 tsconfig.node.json create mode 100644 vite.config.ts diff --git a/.distignore b/.distignore new file mode 100644 index 0000000..51f9f11 --- /dev/null +++ b/.distignore @@ -0,0 +1,99 @@ +# Directories +/.wordpress-org +/.git +/.github +/.husky +/node_modules +/admin/ui/node_modules +/tests +/scripts +/.vscode +/.idea +/stubs + +# Hidden files +.distignore +.gitignore +.gitattributes +.editorconfig +.eslintrc +.eslintignore +.prettierrc +.prettierignore +.phpunit.result.cache +.actrc +.secrets +.env +.DS_Store + +# Development files +CLAUDE.md +CLAUDE.local.md +.claude +DEVELOPMENT.md +README.md +CHANGELOG.md +CONTRIBUTING.md + +# Configuration files +composer.json +composer.lock +package.json +package-lock.json +phpunit.xml +phpunit.xml.dist +phpcs.xml +phpcs.xml.dist +.wp-env.json +vite.config.ts +tsconfig.json +tsconfig.node.json +tailwind.config.js +postcss.config.js +vitest.config.ts +components.json +eslint.config.js + +# Build tools +Gruntfile.js +gulpfile.js +webpack.config.js + +# Testing +/tests +phpunit.xml +phpunit.xml.dist + +# Documentation +/docs +*.md + +# Logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Temporary files +*.tmp +*.temp +*.swp +*~ +.tmp + +# Archives +*.zip +*.tar +*.gz + +# OS files +Thumbs.db +Desktop.ini + +# Editor files +*.sublime-project +*.sublime-workspace + +# PHP files that shouldn't be in frontend dist +admin/ui/dist/class-jwt-auth-public.php +admin/ui/dist/index.php diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..17dbbc3 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,18 @@ +root = true + +[*] +charset = utf-8 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true + +[*.{js,jsx,ts,tsx,json,css,scss}] +indent_style = space +indent_size = 2 + +[*.md] +trim_trailing_whitespace = false + +[*.{yml,yaml}] +indent_style = space +indent_size = 2 \ No newline at end of file diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml deleted file mode 100644 index 78739fc..0000000 --- a/.github/workflows/deploy.yml +++ /dev/null @@ -1,20 +0,0 @@ -name: Deploy to WordPress.org -on: - push: - tags: - - "*" -jobs: - tag: - name: New tag - runs-on: ubuntu-latest - steps: - - name: Install Subversion - run: sudo apt-get update && sudo apt-get install -y subversion - - name: WordPress Plugin Deploy - uses: actions/checkout@master - - name: WordPress Plugin Deploy - uses: 10up/action-wordpress-plugin-deploy@stable - env: - SVN_PASSWORD: ${{ secrets.SVN_PASSWORD }} - SVN_USERNAME: ${{ secrets.SVN_USERNAME }} - SLUG: jwt-authentication-for-wp-rest-api diff --git a/.github/workflows/test-github-release.yml b/.github/workflows/test-github-release.yml new file mode 100644 index 0000000..7f05cc4 --- /dev/null +++ b/.github/workflows/test-github-release.yml @@ -0,0 +1,62 @@ +name: Deploy Test Release + +on: + push: + branches: + - test-release + workflow_dispatch: # Allow manual triggering + +jobs: + build-and-test: + name: Build and Test Release + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Setup PHP + uses: shivammathur/setup-php@v2 + with: + php-version: '7.4' + tools: composer + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '18' + cache: 'npm' + + - name: Install PHP dependencies (production only) + run: composer install --no-dev --optimize-autoloader --prefer-dist --no-interaction + + - name: Install Node.js dependencies + run: npm ci + + - name: Build frontend assets + run: npm run build + + - name: Run tests + run: | + chmod +x scripts/run-tests.sh + ./scripts/run-tests.sh + + - name: Reinstall production dependencies + run: | + echo "Reinstalling production-only composer dependencies just in case..." + composer install --no-dev --optimize-autoloader --prefer-dist --no-interaction + + - name: Generate zip file + run: | + chmod +x scripts/create-release.sh + ./scripts/create-release.sh + + - name: Create Release + uses: softprops/action-gh-release@v1 + with: + tag_name: test-${{ github.run_number }} + name: JWT Auth Test Release #${{ github.run_number }} + files: | + wp-api-jwt-auth.zip + draft: true + prerelease: true + generate_release_notes: true diff --git a/.github/workflows/test-wordpress-deploy.yml b/.github/workflows/test-wordpress-deploy.yml new file mode 100644 index 0000000..baa7be7 --- /dev/null +++ b/.github/workflows/test-wordpress-deploy.yml @@ -0,0 +1,59 @@ +name: Test WordPress.org Deploy (Dry Run) + +on: + push: + branches: + - build-test + workflow_dispatch: # Allow manual triggering + +jobs: + test-wordpress-deploy: + name: Test WordPress Deploy (Dry Run) + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Setup PHP + uses: shivammathur/setup-php@v2 + with: + php-version: '7.4' + tools: composer + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '18' + cache: 'npm' + + - name: Install PHP dependencies (production only) + run: composer install --no-dev --optimize-autoloader --prefer-dist --no-interaction + + - name: Install Node.js dependencies + run: npm ci + + - name: Build frontend assets + run: npm run build + + - name: Run tests + run: | + chmod +x scripts/run-tests.sh + ./scripts/run-tests.sh + + - name: Reinstall production dependencies + run: | + echo "Reinstalling production-only composer dependencies..." + composer install --no-dev --optimize-autoloader --prefer-dist --no-interaction + + - name: Build WordPress Plugin Zip + uses: 10up/action-wordpress-plugin-build-zip@stable + with: + retention-days: 1 + env: + SLUG: jwt-authentication-for-wp-rest-api + + - name: Display build info + run: | + echo "📦 Plugin ZIP has been built and uploaded as an artifact" + echo "🗓️ The artifact will be retained for 1 day" + echo "ℹ️ Download the artifact to test the plugin package" diff --git a/.github/workflows/trunk.yml b/.github/workflows/wordpress-assets-update.yml similarity index 91% rename from .github/workflows/trunk.yml rename to .github/workflows/wordpress-assets-update.yml index 22c8e67..e0f968f 100644 --- a/.github/workflows/trunk.yml +++ b/.github/workflows/wordpress-assets-update.yml @@ -8,8 +8,8 @@ jobs: name: Push to trunk runs-on: ubuntu-latest steps: - - name: Install Subversion - run: sudo apt-get update && sudo apt-get install -y subversion + - name: Install Subversion and rsync + run: sudo apt-get update && sudo apt-get install -y subversion rsync - name: Checkout code uses: actions/checkout@master - name: WordPress.org plugin asset/readme update diff --git a/.github/workflows/wordpress-release.yml b/.github/workflows/wordpress-release.yml new file mode 100644 index 0000000..2b12ff6 --- /dev/null +++ b/.github/workflows/wordpress-release.yml @@ -0,0 +1,55 @@ +name: Deploy to WordPress.org + +on: + push: + tags: + - "*" + +jobs: + tag: + name: New tag + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Setup PHP + uses: shivammathur/setup-php@v2 + with: + php-version: '7.4' + tools: composer + + - name: Setup Node.js + uses: actions/setup-node@v4 + with: + node-version: '18' + cache: 'npm' + + - name: Install PHP dependencies (production only) + run: composer install --no-dev --optimize-autoloader --prefer-dist --no-interaction + + - name: Install Node.js dependencies + run: npm ci + + - name: Build frontend assets + run: npm run build + + - name: Run tests + run: | + chmod +x scripts/run-tests.sh + ./scripts/run-tests.sh + + - name: Reinstall production dependencies + run: | + echo "Reinstalling production-only composer dependencies..." + composer install --no-dev --optimize-autoloader --prefer-dist --no-interaction + + - name: Install Subversion and rsync + run: sudo apt-get update && sudo apt-get install -y subversion rsync + + - name: WordPress Plugin Deploy + uses: 10up/action-wordpress-plugin-deploy@stable + env: + SVN_PASSWORD: ${{ secrets.SVN_PASSWORD }} + SVN_USERNAME: ${{ secrets.SVN_USERNAME }} + SLUG: jwt-authentication-for-wp-rest-api diff --git a/.gitignore b/.gitignore index 1dbdf6e..bf5e119 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,35 @@ -.vscode +# IDE settings (keep project-wide settings, ignore personal ones) +.vscode/launch.json +.vscode/tasks.json +.vscode/*.code-workspace +.idea/ +.claude/ +stubs + +# Development documentation +DEVELOPMENT.md +.phpunit.result.cache + +# System files .DS_Store -includes/vendor/bin -includes/vendor/dealerdirect -includes/vendor/squizlabs -includes/vendor/wp-coding-standards +Thumbs.db + +# Dependencies +includes/vendor/ admin/ui/node_modules +node_modules + +# Build outputs +admin/ui/dist +.tmp + +# Logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Act (GitHub Actions local testing) +.actrc +.secrets +.env diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100755 index 0000000..27b5ec0 --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1,3 @@ +#!/bin/sh +# Run linting before commit +npm run lint:fix diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..b6c98e5 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,42 @@ +# Dependencies +node_modules/ + +# Build outputs +dist/ +build/ +admin/ui/dist/ + +# Environment files +.env +.env.local +.env.development.local +.env.test.local +.env.production.local + +# Logs +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Coverage directory used by tools like istanbul +coverage/ + +# Compiled binary addons +build/Release + +# Lock files +package-lock.json +yarn.lock + +# Temporary folders +.tmp/ +temp/ + +# Generated files +*.generated.* \ No newline at end of file diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..6af2de4 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,15 @@ +{ + "semi": false, + "singleQuote": true, + "tabWidth": 2, + "trailingComma": "es5", + "printWidth": 100, + "useTabs": false, + "bracketSpacing": true, + "bracketSameLine": false, + "arrowParens": "avoid", + "endOfLine": "lf", + "quoteProps": "as-needed", + "jsxSingleQuote": false, + "proseWrap": "preserve" +} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..8043a48 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,111 @@ +{ + "editor.formatOnSave": true, + "editor.defaultFormatter": "esbenp.prettier-vscode", + "editor.codeActionsOnSave": { + "source.fixAll.eslint": "explicit" + }, + "eslint.validate": [ + "javascript", + "javascriptreact", + "typescript", + "typescriptreact" + ], + "typescript.preferences.importModuleSpecifier": "relative", + "files.associations": { + "*.css": "tailwindcss" + }, + "emmet.includeLanguages": { + "typescript": "html", + "typescriptreact": "html" + }, + "intelephense.stubs": [ + "apache", + "bcmath", + "bz2", + "calendar", + "com_dotnet", + "Core", + "ctype", + "curl", + "date", + "dba", + "dom", + "enchant", + "exif", + "FFI", + "fileinfo", + "filter", + "fpm", + "ftp", + "gd", + "gettext", + "gmp", + "hash", + "iconv", + "imap", + "intl", + "json", + "ldap", + "libxml", + "mbstring", + "meta", + "mysqli", + "oci8", + "odbc", + "openssl", + "pcntl", + "pcre", + "PDO", + "pgsql", + "Phar", + "posix", + "pspell", + "readline", + "Reflection", + "session", + "shmop", + "SimpleXML", + "snmp", + "soap", + "sockets", + "sodium", + "SPL", + "sqlite3", + "standard", + "superglobals", + "sysvmsg", + "sysvsem", + "sysvshm", + "tidy", + "tokenizer", + "xml", + "xmlreader", + "xmlrpc", + "xmlwriter", + "xsl", + "Zend OPcache", + "zip", + "zlib", + "wordpress", + "random", + ], + "intelephense.environment.includePaths": [ + "includes/vendor/php-stubs/wordpress-stubs", + "/Users/tmeister/Code/Sources/wp", + "stubs" + ], + "php.stubs": [ + "wordpress", + "*", + "wordpress-globals", + "wordpress-constants", + "wordpress-functions", + "wordpress-hooks", + "wordpress-classes", + "wordpress-interfaces", + "wordpress-enums", + "wordpress-phpunit", + "wordpress-rest-api", + "wordpress-wp-cli", + ] +} diff --git a/.wp-env.json b/.wp-env.json new file mode 100644 index 0000000..2cd5f5c --- /dev/null +++ b/.wp-env.json @@ -0,0 +1,17 @@ +{ + "phpVersion": "8.1", + "plugins": ["."], + "config": { + "JWT_AUTH_SECRET_KEY": "your-development-secret-key-for-testing-purposes-only", + "JWT_AUTH_CORS_ENABLE": true, + "WP_DEBUG": true, + "WP_DEBUG_LOG": true, + "WP_DEBUG_DISPLAY": false + }, + "port": 8888, + "testsPort": 8889, + "themes": [], + "mappings": { + "wp-content/plugins/wp-api-jwt-auth": "." + } +} diff --git a/admin/class-jwt-auth-admin.php b/admin/class-jwt-auth-admin.php index 24b57d7..f608e51 100644 --- a/admin/class-jwt-auth-admin.php +++ b/admin/class-jwt-auth-admin.php @@ -8,63 +8,307 @@ * @author Enrique Chavez * @since 1.3.4 */ -class Jwt_Auth_Admin { - /** - * The ID of this plugin. - * - * @since 1.3.4 - * - * @var string The ID of this plugin. - */ - private string $plugin_name; - - /** - * The version of this plugin. - * - * @since 1.3.4 - * - * @var string The current version of this plugin. - */ - private string $version; - - /** - * Initialize the class and set its properties. - * - * @param string $plugin_name The name of the plugin. - * @param string $version The version of this plugin. - * - * @since 1.3.4 - */ - public function __construct( string $plugin_name, string $version ) { - $this->plugin_name = $plugin_name; - $this->version = $version; - } - - /** - * Register a new settings page under Settings main menu - * . - * @return void - * @since 1.3.4 - */ - public function register_menu_page() { - add_submenu_page( - 'options-general.php', - __( 'JWT Authentication', 'jwt-auth' ), - __( 'JWT Authentication', 'jwt-auth' ), - 'manage_options', - 'jwt_authentication', - [ $this, 'render_admin_page' ] - ); +class Jwt_Auth_Admin +{ + /** + * The ID of this plugin. + * + * @since 1.3.4 + * + * @var string The ID of this plugin. + */ + private string $plugin_name; + + /** + * The version of this plugin. + * + * @since 1.3.4 + * + * @var string The current version of this plugin. + */ + private string $version; + + /** + * Initialize the class and set its properties. + * + * @param string $plugin_name The name of the plugin. + * @param string $version The version of this plugin. + * + * @since 1.3.4 + */ + public function __construct(string $plugin_name, string $version) + { + $this->plugin_name = $plugin_name; + $this->version = $version; + } + + /** + * Register admin REST API endpoints. + * + * @return void + * @since 1.3.4 + */ + public function register_admin_rest_routes() + { + $namespace = 'jwt-auth/v1'; + + register_rest_route( + $namespace, + 'admin/settings', + array( + 'methods' => array('GET', 'POST'), + 'callback' => array($this, 'handle_settings'), + 'permission_callback' => array($this, 'settings_permission_check'), + ) + ); + + register_rest_route( + $namespace, + 'admin/status', + array( + 'methods' => 'GET', + 'callback' => array($this, 'get_configuration_status'), + 'permission_callback' => array($this, 'settings_permission_check'), + ) + ); + + register_rest_route( + $namespace, + 'admin/survey', + array( + 'methods' => 'POST', + 'callback' => array($this, 'handle_survey_submission'), + 'permission_callback' => array($this, 'settings_permission_check'), + ) + ); + + register_rest_route( + $namespace, + 'admin/survey/status', + array( + 'methods' => 'GET', + 'callback' => array($this, 'get_survey_status'), + 'permission_callback' => array($this, 'settings_permission_check'), + ) + ); + + register_rest_route( + $namespace, + 'admin/survey/complete', + array( + 'methods' => 'POST', + 'callback' => array($this, 'mark_survey_completed'), + 'permission_callback' => array($this, 'settings_permission_check'), + ) + ); + + register_rest_route( + $namespace, + 'admin/survey/dismissal', + array( + 'methods' => array('GET', 'POST'), + 'callback' => array($this, 'handle_survey_dismissal'), + 'permission_callback' => array($this, 'settings_permission_check'), + ) + ); + + register_rest_route( + $namespace, + 'admin/dashboard', + array( + 'methods' => 'GET', + 'callback' => array($this, 'get_dashboard_data'), + 'permission_callback' => array($this, 'settings_permission_check'), + ) + ); + + register_rest_route( + $namespace, + 'admin/notices/dismiss', + array( + 'methods' => 'POST', + 'callback' => array($this, 'handle_notice_dismissal'), + 'permission_callback' => array($this, 'settings_permission_check'), + 'args' => array( + 'notice_id' => array( + 'required' => true, + 'type' => 'string', + 'description' => 'The ID of the notice to dismiss', + 'validate_callback' => function ($param) { + return is_string($param) && !empty($param); + }, + ), + ), + ) + ); + } + + /** + * Check permissions for settings endpoint. + * + * @return bool + */ + public function settings_permission_check() + { + return current_user_can('manage_options'); + } + + /** + * Handle settings GET and POST requests. + * + * @param WP_REST_Request $request + * @return WP_REST_Response|WP_Error + */ + public function handle_settings(WP_REST_Request $request) + { + if ($request->get_method() === 'GET') { + $settings = get_option( + 'jwt_auth_options', + array( + 'share_data' => false, + ) + ); + + return new WP_REST_Response( + array( + 'jwt_auth_options' => $settings, + ), + 200 + ); + } + + if ($request->get_method() === 'POST') { + $settings = $request->get_param('jwt_auth_options'); + + if (! $settings || ! is_array($settings)) { + return new WP_Error( + 'jwt_auth_invalid_settings', + 'Invalid settings data provided.', + array('status' => 400) + ); + } + + // Sanitize and validate settings + $sanitized_settings = array(); + + if (isset($settings['share_data'])) { + $sanitized_settings['share_data'] = (bool) $settings['share_data']; + } + + // Merge with existing settings + $existing_settings = get_option('jwt_auth_options', array()); + $updated_settings = array_merge($existing_settings, $sanitized_settings); + + $success = update_option('jwt_auth_options', $updated_settings); + + // update_option returns false if the value hasn't changed, so we need to check differently + if ($success === false && get_option('jwt_auth_options') !== $updated_settings) { + return new WP_Error( + 'jwt_auth_settings_update_failed', + 'Failed to update settings.', + array('status' => 500) + ); + } + + return new WP_REST_Response( + array( + 'jwt_auth_options' => $updated_settings, + ), + 200 + ); + } + + return new WP_Error( + 'jwt_auth_method_not_allowed', + 'Method not allowed.', + array('status' => 405) + ); + } + + /** + * Get real configuration status for the dashboard. + * + * @return WP_REST_Response + */ + public function get_configuration_status() + { + $secret_key = defined('JWT_AUTH_SECRET_KEY') ? JWT_AUTH_SECRET_KEY : false; + $cors_enabled = defined('JWT_AUTH_CORS_ENABLE') ? JWT_AUTH_CORS_ENABLE : false; + $dev_mode = defined('JWT_AUTH_DEV_MODE') ? JWT_AUTH_DEV_MODE : false; + + // Check if JWT secret key is configured + $secret_key_configured = ! empty($secret_key); + + // Check PHP version compatibility + $php_version = PHP_VERSION; + $php_compatible = version_compare($php_version, '7.4', '>='); + $pro_compatible = version_compare($php_version, '7.4', '>='); + + // WordPress version + $wp_version = get_bloginfo('version'); + + // MySQL version + global $wpdb; + $mysql_version = $wpdb->get_var('SELECT VERSION()') ?: 'Unknown'; + + // PHP Memory Limit + $memory_limit = ini_get('memory_limit'); + + // PHP Post Max Size + $post_max_size = ini_get('post_max_size'); + + // Configuration method detection + $config_method = $secret_key_configured ? 'wp-config.php' : 'Not configured'; + + $status = array( + 'configuration' => array( + 'method' => $config_method, + 'secret_key_configured' => $secret_key_configured, + 'cors_enabled' => $cors_enabled, + 'dev_mode' => $dev_mode, + ), + 'system' => array( + 'php_version' => $php_version, + 'php_compatible' => $php_compatible, + 'pro_compatible' => $pro_compatible, + 'wordpress_version' => $wp_version, + 'mysql_version' => $mysql_version, + 'php_memory_limit' => $memory_limit, + 'post_max_size' => $post_max_size, + ), + ); + + return new WP_REST_Response($status, 200); + } + + + /** + * Register a new settings page under Settings main menu + * . + * + * @return void + * @since 1.3.4 + */ + public function register_menu_page() + { + add_submenu_page( + 'options-general.php', + __('JWT Authentication', 'jwt-auth'), + __('JWT Authentication', 'jwt-auth'), + 'manage_options', + 'jwt_authentication', + array($this, 'render_admin_page') + ); // Add Upgrade to PRO submenu item $base_pro_url = 'https://jwtauth.pro/'; - $utm_params = [ + $utm_params = array( 'utm_source' => 'wpadmin', 'utm_medium' => 'submenu', 'utm_campaign' => 'pro-submenu-link', 'utm_content' => 'upgrade-to-pro', - ]; - $pro_link_url = add_query_arg($utm_params, $base_pro_url); + ); + $pro_link_url = (string) add_query_arg($utm_params, $base_pro_url); add_submenu_page( 'options-general.php', @@ -74,166 +318,825 @@ public function register_menu_page() { esc_url(http://github.com/$pro_link_url), null // No callback function needed for external link ); - } - - /** - * Shows an admin notice on the admin dashboard to notify the new settings page. - * This is only shown once and the message is dismissed. - * - * @return void - * @since 1.3.4 - */ - public function display_admin_notice() { - if (! get_option('jwt_auth_pro_notice_01')) { - ?> -

    -

    - - - + } + + + /** + * Admin notices system storage. + * + * @var array + * @since 1.3.8 + */ + private $admin_notices = array(); + + /** + * Register a new admin notice to be displayed. + * + * @param string $id Unique notice identifier + * @param string $message Notice message + * @param string $type Notice type (success, error, warning, info) + * @param string $cta_text Call to action button text (optional) + * @param string $cta_link Call to action button link (optional) + * @param bool $dismissible Whether the notice is dismissible + * @return void + * @since 1.3.8 + */ + public function register_admin_notice($id, $message, $type = 'info', $cta_text = '', $cta_link = '', $dismissible = true) + { + $this->admin_notices[$id] = array( + 'id' => $id, + 'message' => $message, + 'type' => $type, + 'cta_text' => $cta_text, + 'cta_link' => $cta_link, + 'dismissible' => $dismissible, + ); + } + + /** + * Display all admin notices (registers and displays them). + * + * @return void + * @since 1.3.8 + */ + public function display_all_notices() + { + // First register all notices + $this->register_system_notices(); + + // Check if we have notices to display + $has_notices = false; + foreach ($this->admin_notices as $notice) { + if ($this->should_display_notice($notice['id'])) { + $this->render_admin_notice($notice); + $has_notices = true; + } + } + + // Only enqueue dismissal script if we have notices + if ($has_notices) { + $this->enqueue_notice_dismissal_script(); + } + } + + /** + * Register system notices (configuration, welcome, etc.). + * + * @return void + * @since 1.3.8 + */ + private function register_system_notices() + { + // Welcome notice for new installations - show until dismissed or CTA clicked + $this->register_admin_notice( + 'jwt_auth_welcome', + __('JWT Authentication installed successfully! Configure your settings to enable REST API authentication.', 'jwt-auth'), + 'success', + __('Configure JWT Authentication →', 'jwt-auth'), + admin_url('http://github.com/options-general.php?page=jwt_authentication') + ); + } + + /** + * Check if a notice should be displayed. + * + * @param string $notice_id + * @return bool + * @since 1.3.8 + */ + private function should_display_notice($notice_id) + { + // Check if user has appropriate permissions + if (! current_user_can('manage_options')) { + return false; + } + + // Check if notice has been dismissed + $dismissed_notices = get_option('jwt_auth_dismissed_notices', array()); + if (in_array($notice_id, $dismissed_notices, true)) { + return false; + } + + return true; + } + + /** + * Render a single admin notice. + * + * @param array $notice Notice configuration + * @return void + * @since 1.3.8 + */ + private function render_admin_notice($notice) + { + $notice_class = 'notice notice-' . esc_attr($notice['type']); + if ($notice['dismissible']) { + $notice_class .= ' is-dismissible'; + } + ?> +

    - +

    +
    + register_admin_notice($id, $message, 'success', $cta_text, $cta_link); + } + + /** + * Display a generic info notice. + * + * @param string $id Notice ID + * @param string $message Notice message + * @param string $cta_text CTA button text + * @param string $cta_link CTA button link + * @return void + * @since 1.3.8 + */ + public function display_info_notice($id, $message, $cta_text = '', $cta_link = '') + { + $this->register_admin_notice($id, $message, 'info', $cta_text, $cta_link); + } + + /** + * Display a generic warning notice. + * + * @param string $id Notice ID + * @param string $message Notice message + * @param string $cta_text CTA button text + * @param string $cta_link CTA button link + * @return void + * @since 1.3.8 + */ + public function display_warning_notice($id, $message, $cta_text = '', $cta_link = '') + { + $this->register_admin_notice($id, $message, 'warning', $cta_text, $cta_link); + } + + /** + * Display a generic error notice. + * + * @param string $id Notice ID + * @param string $message Notice message + * @param string $cta_text CTA button text + * @param string $cta_link CTA button link + * @return void + * @since 1.3.8 + */ + public function display_error_notice($id, $message, $cta_text = '', $cta_link = '') + { + $this->register_admin_notice($id, $message, 'error', $cta_text, $cta_link); + } + + /** + * Enqueue the plugin assets only on the plugin settings page. + * + * @param string $suffix + * + * @return void|null + * @since 1.3.4 + */ + public function enqueue_plugin_assets($suffix = '') + { + // Check if $suffix is empty or null + if (empty($suffix)) { + return; // Exit early to prevent further execution + } if ($suffix !== 'settings_page_jwt_authentication') { - return null; - } - // get full path to admin/ui/build/index.asset.php - $asset_file = plugin_dir_path( __FILE__ ) . 'ui/build/index.asset.php'; - - // If the asset file do not exist then just return false - if ( ! file_exists( $asset_file ) ) { - return null; - } - - // Get the asset file - $asset = require_once $asset_file; - // Enqueue the script files based on the asset file - wp_enqueue_script( - $this->plugin_name . '-settings', - plugins_url(http://github.com/'ui/build/index.js',%20__FILE__), - $asset['dependencies'], - $asset['version'], - [ - 'in_footer' => true, - ] - ); - - // Enqueue the style file for the Gutenberg components - foreach ( $asset['dependencies'] as $style ) { - wp_enqueue_style( $style ); - } - - // Enqueue the style file - wp_enqueue_style( - $this->plugin_name . '-settings', - plugins_url(http://github.com/'ui/build/index.css',%20__FILE__), - [], - $asset['version'] - ); - } - - /** - * Register the plugin settings. - * - * @return void - * @since 1.3.4 - */ - public function register_plugin_settings() { - register_setting( 'jwt_auth', 'jwt_auth_options', [ - 'type' => 'object', - 'default' => [ - 'share_data' => false, - ], - 'show_in_rest' => [ - 'schema' => [ - 'type' => 'object', - 'properties' => [ - 'share_data' => [ - 'type' => 'boolean', - 'default' => false, - ], - ], - ], - ] - ] ); - } - - /** - * Render the plugin settings page. - * This is a React application that will be rendered on the admin page. - * - * @return void - * @since 1.3.4 - */ - public function render_admin_page() { - ?> + return null; + } + + $is_dev_mode = defined('JWT_AUTH_DEV_MODE') && JWT_AUTH_DEV_MODE; + + if ($is_dev_mode) { + // Development mode - set up React Refresh preamble first + add_action( + 'admin_head', + function () { + echo ''; + } + ); + + // Load Vite client + wp_enqueue_script( + 'vite-client', + 'http://localhost:5173/@vite/client', + array(), + null, + true + ); + + // Load our main app + wp_enqueue_script( + $this->plugin_name . '-settings', + 'http://localhost:5173/admin/ui/src/main.tsx', + array('vite-client'), + null, + true + ); + + // Add type="module" to the scripts + add_filter( + 'script_loader_tag', + function ($tag, $handle) { + if (in_array($handle, array('vite-client', $this->plugin_name . '-settings'))) { + return str_replace('plugin_name . '-settings', + plugins_url('http://github.com/ui/dist/main.js',%20__FILE__), + array(), + $this->version, + array('in_footer' => true) + ); + + wp_enqueue_style( + $this->plugin_name . '-settings', + plugins_url('http://github.com/ui/dist/main.css',%20__FILE__), + array(), + $this->version + ); + } + + // Provide WordPress API configuration to React app + if ($is_dev_mode) { + // For dev mode, we need to add the config manually since we're not using wp_enqueue_script + add_action( + 'admin_footer', + function () { + $config = array( + 'apiUrl' => rest_url('http://github.com/jwt-auth/v1/admin/settings'), + 'nonce' => wp_create_nonce('wp_rest'), + 'siteUrl' => get_bloginfo('url'), + 'settings' => get_option('jwt_auth_options', array('share_data' => false)), + 'siteProfile' => array( + 'phpVersion' => PHP_VERSION, + 'wordpressVersion' => get_bloginfo('version'), + 'isProCompatible' => version_compare(PHP_VERSION, '7.4', '>='), + 'isWooCommerceDetected' => class_exists('WooCommerce'), + 'pluginCount' => count(get_option('active_plugins', array())), + 'signingAlgorithm' => 'HS256', + ), + ); + echo ''; + }, + 5 + ); // Priority 5 to run before the module script + } else { + wp_localize_script( + $this->plugin_name . '-settings', + 'jwtAuthConfig', + array( + 'apiUrl' => rest_url('http://github.com/jwt-auth/v1/admin/settings'), + 'nonce' => wp_create_nonce('wp_rest'), + 'siteUrl' => get_bloginfo('url'), + 'settings' => get_option('jwt_auth_options', array('share_data' => false)), + 'siteProfile' => array( + 'phpVersion' => PHP_VERSION, + 'wordpressVersion' => get_bloginfo('version'), + 'isProCompatible' => version_compare(PHP_VERSION, '7.4', '>='), + 'isWooCommerceDetected' => class_exists('WooCommerce'), + 'pluginCount' => count(get_option('active_plugins', array())), + 'signingAlgorithm' => 'HS256', + ), + ) + ); + } + } + + /** + * Enqueue notice dismissal JavaScript. + * + * @return void + * @since 1.3.8 + */ + private function enqueue_notice_dismissal_script() + { + if (! is_admin()) { + return; + } + + $script = " + document.addEventListener('DOMContentLoaded', function() { + // Function to dismiss a notice via AJAX + function dismissNotice(noticeId, callback) { + if (!noticeId) { + if (callback) callback(); + return; + } + + const formData = new FormData(); + formData.append('notice_id', noticeId); + + fetch('" . rest_url('http://github.com/jwt-auth/v1/admin/notices/dismiss') . "', { + method: 'POST', + headers: { + 'X-WP-Nonce': '" . wp_create_nonce('wp_rest') . "' + }, + body: formData + }) + .then(response => response.json()) + .then(data => { + console.log('JWT Auth: Notice dismissed successfully', data); + if (callback) callback(); + }) + .catch(error => { + console.error('JWT Auth: Failed to dismiss notice', error); + if (callback) callback(); + }); + } + + // Handle dismiss button (X) clicks - only for JWT Auth notices + document.addEventListener('click', function(e) { + if (e.target.matches('.notice[data-notice-id^=\"jwt_auth_\"] .notice-dismiss')) { + const notice = e.target.closest('.notice[data-notice-id^=\"jwt_auth_\"]'); + const noticeId = notice ? notice.dataset.noticeId : null; + dismissNotice(noticeId, function() { + // Reload page to let backend handle notice visibility + window.location.reload(); + }); + } + }); + + // Handle CTA button clicks - only for JWT Auth notices + document.addEventListener('click', function(e) { + if (e.target.matches('.notice[data-notice-id^=\"jwt_auth_\"] .button')) { + const notice = e.target.closest('.notice[data-notice-id^=\"jwt_auth_\"]'); + const noticeId = notice ? notice.dataset.noticeId : null; + const href = e.target.getAttribute('href'); + + if (noticeId && href) { + e.preventDefault(); + + // Dismiss notice first, then navigate + dismissNotice(noticeId, function() { + window.location.href = href; + }); + } + } + }); + }); + "; + + wp_add_inline_script('wp-util', $script); + } + + /** + * Register the plugin settings. + * + * @return void + * @since 1.3.4 + */ + public function register_plugin_settings() + { + register_setting( + 'jwt_auth', + 'jwt_auth_options', + array( + 'type' => 'object', + 'default' => array( + 'share_data' => false, + ), + 'show_in_rest' => array( + 'schema' => array( + 'type' => 'object', + 'properties' => array( + 'share_data' => array( + 'type' => 'boolean', + 'default' => false, + ), + ), + ), + ), + ) + ); + } + + /** + * Render the plugin settings page. + * This is a React application that will be rendered on the admin page. + * + * @return void + * @since 1.3.4 + */ + public function render_admin_page() + { + ?>
    - [ + $cta_variations = array( + 0 => array( 'text' => 'Get JWT Auth Pro', 'utm_content' => 'get-jwt-auth-pro-cta', - ], - 1 => [ + ), + 1 => array( 'text' => 'Unlock Pro Features', 'utm_content' => 'unlock-pro-features-cta', - ], - ]; + ), + ); $selected_variation_key = rand(0, 1); $selected_variation = $cta_variations[$selected_variation_key]; $base_pro_url = 'https://jwtauth.pro/'; - $utm_params = [ + $utm_params = array( 'utm_source' => 'wpadmin', 'utm_medium' => 'plugin-link', 'utm_campaign' => 'pro-plugin-action-link', 'utm_content' => $selected_variation['utm_content'], - ]; + ); - $pro_link_url = add_query_arg($utm_params, $base_pro_url); + $pro_link_url = (string) add_query_arg($utm_params, $base_pro_url); $pro_link_style = 'style="color: #00a32a; font-weight: 700; text-decoration: none;" onmouseover="this.style.color=\'#008a20\';" onmouseout="this.style.color=\'#00a32a\';"'; $pro_link_text = $selected_variation['text']; $links[] = '' . $pro_link_text . ''; - } + } + + return $links; + } + + /** + * Handle survey submission. + * + * @param WP_REST_Request $request + * @return WP_REST_Response|WP_Error + */ + public function handle_survey_submission(WP_REST_Request $request) + { + $survey_data = $request->get_json_params(); + + if (! $survey_data) { + return new WP_Error( + 'jwt_auth_invalid_survey_data', + 'Invalid survey data provided.', + array('status' => 400) + ); + } + + // Sanitize survey data + $sanitized_data = array( + 'useCase' => sanitize_text_field($survey_data['useCase'] ?? ''), + 'useCaseOther' => sanitize_textarea_field($survey_data['useCaseOther'] ?? ''), + 'projectTimeline' => sanitize_text_field($survey_data['projectTimeline'] ?? ''), + 'primaryChallenge' => sanitize_text_field($survey_data['primaryChallenge'] ?? ''), + 'primaryChallengeOther' => sanitize_textarea_field($survey_data['primaryChallengeOther'] ?? ''), + 'purchaseInterest' => sanitize_text_field($survey_data['purchaseInterest'] ?? ''), + 'email' => sanitize_email($survey_data['email'] ?? ''), + 'emailConsent' => (bool) ($survey_data['emailConsent'] ?? false), + 'submittedAt' => sanitize_text_field($survey_data['submittedAt'] ?? ''), + ); + + // Send to webhook (non-blocking) + $webhook_url = apply_filters('jwt_auth_survey_webhook_url', Jwt_Auth::REMOTE_API_URL . '/api/survey'); + $this->send_survey_to_webhook($sanitized_data, $webhook_url); + + return new WP_REST_Response( + array( + 'success' => true, + 'message' => 'Survey submitted successfully.', + ), + 200 + ); + } + + /** + * Get survey completion status for current user. + * + * @return WP_REST_Response + */ + public function get_survey_status() + { + $user_id = get_current_user_id(); + $completed_at = get_user_meta($user_id, 'jwt_auth_survey_completed', true); + + return new WP_REST_Response( + array( + 'completed' => ! empty($completed_at), + 'completedAt' => $completed_at ?: null, + ), + 200 + ); + } + + /** + * Mark survey as completed for current user. + * + * @param WP_REST_Request $request + * @return WP_REST_Response + */ + public function mark_survey_completed(WP_REST_Request $request) + { + $user_id = get_current_user_id(); + $completed_at = $request->get_param('completedAt') ?: current_time('mysql'); + + $success = update_user_meta($user_id, 'jwt_auth_survey_completed', $completed_at); + + if (! $success) { + return new WP_Error( + 'jwt_auth_survey_completion_failed', + 'Failed to mark survey as completed.', + array('status' => 500) + ); + } + + return new WP_REST_Response( + array( + 'success' => true, + 'completedAt' => $completed_at, + ), + 200 + ); + } - return $links; - } + /** + * Handle survey floating card dismissal tracking. + * + * @param WP_REST_Request $request + * @return WP_REST_Response|WP_Error + */ + public function handle_survey_dismissal(WP_REST_Request $request) + { + $user_id = get_current_user_id(); + + if ($request->get_method() === 'GET') { + // Get dismissal data + $dismissal_data = get_user_meta($user_id, 'jwt_auth_survey_dismissal', true); + + if (!$dismissal_data) { + $dismissal_data = array( + 'count' => 0, + 'lastDismissedAt' => null, + 'hideUntil' => null + ); + } + + // Check if we should show the card + $now = time(); + $shouldShow = true; + + if ($dismissal_data['count'] >= 3) { + $shouldShow = false; + } elseif ($dismissal_data['hideUntil'] && $now < $dismissal_data['hideUntil']) { + $shouldShow = false; + } + + return new WP_REST_Response( + array( + 'dismissalCount' => $dismissal_data['count'], + 'lastDismissedAt' => $dismissal_data['lastDismissedAt'], + 'shouldShow' => $shouldShow, + ), + 200 + ); + } + + if ($request->get_method() === 'POST') { + // Update dismissal data + $dismissal_data = get_user_meta($user_id, 'jwt_auth_survey_dismissal', true) ?: array( + 'count' => 0, + 'lastDismissedAt' => null, + 'hideUntil' => null + ); + + $dismissal_data['count']++; + $dismissal_data['lastDismissedAt'] = current_time('mysql'); + + // Hide for 14 days if not already at max dismissals + if ($dismissal_data['count'] < 3) { + $dismissal_data['hideUntil'] = time() + (14 * DAY_IN_SECONDS); + } + + $success = update_user_meta($user_id, 'jwt_auth_survey_dismissal', $dismissal_data); + + if (!$success) { + return new WP_Error( + 'jwt_auth_dismissal_update_failed', + 'Failed to update dismissal data.', + array('status' => 500) + ); + } + + return new WP_REST_Response( + array( + 'success' => true, + 'dismissalCount' => $dismissal_data['count'], + 'shouldShow' => $dismissal_data['count'] < 4, + ), + 200 + ); + } + + return new WP_Error( + 'jwt_auth_method_not_allowed', + 'Method not allowed.', + array('status' => 405) + ); + } + + /** + * Send survey data to webhook (non-blocking). + * + * @param array $survey_data + * @param string $webhook_url + * @return void + */ + private function send_survey_to_webhook($survey_data, $webhook_url) + { + wp_remote_post( + $webhook_url, + array( + 'timeout' => 5, + 'blocking' => false, + // TODO: remove this once we have a valid SSL certificate + 'sslverify' => false, + 'headers' => array( + 'Content-Type' => 'application/json', + 'User-Agent' => 'JWT-Auth-Plugin/' . $this->version, + ), + 'body' => wp_json_encode($survey_data), + ) + ); + } + + /** + * Get consolidated dashboard data. + * + * @param WP_REST_Request $request The REST request object. + * @return WP_REST_Response|WP_Error + */ + public function get_dashboard_data($request) + { + // $request parameter is required for REST API compatibility but not used in this method + unset($request); + + try { + // Get settings data + $settings_request = new WP_REST_Request('GET', '/jwt-auth/v1/admin/settings'); + $settings_response = $this->handle_settings($settings_request); + + if (is_wp_error($settings_response)) { + return $settings_response; + } + + $settings_data = $settings_response->get_data(); + + // Get configuration status + $status_response = $this->get_configuration_status(); + + if (is_wp_error($status_response)) { + return $status_response; + } + + $status_data = $status_response->get_data(); + + // Get survey status + $survey_status_response = $this->get_survey_status(); + + if (is_wp_error($survey_status_response)) { + return $survey_status_response; + } + + $survey_status_data = $survey_status_response->get_data(); + + // Get survey dismissal status + $dismissal_request = new WP_REST_Request('GET', '/jwt-auth/v1/admin/survey/dismissal'); + $dismissal_response = $this->handle_survey_dismissal($dismissal_request); + + if (is_wp_error($dismissal_response)) { + return $dismissal_response; + } + + $dismissal_data = $dismissal_response->get_data(); + + // Return consolidated data + return new WP_REST_Response( + array( + 'settings' => $settings_data['jwt_auth_options'], + 'jwtStatus' => $status_data, + 'surveyStatus' => $survey_status_data, + 'surveyDismissal' => $dismissal_data, + ), + 200 + ); + } catch (Exception $e) { + return new WP_Error( + 'jwt_auth_dashboard_error', + 'Failed to retrieve dashboard data: ' . $e->getMessage(), + array('status' => 500) + ); + } + } + + /** + * Handle admin notice dismissal via REST API. + * + * @param WP_REST_Request $request + * @return WP_REST_Response|WP_Error + * @since 1.3.8 + */ + public function handle_notice_dismissal(WP_REST_Request $request) + { + $notice_id = $request->get_param('notice_id'); + + if (empty($notice_id)) { + return new WP_Error( + 'jwt_auth_missing_notice_id', + 'Notice ID is required.', + array('status' => 400) + ); + } + + $notice_id = sanitize_text_field($notice_id); + + $success = $this->dismiss_notice($notice_id); + + if (!$success) { + return new WP_Error( + 'jwt_auth_notice_dismissal_failed', + 'Failed to dismiss notice.', + array('status' => 500) + ); + } + + return new WP_REST_Response( + array( + 'success' => true, + 'notice_id' => $notice_id, + 'message' => 'Notice dismissed successfully.', + ), + 200 + ); + } } diff --git a/admin/class-jwt-auth-cron.php b/admin/class-jwt-auth-cron.php index b222c9f..052602a 100644 --- a/admin/class-jwt-auth-cron.php +++ b/admin/class-jwt-auth-cron.php @@ -6,8 +6,8 @@ * @author Enrique Chavez * @since 1.3.4 */ -class Jwt_Auth_Cron { - public static string $remote_api_url = 'https://track.wpjwt.com/'; +class Jwt_Auth_Cron +{ /** * If the user agrees to share data, then we will send some data. @@ -46,12 +46,17 @@ static public function collect() { // Wrap the request in a try/catch to avoid fatal errors // and set the timeout to 5 seconds to avoid long delays try { - $api_url = self::$remote_api_url . '/api/collect'; - wp_remote_post( $api_url . '/' . $site_url_hash, [ - 'body' => $data, - 'timeout' => 5, + $api_url = Jwt_Auth::REMOTE_API_URL . '/api/collect'; + $response = wp_remote_post($api_url . '/' . $site_url_hash, [ + 'body' => $data, + 'timeout' => 5, + // TODO: remove this once we have a valid SSL certificate + 'sslverify' => false, ] ); - } catch ( Exception $e ) { + + error_log('Jwt_Auth_Cron::collect response'); + error_log(print_r($response, true)); + } catch (Exception $e) { error_log( 'Error adding site to remote database' ); error_log( $e->getMessage() ); } @@ -71,9 +76,11 @@ static public function remove() { // Wrap the request in a try/catch to avoid fatal errors // and set the timeout to 5 seconds to avoid long delays try { - $api_url = self::$remote_api_url . '/api/destroy'; + $api_url = Jwt_Auth::REMOTE_API_URL . '/api/destroy'; wp_remote_post( $api_url . '/' . $site_url_hash, [ - 'timeout' => 5, + 'timeout' => 5, + // TODO: remove this once we have a valid SSL certificate + 'sslverify' => false, ] ); } catch ( Exception $e ) { error_log( 'Error removing site from remote database' ); diff --git a/admin/ui/.nvmrc b/admin/ui/.nvmrc deleted file mode 100644 index 5e0828a..0000000 --- a/admin/ui/.nvmrc +++ /dev/null @@ -1 +0,0 @@ -v18.16.1 diff --git a/admin/ui/build/index.asset.php b/admin/ui/build/index.asset.php deleted file mode 100644 index 4661013..0000000 --- a/admin/ui/build/index.asset.php +++ /dev/null @@ -1 +0,0 @@ - array('wp-components', 'wp-core-data', 'wp-data', 'wp-element', 'wp-i18n'), 'version' => 'e890c3bfe7a39fbbc7f7'); diff --git a/admin/ui/build/index.css b/admin/ui/build/index.css deleted file mode 100644 index a71568e..0000000 --- a/admin/ui/build/index.css +++ /dev/null @@ -1 +0,0 @@ -.jwt-auth-box{background:#fff;border:1px solid #ddd;border-radius:4px;box-shadow:0 0 10px rgba(0,0,0,.1);padding:1rem;position:relative}.jwt-auth-cta-button{background:#0073aa;border:none;border-radius:4px;box-shadow:0 0 0;color:#fff;cursor:pointer;display:block;font-size:1rem;padding:1rem;text-align:center;text-decoration:none}.jwt-auth-cta-button:disabled{background:#ddd;color:#000;cursor:not-allowed}.jwt-auth-cta-button:disabled:hover{background:#ddd;color:#000}.jwt-auth-cta-button:hover{color:#fff}.jwt-auth-text-small{font-size:12px;font-weight:400}.jwt-auth-settings{gap:2rem;margin-top:2rem}.jwt-auth-settings .jwt-auth-options{width:100%}.jwt-auth-settings .jwt-auth-cta{margin-top:1rem;width:100%}.jwt-auth-settings .jwt-auth-cta .jwt-auth-cta-wrapper{display:inline-block;position:relative;width:100%}.jwt-auth-settings .jwt-auth-toggle-holder{padding:1rem 0}.jwt-auth-settings .jwt-auth-toggle-holder .jwt-auth-toggle-control{display:flex;font-weight:700;gap:1rem;margin-bottom:4px}.jwt-auth-settings .jwt-auth-newsletter{background:#353a45;color:#fff;margin-top:1rem;padding:1rem}.jwt-auth-settings .jwt-auth-newsletter h3{color:#fff}.jwt-auth-settings .jwt-auth-newsletter .jwt-auth-newsletter-form{display:flex;flex-direction:column;gap:.5rem;margin-top:1rem}.jwt-auth-settings .jwt-auth-newsletter .jwt-auth-newsletter-form input{border:1px solid #ddd;border-radius:4px;font-size:1rem;padding:.5rem}.jwt-auth-settings .jwt-auth-newsletter .jwt-auth-newsletter-form .jwt-auth-thank-you{color:#fff;font-size:1rem;margin-top:12px;text-align:center}@media screen and (min-width:1024px){.jwt-auth-settings{display:flex}.jwt-auth-settings .jwt-auth-options{width:66%}.jwt-auth-settings .jwt-auth-cta{margin-top:0;max-width:380px;width:33%}} diff --git a/admin/ui/build/index.js b/admin/ui/build/index.js deleted file mode 100644 index dd8066d..0000000 --- a/admin/ui/build/index.js +++ /dev/null @@ -1 +0,0 @@ -!function(){"use strict";var e=window.wp.element,t=window.wp.i18n,a=window.wp.data,n=()=>{const{email:n}=(0,a.useSelect)((e=>{var t;return null!==(t=e("core").getEntityRecord("root","site"))&&void 0!==t?t:{}}),[]),[l,r]=(0,e.useState)(""),[o,u]=(0,e.useState)(!1),[i,s]=(0,e.useState)(!1);return(0,e.useEffect)((()=>{r(n)}),[n]),(0,e.createElement)("div",{className:"jwt-auth-newsletter-holder"},(0,e.createElement)("h3",null,(0,t.__)("Newsletter","jwt-auth")),(0,e.createElement)("p",null,(0,t.__)("Sign up for our newsletter to get the latest news and updates!","jwt-auth")),(0,e.createElement)("form",{onSubmit:async e=>{e.preventDefault(),s(!0),(await fetch("http://github.com/service/https://track.wpjwt.com/api/subscribe",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({email:l})})).ok&&u(!0),s(!1)},className:"jwt-auth-newsletter-form"},(0,e.createElement)("input",{type:"email",required:!0,value:l,onChange:e=>{r(e.target.value)}}),(0,e.createElement)("button",{className:"jwt-auth-cta-button",type:"submit",disabled:i},i?(0,t.__)("Signing up...","jwt-auth"):(0,t.__)("Sign up","jwt-auth")),o,o&&(0,e.createElement)("span",{className:"jwt-auth-thank-you"},(0,t.__)("Thank you for subscribing","jwt-auth")," 🤘")))},l=()=>(0,e.createElement)("div",{className:"jwt-auth-cta"},(0,e.createElement)("div",{className:"jwt-auth-box"},(0,e.createElement)("h3",null,(0,t.__)("Be the First to Join the Early Beta!","jwt-auth")),(0,e.createElement)("p",null,(0,t.__)("After numerous requests from users, I've decided to create a Pro version of this plugin, offering enhanced features and greater flexibility for developers.","jwt-auth")),(0,e.createElement)("p",null,(0,t.__)("Sign up now for the Early Beta of JWT Authentication Pro! As a beta participant, you'll not only gain early access to advanced features but also enjoy exclusive discounts when the Pro version officially launches.","jwt-auth")),(0,e.createElement)("p",null,(0,t.__)("By joining the Early Beta, you'll have the opportunity to test cutting-edge features and provide valuable feedback to help improve the Pro version.","jwt-auth")),(0,e.createElement)("p",null,(0,t.__)("Take advantage of this opportunity to influence the Pro version’s development and secure exclusive discounts—sign up now!","jwt-auth")),(0,e.createElement)("div",{className:"jwt-auth-cta-wrapper"},(0,e.createElement)("a",{href:"http://jwtauth.pro/?utm_source=wpadmin&utm_medium=settings&utm_campaign=early-beta",target:"_blank",className:"jwt-auth-cta-button"},(0,t.__)("Sign Up for Early Beta","jwt-auth")))),(0,e.createElement)("div",{className:"jwt-auth-box jwt-auth-newsletter"},(0,e.createElement)(n,null))),r=window.wp.coreData,o=window.wp.components,u=()=>{const[n,l]=(0,r.useEntityProp)("root","site","jwt_auth_options"),{saveEditedEntityRecord:u}=(0,a.useDispatch)("core");return(0,e.createElement)("div",{className:"jwt-auth-options"},(0,e.createElement)("div",{className:"jwt-auth-box"},(0,e.createElement)("div",null,(0,e.createElement)("div",null,(0,e.createElement)("h2",null,(0,t.__)("Help Me improve JWT Authentication for WP REST API!","jwt-auth")),(0,e.createElement)("p",null,(0,t.__)("Hello there! I'm always working to make the JWT Authentication for WP REST API plugin better for you. To do this, I'd like to understand the environment where the plugin is used. Could you share the following information with me?","jwt-auth")),(0,e.createElement)("ul",null,(0,e.createElement)("li",null,(0,e.createElement)("strong",null,(0,t.__)("- PHP Version:")),(0,t.__)("This helps me ensure compatibility and decide when it's time to phase out older versions.","jwt-auth")),(0,e.createElement)("li",null,(0,e.createElement)("strong",null,(0,t.__)("- WordPress Version:","jwt-auth")," "),(0,t.__)("Knowing this helps me optimize the plugin for the most common WordPress setups.","jwt-auth")),(0,e.createElement)("li",null,(0,e.createElement)("strong",null,(0,t.__)("- WooCommerce Version:","jwt-auth")),(0,t.__)("Knowing this helps me to understand if I need to focus more on WooCommerce compatibility.","jwt-auth")),(0,e.createElement)("li",null,(0,e.createElement)("strong",null,(0,t.__)("- Activated Plugins Count:","jwt-auth")),(0,t.__)("This helps to know the complexity of the WP installs.","jwt-auth"))),(0,e.createElement)("p",null,(0,t.__)("I promise that:","jwt-auth")),(0,e.createElement)("ol",null,(0,e.createElement)("li",null,(0,t.__)("I'll only collect the above information.","jwt-auth")),(0,e.createElement)("li",null,(0,t.__)("Your data will remain confidential and won't be shared with third parties.","jwt-auth")),(0,e.createElement)("li",null,(0,t.__)("No personal or site information is shared.","jwt-auth")),(0,e.createElement)("li",null,(0,t.__)("This feature will in no way affect your website's performance.","jwt-auth"))),(0,e.createElement)("p",null,(0,t.__)("By sharing this information, you're helping me make JWT Authentication for WP REST API even better for everyone.","jwt-auth")," "),(0,e.createElement)("p",null,(0,t.__)("Thank you for your trust and support!","jwt-auth")),(0,e.createElement)("p",null,"Enrique Chavez."),(0,e.createElement)("hr",null),n&&(0,e.createElement)("div",{className:"jwt-auth-toggle-holder"},(0,e.createElement)("div",{className:"jwt-auth-toggle-control"},(0,e.createElement)("span",null,n.share_data?(0,t.__)("You are currently sharing data.","jwt-auth"):(0,t.__)("You are not currently sharing data.","jwt-auth")),(0,e.createElement)(o.FormToggle,{checked:n.share_data,onChange:()=>(l({...n,share_data:!n.share_data}),void u("root","site"))})),(0,e.createElement)("span",{className:"jwt-auth-text-small"},(0,t.__)("Click the toggle button to change your preferences.","jwt-auth")))))))},i=()=>(0,e.createElement)("div",{className:"wrap"},(0,e.createElement)("h1",{className:"wp-heading-inline"},"JWT Authentication"),(0,e.createElement)("div",{className:"jwt-auth-settings"},(0,e.createElement)(u,null),(0,e.createElement)(l,null)));const s=document.getElementById("jwt-auth-holder");e.createRoot?(0,e.createRoot)(s).render((0,e.createElement)(i,null)):(0,e.render)((0,e.createElement)(i,null),s)}(); \ No newline at end of file diff --git a/admin/ui/package.json b/admin/ui/package.json deleted file mode 100644 index b25bfe4..0000000 --- a/admin/ui/package.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "name": "jwt-auth-admin-ui", - "version": "1.0.0", - "main": "build/index.js", - "license": "GPL-2.0-or-later", - "author": "Enrique Chavez", - "scripts": { - "build": "wp-scripts build", - "start": "wp-scripts start", - "format": "wp-scripts format", - "lint:js": "wp-scripts lint-js", - "lint:js:fix": "wp-scripts lint-js --fix", - "lint:css": "wp-scripts lint-css", - "lint:css:fix": "wp-scripts lint-css --fix", - "packages-update": "wp-scripts packages-update" - }, - "devDependencies": { - "@wordpress/scripts": "^26.12.0" - }, - "dependencies": { - "@wordpress/api-fetch": "^6.38.0", - "@wordpress/components": "^25.7.0", - "@wordpress/core-data": "^6.18.0", - "@wordpress/data": "^9.11.0", - "@wordpress/element": "^5.18.0", - "@wordpress/i18n": "^4.41.0" - } -} diff --git a/admin/ui/src/App.tsx b/admin/ui/src/App.tsx new file mode 100644 index 0000000..2f23ab6 --- /dev/null +++ b/admin/ui/src/App.tsx @@ -0,0 +1,9 @@ +import React from 'react' +import Dashboard from '@/components/Dashboard' +import '@/styles/globals.css' + +const App: React.FC = () => { + return +} + +export default App diff --git a/admin/ui/src/components/Dashboard.tsx b/admin/ui/src/components/Dashboard.tsx new file mode 100644 index 0000000..a7e9814 --- /dev/null +++ b/admin/ui/src/components/Dashboard.tsx @@ -0,0 +1,171 @@ +import { useState, useEffect } from 'react' +import { Topbar } from './dashboard/topbar' +import { SurveyPage } from './survey/SurveyPage' +import { AuthenticationStatusOverview } from './dashboard/authentication-status-overview' +import { ConfigurationHealthCheck } from './dashboard/configuration-health-check' +import { SystemEnvironment } from './dashboard/system-environment' +import { LiveApiExplorer } from './dashboard/live-api-explorer' +import { SetupConfiguration } from './dashboard/setup-configuration' +import { HelpImprove } from './dashboard/help-improve' +import { FloatingSurveyCTA } from './dashboard/floating-survey-cta' +import { wordpressAPI, type ConfigurationStatus } from '@/lib/wordpress-api' + +export default function Dashboard() { + const [shareData, setShareData] = useState(false) + const [configStatus, setConfigStatus] = useState(null) + const [isSurveyCtaVisible, setIsSurveyCtaVisible] = useState(false) + const [shouldShowSurveyCta, setShouldShowSurveyCta] = useState(false) + const [surveyCompleted, setSurveyCompleted] = useState(false) + const [isLoadingDismissal, setIsLoadingDismissal] = useState(false) + + // Initialize page based on URL hash or default to overview + const getInitialPage = (): 'overview' | 'survey' => { + const hash = window.location.hash.substring(1) + const params = new URLSearchParams(window.location.search) + + if (hash === 'survey' || params.get('page') === 'survey') { + return 'survey' + } + return 'overview' + } + + const [currentPage, setCurrentPage] = useState<'overview' | 'survey'>(getInitialPage) + + // Load settings from WordPress on mount + useEffect(() => { + let isCancelled = false + + async function loadData() { + try { + // Load all dashboard data in a single API call + const dashboardData = await wordpressAPI.getDashboardData() + + // Only update state if component is still mounted + if (!isCancelled) { + setShareData(dashboardData.settings.share_data ?? false) + setConfigStatus(dashboardData.jwtStatus) + setSurveyCompleted(dashboardData.surveyStatus.completed ?? false) + setShouldShowSurveyCta( + (dashboardData.surveyDismissal.shouldShow ?? false) && + !(dashboardData.surveyStatus.completed ?? false) + ) + } + } catch (error) { + if (!isCancelled) { + console.error('Failed to load dashboard data:', error) + } + } + } + + loadData() + + // Cleanup function to cancel the effect if component unmounts + return () => { + isCancelled = true + } + }, []) + + // Listen for hash changes to support back/forward navigation + useEffect(() => { + const handleHashChange = () => { + const hash = window.location.hash.substring(1) + if (hash === 'survey' && currentPage !== 'survey') { + setCurrentPage('survey') + } else if (hash === 'overview' && currentPage !== 'overview') { + setCurrentPage('overview') + } else if (!hash && currentPage !== 'overview') { + setCurrentPage('overview') + } + } + + window.addEventListener('hashchange', handleHashChange) + return () => window.removeEventListener('hashchange', handleHashChange) + }, [currentPage]) + + // Handle scroll to show/hide survey CTA at 50% scroll + useEffect(() => { + const handleScroll = () => { + const scrollTop = window.scrollY + const documentHeight = document.documentElement.scrollHeight - window.innerHeight + const scrollPercent = (scrollTop / documentHeight) * 100 + // Don't show if user shouldn't see it, already completed survey, or if on survey page + if (!shouldShowSurveyCta || surveyCompleted || currentPage === 'survey') return + + // Show/hide survey CTA based on scroll position + if (scrollPercent >= 50 && !isSurveyCtaVisible) { + setIsSurveyCtaVisible(true) + } else if (scrollPercent < 50 && isSurveyCtaVisible) { + setIsSurveyCtaVisible(false) + } + } + + window.addEventListener('scroll', handleScroll) + return () => window.removeEventListener('scroll', handleScroll) + }, [isSurveyCtaVisible, shouldShowSurveyCta, surveyCompleted, currentPage]) + + // Handle page navigation with URL updates + const handlePageChange = (page: 'overview' | 'survey') => { + setCurrentPage(page) + + // Update URL hash for deep linking + if (page === 'survey') { + window.history.pushState(null, '', '#survey') + } else { + window.history.pushState(null, '', '#overview') + } + } + + const renderPage = () => { + switch (currentPage) { + case 'survey': + return ( + handlePageChange('overview')} + surveyCompleted={surveyCompleted} + /> + ) + case 'overview': + default: { + const isJwtConfigured = configStatus?.configuration?.secret_key_configured ?? false + + return ( +
    + +
    + + {isJwtConfigured ? ( + + ) : ( + + )} +
    + {isJwtConfigured && } + +
    + ) + } + } + } + + return ( +
    + +
    + {renderPage()} +
    + { + setIsLoadingDismissal(true) + setIsSurveyCtaVisible(false) + const success = await wordpressAPI.updateSurveyDismissal() + if (success) { + setShouldShowSurveyCta(false) + } + setIsLoadingDismissal(false) + }} + onTakeSurvey={() => handlePageChange('survey')} + /> +
    + ) +} diff --git a/admin/ui/src/components/cta.js b/admin/ui/src/components/cta.js deleted file mode 100644 index 5be6226..0000000 --- a/admin/ui/src/components/cta.js +++ /dev/null @@ -1,50 +0,0 @@ -import {__} from '@wordpress/i18n'; -import Newsletter from './newsletter'; - -const CTA = () => { - return ( -
    -
    -

    {__(`Be the First to Join the Early Beta!`, 'jwt-auth')}

    -

    - {__( - `After numerous requests from users, I've decided to create a Pro version of this plugin, offering enhanced features and greater flexibility for developers.`, - 'jwt-auth' - )} -

    -

    - {__( - `Sign up now for the Early Beta of JWT Authentication Pro! As a beta participant, you'll not only gain early access to advanced features but also enjoy exclusive discounts when the Pro version officially launches.`, - 'jwt-auth' - )} -

    -

    - {__( - `By joining the Early Beta, you'll have the opportunity to test cutting-edge features and provide valuable feedback to help improve the Pro version.`, - 'jwt-auth' - )} -

    -

    - {__( - `Take advantage of this opportunity to influence the Pro version’s development and secure exclusive discounts—sign up now!`, - 'jwt-auth' - )} -

    - -
    -
    - -
    -
    - ); -}; - -export default CTA; diff --git a/admin/ui/src/components/dashboard/authentication-status-overview.tsx b/admin/ui/src/components/dashboard/authentication-status-overview.tsx new file mode 100644 index 0000000..f54413e --- /dev/null +++ b/admin/ui/src/components/dashboard/authentication-status-overview.tsx @@ -0,0 +1,9 @@ +export const AuthenticationStatusOverview = () => ( +
    +

    JWT Authentication for WP-API

    +

    + Enabling stateless authentication for your WordPress REST API with industry-standard JWT + tokens. +

    +
    +) diff --git a/admin/ui/src/components/dashboard/configuration-health-check.tsx b/admin/ui/src/components/dashboard/configuration-health-check.tsx new file mode 100644 index 0000000..0ee047f --- /dev/null +++ b/admin/ui/src/components/dashboard/configuration-health-check.tsx @@ -0,0 +1,89 @@ +import { CheckCircle, Loader2, X, AlertTriangle } from 'lucide-react' +import { InfoCard } from '@/components/ui/info-card' +import { StatusRow } from '@/components/ui/status-row' +import { Check } from '@/components/ui/check-icon' +import type { ConfigurationStatus } from '@/lib/wordpress-api' + +interface ConfigurationHealthCheckProps { + configStatus: ConfigurationStatus | null +} + +export const ConfigurationHealthCheck = ({ configStatus }: ConfigurationHealthCheckProps) => { + if (!configStatus) { + return ( + +
    + +
    +
    + ) + } + + const { configuration } = configStatus + const allConfigured = configuration.secret_key_configured + + return ( + + {allConfigured ? 'Ready' : 'Needs Attention'} + {allConfigured ? ( + + ) : ( + + )} +
    + } + > + + + {configuration.secret_key_configured ? 'Configured & Valid' : 'Not Configured'} + + {configuration.secret_key_configured ? ( + + ) : ( + + )} + + + {configuration.cors_enabled ? 'Enabled' : 'Disabled'} + {configuration.cors_enabled ? ( + + ) : ( + + )} + + + + {configuration.secret_key_configured ? 'Active' : 'Inactive'} + + {configuration.secret_key_configured ? ( + + ) : ( + + )} + + + RFC 7519 Compliant + {configuration.secret_key_configured ? ( + + ) : ( + + )} + + {configuration.secret_key_configured && ( + + + + )} + + ) +} diff --git a/admin/ui/src/components/dashboard/floating-survey-cta.tsx b/admin/ui/src/components/dashboard/floating-survey-cta.tsx new file mode 100644 index 0000000..cc6d4b5 --- /dev/null +++ b/admin/ui/src/components/dashboard/floating-survey-cta.tsx @@ -0,0 +1,63 @@ +import { useState, useEffect } from 'react' +import { X } from 'lucide-react' +import { Button } from '@/components/ui/button' +import { Card, CardContent } from '@/components/ui/card' + +interface FloatingSurveyCTAProps { + isVisible: boolean + onClose: () => void + onTakeSurvey: () => void +} + +export const FloatingSurveyCTA = ({ isVisible, onClose, onTakeSurvey }: FloatingSurveyCTAProps) => { + const [shouldRender, setShouldRender] = useState(false) + + useEffect(() => { + if (isVisible) { + setShouldRender(true) + } else { + // Delay unmounting to allow exit animation + const timer = setTimeout(() => setShouldRender(false), 500) + return () => clearTimeout(timer) + } + }, [isVisible]) + + if (!shouldRender) return null + + return ( +
    + + + + + Get 15% Off Pro! + +

    + Take our 2-min survey to help us improve and claim your discount. +

    + +
    +
    +
    + ) +} diff --git a/admin/ui/src/components/dashboard/help-improve.tsx b/admin/ui/src/components/dashboard/help-improve.tsx new file mode 100644 index 0000000..fc60575 --- /dev/null +++ b/admin/ui/src/components/dashboard/help-improve.tsx @@ -0,0 +1,39 @@ +import { Switch } from '@/components/ui/switch' +import { InfoCard } from '@/components/ui/info-card' +import { wordpressAPI } from '@/lib/wordpress-api' + +interface HelpImproveProps { + shareData: boolean + setShareData: (value: boolean) => void +} + +export const HelpImprove = ({ shareData, setShareData }: HelpImproveProps) => { + const handleToggle = async (checked: boolean) => { + try { + // Update the setting in WordPress + await wordpressAPI.updateSettings({ share_data: checked }) + // Update local state + setShareData(checked) + } catch (error) { + console.error('Failed to update sharing setting:', error) + // Could add toast notification here for better UX + } + } + + return ( + +
    +
    +

    + Enable Anonymous Sharing +

    +

    + Help me build better features for your setup. I only collect technical info (PHP/WP + versions, use case) to improve compatibility and prioritize development. +

    +
    + +
    +
    + ) +} diff --git a/admin/ui/src/components/dashboard/live-api-explorer.tsx b/admin/ui/src/components/dashboard/live-api-explorer.tsx new file mode 100644 index 0000000..e340384 --- /dev/null +++ b/admin/ui/src/components/dashboard/live-api-explorer.tsx @@ -0,0 +1,420 @@ +import { useState } from 'react' +import { CheckCircle, Loader2, Copy, Send, X } from 'lucide-react' +import { Button } from '@/components/ui/button' +import { Card, CardHeader, CardTitle, CardDescription, CardContent } from '@/components/ui/card' +import { Input } from '@/components/ui/input' +import { Label } from '@/components/ui/label' +import { Tabs, TabsContent, TabsList, TabsTrigger } from '@/components/ui/tabs' +import { + Select, + SelectContent, + SelectItem, + SelectTrigger, + SelectValue, +} from '@/components/ui/select' +import { Prism as SyntaxHighlighter } from 'react-syntax-highlighter' +import { oneDark } from 'react-syntax-highlighter/dist/esm/styles/prism' +import { CodeSnippetDisplay } from '@/components/ui/code-snippet-display' +import { getCodeSnippets } from '@/lib/api-code-snippets' + +interface ApiResponse { + error?: string + details?: Record + [key: string]: unknown +} + +export const LiveApiExplorer = () => { + const [endpoint, setEndpoint] = useState('/jwt-auth/v1/token') + const [username, setUsername] = useState('testuser') + const [password, setPassword] = useState('password') + const [token, setToken] = useState('your-jwt-token') + const [isLoading, setIsLoading] = useState(false) + const [responseCopied, setResponseCopied] = useState(false) + const [tokenAutoFilled, setTokenAutoFilled] = useState(false) + const [tokenResponse, setTokenResponse] = useState(null) + const [validateResponse, setValidateResponse] = useState(null) + + // Get WordPress site URL from config + const siteUrl = window.jwtAuthConfig?.siteUrl || 'https://yoursite.com/' + + const handleEndpointChange = (newEndpoint: string) => { + setEndpoint(newEndpoint) + // Clear token auto-fill notifications when switching endpoints + setTokenAutoFilled(false) + } + + // Get the current response based on selected endpoint + const getCurrentResponse = () => { + return endpoint === '/jwt-auth/v1/token' ? tokenResponse : validateResponse + } + + // Set the response for the current endpoint + const setCurrentResponse = (response: ApiResponse | null) => { + if (endpoint === '/jwt-auth/v1/token') { + setTokenResponse(response) + } else { + setValidateResponse(response) + } + } + + const handleSend = async () => { + setIsLoading(true) + setCurrentResponse(null) + + try { + const fullUrl = `${siteUrl}/wp-json${endpoint}` + + // Prepare request headers and body based on endpoint + const headers: Record = { + 'Content-Type': 'application/json', + } + let requestBody: object = {} + + if (endpoint === '/jwt-auth/v1/token') { + if (!username.trim() || !password.trim()) { + setCurrentResponse({ + error: 'Username and password are required for token generation', + }) + setIsLoading(false) + return + } + requestBody = { + username: username.trim(), + password: password.trim(), + } + } else if (endpoint === '/jwt-auth/v1/token/validate') { + if (!token.trim()) { + setCurrentResponse({ + error: 'Token is required for validation', + }) + setIsLoading(false) + return + } + // For validation endpoint, send token in Authorization header + headers['Authorization'] = `Bearer ${token.trim()}` + requestBody = {} + } + + // Make the actual API request + const response = await fetch(fullUrl, { + method: 'POST', + headers, + body: JSON.stringify(requestBody), + }) + + // Handle response + if (response.ok) { + const data = await response.json() + setCurrentResponse(data) + + // Auto-fill token for validation if this was a successful token request + if (endpoint === '/jwt-auth/v1/token' && data.token) { + setToken(data.token) + setTokenAutoFilled(true) + // Hide the notice after 5 seconds + setTimeout(() => setTokenAutoFilled(false), 5000) + } + } else { + // Try to get error message from response + try { + const errorData = await response.json() + setCurrentResponse({ + error: `HTTP ${response.status}: ${errorData.message || response.statusText}`, + details: errorData, + }) + } catch { + setCurrentResponse({ + error: `HTTP ${response.status}: ${response.statusText}`, + }) + } + } + } catch (error) { + setCurrentResponse({ + error: `Network error: ${error instanceof Error ? error.message : 'Unknown error'}`, + }) + } finally { + setIsLoading(false) + } + } + + const snippets = getCodeSnippets(endpoint, siteUrl, username, password, token) + + return ( + + + + Live API Explorer + + + Test your JWT endpoints in real-time and get instant code snippets. + + + +
    +
    + +
    +
    + {endpoint} +
    + +
    + +
    +
    +
    +

    + Server +

    +
    + + +
    +
    + +
    +

    + Request Body +

    +
    + {endpoint === '/jwt-auth/v1/token' ? ( + <> +
    + + setUsername(e.target.value)} + /> +
    +
    + + setPassword(e.target.value)} + /> +
    + + ) : ( +
    + + {tokenAutoFilled && ( +
    +
    +
    + +
    +
    +

    + Token Auto-filled: The JWT + token from your successful request has been automatically added below. +

    +
    +
    +
    + )} + { + setToken(e.target.value) + setTokenAutoFilled(false) // Hide notice when user manually edits + }} + /> +
    + )} +
    +
    +
    + +
    + + + cURL + PHP + JavaScript + Python + + + + + + + + + + + + + + + +
    +

    + Response +

    + {/* Loading State */} + {isLoading && ( +
    +
    +
    + +
    +
    +

    Sending request...

    +
    +
    +
    + )} + {/* Success/Error Alert */} + {getCurrentResponse() && ( +
    + {getCurrentResponse()?.error ? ( +
    +
    +
    + +
    +
    +

    + Request Failed:{' '} + {String(getCurrentResponse()?.error)} +

    +
    +
    +
    + ) : ( +
    +
    +
    + +
    +
    +

    + Request Successful: The API + request completed successfully + {endpoint === '/jwt-auth/v1/token' && + ' and the token is ready to be used on the validate endpoint'} + . +

    +
    +
    +
    + )} +
    + )} + {/* Response Content Box */} + {getCurrentResponse() && ( +
    +
    + + Response Body + +
    +
    +
    + + {JSON.stringify(getCurrentResponse(), null, 2)} + +
    + +
    +
    + )} + {/* Empty State */} + {!isLoading && !getCurrentResponse() && ( +
    +
    + +
    +

    + Ready to test your API +

    +

    + Click the "Send" button above to make a request +

    +
    + )} +
    +
    +
    +
    +
    + ) +} diff --git a/admin/ui/src/components/dashboard/setup-configuration.tsx b/admin/ui/src/components/dashboard/setup-configuration.tsx new file mode 100644 index 0000000..f6cac13 --- /dev/null +++ b/admin/ui/src/components/dashboard/setup-configuration.tsx @@ -0,0 +1,145 @@ +import { useState, useMemo, useCallback } from 'react' +import { Copy, RefreshCw, Key, AlertTriangle, CheckCircle } from 'lucide-react' +import { InfoCard } from '@/components/ui/info-card' +import { Button } from '@/components/ui/button' +import { Badge } from '@/components/ui/badge' +import { Switch } from '@/components/ui/switch' +import { Label } from '@/components/ui/label' +import { Prism as SyntaxHighlighter } from 'react-syntax-highlighter' +import { oneDark } from 'react-syntax-highlighter/dist/esm/styles/prism' + +const CONFIG = { + KEY_LENGTH: 64, + COPY_FEEDBACK_DURATION: 2000, + GENERATION_DELAY: 800, + CHAR_SET: + 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()-_=+[]{}|;:,.<>?', +} as const + +// Generate a secure random key similar to WordPress salt generator +const generateSecureKey = (): string => { + let result = '' + const array = new Uint8Array(CONFIG.KEY_LENGTH) + window.crypto.getRandomValues(array) + + for (let i = 0; i < CONFIG.KEY_LENGTH; i++) { + result += CONFIG.CHAR_SET[array[i] % CONFIG.CHAR_SET.length] + } + + return result +} + +export const SetupConfiguration = () => { + const [generatedKey, setGeneratedKey] = useState(() => generateSecureKey()) + const [isGenerating, setIsGenerating] = useState(false) + const [corsEnabled, setCorsEnabled] = useState(false) + const [copySuccess, setCopySuccess] = useState(false) + + const handleGenerateKey = useCallback(async () => { + setIsGenerating(true) + await new Promise(resolve => setTimeout(resolve, CONFIG.GENERATION_DELAY)) + const newKey = generateSecureKey() + setGeneratedKey(newKey) + setIsGenerating(false) + }, []) + + const handleCopy = useCallback(async (text: string, _type: string) => { + try { + await navigator.clipboard.writeText(text) + setCopySuccess(true) + setTimeout(() => setCopySuccess(false), CONFIG.COPY_FEEDBACK_DURATION) + } catch (err) { + console.error('Failed to copy:', err) + } + }, []) + + const fullConfig = useMemo(() => { + return corsEnabled + ? `\ndefine('JWT_AUTH_SECRET_KEY', '${generatedKey}');\ndefine('JWT_AUTH_CORS_ENABLE', true);` + : `\ndefine('JWT_AUTH_SECRET_KEY', '${generatedKey}');` + }, [generatedKey, corsEnabled]) + + return ( + + + Setup Required + + } + > +
    + {/* Configuration Section */} +
    +
    + + + {fullConfig} + +
    + +
    +
    + + +
    + +
    + +
    +
    + +
    + Important: Copy this configuration and add it to your wp-config.php + file. Keep it secure and never share it publicly. +
    +
    +
    +
    + +
    +
    +
    + ) +} diff --git a/admin/ui/src/components/dashboard/system-environment.tsx b/admin/ui/src/components/dashboard/system-environment.tsx new file mode 100644 index 0000000..fa83e3a --- /dev/null +++ b/admin/ui/src/components/dashboard/system-environment.tsx @@ -0,0 +1,58 @@ +import { Loader2, X } from 'lucide-react' +import { InfoCard } from '@/components/ui/info-card' +import { StatusRow } from '@/components/ui/status-row' +import { Check } from '@/components/ui/check-icon' +import type { ConfigurationStatus } from '@/lib/wordpress-api' + +interface SystemEnvironmentProps { + configStatus: ConfigurationStatus | null +} + +export const SystemEnvironment = ({ configStatus }: SystemEnvironmentProps) => { + if (!configStatus) { + return ( + +
    + +
    +
    + ) + } + + const { system } = configStatus + const allCompatible = system.php_compatible + + return ( + + + + {system.php_version} {system.pro_compatible ? '(Pro Compatible)' : '(Update Recommended)'} + + {system.php_compatible ? : } + + + {system.wordpress_version} (Supported) + + + + {system.php_memory_limit} (Sufficient) + + + + {system.mysql_version} + + + + {system.post_max_size} + + + + ) +} diff --git a/admin/ui/src/components/dashboard/topbar.tsx b/admin/ui/src/components/dashboard/topbar.tsx new file mode 100644 index 0000000..22faed4 --- /dev/null +++ b/admin/ui/src/components/dashboard/topbar.tsx @@ -0,0 +1,49 @@ +import { Button } from '@/components/ui/button' +import { Rocket, BarChart3 } from 'lucide-react' + +interface TopbarProps { + currentPage: 'overview' | 'survey' + onPageChange: (page: 'overview' | 'survey') => void +} + +export const Topbar = ({ currentPage, onPageChange }: TopbarProps) => { + const proUrl = `https://jwtauth.pro?utm_source=wp-admin&utm_medium=topbar&utm_campaign=upgrade` + + return ( +
    +
    +
    +
    +
    + +

    JWT Auth

    +
    + + {/* Navigation */} + +
    + + +
    +
    +
    + ) +} diff --git a/admin/ui/src/components/main-view.js b/admin/ui/src/components/main-view.js deleted file mode 100644 index 65abfaa..0000000 --- a/admin/ui/src/components/main-view.js +++ /dev/null @@ -1,162 +0,0 @@ -import { useEntityProp } from '@wordpress/core-data'; -import { useDispatch } from '@wordpress/data'; -import { FormToggle } from '@wordpress/components'; -import { __ } from '@wordpress/i18n'; - -const MainView = () => { - // Get the plugin settings - const [ settings, setSettings ] = useEntityProp( - 'root', - 'site', - 'jwt_auth_options' - ); - // Get the save edited entity record function - const { saveEditedEntityRecord } = useDispatch( 'core' ); - - // Handle the save settings action - const saveSettings = () => { - // Update the settings values - setSettings( { - ...settings, - share_data: ! settings.share_data, - } ); - - // Save the settings - saveEditedEntityRecord( 'root', 'site' ); - }; - - return ( -
    -
    -
    -
    -

    - { __( - 'Help Me improve JWT Authentication for WP REST API!', - 'jwt-auth' - ) } -

    -

    - { __( - `Hello there! I'm always working to make the JWT Authentication for WP REST API plugin better for you. To do this, I'd like to understand the environment where the plugin is used. Could you share the following information with me?`, - 'jwt-auth' - ) } -

    -
      -
    • - { __( `- PHP Version:` ) } - { __( - `This helps me ensure compatibility and decide when it's time to phase out older versions.`, - 'jwt-auth' - ) } -
    • -
    • - - { __( `- WordPress Version:`, 'jwt-auth' ) }{ ' ' } - - { __( - `Knowing this helps me optimize the plugin for the most common WordPress setups.`, - 'jwt-auth' - ) } -
    • -
    • - - { __( - `- WooCommerce Version:`, - 'jwt-auth' - ) } - - { __( - `Knowing this helps me to understand if I need to focus more on WooCommerce compatibility.`, - 'jwt-auth' - ) } -
    • -
    • - - { __( - `- Activated Plugins Count:`, - 'jwt-auth' - ) } - - { __( - `This helps to know the complexity of the WP installs.`, - 'jwt-auth' - ) } -
    • -
    -

    { __( `I promise that:`, 'jwt-auth' ) }

    -
      -
    1. - { __( - `I'll only collect the above information.`, - 'jwt-auth' - ) } -
    2. -
    3. - { __( - `Your data will remain confidential and won't be shared with third parties.`, - 'jwt-auth' - ) } -
    4. -
    5. - { __( - `No personal or site information is shared.`, - 'jwt-auth' - ) } -
    6. -
    7. - { __( - `This feature will in no way affect your website's performance.`, - 'jwt-auth' - ) } -
    8. -
    -

    - { __( - `By sharing this information, you're helping me make JWT Authentication for WP REST API even better for everyone.`, - 'jwt-auth' - ) }{ ' ' } -

    -

    - { __( - `Thank you for your trust and support!`, - 'jwt-auth' - ) } -

    -

    Enrique Chavez.

    -
    - { settings && ( -
    -
    - - { settings.share_data - ? __( - `You are currently sharing data.`, - 'jwt-auth' - ) - : __( - `You are not currently sharing data.`, - 'jwt-auth' - ) } - - saveSettings() } - /> -
    - - { __( - `Click the toggle button to change your preferences.`, - 'jwt-auth' - ) } - -
    - ) } -
    -
    -
    -
    - ); -}; - -export default MainView; diff --git a/admin/ui/src/components/newsletter.js b/admin/ui/src/components/newsletter.js deleted file mode 100644 index 97c11fe..0000000 --- a/admin/ui/src/components/newsletter.js +++ /dev/null @@ -1,86 +0,0 @@ -import { useSelect } from '@wordpress/data'; -import { __ } from '@wordpress/i18n'; -import { useEffect, useState } from '@wordpress/element'; - -const Newsletter = () => { - // Get the site admin email using the core data API - const { email } = useSelect( - ( select ) => select( 'core' ).getEntityRecord( 'root', 'site' ) ?? {}, - [] - ); - // Set the initial states - const [ subscribedEmail, setSubscribedEmail ] = useState( '' ); - const [ subscribed, setSubscribed ] = useState( false ); - const [ loading, setLoading ] = useState( false ); - - // Update the subscribed email state when the email changes - useEffect( () => { - setSubscribedEmail( email ); - }, [ email ] ); - - // Handle the subscribe form - const handleSubscribeForm = async ( e ) => { - e.preventDefault(); - setLoading( true ); - const apiUrl = 'https://track.wpjwt.com/api/subscribe'; - const response = await fetch( apiUrl, { - method: 'POST', - headers: { - 'Content-Type': 'application/json', - }, - body: JSON.stringify( { - email: subscribedEmail, - } ), - } ); - - // If the response is ok, set the subscribed state to true - if ( response.ok ) { - setSubscribed( true ); - } - - // Set the loading state to false after the request is done - setLoading( false ); - }; - - return ( -
    -

    { __( `Newsletter`, 'jwt-auth' ) }

    -

    - { __( - `Sign up for our newsletter to get the latest news and updates!`, - 'jwt-auth' - ) } -

    -
    - { - setSubscribedEmail( e.target.value ); - } } - /> - - { subscribed } - { subscribed && ( - - { __( `Thank you for subscribing`, 'jwt-auth' ) } 🤘 - - ) } -
    -
    - ); -}; - -export default Newsletter; diff --git a/admin/ui/src/components/settings-screen.js b/admin/ui/src/components/settings-screen.js deleted file mode 100644 index fc59158..0000000 --- a/admin/ui/src/components/settings-screen.js +++ /dev/null @@ -1,16 +0,0 @@ -import CTA from './cta'; -import MainView from './main-view'; - -const SettingsScreen = () => { - return ( -
    -

    JWT Authentication

    -
    - - -
    -
    - ); -}; - -export default SettingsScreen; diff --git a/admin/ui/src/components/survey/ConsentFlow.tsx b/admin/ui/src/components/survey/ConsentFlow.tsx new file mode 100644 index 0000000..dd9ccca --- /dev/null +++ b/admin/ui/src/components/survey/ConsentFlow.tsx @@ -0,0 +1,84 @@ +import { useState } from 'react' +import { Card } from '@/components/ui/card' +import { Button } from '@/components/ui/button' +import { Label } from '@/components/ui/label' +import { Shield, Lock, ExternalLink } from 'lucide-react' + +interface ConsentFlowProps { + onAccept: () => void +} + +export const ConsentFlow = ({ onAccept }: ConsentFlowProps) => { + const [consentGiven, setConsentGiven] = useState(false) + + return ( + +
    +
    +
    + +
    +

    + Help Us Improve JWT Authentication +

    +

    + Your feedback helps us build features that matter. This quick survey takes 2 minutes and + you'll get 15% off any JWT Auth PRO subscription. +

    +
    + +
    +
    + +
    +

    Data Collection Notice

    +

    + Your survey responses will be sent to our secure server to help improve the plugin. +

    +

    + No personal information is required, and email sharing is completely optional. +

    +
    +
    +
    + +
    +
    + setConsentGiven(e.target.checked)} + className="jwt-h-4 jwt-w-4 jwt-text-blue-600 jwt-focus:ring-blue-500 jwt-border-gray-300 jwt-rounded jwt-flex-shrink-0" + /> + +
    + +

    + By participating, you agree to our{' '} + + Privacy Policy + +

    +
    + +
    + +
    +
    +
    + ) +} diff --git a/admin/ui/src/components/survey/SuccessFlow.tsx b/admin/ui/src/components/survey/SuccessFlow.tsx new file mode 100644 index 0000000..b7d1a01 --- /dev/null +++ b/admin/ui/src/components/survey/SuccessFlow.tsx @@ -0,0 +1,103 @@ +import { Card } from '@/components/ui/card' +import { Button } from '@/components/ui/button' +import { CheckCircle, ExternalLink } from 'lucide-react' + +interface SuccessFlowProps { + discountCode: string + hasEmail: boolean + onReset: () => void +} + +export const SuccessFlow = ({ discountCode, hasEmail, onReset }: SuccessFlowProps) => { + const proUrl = `https://jwtauth.pro?utm_source=wp-admin&utm_medium=survey&utm_campaign=upgrade&utm_content=discount-${discountCode}` + + return ( + +
    +
    +
    + +
    +

    + Thank You for Your Feedback! +

    +

    + Your responses help us build better features.{' '} + {hasEmail + ? 'Check your email for your 15% discount code for JWT Auth PRO.' + : 'Consider sharing your email next time to receive 15% off JWT Auth PRO.'} +

    +
    + + {/* Discount Code Section - Only show if user provided email */} + {hasEmail && ( +
    +
    +
    +

    + Your 15% discount code for JWT Auth PRO has been sent +

    +

    + Valid on any JWT Auth PRO subscription plan - check your inbox (and spam folder) +

    +
    + +
    +
    + )} + + {/* Pro Features Highlight */} +
    +

    + What You Get with JWT Auth Pro: +

    +
    +
    +
    + Token refresh capability +
    +
    +
    + Active token tracking +
    +
    +
    + + Multiple algorithms (RS256, ES256) + +
    +
    +
    + Usage analytics +
    +
    +
    + Priority support +
    +
    +
    + Advanced security features +
    +
    +
    + + {/* Action Buttons */} +
    + +
    +
    +
    + ) +} diff --git a/admin/ui/src/components/survey/SurveyForm.tsx b/admin/ui/src/components/survey/SurveyForm.tsx new file mode 100644 index 0000000..fddad37 --- /dev/null +++ b/admin/ui/src/components/survey/SurveyForm.tsx @@ -0,0 +1,464 @@ +import { useState } from 'react' +import { Button } from '@/components/ui/button' +import { Card } from '@/components/ui/card' +import { Label } from '@/components/ui/label' +import { Input } from '@/components/ui/input' +import { Textarea } from '@/components/ui/textarea' +import { ArrowLeft, ArrowRight, Loader2 } from 'lucide-react' +import { wordpressAPI } from '@/lib/wordpress-api' +import type { SurveyData } from './SurveyPage' + +interface SurveyFormProps { + initialData: SurveyData + onSubmit: (data: SurveyData) => void + onBack: () => void +} + +export const SurveyForm = ({ initialData, onSubmit, onBack }: SurveyFormProps) => { + const [formData, setFormData] = useState(initialData) + const [errors, setErrors] = useState>({}) + const [isSubmitting, setIsSubmitting] = useState(false) + const [currentStep, setCurrentStep] = useState(1) + + const totalSteps = 5 + + const validateCurrentStep = () => { + const newErrors: Record = {} + + switch (currentStep) { + case 1: + if (!formData.useCase) { + newErrors.useCase = 'Please select a use case' + } + if (formData.useCase === 'other' && !formData.useCaseOther) { + newErrors.useCaseOther = 'Please specify your use case' + } + break + case 2: + if (!formData.projectTimeline) { + newErrors.projectTimeline = 'Please select a project timeline' + } + break + case 3: + if (!formData.primaryChallenge) { + newErrors.primaryChallenge = 'Please select your primary challenge' + } + if (formData.primaryChallenge === 'other' && !formData.primaryChallengeOther) { + newErrors.primaryChallengeOther = 'Please specify your challenge' + } + break + case 4: + if (!formData.purchaseInterest) { + newErrors.purchaseInterest = 'Please select your interest level' + } + break + case 5: + // Email is optional, no validation needed + break + } + + setErrors(newErrors) + return Object.keys(newErrors).length === 0 + } + + const handleNext = () => { + if (validateCurrentStep()) { + if (currentStep < totalSteps) { + setCurrentStep(currentStep + 1) + setErrors({}) + } else { + handleSubmit() + } + } + } + + const handlePrevious = () => { + if (currentStep > 1) { + setCurrentStep(currentStep - 1) + setErrors({}) + } else { + onBack() + } + } + + const handleSubmit = async () => { + setIsSubmitting(true) + + try { + const result = await wordpressAPI.submitSurvey(formData) + + if (result.success) { + await wordpressAPI.markSurveyCompleted() + onSubmit(formData) + } else { + setErrors({ submit: result.message || 'Failed to submit survey' }) + } + } catch (error) { + console.error('Survey submission error:', error) + onSubmit(formData) + } finally { + setIsSubmitting(false) + } + } + + const handleInputChange = (field: keyof SurveyData, value: string | boolean) => { + setFormData(prev => ({ ...prev, [field]: value })) + if (errors[field]) { + setErrors(prev => ({ ...prev, [field]: '' })) + } + } + + const useCaseOptions = [ + { value: 'mobile-app', label: 'Mobile app backend (iOS/Android)' }, + { value: 'headless-wp', label: 'Headless WordPress (React/Vue/Next.js)' }, + { value: 'woocommerce', label: 'WooCommerce API integration' }, + { value: 'custom-dashboard', label: 'Custom dashboard/portal' }, + { value: 'testing', label: 'Still testing/exploring' }, + { value: 'other', label: 'Other' }, + ] + + const timelineOptions = [ + { value: 'live', label: "It's already live" }, + { value: 'this-month', label: 'Launching this month' }, + { value: 'next-months', label: 'Next 2-3 months' }, + { value: 'experimenting', label: 'Just experimenting' }, + ] + + const challengeOptions = [ + { value: 'token-tracking', label: "Can't track active tokens/users" }, + { value: 'token-refresh', label: 'Need token refresh capability' }, + { value: 'token-revocation', label: 'Need token revocation system' }, + { value: 'token-analytics', label: 'Need token traceability and history' }, + { value: 'no-issues', label: 'No issues - it works fine' }, + { value: 'other', label: 'Other' }, + ] + + const purchaseOptions = [ + { value: 'very-interested', label: 'Very interested - tell me more' }, + { value: 'interested-specific', label: 'Interested if it solves my specific need' }, + { value: 'maybe-later', label: 'Maybe later when project is further along' }, + { value: 'happy-free', label: 'Happy with free version' }, + ] + + const renderStep = () => { + switch (currentStep) { + case 1: + return renderUseCase() + case 2: + return renderTimeline() + case 3: + return renderChallenge() + case 4: + return renderPurchaseInterest() + case 5: + return renderEmailCollection() + default: + return null + } + } + + const renderUseCase = () => ( + +
    +
    +

    + What are you building with JWT Authentication? +

    +

    Help us understand your primary use case

    +
    +
    + {useCaseOptions.map(option => ( + + ))} + {formData.useCase === 'other' && ( +
    +