From cb8f57a7eaa4b05405f9cce2cc2fbf166201058c Mon Sep 17 00:00:00 2001
From: Alexia Soare <108459992+Alexia-Soare@users.noreply.github.com>
Date: Thu, 16 Jul 2026 16:55:04 +0300
Subject: [PATCH 01/22] fix: preserve selected page status and template across
maintenance mode lifecycle
Selecting an existing published page as the maintenance page no longer
leaves it private (404 for visitors) after maintenance mode is disabled
or the plugin is deactivated.
The page's original status and template are now recorded in post meta
when the page is selected (or on first enable, for pages selected before
this fix) and restored when maintenance mode is disabled and on plugin
deactivation. Pages with no recorded state are left untouched instead of
being forced private.
Fixes #523
Co-Authored-By: Claude Fable 5
---
.../classes/wp-maintenance-mode-admin.php | 22 +++-
includes/classes/wp-maintenance-mode.php | 36 +++--
includes/functions/helpers.php | 49 +++++++
tests/page-state-test.php | 123 ++++++++++++++++++
4 files changed, 209 insertions(+), 21 deletions(-)
create mode 100644 tests/page-state-test.php
diff --git a/includes/classes/wp-maintenance-mode-admin.php b/includes/classes/wp-maintenance-mode-admin.php
index 1f36a03..3456c3c 100644
--- a/includes/classes/wp-maintenance-mode-admin.php
+++ b/includes/classes/wp-maintenance-mode-admin.php
@@ -686,13 +686,21 @@ public function select_page() {
die( esc_html__( 'Security check.', 'wp-maintenance-mode' ) );
}
- $this->plugin_settings['design']['page_id'] = $_POST['page_id'];
- wp_update_post(
- array(
- 'ID' => $this->plugin_settings['design']['page_id'],
- 'page_template' => 'templates/wpmm-page-template.php',
- )
- );
+ $page_id = isset( $_POST['page_id'] ) ? absint( $_POST['page_id'] ) : 0;
+
+ $this->plugin_settings['design']['page_id'] = $page_id;
+
+ if ( $page_id ) {
+ // remember the page's original state before taking it over as a maintenance page
+ wpmm_record_page_state( $page_id );
+
+ wp_update_post(
+ array(
+ 'ID' => $page_id,
+ 'page_template' => 'templates/wpmm-page-template.php',
+ )
+ );
+ }
update_option( 'wpmm_settings', $this->plugin_settings );
diff --git a/includes/classes/wp-maintenance-mode.php b/includes/classes/wp-maintenance-mode.php
index 8933e46..ce6812a 100644
--- a/includes/classes/wp-maintenance-mode.php
+++ b/includes/classes/wp-maintenance-mode.php
@@ -97,12 +97,21 @@ private function __construct() {
add_action( 'wp_ajax_wpmm_send_contact', array( $this, 'send_contact' ) );
add_action( 'otter_form_after_submit', array( $this, 'otter_add_subscriber' ) );
- if ( isset( $this->plugin_settings['design']['page_id'] ) && get_option( 'wpmm_new_look' ) && get_post_status( $this->plugin_settings['design']['page_id'] ) === 'private' ) {
- add_filter( 'wpo_purge_all_cache_on_update', '__return_true' );
- if ( function_exists( 'wp_functionality_constants' ) ) {
- wp_functionality_constants();
+ if ( isset( $this->plugin_settings['design']['page_id'] ) && get_option( 'wpmm_new_look' ) ) {
+ // remember the page's original state so it can be restored when maintenance mode is disabled
+ wpmm_record_page_state( (int) $this->plugin_settings['design']['page_id'], false );
+
+ if ( get_post_meta( $this->plugin_settings['design']['page_id'], '_wp_page_template', true ) !== 'templates/wpmm-page-template.php' ) {
+ update_post_meta( $this->plugin_settings['design']['page_id'], '_wp_page_template', 'templates/wpmm-page-template.php' );
+ }
+
+ if ( get_post_status( $this->plugin_settings['design']['page_id'] ) === 'private' ) {
+ add_filter( 'wpo_purge_all_cache_on_update', '__return_true' );
+ if ( function_exists( 'wp_functionality_constants' ) ) {
+ wp_functionality_constants();
+ }
+ wp_publish_post( $this->plugin_settings['design']['page_id'] );
}
- wp_publish_post( $this->plugin_settings['design']['page_id'] );
}
update_option( 'show_on_front', 'page' );
@@ -141,21 +150,14 @@ function ( $value ) {
add_action( 'wpmm_before_scripts', array( $this, 'add_bot_extras' ) );
add_action( 'wpmm_footer', array( $this, 'add_js_files' ) );
} else {
- // make maintenance page private when maintenance mode is disabled
+ // restore the maintenance page to its original state when maintenance mode is disabled
add_action(
'init',
function() {
if ( ! isset( $this->plugin_settings['design']['page_id'] ) ) {
return;
}
- if ( get_post_status( $this->plugin_settings['design']['page_id'] ) === 'publish' ) {
- wp_update_post(
- array(
- 'ID' => $this->plugin_settings['design']['page_id'],
- 'post_status' => 'private',
- )
- );
- }
+ wpmm_restore_page_state( (int) $this->plugin_settings['design']['page_id'] );
}
);
}
@@ -671,6 +673,12 @@ public static function single_activate( $network_wide = false ) {
* @since 2.0.0
*/
public static function single_deactivate() {
+ // give the selected page back to the site in its original state
+ $settings = get_option( 'wpmm_settings' );
+ if ( ! empty( $settings['design']['page_id'] ) ) {
+ wpmm_restore_page_state( (int) $settings['design']['page_id'] );
+ }
+
wpmm_delete_cache();
}
diff --git a/includes/functions/helpers.php b/includes/functions/helpers.php
index 40a2dbc..0695e8a 100644
--- a/includes/functions/helpers.php
+++ b/includes/functions/helpers.php
@@ -513,6 +513,55 @@ function sanitize_hex_color( $color ) {
}
}
+/**
+ * Record the current state of the selected maintenance page so it can be
+ * restored when maintenance mode is disabled or the plugin is deactivated.
+ *
+ * @since 2.6.23
+ * @param int $page_id page ID
+ * @param bool $overwrite whether to overwrite a previously recorded state
+ */
+function wpmm_record_page_state( $page_id, $overwrite = true ) {
+ if ( ! $overwrite && get_post_meta( $page_id, '_wpmm_original_status', true ) ) {
+ return;
+ }
+
+ update_post_meta( $page_id, '_wpmm_original_status', get_post_status( $page_id ) );
+ update_post_meta( $page_id, '_wpmm_original_template', get_post_meta( $page_id, '_wp_page_template', true ) );
+}
+
+/**
+ * Restore the selected maintenance page to its recorded original state.
+ * Pages without a recorded state are left untouched.
+ *
+ * @since 2.6.23
+ * @param int $page_id page ID
+ */
+function wpmm_restore_page_state( $page_id ) {
+ $original_status = get_post_meta( $page_id, '_wpmm_original_status', true );
+
+ if ( empty( $original_status ) || ! get_post( $page_id ) ) {
+ return;
+ }
+
+ if ( get_post_status( $page_id ) !== $original_status ) {
+ wp_update_post(
+ array(
+ 'ID' => $page_id,
+ 'post_status' => $original_status,
+ )
+ );
+ }
+
+ $original_template = get_post_meta( $page_id, '_wpmm_original_template', true );
+
+ if ( empty( $original_template ) ) {
+ delete_post_meta( $page_id, '_wp_page_template' );
+ } else {
+ update_post_meta( $page_id, '_wp_page_template', $original_template );
+ }
+}
+
/**
* Get option page URL.
*/
diff --git a/tests/page-state-test.php b/tests/page-state-test.php
new file mode 100644
index 0000000..eaa00a6
--- /dev/null
+++ b/tests/page-state-test.php
@@ -0,0 +1,123 @@
+setAccessible( true );
+ $instance->setValue( null, null );
+
+ return WP_Maintenance_Mode::get_instance();
+ }
+
+ /**
+ * Minimal settings array for the code paths under test.
+ *
+ * @param int $status Maintenance mode status (0/1).
+ * @param int $page_id Selected page ID.
+ * @return array
+ */
+ private function make_settings( $status, $page_id ) {
+ $settings = WP_Maintenance_Mode::get_instance()->default_settings();
+
+ $settings['general']['status'] = $status;
+ $settings['design']['page_id'] = $page_id;
+
+ return $settings;
+ }
+
+ public function test_disabled_mode_leaves_selected_published_page_public() {
+ $page_id = self::factory()->post->create(
+ array(
+ 'post_type' => 'page',
+ 'post_status' => 'publish',
+ )
+ );
+
+ $this->boot_plugin( $this->make_settings( 0, $page_id ) );
+ do_action( 'init' );
+
+ $this->assertSame( 'publish', get_post_status( $page_id ) );
+ }
+
+ public function test_enable_then_disable_returns_private_page_to_private() {
+ $page_id = self::factory()->post->create(
+ array(
+ 'post_type' => 'page',
+ 'post_status' => 'private',
+ )
+ );
+
+ // Enabling maintenance mode publishes the private page so it can be served.
+ $this->boot_plugin( $this->make_settings( 1, $page_id ) );
+ $this->assertSame( 'publish', get_post_status( $page_id ) );
+
+ // Disabling it puts the page back to private, not just any page to private.
+ $this->boot_plugin( $this->make_settings( 0, $page_id ) );
+ do_action( 'init' );
+ $this->assertSame( 'private', get_post_status( $page_id ) );
+ }
+
+ public function test_user_page_template_is_restored_on_disable_and_reapplied_on_enable() {
+ $page_id = self::factory()->post->create(
+ array(
+ 'post_type' => 'page',
+ 'post_status' => 'publish',
+ )
+ );
+ update_post_meta( $page_id, '_wp_page_template', 'custom-template.php' );
+
+ // What select_page() does when the user picks an existing page.
+ wpmm_record_page_state( $page_id );
+ update_post_meta( $page_id, '_wp_page_template', 'templates/wpmm-page-template.php' );
+
+ // Disabling maintenance mode restores the page's own template and status.
+ $this->boot_plugin( $this->make_settings( 0, $page_id ) );
+ do_action( 'init' );
+ $this->assertSame( 'custom-template.php', get_post_meta( $page_id, '_wp_page_template', true ) );
+ $this->assertSame( 'publish', get_post_status( $page_id ) );
+
+ // Re-enabling applies the maintenance template again.
+ $this->boot_plugin( $this->make_settings( 1, $page_id ) );
+ $this->assertSame( 'templates/wpmm-page-template.php', get_post_meta( $page_id, '_wp_page_template', true ) );
+ }
+
+ public function test_plugin_deactivation_restores_selected_page() {
+ $page_id = self::factory()->post->create(
+ array(
+ 'post_type' => 'page',
+ 'post_status' => 'publish',
+ )
+ );
+
+ update_option( 'wpmm_settings', $this->make_settings( 0, $page_id ) );
+ wpmm_record_page_state( $page_id );
+
+ // Simulate the state a broken site is in: selected page left private.
+ wp_update_post(
+ array(
+ 'ID' => $page_id,
+ 'post_status' => 'private',
+ )
+ );
+
+ WP_Maintenance_Mode::single_deactivate();
+
+ $this->assertSame( 'publish', get_post_status( $page_id ) );
+ }
+}
From 2c25e1a6a0b324e074831ac021c106659f4001d4 Mon Sep 17 00:00:00 2001
From: Alexia Soare <108459992+Alexia-Soare@users.noreply.github.com>
Date: Fri, 17 Jul 2026 09:36:30 +0300
Subject: [PATCH 02/22] fix: never overwrite user-owned pages when applying a
maintenance template
Applying a gallery template while an existing site page was selected
overwrote that page's content and forced it private. Templates are now
written only to pages the plugin created (marked with _wpmm_generated);
when a user-owned page is selected, it is handed back in its original
state and the template lands on a newly created maintenance page.
Recording a page's original state is now first-write-wins and the record
is cleared on restore, so re-selecting a page the plugin already modified
can no longer poison the saved original state.
Also guards the Otter CSS_Handler call, which fataled on sites without
Otter Blocks.
Refs #523
Co-Authored-By: Claude Fable 5
---
.../classes/wp-maintenance-mode-admin.php | 22 ++-
includes/classes/wp-maintenance-mode.php | 2 +-
includes/functions/helpers.php | 15 +-
tests/page-state-test.php | 150 ++++++++++++++++++
views/settings.php | 3 +-
5 files changed, 183 insertions(+), 9 deletions(-)
diff --git a/includes/classes/wp-maintenance-mode-admin.php b/includes/classes/wp-maintenance-mode-admin.php
index 3456c3c..ff37b3a 100644
--- a/includes/classes/wp-maintenance-mode-admin.php
+++ b/includes/classes/wp-maintenance-mode-admin.php
@@ -742,12 +742,25 @@ public function insert_template() {
'page_template' => 'templates/wpmm-page-template.php',
);
- if ( isset( $this->plugin_settings['design']['page_id'] ) && get_post_status( $this->plugin_settings['design']['page_id'] ) && get_post_status( $this->plugin_settings['design']['page_id'] ) !== 'trash' ) {
- $post_arr['ID'] = $this->plugin_settings['design']['page_id'];
+ $selected_page_id = isset( $this->plugin_settings['design']['page_id'] ) ? absint( $this->plugin_settings['design']['page_id'] ) : 0;
+ $page_exists = $selected_page_id && get_post_status( $selected_page_id ) && get_post_status( $selected_page_id ) !== 'trash';
+
+ if ( $page_exists && get_post_meta( $selected_page_id, '_wpmm_generated', true ) ) {
+ // only pages created by the plugin may be overwritten
+ $post_arr['ID'] = $selected_page_id;
$page_id = wp_update_post( $post_arr );
} else {
+ if ( $page_exists ) {
+ // hand the user's page back before switching to a generated one
+ wpmm_restore_page_state( $selected_page_id );
+ }
+
$post_arr['post_title'] = __( 'Maintenance Page', 'wp-maintenance-mode' );
$page_id = wp_insert_post( $post_arr );
+
+ if ( $page_id && ! $page_id instanceof WP_Error ) {
+ update_post_meta( $page_id, '_wpmm_generated', 1 );
+ }
}
if ( $page_id === 0 || $page_id instanceof WP_Error ) {
@@ -755,7 +768,10 @@ public function insert_template() {
}
$this->plugin_settings['design']['page_id'] = $page_id;
- CSS_Handler::generate_css_file( $page_id );
+
+ if ( class_exists( 'ThemeIsle\GutenbergBlocks\CSS\CSS_Handler' ) ) {
+ CSS_Handler::generate_css_file( $page_id );
+ }
if ( 'wizard' === $_POST['source'] ) {
$this->plugin_settings['general']['status'] = 1;
diff --git a/includes/classes/wp-maintenance-mode.php b/includes/classes/wp-maintenance-mode.php
index ce6812a..715a1fb 100644
--- a/includes/classes/wp-maintenance-mode.php
+++ b/includes/classes/wp-maintenance-mode.php
@@ -99,7 +99,7 @@ private function __construct() {
if ( isset( $this->plugin_settings['design']['page_id'] ) && get_option( 'wpmm_new_look' ) ) {
// remember the page's original state so it can be restored when maintenance mode is disabled
- wpmm_record_page_state( (int) $this->plugin_settings['design']['page_id'], false );
+ wpmm_record_page_state( (int) $this->plugin_settings['design']['page_id'] );
if ( get_post_meta( $this->plugin_settings['design']['page_id'], '_wp_page_template', true ) !== 'templates/wpmm-page-template.php' ) {
update_post_meta( $this->plugin_settings['design']['page_id'], '_wp_page_template', 'templates/wpmm-page-template.php' );
diff --git a/includes/functions/helpers.php b/includes/functions/helpers.php
index 0695e8a..f70d2fb 100644
--- a/includes/functions/helpers.php
+++ b/includes/functions/helpers.php
@@ -517,12 +517,15 @@ function sanitize_hex_color( $color ) {
* Record the current state of the selected maintenance page so it can be
* restored when maintenance mode is disabled or the plugin is deactivated.
*
+ * A previously recorded state is never overwritten: the page may already be
+ * carrying plugin-made changes, and recording those would poison the original
+ * state. The record is cleared when the page is restored.
+ *
* @since 2.6.23
- * @param int $page_id page ID
- * @param bool $overwrite whether to overwrite a previously recorded state
+ * @param int $page_id page ID
*/
-function wpmm_record_page_state( $page_id, $overwrite = true ) {
- if ( ! $overwrite && get_post_meta( $page_id, '_wpmm_original_status', true ) ) {
+function wpmm_record_page_state( $page_id ) {
+ if ( get_post_meta( $page_id, '_wpmm_original_status', true ) ) {
return;
}
@@ -560,6 +563,10 @@ function wpmm_restore_page_state( $page_id ) {
} else {
update_post_meta( $page_id, '_wp_page_template', $original_template );
}
+
+ // clear the record so the next take-over captures the page's state afresh
+ delete_post_meta( $page_id, '_wpmm_original_status' );
+ delete_post_meta( $page_id, '_wpmm_original_template' );
}
/**
diff --git a/tests/page-state-test.php b/tests/page-state-test.php
index eaa00a6..5369cde 100644
--- a/tests/page-state-test.php
+++ b/tests/page-state-test.php
@@ -97,6 +97,156 @@ public function test_user_page_template_is_restored_on_disable_and_reapplied_on_
$this->assertSame( 'templates/wpmm-page-template.php', get_post_meta( $page_id, '_wp_page_template', true ) );
}
+ /**
+ * Boot a fresh admin instance and simulate the insert-template AJAX call.
+ *
+ * @param array $settings Value for the wpmm_settings option.
+ * @return void
+ */
+ private function apply_template( $settings ) {
+ $this->boot_plugin( $settings );
+
+ if ( ! class_exists( 'WP_Maintenance_Mode_Admin' ) ) {
+ require_once WPMM_CLASSES_PATH . 'wp-maintenance-mode-admin.php';
+ }
+
+ $instance = new ReflectionProperty( 'WP_Maintenance_Mode_Admin', 'instance' );
+ $instance->setAccessible( true );
+ $instance->setValue( null, null );
+
+ $admin = WP_Maintenance_Mode_Admin::get_instance();
+ $admin->load_default_settings();
+
+ $_POST = array(
+ '_wpnonce' => wp_create_nonce( 'tab-design' ),
+ 'source' => 'tab-design',
+ 'template_slug' => 'coming-soon-1',
+ 'category' => 'coming-soon',
+ );
+
+ $die_handler = function () {
+ return function () {
+ throw new WPDieException( 'json response sent' );
+ };
+ };
+ // Outside of admin-ajax.php, wp_send_json_*() ends with a bare `die`;
+ // claiming AJAX context routes it through a catchable die handler instead.
+ add_filter( 'wp_doing_ajax', '__return_true' );
+ add_filter( 'wp_die_ajax_handler', $die_handler );
+
+ ob_start();
+ try {
+ $admin->insert_template();
+ } catch ( WPDieException $e ) {
+ // wp_send_json_*() ends the request with wp_die(); expected.
+ }
+ ob_end_clean();
+
+ remove_filter( 'wp_doing_ajax', '__return_true' );
+ remove_filter( 'wp_die_ajax_handler', $die_handler );
+ $_POST = array();
+ }
+
+ public function test_applying_template_to_user_page_creates_new_page_instead_of_overwriting() {
+ $page_id = self::factory()->post->create(
+ array(
+ 'post_type' => 'page',
+ 'post_status' => 'publish',
+ 'post_content' => 'My real homepage content.',
+ )
+ );
+ update_post_meta( $page_id, '_wp_page_template', 'custom-template.php' );
+
+ // What select_page() does when the user picks an existing page.
+ wpmm_record_page_state( $page_id );
+ update_post_meta( $page_id, '_wp_page_template', 'templates/wpmm-page-template.php' );
+
+ $this->apply_template( $this->make_settings( 0, $page_id ) );
+
+ // The user's page is handed back untouched.
+ $this->assertSame( 'publish', get_post_status( $page_id ) );
+ $this->assertSame( 'My real homepage content.', get_post( $page_id )->post_content );
+ $this->assertSame( 'custom-template.php', get_post_meta( $page_id, '_wp_page_template', true ) );
+
+ // The template landed on a newly created, plugin-owned page instead.
+ $settings = get_option( 'wpmm_settings' );
+ $new_page_id = (int) $settings['design']['page_id'];
+
+ $this->assertNotSame( $page_id, $new_page_id );
+ $this->assertSame( 'private', get_post_status( $new_page_id ) );
+ $this->assertNotEmpty( get_post_meta( $new_page_id, '_wpmm_generated', true ) );
+ $this->assertNotEmpty( get_post( $new_page_id )->post_content );
+ }
+
+ public function test_applying_template_to_generated_page_updates_it_in_place() {
+ $page_id = self::factory()->post->create(
+ array(
+ 'post_type' => 'page',
+ 'post_status' => 'private',
+ )
+ );
+ update_post_meta( $page_id, '_wpmm_generated', 1 );
+
+ $this->apply_template( $this->make_settings( 0, $page_id ) );
+
+ $settings = get_option( 'wpmm_settings' );
+
+ $this->assertSame( $page_id, (int) $settings['design']['page_id'] );
+ $this->assertNotEmpty( get_post( $page_id )->post_content );
+ }
+
+ public function test_recording_twice_does_not_poison_the_original_state() {
+ $page_id = self::factory()->post->create(
+ array(
+ 'post_type' => 'page',
+ 'post_status' => 'publish',
+ )
+ );
+ update_post_meta( $page_id, '_wp_page_template', 'custom-template.php' );
+
+ wpmm_record_page_state( $page_id );
+
+ // The plugin takes the page over...
+ wp_update_post(
+ array(
+ 'ID' => $page_id,
+ 'post_status' => 'private',
+ )
+ );
+ update_post_meta( $page_id, '_wp_page_template', 'templates/wpmm-page-template.php' );
+
+ // ...and the user re-selects the same page while it is in that state.
+ wpmm_record_page_state( $page_id );
+
+ wpmm_restore_page_state( $page_id );
+
+ $this->assertSame( 'publish', get_post_status( $page_id ) );
+ $this->assertSame( 'custom-template.php', get_post_meta( $page_id, '_wp_page_template', true ) );
+ }
+
+ public function test_page_edits_after_restore_become_the_new_baseline() {
+ $page_id = self::factory()->post->create(
+ array(
+ 'post_type' => 'page',
+ 'post_status' => 'publish',
+ )
+ );
+ update_post_meta( $page_id, '_wp_page_template', 'custom-template.php' );
+
+ // First take-over / hand-back cycle.
+ wpmm_record_page_state( $page_id );
+ update_post_meta( $page_id, '_wp_page_template', 'templates/wpmm-page-template.php' );
+ wpmm_restore_page_state( $page_id );
+
+ // The user changes the page's template, then the plugin takes it over again.
+ update_post_meta( $page_id, '_wp_page_template', 'new-template.php' );
+ wpmm_record_page_state( $page_id );
+ update_post_meta( $page_id, '_wp_page_template', 'templates/wpmm-page-template.php' );
+ wpmm_restore_page_state( $page_id );
+
+ $this->assertSame( 'new-template.php', get_post_meta( $page_id, '_wp_page_template', true ) );
+ }
+
public function test_plugin_deactivation_restores_selected_page() {
$page_id = self::factory()->post->create(
array(
diff --git a/views/settings.php b/views/settings.php
index 6c53766..6260401 100644
--- a/views/settings.php
+++ b/views/settings.php
@@ -297,7 +297,8 @@
$will_replace = isset( $this->plugin_settings['design']['page_id'] ) &&
! ( ! get_post( $this->plugin_settings['design']['page_id'] ) ||
empty( trim( get_post( $this->plugin_settings['design']['page_id'] )->post_content ) ) ||
- get_post( $this->plugin_settings['design']['page_id'] )->post_status === 'trash' );
+ get_post( $this->plugin_settings['design']['page_id'] )->post_status === 'trash' ) &&
+ get_post_meta( (int) $this->plugin_settings['design']['page_id'], '_wpmm_generated', true );
foreach ( $categories as $category => $label ) {
$templates = list_files( WPMM_TEMPLATES_PATH . $category . '/', 1 );
From 941315acc66cc3b968d94dc80bfe70a8947402ac Mon Sep 17 00:00:00 2001
From: Alexia Soare <108459992+Alexia-Soare@users.noreply.github.com>
Date: Fri, 17 Jul 2026 09:49:13 +0300
Subject: [PATCH 03/22] fix: harden maintenance page bootstrap and template
import
Skip the enable-mode page takeover when the selected page no longer
exists (previously wrote orphan post meta), and reject template imports
whose slug/category do not resolve to a bundled template instead of
creating an empty maintenance page. Template slug and category are
sanitized before being used in a filesystem path.
Refs #523
Co-Authored-By: Claude Fable 5
---
.../classes/wp-maintenance-mode-admin.php | 16 +++++++--
includes/classes/wp-maintenance-mode.php | 2 +-
tests/page-state-test.php | 33 +++++++++++++++++--
3 files changed, 44 insertions(+), 7 deletions(-)
diff --git a/includes/classes/wp-maintenance-mode-admin.php b/includes/classes/wp-maintenance-mode-admin.php
index ff37b3a..5a95842 100644
--- a/includes/classes/wp-maintenance-mode-admin.php
+++ b/includes/classes/wp-maintenance-mode-admin.php
@@ -729,9 +729,19 @@ public function insert_template() {
die( esc_html__( 'Security check.', 'wp-maintenance-mode' ) );
}
- $template_slug = $_POST['template_slug'];
- $category = $_POST['category'];
- $template = json_decode( file_get_contents( WPMM_TEMPLATES_PATH . $category . '/' . $template_slug . '/blocks-export.json' ) );
+ $template_slug = isset( $_POST['template_slug'] ) ? basename( sanitize_text_field( $_POST['template_slug'] ) ) : '';
+ $category = isset( $_POST['category'] ) ? basename( sanitize_text_field( $_POST['category'] ) ) : '';
+ $template_file = WPMM_TEMPLATES_PATH . $category . '/' . $template_slug . '/blocks-export.json';
+
+ if ( '' === $template_slug || '' === $category || ! is_readable( $template_file ) ) {
+ wp_send_json_error( array( 'error' => 'Unknown template' ) );
+ }
+
+ $template = json_decode( file_get_contents( $template_file ) );
+
+ if ( empty( $template->content ) ) {
+ wp_send_json_error( array( 'error' => 'Unknown template' ) );
+ }
$blocks = str_replace( '\n', '', $template->content );
diff --git a/includes/classes/wp-maintenance-mode.php b/includes/classes/wp-maintenance-mode.php
index 715a1fb..5775aa3 100644
--- a/includes/classes/wp-maintenance-mode.php
+++ b/includes/classes/wp-maintenance-mode.php
@@ -97,7 +97,7 @@ private function __construct() {
add_action( 'wp_ajax_wpmm_send_contact', array( $this, 'send_contact' ) );
add_action( 'otter_form_after_submit', array( $this, 'otter_add_subscriber' ) );
- if ( isset( $this->plugin_settings['design']['page_id'] ) && get_option( 'wpmm_new_look' ) ) {
+ if ( isset( $this->plugin_settings['design']['page_id'] ) && get_option( 'wpmm_new_look' ) && get_post_status( $this->plugin_settings['design']['page_id'] ) ) {
// remember the page's original state so it can be restored when maintenance mode is disabled
wpmm_record_page_state( (int) $this->plugin_settings['design']['page_id'] );
diff --git a/tests/page-state-test.php b/tests/page-state-test.php
index 5369cde..af26e0f 100644
--- a/tests/page-state-test.php
+++ b/tests/page-state-test.php
@@ -103,7 +103,7 @@ public function test_user_page_template_is_restored_on_disable_and_reapplied_on_
* @param array $settings Value for the wpmm_settings option.
* @return void
*/
- private function apply_template( $settings ) {
+ private function apply_template( $settings, $template_slug = 'coming-soon-1', $category = 'coming-soon' ) {
$this->boot_plugin( $settings );
if ( ! class_exists( 'WP_Maintenance_Mode_Admin' ) ) {
@@ -120,8 +120,8 @@ private function apply_template( $settings ) {
$_POST = array(
'_wpnonce' => wp_create_nonce( 'tab-design' ),
'source' => 'tab-design',
- 'template_slug' => 'coming-soon-1',
- 'category' => 'coming-soon',
+ 'template_slug' => $template_slug,
+ 'category' => $category,
);
$die_handler = function () {
@@ -195,6 +195,33 @@ public function test_applying_template_to_generated_page_updates_it_in_place() {
$this->assertNotEmpty( get_post( $page_id )->post_content );
}
+ public function test_applying_unknown_template_is_rejected() {
+ $pages_before = count( get_posts( array( 'post_type' => 'page', 'post_status' => 'any', 'numberposts' => -1 ) ) );
+
+ $this->apply_template( $this->make_settings( 0, 0 ), '../../nonexistent', 'coming-soon' );
+
+ $settings = get_option( 'wpmm_settings' );
+ $pages_after = count( get_posts( array( 'post_type' => 'page', 'post_status' => 'any', 'numberposts' => -1 ) ) );
+
+ $this->assertSame( 0, (int) $settings['design']['page_id'], 'selection must not change' );
+ $this->assertSame( $pages_before, $pages_after, 'no page must be created' );
+ }
+
+ public function test_enabled_mode_with_deleted_page_writes_nothing() {
+ $page_id = self::factory()->post->create(
+ array(
+ 'post_type' => 'page',
+ 'post_status' => 'publish',
+ )
+ );
+ wp_delete_post( $page_id, true );
+
+ $this->boot_plugin( $this->make_settings( 1, $page_id ) );
+
+ $this->assertFalse( metadata_exists( 'post', $page_id, '_wp_page_template' ) );
+ $this->assertFalse( metadata_exists( 'post', $page_id, '_wpmm_original_status' ) );
+ }
+
public function test_recording_twice_does_not_poison_the_original_state() {
$page_id = self::factory()->post->create(
array(
From 820e2b3364a4ced56bb9cb93952cb3e091c977ba Mon Sep 17 00:00:00 2001
From: Alexia Soare <108459992+Alexia-Soare@users.noreply.github.com>
Date: Fri, 17 Jul 2026 09:56:53 +0300
Subject: [PATCH 04/22] fix: never resurrect or re-trash a trashed maintenance
page selection
Restoring the selected page's recorded state now leaves trashed pages
alone (trashing is always user intent; the plugin never trashes), and
enabling maintenance mode with a trashed page selected records nothing,
so untrashing the page later cannot snap it back to trash.
Refs #523
Co-Authored-By: Claude Fable 5
---
includes/classes/wp-maintenance-mode.php | 4 ++-
includes/functions/helpers.php | 5 ++++
tests/page-state-test.php | 33 ++++++++++++++++++++++++
3 files changed, 41 insertions(+), 1 deletion(-)
diff --git a/includes/classes/wp-maintenance-mode.php b/includes/classes/wp-maintenance-mode.php
index 5775aa3..d98553a 100644
--- a/includes/classes/wp-maintenance-mode.php
+++ b/includes/classes/wp-maintenance-mode.php
@@ -97,7 +97,9 @@ private function __construct() {
add_action( 'wp_ajax_wpmm_send_contact', array( $this, 'send_contact' ) );
add_action( 'otter_form_after_submit', array( $this, 'otter_add_subscriber' ) );
- if ( isset( $this->plugin_settings['design']['page_id'] ) && get_option( 'wpmm_new_look' ) && get_post_status( $this->plugin_settings['design']['page_id'] ) ) {
+ $maintenance_page_status = isset( $this->plugin_settings['design']['page_id'] ) ? get_post_status( $this->plugin_settings['design']['page_id'] ) : false;
+
+ if ( $maintenance_page_status && $maintenance_page_status !== 'trash' && get_option( 'wpmm_new_look' ) ) {
// remember the page's original state so it can be restored when maintenance mode is disabled
wpmm_record_page_state( (int) $this->plugin_settings['design']['page_id'] );
diff --git a/includes/functions/helpers.php b/includes/functions/helpers.php
index f70d2fb..765a168 100644
--- a/includes/functions/helpers.php
+++ b/includes/functions/helpers.php
@@ -547,6 +547,11 @@ function wpmm_restore_page_state( $page_id ) {
return;
}
+ // a trashed page reflects user intent; the plugin never trashes, so leave it alone
+ if ( get_post_status( $page_id ) === 'trash' ) {
+ return;
+ }
+
if ( get_post_status( $page_id ) !== $original_status ) {
wp_update_post(
array(
diff --git a/tests/page-state-test.php b/tests/page-state-test.php
index af26e0f..91f30ed 100644
--- a/tests/page-state-test.php
+++ b/tests/page-state-test.php
@@ -222,6 +222,39 @@ public function test_enabled_mode_with_deleted_page_writes_nothing() {
$this->assertFalse( metadata_exists( 'post', $page_id, '_wpmm_original_status' ) );
}
+ public function test_trashed_page_is_not_resurrected_on_disable() {
+ $page_id = self::factory()->post->create(
+ array(
+ 'post_type' => 'page',
+ 'post_status' => 'publish',
+ )
+ );
+
+ wpmm_record_page_state( $page_id );
+
+ // The user deliberately trashes the page while it is selected.
+ wp_trash_post( $page_id );
+
+ $this->boot_plugin( $this->make_settings( 0, $page_id ) );
+ do_action( 'init' );
+
+ $this->assertSame( 'trash', get_post_status( $page_id ) );
+ }
+
+ public function test_enabled_mode_with_trashed_page_records_nothing() {
+ $page_id = self::factory()->post->create(
+ array(
+ 'post_type' => 'page',
+ 'post_status' => 'publish',
+ )
+ );
+ wp_trash_post( $page_id );
+
+ $this->boot_plugin( $this->make_settings( 1, $page_id ) );
+
+ $this->assertFalse( metadata_exists( 'post', $page_id, '_wpmm_original_status' ) );
+ }
+
public function test_recording_twice_does_not_poison_the_original_state() {
$page_id = self::factory()->post->create(
array(
From f79bbc554abbfbe5087fb79f40e23419b0dc3be1 Mon Sep 17 00:00:00 2001
From: Alexia Soare <108459992+Alexia-Soare@users.noreply.github.com>
Date: Fri, 17 Jul 2026 10:00:45 +0300
Subject: [PATCH 05/22] test: cover the full issue #523 workflow through the
select-page handler
Selecting an existing published page via the real AJAX handler, enabling
and disabling maintenance mode must leave the page public with its
original content and template. Verified to fail against the unfixed
code.
Refs #523
Co-Authored-By: Claude Fable 5
---
tests/page-state-test.php | 75 +++++++++++++++++++++++++++++++++++++++
1 file changed, 75 insertions(+)
diff --git a/tests/page-state-test.php b/tests/page-state-test.php
index 91f30ed..41080e8 100644
--- a/tests/page-state-test.php
+++ b/tests/page-state-test.php
@@ -147,6 +147,81 @@ private function apply_template( $settings, $template_slug = 'coming-soon-1', $c
$_POST = array();
}
+ /**
+ * Simulate the select-page AJAX call the Design tab dropdown fires.
+ *
+ * @param array $settings Value for the wpmm_settings option.
+ * @param int $page_id Page being selected.
+ * @return void
+ */
+ private function select_page( $settings, $page_id ) {
+ $this->boot_plugin( $settings );
+
+ if ( ! class_exists( 'WP_Maintenance_Mode_Admin' ) ) {
+ require_once WPMM_CLASSES_PATH . 'wp-maintenance-mode-admin.php';
+ }
+
+ $instance = new ReflectionProperty( 'WP_Maintenance_Mode_Admin', 'instance' );
+ $instance->setAccessible( true );
+ $instance->setValue( null, null );
+
+ $admin = WP_Maintenance_Mode_Admin::get_instance();
+ $admin->load_default_settings();
+
+ $_POST = array(
+ '_wpnonce' => wp_create_nonce( 'tab-design' ),
+ 'page_id' => (string) $page_id,
+ );
+
+ $die_handler = function () {
+ return function () {
+ throw new WPDieException( 'json response sent' );
+ };
+ };
+ add_filter( 'wp_doing_ajax', '__return_true' );
+ add_filter( 'wp_die_ajax_handler', $die_handler );
+
+ ob_start();
+ try {
+ $admin->select_page();
+ } catch ( WPDieException $e ) {
+ // wp_send_json_*() ends the request with wp_die(); expected.
+ }
+ ob_end_clean();
+
+ remove_filter( 'wp_doing_ajax', '__return_true' );
+ remove_filter( 'wp_die_ajax_handler', $die_handler );
+ $_POST = array();
+ }
+
+ public function test_issue_523_workflow_leaves_selected_homepage_public() {
+ $page_id = self::factory()->post->create(
+ array(
+ 'post_type' => 'page',
+ 'post_status' => 'publish',
+ 'post_content' => 'Real homepage content.',
+ )
+ );
+
+ // 1. The user selects their existing homepage in Design > Select page.
+ $this->select_page( $this->make_settings( 0, 0 ), $page_id );
+
+ $settings = get_option( 'wpmm_settings' );
+ $this->assertSame( $page_id, (int) $settings['design']['page_id'] );
+
+ // 2. Maintenance mode is enabled...
+ $this->boot_plugin( $this->make_settings( 1, $page_id ) );
+
+ // 3. ...then disabled, and another request runs the init callback.
+ $this->boot_plugin( $this->make_settings( 0, $page_id ) );
+ do_action( 'init' );
+
+ // The homepage is publicly available in its original state (issue #523).
+ $this->assertSame( 'publish', get_post_status( $page_id ) );
+ $this->assertSame( 'Real homepage content.', get_post( $page_id )->post_content );
+ $this->assertSame( '', get_post_meta( $page_id, '_wp_page_template', true ) );
+ }
+
public function test_applying_template_to_user_page_creates_new_page_instead_of_overwriting() {
$page_id = self::factory()->post->create(
array(
From 41961beb4360e545a7ffe7f0d664e809b28da4b8 Mon Sep 17 00:00:00 2001
From: Alexia Soare <108459992+Alexia-Soare@users.noreply.github.com>
Date: Fri, 17 Jul 2026 10:09:29 +0300
Subject: [PATCH 06/22] ci: run PHPUnit on PHP 7.4, required by the latest
WordPress test suite
The job installed the latest WordPress test suite (currently 7.0.1,
which requires PHP 7.4+) on PHP 7.2, so the suite aborted before running
any test. The phpunit:7.5.20 tool pin was unused: composer run-script
resolves vendor/bin/phpunit from the lockfile.
Co-Authored-By: Claude Fable 5
---
.github/workflows/test-php.yml | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/.github/workflows/test-php.yml b/.github/workflows/test-php.yml
index 03801ea..1dbaabb 100644
--- a/.github/workflows/test-php.yml
+++ b/.github/workflows/test-php.yml
@@ -51,9 +51,9 @@ jobs:
- name: Setup PHP version
uses: shivammathur/setup-php@v2
with:
- php-version: '7.2'
+ php-version: '7.4'
extensions: simplexml, mysql
- tools: phpunit:7.5.20, phpunit-polyfills
+ tools: phpunit-polyfills
- name: Checkout source code
uses: actions/checkout@v2
- name: Install Subversion
From 383dfda2a5b42d8b9cb47888d4a1b6fc8188a52d Mon Sep 17 00:00:00 2001
From: Alexia Soare <108459992+Alexia-Soare@users.noreply.github.com>
Date: Mon, 20 Jul 2026 16:47:02 +0300
Subject: [PATCH 07/22] test: drop the issue number from the test name and
comments
Co-Authored-By: Claude Fable 5
---
tests/page-state-test.php | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/tests/page-state-test.php b/tests/page-state-test.php
index 41080e8..e6c7e08 100644
--- a/tests/page-state-test.php
+++ b/tests/page-state-test.php
@@ -1,6 +1,6 @@
post->create(
array(
'post_type' => 'page',
@@ -216,7 +216,7 @@ public function test_issue_523_workflow_leaves_selected_homepage_public() {
$this->boot_plugin( $this->make_settings( 0, $page_id ) );
do_action( 'init' );
- // The homepage is publicly available in its original state (issue #523).
+ // The homepage is publicly available in its original state.
$this->assertSame( 'publish', get_post_status( $page_id ) );
$this->assertSame( 'Real homepage content.', get_post( $page_id )->post_content );
$this->assertSame( '', get_post_meta( $page_id, '_wp_page_template', true ) );
From e8a06d6b3812dbce5fb5d8581d8ef8c867ebaaf0 Mon Sep 17 00:00:00 2001
From: Alexia Soare <108459992+Alexia-Soare@users.noreply.github.com>
Date: Tue, 21 Jul 2026 12:09:15 +0300
Subject: [PATCH 08/22] fix: restore abandoned selections, clean up trashed
pages, record atomically
Addresses the Copilot review on #524:
- select_page() restores the previously selected page before switching
away from it, so the old page never keeps the maintenance template
- restoring a trashed page keeps it in the trash but hands back the
template and clears the record, so untrashing brings it back clean
- recording claims the record with add_post_meta( ..., true ) so a
racing request cannot capture the plugin-modified state as original
Co-Authored-By: Claude Fable 5
---
.../classes/wp-maintenance-mode-admin.php | 8 +++
includes/functions/helpers.php | 24 ++++---
tests/page-state-test.php | 71 +++++++++++++++++++
3 files changed, 94 insertions(+), 9 deletions(-)
diff --git a/includes/classes/wp-maintenance-mode-admin.php b/includes/classes/wp-maintenance-mode-admin.php
index 5a95842..b8c4424 100644
--- a/includes/classes/wp-maintenance-mode-admin.php
+++ b/includes/classes/wp-maintenance-mode-admin.php
@@ -688,6 +688,14 @@ public function select_page() {
$page_id = isset( $_POST['page_id'] ) ? absint( $_POST['page_id'] ) : 0;
+ $previous_page_id = isset( $this->plugin_settings['design']['page_id'] ) ? absint( $this->plugin_settings['design']['page_id'] ) : 0;
+
+ if ( $previous_page_id && $previous_page_id !== $page_id ) {
+ // hand the previously selected page back before abandoning it,
+ // otherwise nothing would ever restore it
+ wpmm_restore_page_state( $previous_page_id );
+ }
+
$this->plugin_settings['design']['page_id'] = $page_id;
if ( $page_id ) {
diff --git a/includes/functions/helpers.php b/includes/functions/helpers.php
index 765a168..8e31af5 100644
--- a/includes/functions/helpers.php
+++ b/includes/functions/helpers.php
@@ -525,12 +525,21 @@ function sanitize_hex_color( $color ) {
* @param int $page_id page ID
*/
function wpmm_record_page_state( $page_id ) {
- if ( get_post_meta( $page_id, '_wpmm_original_status', true ) ) {
+ $status = get_post_status( $page_id );
+
+ if ( ! $status ) {
+ return;
+ }
+
+ $template = get_post_meta( $page_id, '_wp_page_template', true );
+
+ // the unique flag makes the status key a first-write-wins claim on the
+ // record, so a racing request cannot save the plugin-modified state
+ if ( ! add_post_meta( $page_id, '_wpmm_original_status', $status, true ) ) {
return;
}
- update_post_meta( $page_id, '_wpmm_original_status', get_post_status( $page_id ) );
- update_post_meta( $page_id, '_wpmm_original_template', get_post_meta( $page_id, '_wp_page_template', true ) );
+ update_post_meta( $page_id, '_wpmm_original_template', $template );
}
/**
@@ -547,12 +556,9 @@ function wpmm_restore_page_state( $page_id ) {
return;
}
- // a trashed page reflects user intent; the plugin never trashes, so leave it alone
- if ( get_post_status( $page_id ) === 'trash' ) {
- return;
- }
-
- if ( get_post_status( $page_id ) !== $original_status ) {
+ // a trashed page reflects user intent; the plugin never trashes, so keep the
+ // status but still hand back the template and clear the record below
+ if ( get_post_status( $page_id ) !== 'trash' && get_post_status( $page_id ) !== $original_status ) {
wp_update_post(
array(
'ID' => $page_id,
diff --git a/tests/page-state-test.php b/tests/page-state-test.php
index e6c7e08..a3b78ac 100644
--- a/tests/page-state-test.php
+++ b/tests/page-state-test.php
@@ -222,6 +222,77 @@ public function test_select_page_workflow_leaves_selected_homepage_public() {
$this->assertSame( '', get_post_meta( $page_id, '_wp_page_template', true ) );
}
+ public function test_changing_selection_restores_the_previously_selected_page() {
+ $first_page_id = self::factory()->post->create(
+ array(
+ 'post_type' => 'page',
+ 'post_status' => 'publish',
+ )
+ );
+ update_post_meta( $first_page_id, '_wp_page_template', 'custom-template.php' );
+
+ $second_page_id = self::factory()->post->create(
+ array(
+ 'post_type' => 'page',
+ 'post_status' => 'publish',
+ )
+ );
+
+ $this->select_page( $this->make_settings( 0, 0 ), $first_page_id );
+ $this->assertSame( 'templates/wpmm-page-template.php', get_post_meta( $first_page_id, '_wp_page_template', true ) );
+
+ $this->select_page( $this->make_settings( 0, $first_page_id ), $second_page_id );
+
+ // The first page is handed back with its own template, and its record is cleared.
+ $this->assertSame( 'custom-template.php', get_post_meta( $first_page_id, '_wp_page_template', true ) );
+ $this->assertFalse( metadata_exists( 'post', $first_page_id, '_wpmm_original_status' ) );
+
+ $settings = get_option( 'wpmm_settings' );
+ $this->assertSame( $second_page_id, (int) $settings['design']['page_id'] );
+ }
+
+ public function test_clearing_selection_restores_the_previously_selected_page() {
+ $page_id = self::factory()->post->create(
+ array(
+ 'post_type' => 'page',
+ 'post_status' => 'private',
+ )
+ );
+
+ $this->select_page( $this->make_settings( 0, 0 ), $page_id );
+
+ // Simulate the state an active maintenance mode leaves the page in.
+ wp_publish_post( $page_id );
+
+ $this->select_page( $this->make_settings( 0, $page_id ), 0 );
+
+ $this->assertSame( 'private', get_post_status( $page_id ) );
+ $this->assertFalse( metadata_exists( 'post', $page_id, '_wpmm_original_status' ) );
+ }
+
+ public function test_restoring_a_trashed_page_keeps_trash_but_clears_template_and_record() {
+ $page_id = self::factory()->post->create(
+ array(
+ 'post_type' => 'page',
+ 'post_status' => 'publish',
+ )
+ );
+ update_post_meta( $page_id, '_wp_page_template', 'custom-template.php' );
+
+ wpmm_record_page_state( $page_id );
+ update_post_meta( $page_id, '_wp_page_template', 'templates/wpmm-page-template.php' );
+
+ // The user deliberately trashes the page, then the plugin hands it back.
+ wp_trash_post( $page_id );
+ wpmm_restore_page_state( $page_id );
+
+ // The status is untouched, but the page no longer carries plugin state.
+ $this->assertSame( 'trash', get_post_status( $page_id ) );
+ $this->assertSame( 'custom-template.php', get_post_meta( $page_id, '_wp_page_template', true ) );
+ $this->assertFalse( metadata_exists( 'post', $page_id, '_wpmm_original_status' ) );
+ $this->assertFalse( metadata_exists( 'post', $page_id, '_wpmm_original_template' ) );
+ }
+
public function test_applying_template_to_user_page_creates_new_page_instead_of_overwriting() {
$page_id = self::factory()->post->create(
array(
From e438144599f4bcb5252b62e1c3e17eda74214ef4 Mon Sep 17 00:00:00 2001
From: girishpanchal30
Date: Wed, 22 Jul 2026 11:17:46 +0530
Subject: [PATCH 09/22] fix: remove trailing comma for PHP 7.1 compatibility
---
views/wizard.php | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/views/wizard.php b/views/wizard.php
index 07516db..a245dbb 100644
--- a/views/wizard.php
+++ b/views/wizard.php
@@ -38,7 +38,7 @@
__( 'Pick a template to get started.', 'wp-maintenance-mode' ),
tsdk_utmify( 'https://themeisle.com/plugins/otter-blocks/', $this->plugin_slug, 'wizard' ),
__( 'Otter Blocks', 'wp-maintenance-mode' ),
- __( 'plugin will be installed and activated to support and customize your layout.', 'wp-maintenance-mode' ),
+ __( 'plugin will be installed and activated to support and customize your layout.', 'wp-maintenance-mode' )
),
wpmm_translated_string_allowed_html()
);
@@ -93,9 +93,9 @@
__( 'Templates would have pre-optimized images and all of your website’s images would be delivered via Amazon Cloudfront CDN, resulting in an ≈ 80% increase in speed.', 'wp-maintenance-mode' ),
esc_url( 'https://wordpress.org/plugins/optimole-wp/' ),
'Optimole',
- __( 'plugin will be installed and activated.', 'wp-maintenance-mode' ),
+ __( 'plugin will be installed and activated.', 'wp-maintenance-mode' )
),
- wpmm_translated_string_allowed_html(),
+ wpmm_translated_string_allowed_html()
);
?>
From 8be83d359c4d82aa8a447c569f07c32f29314e03 Mon Sep 17 00:00:00 2001
From: girishpanchal30
Date: Wed, 22 Jul 2026 11:24:54 +0530
Subject: [PATCH 10/22] fix: update PHPUnit job to support multiple PHP and WP
versions
---
.github/workflows/test-php.yml | 14 +++++++++++---
1 file changed, 11 insertions(+), 3 deletions(-)
diff --git a/.github/workflows/test-php.yml b/.github/workflows/test-php.yml
index 03801ea..568e864 100644
--- a/.github/workflows/test-php.yml
+++ b/.github/workflows/test-php.yml
@@ -37,8 +37,16 @@ jobs:
run: composer run lint
phpunit:
- name: PHPUnit
+ name: PHPUnit (PHP ${{ matrix.php-version }}, WP ${{ matrix.wp-version }})
runs-on: ubuntu-latest
+ strategy:
+ fail-fast: false
+ matrix:
+ include:
+ - php-version: '7.2'
+ wp-version: '6.4'
+ - php-version: '7.4'
+ wp-version: 'latest'
services:
mysql:
image: mysql:5.7
@@ -51,7 +59,7 @@ jobs:
- name: Setup PHP version
uses: shivammathur/setup-php@v2
with:
- php-version: '7.2'
+ php-version: ${{ matrix.php-version }}
extensions: simplexml, mysql
tools: phpunit:7.5.20, phpunit-polyfills
- name: Checkout source code
@@ -60,7 +68,7 @@ jobs:
run: sudo apt-get update && sudo apt-get install -y subversion
- name: Install WordPress Test Suite
run: |
- bash bin/install-wp-tests.sh wordpress_test root root 127.0.0.1:${{ job.services.mysql.ports['3306'] }}
+ bash bin/install-wp-tests.sh wordpress_test root root 127.0.0.1:${{ job.services.mysql.ports['3306'] }} ${{ matrix.wp-version }}
- name: Get Composer Cache Directory
id: composer-cache
run: |
From 475d3dcbd74ba137a11175a8d5a261e84305854d Mon Sep 17 00:00:00 2001
From: girishpanchal30
Date: Wed, 22 Jul 2026 12:27:57 +0530
Subject: [PATCH 11/22] fix: reset template import status on request failure
---
assets/js/scripts-admin.js | 68 ++++++++++++++++++++++++++------------
1 file changed, 46 insertions(+), 22 deletions(-)
diff --git a/assets/js/scripts-admin.js b/assets/js/scripts-admin.js
index e287753..7ed1a4a 100644
--- a/assets/js/scripts-admin.js
+++ b/assets/js/scripts-admin.js
@@ -219,6 +219,8 @@ jQuery( function( $ ) {
let pageEditURL = '#';
const templateWrap = $( '.wpmm-template-image-wrap' );
const wizardButtons = $( '#wizard-buttons' );
+ let activeImportButton = null;
+ let activeImportButtonHtml = '';
templateWrap.on( 'click', '.button-import', function() {
/* If the page has some content inside, show a confirmation prompt to let the use know the
@@ -264,6 +266,8 @@ jQuery( function( $ ) {
category,
};
+ activeImportButton = button;
+ activeImportButtonHtml = button.innerHTML;
$( button ).html( '' + wpmmVars.importingText + '...' );
$( '.button-import' ).addClass( 'disabled' ).css( 'pointer-events', 'none' );
@@ -525,21 +529,17 @@ jQuery( function( $ ) {
* @param {Function} callback
*/
function importTemplate( data, callback ) {
- handlePlugins()
+ return handlePlugins()
.then( () => addToPage( data, callback ) )
.catch( ( error ) => {
// eslint-disable-next-line no-console
console.error( error );
- const template = $( '.wpmm-template.loading' );
+ resetImportUI();
- template.removeClass( 'loading' );
- $( '.wpmm-template .dashicons.dashicons-update' ).remove();
- $( '.wpmm-template p' ).remove();
-
- $( '.button-import' ).removeAttr( 'disabled' );
- $( '#wpmm-wizard-wrapper .button-skip' ).removeClass( 'disabled' );
- $( '#wpmm-wizard-wrapper .wpmm-templates-radio label' ).removeAttr( 'style' );
+ if ( error && error.data && error.data.error ) {
+ alert( error.data.error );
+ }
addErrorMessage();
} );
@@ -559,6 +559,34 @@ jQuery( function( $ ) {
}, 3000 );
}
+ /**
+ * Restores the tab-design and wizard import UI to an interactive state
+ * after a failed import, so the user can retry without reloading the page.
+ */
+ function resetImportUI() {
+ $( '.modal-overlay' ).remove();
+ $( 'body' ).removeClass( 'has-modal' );
+
+ // Restore the import button that was active when the import failed, if any.
+ if ( activeImportButton ) {
+ $( activeImportButton ).html( activeImportButtonHtml );
+ activeImportButton = null;
+ activeImportButtonHtml = '';
+ }
+
+ $( '.button-import' ).show().removeClass( 'disabled' ).css( 'pointer-events', '' );
+ templateWrap.has( '.button-import' ).addClass( 'can-import' );
+ $( '.importing' ).removeClass( 'importing' );
+
+ $( '.wpmm-template.loading' ).removeClass( 'loading' );
+ $( '.wpmm-template .dashicons.dashicons-update' ).remove();
+ $( '.wpmm-template p' ).remove();
+
+ $( '.button-import' ).removeAttr( 'disabled' );
+ $( '#wpmm-wizard-wrapper .button-skip' ).removeClass( 'disabled' );
+ $( '#wpmm-wizard-wrapper .wpmm-templates-radio label' ).removeAttr( 'style' );
+ }
+
/**
* Adds the template content to the Maintenance Page
* and calls the callback after
@@ -567,33 +595,29 @@ jQuery( function( $ ) {
* @param {Function} callback
*/
function addToPage( data, callback ) {
- if ($('.wpmm-templates-radio').hasClass('disabled')) {
- $.post( wpmmVars.ajaxURL, {
+ if ( $( '.wpmm-templates-radio' ).hasClass( 'disabled' ) ) {
+ return $.post( wpmmVars.ajaxURL, {
action: 'wpmm_skip_insert_template',
_wpnonce: wpmmVars.wizardNonce,
- }, function( response ) {
+ }, undefined, 'json' ).then( ( response ) => {
if ( ! response.success ) {
- addErrorMessage();
- return;
+ return Promise.reject( response );
}
skipWizard = true;
moveToStep( 'import', 'subscribe' );
} );
- return Promise.resolve();
}
-
+
data.action = 'wpmm_insert_template';
- $.post( wpmmVars.ajaxURL, data, function( response ) {
+
+ return $.post( wpmmVars.ajaxURL, data, undefined, 'json' ).then( ( response ) => {
if ( ! response.success ) {
- alert( response.data.error );
- $( '.dashicons-update' ).remove();
- addErrorMessage();
- return false;
+ return Promise.reject( response );
}
callback( response.data );
- }, 'json' );
+ } );
}
/**
From 82a968ad376afe0660d7cbfa5b991a0d1ddbf5fb Mon Sep 17 00:00:00 2001
From: girishpanchal30
Date: Wed, 22 Jul 2026 12:35:46 +0530
Subject: [PATCH 12/22] fix: handle missing import step error alert
---
assets/js/scripts-admin.js | 2 ++
1 file changed, 2 insertions(+)
diff --git a/assets/js/scripts-admin.js b/assets/js/scripts-admin.js
index 7ed1a4a..b31978a 100644
--- a/assets/js/scripts-admin.js
+++ b/assets/js/scripts-admin.js
@@ -539,6 +539,8 @@ jQuery( function( $ ) {
if ( error && error.data && error.data.error ) {
alert( error.data.error );
+ } else if ( ! $( '.import-step' ).length ) {
+ alert( wpmmVars.errorString );
}
addErrorMessage();
From 5b1f2e42b97a46eee2014a08350536cfcb7d1fdc Mon Sep 17 00:00:00 2001
From: girishpanchal30
Date: Wed, 22 Jul 2026 19:12:06 +0530
Subject: [PATCH 13/22] fix: improve bot avatar and chat layout on mobile
---
assets/css/style.bot.css | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/assets/css/style.bot.css b/assets/css/style.bot.css
index a31c236..53bc816 100644
--- a/assets/css/style.bot.css
+++ b/assets/css/style.bot.css
@@ -384,12 +384,15 @@ CHAT BOT STYLING
@media screen and (max-width: 700px) {
.bot-avatar {
- display: none !important;
+ width: 50px;
+ height: 50px;
}
.bot-chat-wrapper,
.bg-image .bot-chat-wrapper {
padding: 20px;
+ width: 85%;
+ height: 60%;
}
.bg-image .bot-chat-wrapper {
From c5e408c511d88fe9802f23c1f9f741b7794dad00 Mon Sep 17 00:00:00 2001
From: girishpanchal30
Date: Thu, 23 Jul 2026 16:56:16 +0530
Subject: [PATCH 14/22] fix: remove trailing comma for PHP compatibility
---
views/wizard.php | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/views/wizard.php b/views/wizard.php
index a245dbb..0c0bb67 100644
--- a/views/wizard.php
+++ b/views/wizard.php
@@ -121,9 +121,9 @@
__( 'Speed up your pages by 60-80% with intelligent caching. Achieve faster load times and better search rankings automatically, with', 'wp-maintenance-mode' ),
esc_url( 'https://wordpress.org/plugins/wp-cloudflare-page-cache/' ),
__( 'Super Page Cache', 'wp-maintenance-mode' ),
- __( 'plugin installed and activated automatically.', 'wp-maintenance-mode' ),
+ __( 'plugin installed and activated automatically.', 'wp-maintenance-mode' )
),
- wpmm_translated_string_allowed_html(),
+ wpmm_translated_string_allowed_html()
);
?>
From 617cb0dbd359496c9fd8a9dbde7fd3f7092b4a51 Mon Sep 17 00:00:00 2001
From: Alexia-Soare <108459992+Alexia-Soare@users.noreply.github.com>
Date: Fri, 24 Jul 2026 14:39:14 +0300
Subject: [PATCH 15/22] feat: add wp-env, PHPUnit and Playwright testing setup
with Copilot support (#532)
---
.distignore | 9 +
.github/workflows/build-dev-artifact.yml | 4 +-
.github/workflows/copilot-setup-steps.yml | 43 +
.github/workflows/deploy.yml | 4 +-
.github/workflows/test-e2e.yml | 51 +
.github/workflows/test-php.yml | 23 +-
.gitignore | 11 +
.wp-env.json | 16 +
AGENTS.md | 64 +-
bin/wp-env-setup.sh | 18 +
bin/wp-env-up.js | 104 +
composer.json | 19 +-
composer.lock | 1442 ++++--
...p-maintenance-mode-shortcode-loginform.php | 1 -
.../classes/wp-maintenance-mode-admin.php | 2 +-
.../wp-maintenance-mode-shortcodes.php | 7 +-
includes/classes/wp-maintenance-mode.php | 16 +-
includes/functions/helpers.php | 12 +-
package.json | 17 +-
phpcs.xml | 2 +
phpstan-baseline.neon | 661 +++
phpstan.neon | 17 +
tests/access-control-test.php | 167 +
tests/ajax-api-test.php | 495 ++
tests/e2e/global-setup.js | 20 +
tests/e2e/playwright.config.js | 59 +
tests/e2e/specs/access-rules.spec.js | 207 +
tests/e2e/specs/design.spec.js | 88 +
tests/e2e/specs/maintenance-mode.spec.js | 91 +
tests/e2e/specs/modules.spec.js | 211 +
tests/e2e/specs/roles.spec.js | 118 +
tests/e2e/specs/subscribe-form.spec.js | 160 +
tests/e2e/utils.js | 110 +
tests/frontend-behavior-test.php | 158 +
tests/generic-test.php | 4 +-
tests/helpers-test.php | 121 +
tests/static-analysis-stubs/constants.php | 36 +
tests/static-analysis-stubs/integrations.php | 64 +
wp-maintenance-mode.php | 6 +-
yarn.lock | 4098 ++++++++++++++++-
40 files changed, 8175 insertions(+), 581 deletions(-)
create mode 100644 .github/workflows/copilot-setup-steps.yml
create mode 100644 .github/workflows/test-e2e.yml
create mode 100644 .wp-env.json
create mode 100644 bin/wp-env-setup.sh
create mode 100755 bin/wp-env-up.js
create mode 100644 phpstan-baseline.neon
create mode 100644 phpstan.neon
create mode 100644 tests/access-control-test.php
create mode 100644 tests/ajax-api-test.php
create mode 100644 tests/e2e/global-setup.js
create mode 100644 tests/e2e/playwright.config.js
create mode 100644 tests/e2e/specs/access-rules.spec.js
create mode 100644 tests/e2e/specs/design.spec.js
create mode 100644 tests/e2e/specs/maintenance-mode.spec.js
create mode 100644 tests/e2e/specs/modules.spec.js
create mode 100644 tests/e2e/specs/roles.spec.js
create mode 100644 tests/e2e/specs/subscribe-form.spec.js
create mode 100644 tests/e2e/utils.js
create mode 100644 tests/frontend-behavior-test.php
create mode 100644 tests/helpers-test.php
create mode 100644 tests/static-analysis-stubs/constants.php
create mode 100644 tests/static-analysis-stubs/integrations.php
diff --git a/.distignore b/.distignore
index b437e87..b209878 100755
--- a/.distignore
+++ b/.distignore
@@ -42,3 +42,12 @@ assets/vue
yarn.lock
.eslintrc
CONTRIBUTING.md
+AGENTS.md
+phpstan.neon
+phpstan-baseline.neon
+.wp-env.json
+.wp-env.override.json
+.phpunit.result.cache
+artifacts
+playwright-report
+test-results
diff --git a/.github/workflows/build-dev-artifact.yml b/.github/workflows/build-dev-artifact.yml
index 8d750ca..b80c6d4 100644
--- a/.github/workflows/build-dev-artifact.yml
+++ b/.github/workflows/build-dev-artifact.yml
@@ -15,7 +15,7 @@ jobs:
runs-on: ubuntu-latest
strategy:
matrix:
- node-version: [14.x]
+ node-version: [20.x]
outputs:
branch-name: ${{ steps.retrieve-branch-name.outputs.branch_name }}
git-sha-8: ${{ steps.retrieve-git-sha-8.outputs.sha8 }}
@@ -50,7 +50,7 @@ jobs:
- name: Install composer deps
run: composer install --no-dev --prefer-dist --no-progress --no-suggest
- name: Install yarn deps
- run: yarn install --frozen-lockfile
+ run: yarn install --frozen-lockfile --ignore-engines
- name: Build files
run: yarn run build
- name: Create zip
diff --git a/.github/workflows/copilot-setup-steps.yml b/.github/workflows/copilot-setup-steps.yml
new file mode 100644
index 0000000..b1748e3
--- /dev/null
+++ b/.github/workflows/copilot-setup-steps.yml
@@ -0,0 +1,43 @@
+name: "Copilot Setup Steps"
+
+on:
+ workflow_dispatch:
+ push:
+ paths:
+ - .github/workflows/copilot-setup-steps.yml
+ pull_request:
+ paths:
+ - .github/workflows/copilot-setup-steps.yml
+
+jobs:
+ copilot-setup-steps:
+ runs-on: ubuntu-latest
+ permissions:
+ contents: read
+
+ # These steps run before the Copilot coding agent starts, so the agent
+ # boots into a checkout with a running wp-env instance and both test
+ # suites (npm run test:unit:php:base / npm run test:e2e) ready to use.
+ steps:
+ - uses: actions/checkout@v6
+ - uses: actions/setup-node@v6
+ with:
+ node-version: "22"
+ cache: "yarn"
+ - name: Install JS deps
+ run: |
+ yarn install --frozen-lockfile --ignore-engines
+ - name: Install Playwright
+ run: |
+ npx playwright install --with-deps chromium
+ - name: Setup PHP with tools
+ uses: shivammathur/setup-php@v2
+ with:
+ php-version: "7.4"
+ extensions: simplexml, mysql, mbstring, curl
+ tools: wp-cli
+ - name: Install composer deps
+ run: composer install --no-progress
+ - name: Start the WordPress environment via wp-env
+ run: |
+ yarn run env:start
diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml
index 39e9277..a3d5b40 100644
--- a/.github/workflows/deploy.yml
+++ b/.github/workflows/deploy.yml
@@ -10,7 +10,7 @@ jobs:
runs-on: ubuntu-latest
strategy:
matrix:
- node-version: [14.x]
+ node-version: [20.x]
steps:
- uses: actions/checkout@master
- name: Build files using ${{ matrix.node-version }}
@@ -19,7 +19,7 @@ jobs:
node-version: ${{ matrix.node-version }}
- name: Build
run: |
- yarn install --frozen-lockfile
+ yarn install --frozen-lockfile --ignore-engines
yarn run build
composer install --no-dev --prefer-dist --no-progress --no-suggest
- name: WordPress Plugin Deploy
diff --git a/.github/workflows/test-e2e.yml b/.github/workflows/test-e2e.yml
new file mode 100644
index 0000000..f0f0bb9
--- /dev/null
+++ b/.github/workflows/test-e2e.yml
@@ -0,0 +1,51 @@
+name: Test E2E
+
+on:
+ pull_request:
+ types: [opened, synchronize, ready_for_review]
+
+concurrency:
+ group: ${{ github.workflow }}-${{ github.event_name == 'pull_request' && github.head_ref || github.ref }}
+ cancel-in-progress: true
+
+permissions:
+ contents: read
+
+jobs:
+ e2e:
+ name: Playwright
+ runs-on: ubuntu-latest
+ if: github.event.pull_request.draft == false
+ steps:
+ - uses: actions/checkout@v6
+ - uses: actions/setup-node@v6
+ with:
+ node-version: 22
+ cache: "yarn"
+ - name: Setup PHP version
+ uses: shivammathur/setup-php@v2
+ with:
+ php-version: "7.4"
+ - name: Install composer
+ run: composer install --prefer-dist --no-progress
+ - name: Install JS deps
+ run: |
+ yarn install --frozen-lockfile --ignore-engines
+ - name: Install Playwright
+ run: |
+ npx playwright install --with-deps chromium
+ - name: Setup WP Env
+ run: |
+ yarn run env:start
+ - name: Run Playwright tests
+ env:
+ PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: true
+ run: |
+ yarn run test:e2e
+ - name: Upload tests artifacts
+ if: failure()
+ uses: actions/upload-artifact@v7
+ with:
+ name: artifacts-e2e
+ path: ./artifacts
+ retention-days: 3
diff --git a/.github/workflows/test-php.yml b/.github/workflows/test-php.yml
index 03801ea..ca4030d 100644
--- a/.github/workflows/test-php.yml
+++ b/.github/workflows/test-php.yml
@@ -15,9 +15,9 @@ jobs:
- name: Setup PHP version
uses: shivammathur/setup-php@v2
with:
- php-version: '7.2'
+ # the modern sniffer stack needs PHP 7.4+ and a current composer
+ php-version: '7.4'
extensions: simplexml
- tools: composer:v2.1
- name: Checkout source code
uses: actions/checkout@v2
- name: Get Composer Cache Directory
@@ -36,6 +36,22 @@ jobs:
- name: Run PHPCS
run: composer run lint
+ phpstan:
+ name: PHPStan
+ runs-on: ubuntu-latest
+ steps:
+ - name: Setup PHP version
+ uses: shivammathur/setup-php@v2
+ with:
+ php-version: '7.4'
+ extensions: simplexml
+ - name: Checkout source code
+ uses: actions/checkout@v6
+ - name: Install composer
+ run: composer install --prefer-dist --no-progress
+ - name: PHPStan Static Analysis
+ run: composer run phpstan
+
phpunit:
name: PHPUnit
runs-on: ubuntu-latest
@@ -51,7 +67,8 @@ jobs:
- name: Setup PHP version
uses: shivammathur/setup-php@v2
with:
- php-version: '7.2'
+ # the latest WordPress test suite requires PHP 7.4+
+ php-version: '7.4'
extensions: simplexml, mysql
tools: phpunit:7.5.20, phpunit-polyfills
- name: Checkout source code
diff --git a/.gitignore b/.gitignore
index 69cce59..e6d0499 100644
--- a/.gitignore
+++ b/.gitignore
@@ -44,3 +44,14 @@ artifact
# build assets files
assets/js/*.min.js
assets/css/*.min.css
+
+### yarn.lock is the tracked lockfile; npm's lockfile must never be committed
+### (npm install also rewrites yarn.lock into a format yarn 1 cannot parse)
+package-lock.json
+
+### wp-env / tests
+.wp-env.override.json
+.phpunit.result.cache
+artifacts/
+playwright-report/
+test-results/
diff --git a/.wp-env.json b/.wp-env.json
new file mode 100644
index 0000000..8e2962e
--- /dev/null
+++ b/.wp-env.json
@@ -0,0 +1,16 @@
+{
+ "core": null,
+ "phpVersion": "7.4",
+ "testsEnvironment": false,
+ "plugins": [ "." ],
+ "config": {
+ "WP_DEBUG": true,
+ "WP_DEBUG_LOG": true,
+ "WP_DEBUG_DISPLAY": false,
+ "SCRIPT_DEBUG": true,
+ "FS_METHOD": "direct"
+ },
+ "lifecycleScripts": {
+ "afterStart": "bash bin/wp-env-setup.sh"
+ }
+}
diff --git a/AGENTS.md b/AGENTS.md
index 814d4ca..b54a536 100644
--- a/AGENTS.md
+++ b/AGENTS.md
@@ -7,21 +7,33 @@ WP Maintenance Mode (LightStart) is a WordPress plugin by Themeisle that display
## Commands
```bash
-# Install dependencies
+# Install dependencies (yarn.lock is the tracked lockfile; package-lock.json is
+# ignored, and --ignore-engines is needed because the legacy eslint toolchain
+# caps its node engines range below current node versions)
composer install
-npm install
+yarn install --frozen-lockfile --ignore-engines
-# Lint (PHP_CodeSniffer with WordPress coding standards)
-composer run lint
+# Environment (wp-env, requires Docker)
+npm run env:start # reuse a running instance, or pick a free port + start
+npm run env:stop
+npm run env:cleanup # remove THIS checkout's containers/volumes (run before deleting a worktree)
-# Auto-fix coding standards
-composer run format
+# Lint / format (PHP_CodeSniffer with WordPress coding standards)
+composer run lint # on the host
+npm run lint:php # same, inside the wp-env container
+npm run format:php
-# Run PHPUnit tests
-./vendor/bin/phpunit
+# Static analysis (PHPStan level 6, WordPress stubs)
+composer run phpstan
+composer run phpstan:generate:baseline # refresh phpstan-baseline.neon after intentional changes
-# Run a single test file
-./vendor/bin/phpunit tests/generic-test.php
+# PHP unit tests (run inside wp-env; no local MySQL/SVN setup needed)
+npm run test:unit:php # start env + run the suite
+npm run test:unit:php:base # run the suite against an already-running env
+
+# E2E tests (Playwright; needs `npx playwright install chromium` once)
+npm run test:e2e
+npm run test:e2e:ui # interactive UI mode
# Build assets (minify JS + CSS via Grunt)
npm run build # or: npx grunt
@@ -30,6 +42,38 @@ npm run build # or: npx grunt
npx grunt watch
```
+Configs: PHPUnit `phpunit.xml` (+ `tests/bootstrap.php`), Playwright `tests/e2e/playwright.config.js`, wp-env `.wp-env.json` + gitignored `.wp-env.override.json`, PHPStan `phpstan.neon` + `phpstan-baseline.neon` (stubs for optional integrations and dynamic constants live in `tests/static-analysis-stubs/`, loaded only during analysis).
+
+## wp-env Instance
+
+Single environment (`"testsEnvironment": false`): one `wordpress`/`cli`/`mysql` container set serves dev, PHPUnit, and E2E. Login: `admin`/`password`. Port precedence everywhere: `WP_BASE_URL` > `WP_ENV_PORT` > `.wp-env.override.json` > `8888` — `npm run env:start` (`bin/wp-env-up.js`) probes for a free port and pins it in the override file, which the Playwright config reads too.
+
+- PHPUnit runs in the container with `WORDPRESS_TABLE_PREFIX=wptests_` (baked into `test:unit:php:base`). Never drop that prefix override: the container's tests config otherwise points at the dev site's own `wp_` tables and the suite install WIPES the site.
+- `bin/wp-env-setup.sh` (wp-env `afterStart`) sets pretty permalinks, provisions the plugin's default settings, and disables the setup-wizard redirect plus the block-based "new look" (`wpmm_new_look=0`) so the classic settings screens are testable. While `wpmm_settings` is missing, the plugin re-flags the install as fresh on every request — provision settings before touching `wpmm_fresh_install`.
+- The environment runs with `SCRIPT_DEBUG=true`, so unminified assets load and no Grunt build is needed for tests; `WPMM_ASSETS_SUFFIX` is empty in this mode.
+
+## E2E Rules (Important)
+
+- `workers: 1`, always. Maintenance mode is a site-wide option; virtually every spec flips global state. Do not raise the worker count or add `fullyParallel`.
+- Specs must leave maintenance mode OFF when they finish, or every later spec sees the 503 page.
+- Use the helpers in `tests/e2e/utils.js` (`setMaintenanceMode`, `activateSettingsTab`, `saveSettingsForm`, `openAsVisitor`) instead of hand-rolling admin flows. They encode three non-obvious constraints:
+ - After any settings save (form POST + redirect), headless Chromium stops producing animation frames for the page, so non-`force` Playwright interactions hang on the "element is stable" actionability check. Helpers use `force: true` plus explicit state assertions.
+ - The settings tabs are hash-driven; navigating to the hash-less settings URL is a same-document navigation, so the previously active tab persists. Always `activateSettingsTab` explicitly.
+ - The save redirect lands on `?updated=1#` and WordPress strips the query right after load — wait for the redirect response, not the URL.
+- Visitor contexts: `browser.newContext()` inherits the admin `storageState`; `openAsVisitor` clears cookies to get a real logged-out visitor.
+
+## Testing Practices (TDD)
+
+- Red → green: write the failing test first, then only enough code to make it pass. One seam, one test, one minimal implementation per cycle — don't batch-write tests for imagined behavior (vertical slices, not horizontal). Refactoring is a separate review-stage step, not part of the loop.
+- Test behavior through public seams, never internals: the admin-ajax endpoints (`wp_ajax_wpmm_*`), public helpers (`includes/functions/helpers.php`), rendered frontend output, and the settings screens. If a test breaks when you refactor but behavior hasn't changed, it's testing the wrong thing.
+- Expected values must come from an independent source of truth (a known-good literal, the spec, a worked example) — never recompute them the way the code does.
+- Plugin-specific seams and traps (see `tests/ajax-api-test.php`):
+ - Several AJAX handlers guard with plain `die( $msg )` (not `wp_die`); those guard paths CANNOT be exercised through `_handleAjax` — a plain `die()` kills the PHPUnit process with exit code 0.
+ - Handlers wrapped in `catch ( Exception )` swallow the suite's die-exception and answer twice; the test class installs a die handler that throws `WPMM_Ajax_Die_Signal extends Error` instead.
+ - `_handleAjax()` fires `admin_init` without defining `DOING_AJAX`; keep `maybe_redirect` unhooked in tests or a fresh-install flag turns it into a process-killing wizard redirect.
+ - The WP suite auto-excludes tests annotated `@group ajax` — don't add that annotation.
+ - wp-env's sender address `wordpress@localhost` fails PHPMailer validation; filter `wp_mail_from` in mail tests.
+
## Architecture
### Entry Point & Bootstrap
diff --git a/bin/wp-env-setup.sh b/bin/wp-env-setup.sh
new file mode 100644
index 0000000..cce81ff
--- /dev/null
+++ b/bin/wp-env-setup.sh
@@ -0,0 +1,18 @@
+#!/bin/sh
+
+# Prepare the wp-env instance for development and tests (wp-env afterStart hook).
+
+# Pretty permalinks: the Playwright global-setup talks to /wp-json/.
+npx wp-env run cli wp rewrite structure '/%postname%/'
+
+# Provision the plugin's default settings; while wpmm_settings is missing the
+# plugin re-flags the install as fresh on every request.
+npx wp-env run cli wp eval 'WP_Maintenance_Mode::single_activate();'
+
+# Skip the setup wizard redirect so the settings screens are directly reachable.
+npx wp-env run cli wp option update wpmm_fresh_install 0
+
+# Use the classic (pre-Gutenberg) maintenance screen: the modules settings UI
+# (subscribe, countdown, social) only renders in this mode, and the block-based
+# flow needs Otter Blocks plus the wizard, which the E2E suite does not cover.
+npx wp-env run cli wp option update wpmm_new_look 0
diff --git a/bin/wp-env-up.js b/bin/wp-env-up.js
new file mode 100755
index 0000000..4aa9a7f
--- /dev/null
+++ b/bin/wp-env-up.js
@@ -0,0 +1,104 @@
+#!/usr/bin/env node
+
+/**
+ * Start (or reuse) this checkout's wp-env instance without clashing with
+ * other checkouts/worktrees over the host port.
+ *
+ * 1. Reuses the instance if it is already running.
+ * 2. Otherwise picks a free port (override file > WP_ENV_PORT > 8888, scanning
+ * upward on conflict), pins it in the gitignored .wp-env.override.json,
+ * and runs `wp-env start`.
+ *
+ * The Playwright configs read the same override file, so the test suites
+ * follow the pinned port automatically. See AGENTS.md.
+ */
+
+const fs = require( 'fs' );
+const net = require( 'net' );
+const path = require( 'path' );
+const { spawnSync } = require( 'child_process' );
+
+const ROOT = path.resolve( __dirname, '..' );
+const OVERRIDE_PATH = path.join( ROOT, '.wp-env.override.json' );
+const DEFAULT_PORT = 8888;
+
+function getStatus() {
+ const result = spawnSync( 'npx', [ 'wp-env', 'status', '--json' ], {
+ cwd: ROOT,
+ encoding: 'utf8'
+ });
+
+ try {
+ return JSON.parse( result.stdout.trim() );
+ } catch ( e ) {
+ return null;
+ }
+}
+
+function isPortFree( port ) {
+ return new Promise( ( resolve ) => {
+ const socket = net.createConnection({ host: '127.0.0.1', port, timeout: 1000 });
+ socket.once( 'connect', () => {
+ socket.destroy();
+ resolve( false );
+ });
+ socket.once( 'error', () => resolve( true ) );
+ socket.once( 'timeout', () => {
+ socket.destroy();
+ resolve( true );
+ });
+ });
+}
+
+function readOverride() {
+ try {
+ return JSON.parse( fs.readFileSync( OVERRIDE_PATH, 'utf8' ) );
+ } catch ( e ) {
+ return {};
+ }
+}
+
+async function main() {
+ const docker = spawnSync( 'docker', [ 'info' ], { stdio: 'ignore' });
+ if ( 0 !== docker.status ) {
+ console.error( 'Docker is not running. Start Docker Desktop and retry.' );
+ process.exit( 1 );
+ }
+
+ const status = getStatus();
+ if ( 'running' === status?.status ) {
+ console.log( `wp-env is already running at ${ status.urls.development } — reusing it.` );
+ return;
+ }
+
+ const override = readOverride();
+ let port =
+ parseInt( override.port, 10 ) ||
+ parseInt( process.env.WP_ENV_PORT || '', 10 ) ||
+ DEFAULT_PORT;
+
+ while ( ! ( await isPortFree( port ) ) ) {
+ console.log( `Port ${ port } is taken, trying ${ port + 1 }.` );
+ port += 1;
+ }
+
+ if ( override.port !== port ) {
+ fs.writeFileSync(
+ OVERRIDE_PATH,
+ JSON.stringify({ ...override, port }, null, '\t' ) + '\n'
+ );
+ console.log( `Pinned port ${ port } in .wp-env.override.json.` );
+ }
+
+ // Pass the resolved port explicitly so a stale WP_ENV_PORT in the caller's
+ // shell cannot override the pinned (verified-free) one.
+ const start = spawnSync( 'npx', [ 'wp-env', 'start' ], {
+ cwd: ROOT,
+ stdio: 'inherit',
+ env: { ...process.env, WP_ENV_PORT: String( port ) }
+ });
+
+ process.exit( start.status ?? 1 );
+}
+
+main();
diff --git a/composer.json b/composer.json
index fb0f332..e5f0a89 100644
--- a/composer.json
+++ b/composer.json
@@ -22,13 +22,15 @@
"ext-dom": "*"
},
"require-dev": {
- "codeinwp/phpcs-ruleset": "dev-main",
- "squizlabs/php_codesniffer": "^3.5",
- "dealerdirect/phpcodesniffer-composer-installer": "^0.7.1",
+ "squizlabs/php_codesniffer": "^3.13",
+ "dealerdirect/phpcodesniffer-composer-installer": "^1",
"phpcompatibility/php-compatibility": "^9.3",
"phpcompatibility/phpcompatibility-wp": "^2.1",
- "wp-coding-standards/wpcs": "*",
- "yoast/phpunit-polyfills": "^4.0"
+ "wp-coding-standards/wpcs": "^3.2",
+ "phpunit/phpunit": "^9.6",
+ "yoast/phpunit-polyfills": "^4.0",
+ "phpstan/phpstan": "^2.1",
+ "php-stubs/wordpress-stubs": "^6.8"
},
"autoload": {
"files": [
@@ -38,7 +40,7 @@
"config": {
"optimize-autoloader": true,
"platform": {
- "php": "7.2"
+ "php": "7.4"
},
"allow-plugins": {
"dealerdirect/phpcodesniffer-composer-installer": true
@@ -51,10 +53,11 @@
],
"scripts": {
"format": "./vendor/bin/phpcbf --standard=phpcs.xml --report-summary --report-source -s --runtime-set testVersion 7.0- ",
- "format-fix-exit": "./vendor/bin/phpcbf-fix-exit-0 --standard=phpcs.xml --report-summary --report-source -s --runtime-set testVersion 7.0- ",
"phpcs": "phpcs --standard=phpcs.xml -s --runtime-set testVersion 7.0-",
"lint": "composer run-script phpcs",
"phpcs-i": "phpcs -i",
- "phpunit": "phpunit"
+ "phpunit": "phpunit",
+ "phpstan": "phpstan --memory-limit=-1",
+ "phpstan:generate:baseline": "phpstan --generate-baseline --memory-limit=-1"
}
}
diff --git a/composer.lock b/composer.lock
index 5cf3def..d312d9a 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,20 +4,20 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
- "content-hash": "a24f823b2ab3a563eee875864f3b8d02",
+ "content-hash": "744ae16dff0084e7151825d4e2157447",
"packages": [
{
"name": "codeinwp/themeisle-sdk",
- "version": "3.3.55",
+ "version": "3.3.56",
"source": {
"type": "git",
"url": "https://github.com/Codeinwp/themeisle-sdk.git",
- "reference": "bd601798d209a4bc5962d2a19a22dc6dddf341cc"
+ "reference": "08dd8190f8c7e2ccc34d3b200c1fe073a761bf7a"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/Codeinwp/themeisle-sdk/zipball/bd601798d209a4bc5962d2a19a22dc6dddf341cc",
- "reference": "bd601798d209a4bc5962d2a19a22dc6dddf341cc",
+ "url": "https://api.github.com/repos/Codeinwp/themeisle-sdk/zipball/08dd8190f8c7e2ccc34d3b200c1fe073a761bf7a",
+ "reference": "08dd8190f8c7e2ccc34d3b200c1fe073a761bf7a",
"shasum": ""
},
"require-dev": {
@@ -43,121 +43,46 @@
],
"support": {
"issues": "https://github.com/Codeinwp/themeisle-sdk/issues",
- "source": "https://github.com/Codeinwp/themeisle-sdk/tree/v3.3.55"
+ "source": "https://github.com/Codeinwp/themeisle-sdk/tree/v3.3.56"
},
- "time": "2026-07-20T10:57:27+00:00"
+ "time": "2026-07-23T07:44:24+00:00"
}
],
"packages-dev": [
- {
- "name": "automattic/vipwpcs",
- "version": "2.3.3",
- "source": {
- "type": "git",
- "url": "https://github.com/Automattic/VIP-Coding-Standards.git",
- "reference": "6cd0a6a82bc0ac988dbf9d6a7c2e293dc8ac640b"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/Automattic/VIP-Coding-Standards/zipball/6cd0a6a82bc0ac988dbf9d6a7c2e293dc8ac640b",
- "reference": "6cd0a6a82bc0ac988dbf9d6a7c2e293dc8ac640b",
- "shasum": ""
- },
- "require": {
- "dealerdirect/phpcodesniffer-composer-installer": "^0.4.1 || ^0.5 || ^0.6.2 || ^0.7",
- "php": ">=5.4",
- "sirbrillig/phpcs-variable-analysis": "^2.11.1",
- "squizlabs/php_codesniffer": "^3.5.5",
- "wp-coding-standards/wpcs": "^2.3"
- },
- "require-dev": {
- "php-parallel-lint/php-console-highlighter": "^0.5",
- "php-parallel-lint/php-parallel-lint": "^1.0",
- "phpcompatibility/php-compatibility": "^9",
- "phpcsstandards/phpcsdevtools": "^1.0",
- "phpunit/phpunit": "^4 || ^5 || ^6 || ^7"
- },
- "type": "phpcodesniffer-standard",
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Contributors",
- "homepage": "https://github.com/Automattic/VIP-Coding-Standards/graphs/contributors"
- }
- ],
- "description": "PHP_CodeSniffer rules (sniffs) to enforce WordPress VIP minimum coding conventions",
- "keywords": [
- "phpcs",
- "standards",
- "wordpress"
- ],
- "time": "2021-09-29T16:20:23+00:00"
- },
- {
- "name": "codeinwp/phpcs-ruleset",
- "version": "dev-main",
- "source": {
- "type": "git",
- "url": "https://github.com/Codeinwp/phpcs-ruleset.git",
- "reference": "982f9881312252e6213cde07704b74da47b39475"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/Codeinwp/phpcs-ruleset/zipball/982f9881312252e6213cde07704b74da47b39475",
- "reference": "982f9881312252e6213cde07704b74da47b39475",
- "shasum": ""
- },
- "require": {
- "automattic/vipwpcs": "^2.0",
- "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0",
- "sirbrillig/phpcs-variable-analysis": "^2.10",
- "wptrt/wpthemereview": "*"
- },
- "bin": [
- "bin/phpcbf-fix-exit-0"
- ],
- "type": "phpcodesniffer-standard",
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "GPL-3.0-or-later"
- ],
- "description": "PHPCS coding standards for Themeisle products.",
- "time": "2021-05-05T16:55:27+00:00"
- },
{
"name": "dealerdirect/phpcodesniffer-composer-installer",
- "version": "v0.7.2",
+ "version": "v1.2.1",
"source": {
"type": "git",
- "url": "https://github.com/Dealerdirect/phpcodesniffer-composer-installer.git",
- "reference": "1c968e542d8843d7cd71de3c5c9c3ff3ad71a1db"
+ "url": "https://github.com/PHPCSStandards/composer-installer.git",
+ "reference": "963f0c67bffde0eac41b56be71ac0e8ba132f0bd"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/Dealerdirect/phpcodesniffer-composer-installer/zipball/1c968e542d8843d7cd71de3c5c9c3ff3ad71a1db",
- "reference": "1c968e542d8843d7cd71de3c5c9c3ff3ad71a1db",
+ "url": "https://api.github.com/repos/PHPCSStandards/composer-installer/zipball/963f0c67bffde0eac41b56be71ac0e8ba132f0bd",
+ "reference": "963f0c67bffde0eac41b56be71ac0e8ba132f0bd",
"shasum": ""
},
"require": {
- "composer-plugin-api": "^1.0 || ^2.0",
- "php": ">=5.3",
- "squizlabs/php_codesniffer": "^2.0 || ^3.1.0 || ^4.0"
+ "composer-plugin-api": "^2.2",
+ "php": ">=5.4",
+ "squizlabs/php_codesniffer": "^3.1.0 || ^4.0"
},
"require-dev": {
- "composer/composer": "*",
- "php-parallel-lint/php-parallel-lint": "^1.3.1",
- "phpcompatibility/php-compatibility": "^9.0"
+ "composer/composer": "^2.2",
+ "ext-json": "*",
+ "ext-zip": "*",
+ "php-parallel-lint/php-parallel-lint": "^1.4.0",
+ "phpcompatibility/php-compatibility": "^9.0 || ^10.0.0@dev",
+ "yoast/phpunit-polyfills": "^1.0"
},
"type": "composer-plugin",
"extra": {
- "class": "Dealerdirect\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\Plugin"
+ "class": "PHPCSStandards\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\Plugin"
},
"autoload": {
"psr-4": {
- "Dealerdirect\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\": "src/"
+ "PHPCSStandards\\Composer\\Plugin\\Installers\\PHPCodeSniffer\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
@@ -167,17 +92,16 @@
"authors": [
{
"name": "Franck Nijhof",
- "email": "franck.nijhof@dealerdirect.com",
- "homepage": "http://www.frenck.nl",
- "role": "Developer / IT Manager"
+ "email": "opensource@frenck.dev",
+ "homepage": "https://frenck.dev",
+ "role": "Open source developer"
},
{
"name": "Contributors",
- "homepage": "https://github.com/Dealerdirect/phpcodesniffer-composer-installer/graphs/contributors"
+ "homepage": "https://github.com/PHPCSStandards/composer-installer/graphs/contributors"
}
],
"description": "PHP_CodeSniffer Standards Composer Installer Plugin",
- "homepage": "http://www.dealerdirect.com",
"keywords": [
"PHPCodeSniffer",
"PHP_CodeSniffer",
@@ -196,7 +120,30 @@
"stylecheck",
"tests"
],
- "time": "2022-02-04T12:51:07+00:00"
+ "support": {
+ "issues": "https://github.com/PHPCSStandards/composer-installer/issues",
+ "security": "https://github.com/PHPCSStandards/composer-installer/security/policy",
+ "source": "https://github.com/PHPCSStandards/composer-installer"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/PHPCSStandards",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/jrfnl",
+ "type": "github"
+ },
+ {
+ "url": "https://opencollective.com/php_codesniffer",
+ "type": "open_collective"
+ },
+ {
+ "url": "https://thanks.dev/u/gh/phpcsstandards",
+ "type": "thanks_dev"
+ }
+ ],
+ "time": "2026-05-06T08:26:05+00:00"
},
{
"name": "doctrine/instantiator",
@@ -328,6 +275,63 @@
],
"time": "2025-08-01T08:46:24+00:00"
},
+ {
+ "name": "nikic/php-parser",
+ "version": "v5.8.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/nikic/PHP-Parser.git",
+ "reference": "044a6a392ff8ad0d61f14370a5fbbd0a0107152f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/044a6a392ff8ad0d61f14370a5fbbd0a0107152f",
+ "reference": "044a6a392ff8ad0d61f14370a5fbbd0a0107152f",
+ "shasum": ""
+ },
+ "require": {
+ "ext-json": "*",
+ "ext-tokenizer": "*",
+ "php": ">=7.4"
+ },
+ "require-dev": {
+ "ircmaxell/php-yacc": "^0.0.7",
+ "phpunit/phpunit": "^9.0"
+ },
+ "bin": [
+ "bin/php-parse"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "5.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "PhpParser\\": "lib/PhpParser"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Nikita Popov"
+ }
+ ],
+ "description": "A PHP parser written in PHP",
+ "keywords": [
+ "parser",
+ "php"
+ ],
+ "support": {
+ "issues": "https://github.com/nikic/PHP-Parser/issues",
+ "source": "https://github.com/nikic/PHP-Parser/tree/v5.8.0"
+ },
+ "time": "2026-07-04T14:30:18+00:00"
+ },
{
"name": "phar-io/manifest",
"version": "2.0.4",
@@ -446,6 +450,58 @@
},
"time": "2022-02-21T01:04:05+00:00"
},
+ {
+ "name": "php-stubs/wordpress-stubs",
+ "version": "v6.9.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-stubs/wordpress-stubs.git",
+ "reference": "90a9412826b9944f93b10bf41d795b5fe68abcd5"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-stubs/wordpress-stubs/zipball/90a9412826b9944f93b10bf41d795b5fe68abcd5",
+ "reference": "90a9412826b9944f93b10bf41d795b5fe68abcd5",
+ "shasum": ""
+ },
+ "conflict": {
+ "phpdocumentor/reflection-docblock": "5.6.1"
+ },
+ "require-dev": {
+ "dealerdirect/phpcodesniffer-composer-installer": "^1.0",
+ "nikic/php-parser": "^5.5",
+ "php": "^7.4 || ^8.0",
+ "php-stubs/generator": "^0.8.6",
+ "phpdocumentor/reflection-docblock": "^6.0",
+ "phpstan/phpstan": "^2.1",
+ "phpunit/phpunit": "^9.5",
+ "symfony/polyfill-php80": "*",
+ "szepeviktor/phpcs-psr-12-neutron-hybrid-ruleset": "^1.1.1",
+ "wp-coding-standards/wpcs": "3.1.0 as 2.3.0"
+ },
+ "suggest": {
+ "paragonie/sodium_compat": "Pure PHP implementation of libsodium",
+ "symfony/polyfill-php80": "Symfony polyfill backporting some PHP 8.0+ features to lower PHP versions",
+ "szepeviktor/phpstan-wordpress": "WordPress extensions for PHPStan"
+ },
+ "type": "library",
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "WordPress function and class declaration stubs for static analysis.",
+ "homepage": "https://github.com/php-stubs/wordpress-stubs",
+ "keywords": [
+ "PHPStan",
+ "static analysis",
+ "wordpress"
+ ],
+ "support": {
+ "issues": "https://github.com/php-stubs/wordpress-stubs/issues",
+ "source": "https://github.com/php-stubs/wordpress-stubs/tree/v6.9.4"
+ },
+ "time": "2026-05-01T20:36:01+00:00"
+ },
{
"name": "phpcompatibility/php-compatibility",
"version": "9.3.5",
@@ -510,16 +566,16 @@
},
{
"name": "phpcompatibility/phpcompatibility-paragonie",
- "version": "1.3.3",
+ "version": "1.3.4",
"source": {
"type": "git",
"url": "https://github.com/PHPCompatibility/PHPCompatibilityParagonie.git",
- "reference": "293975b465e0e709b571cbf0c957c6c0a7b9a2ac"
+ "reference": "244d7b04fc4bc2117c15f5abe23eb933b5f02bbf"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/PHPCompatibility/PHPCompatibilityParagonie/zipball/293975b465e0e709b571cbf0c957c6c0a7b9a2ac",
- "reference": "293975b465e0e709b571cbf0c957c6c0a7b9a2ac",
+ "url": "https://api.github.com/repos/PHPCompatibility/PHPCompatibilityParagonie/zipball/244d7b04fc4bc2117c15f5abe23eb933b5f02bbf",
+ "reference": "244d7b04fc4bc2117c15f5abe23eb933b5f02bbf",
"shasum": ""
},
"require": {
@@ -576,22 +632,26 @@
{
"url": "https://opencollective.com/php_codesniffer",
"type": "open_collective"
+ },
+ {
+ "url": "https://thanks.dev/u/gh/phpcompatibility",
+ "type": "thanks_dev"
}
],
- "time": "2024-04-24T21:30:46+00:00"
+ "time": "2025-09-19T17:43:28+00:00"
},
{
"name": "phpcompatibility/phpcompatibility-wp",
- "version": "2.1.7",
+ "version": "2.1.8",
"source": {
"type": "git",
"url": "https://github.com/PHPCompatibility/PHPCompatibilityWP.git",
- "reference": "5bfbbfbabb3df2b9a83e601de9153e4a7111962c"
+ "reference": "7c8d18b4d90dac9e86b0869a608fa09158e168fa"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/PHPCompatibility/PHPCompatibilityWP/zipball/5bfbbfbabb3df2b9a83e601de9153e4a7111962c",
- "reference": "5bfbbfbabb3df2b9a83e601de9153e4a7111962c",
+ "url": "https://api.github.com/repos/PHPCompatibility/PHPCompatibilityWP/zipball/7c8d18b4d90dac9e86b0869a608fa09158e168fa",
+ "reference": "7c8d18b4d90dac9e86b0869a608fa09158e168fa",
"shasum": ""
},
"require": {
@@ -653,44 +713,287 @@
"type": "thanks_dev"
}
],
- "time": "2025-05-12T16:38:37+00:00"
+ "time": "2025-10-18T00:05:59+00:00"
+ },
+ {
+ "name": "phpcsstandards/phpcsextra",
+ "version": "1.5.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/PHPCSStandards/PHPCSExtra.git",
+ "reference": "b598aa890815b8df16363271b659d73280129101"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/PHPCSStandards/PHPCSExtra/zipball/b598aa890815b8df16363271b659d73280129101",
+ "reference": "b598aa890815b8df16363271b659d73280129101",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.4",
+ "phpcsstandards/phpcsutils": "^1.2.0",
+ "squizlabs/php_codesniffer": "^3.13.5 || ^4.0.1"
+ },
+ "require-dev": {
+ "php-parallel-lint/php-console-highlighter": "^1.0",
+ "php-parallel-lint/php-parallel-lint": "^1.4.0",
+ "phpcsstandards/phpcsdevcs": "^1.2.0",
+ "phpcsstandards/phpcsdevtools": "^1.2.1",
+ "phpunit/phpunit": "^4.5 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.3.4"
+ },
+ "type": "phpcodesniffer-standard",
+ "extra": {
+ "branch-alias": {
+ "dev-stable": "1.x-dev",
+ "dev-develop": "1.x-dev"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "LGPL-3.0-or-later"
+ ],
+ "authors": [
+ {
+ "name": "Juliette Reinders Folmer",
+ "homepage": "https://github.com/jrfnl",
+ "role": "lead"
+ },
+ {
+ "name": "Contributors",
+ "homepage": "https://github.com/PHPCSStandards/PHPCSExtra/graphs/contributors"
+ }
+ ],
+ "description": "A collection of sniffs and standards for use with PHP_CodeSniffer.",
+ "keywords": [
+ "PHP_CodeSniffer",
+ "phpcbf",
+ "phpcodesniffer-standard",
+ "phpcs",
+ "standards",
+ "static analysis"
+ ],
+ "support": {
+ "issues": "https://github.com/PHPCSStandards/PHPCSExtra/issues",
+ "security": "https://github.com/PHPCSStandards/PHPCSExtra/security/policy",
+ "source": "https://github.com/PHPCSStandards/PHPCSExtra"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/PHPCSStandards",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/jrfnl",
+ "type": "github"
+ },
+ {
+ "url": "https://opencollective.com/php_codesniffer",
+ "type": "open_collective"
+ },
+ {
+ "url": "https://thanks.dev/u/gh/phpcsstandards",
+ "type": "thanks_dev"
+ }
+ ],
+ "time": "2025-11-12T23:06:57+00:00"
+ },
+ {
+ "name": "phpcsstandards/phpcsutils",
+ "version": "1.2.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/PHPCSStandards/PHPCSUtils.git",
+ "reference": "c216317e96c8b3f5932808f9b0f1f7a14e3bbf55"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/PHPCSStandards/PHPCSUtils/zipball/c216317e96c8b3f5932808f9b0f1f7a14e3bbf55",
+ "reference": "c216317e96c8b3f5932808f9b0f1f7a14e3bbf55",
+ "shasum": ""
+ },
+ "require": {
+ "dealerdirect/phpcodesniffer-composer-installer": "^0.4.1 || ^0.5 || ^0.6.2 || ^0.7 || ^1.0",
+ "php": ">=5.4",
+ "squizlabs/php_codesniffer": "^3.13.5 || ^4.0.1"
+ },
+ "require-dev": {
+ "ext-filter": "*",
+ "php-parallel-lint/php-console-highlighter": "^1.0",
+ "php-parallel-lint/php-parallel-lint": "^1.4.0",
+ "phpcsstandards/phpcsdevcs": "^1.2.0",
+ "yoast/phpunit-polyfills": "^1.1.0 || ^2.0.0 || ^3.0.0"
+ },
+ "type": "phpcodesniffer-standard",
+ "extra": {
+ "branch-alias": {
+ "dev-stable": "1.x-dev",
+ "dev-develop": "1.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "PHPCSUtils/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "LGPL-3.0-or-later"
+ ],
+ "authors": [
+ {
+ "name": "Juliette Reinders Folmer",
+ "homepage": "https://github.com/jrfnl",
+ "role": "lead"
+ },
+ {
+ "name": "Contributors",
+ "homepage": "https://github.com/PHPCSStandards/PHPCSUtils/graphs/contributors"
+ }
+ ],
+ "description": "A suite of utility functions for use with PHP_CodeSniffer",
+ "homepage": "https://phpcsutils.com/",
+ "keywords": [
+ "PHP_CodeSniffer",
+ "phpcbf",
+ "phpcodesniffer-standard",
+ "phpcs",
+ "phpcs3",
+ "phpcs4",
+ "standards",
+ "static analysis",
+ "tokens",
+ "utility"
+ ],
+ "support": {
+ "docs": "https://phpcsutils.com/",
+ "issues": "https://github.com/PHPCSStandards/PHPCSUtils/issues",
+ "security": "https://github.com/PHPCSStandards/PHPCSUtils/security/policy",
+ "source": "https://github.com/PHPCSStandards/PHPCSUtils"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/PHPCSStandards",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/jrfnl",
+ "type": "github"
+ },
+ {
+ "url": "https://opencollective.com/php_codesniffer",
+ "type": "open_collective"
+ },
+ {
+ "url": "https://thanks.dev/u/gh/phpcsstandards",
+ "type": "thanks_dev"
+ }
+ ],
+ "time": "2025-12-08T14:27:58+00:00"
+ },
+ {
+ "name": "phpstan/phpstan",
+ "version": "2.2.5",
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpstan/phpstan/zipball/909c1e5fef7989ac0d0c1c5c42e32a5c4f6198a0",
+ "reference": "909c1e5fef7989ac0d0c1c5c42e32a5c4f6198a0",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.4|^8.0"
+ },
+ "conflict": {
+ "phpstan/phpstan-shim": "*"
+ },
+ "bin": [
+ "phpstan",
+ "phpstan.phar"
+ ],
+ "type": "library",
+ "autoload": {
+ "files": [
+ "bootstrap.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Ondřej Mirtes"
+ },
+ {
+ "name": "Markus Staab"
+ },
+ {
+ "name": "Vincent Langlet"
+ }
+ ],
+ "description": "PHPStan - PHP Static Analysis Tool",
+ "keywords": [
+ "dev",
+ "static analysis"
+ ],
+ "support": {
+ "docs": "https://phpstan.org/user-guide/getting-started",
+ "forum": "https://github.com/phpstan/phpstan/discussions",
+ "issues": "https://github.com/phpstan/phpstan/issues",
+ "security": "https://github.com/phpstan/phpstan/security/policy",
+ "source": "https://github.com/phpstan/phpstan-src"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/ondrejmirtes",
+ "type": "github"
+ },
+ {
+ "url": "https://github.com/phpstan",
+ "type": "github"
+ }
+ ],
+ "time": "2026-07-05T06:31:06+00:00"
},
{
"name": "phpunit/php-code-coverage",
- "version": "7.0.17",
+ "version": "9.2.32",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/php-code-coverage.git",
- "reference": "40a4ed114a4aea5afd6df8d0f0c9cd3033097f66"
+ "reference": "85402a822d1ecf1db1096959413d35e1c37cf1a5"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/40a4ed114a4aea5afd6df8d0f0c9cd3033097f66",
- "reference": "40a4ed114a4aea5afd6df8d0f0c9cd3033097f66",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/85402a822d1ecf1db1096959413d35e1c37cf1a5",
+ "reference": "85402a822d1ecf1db1096959413d35e1c37cf1a5",
"shasum": ""
},
"require": {
"ext-dom": "*",
+ "ext-libxml": "*",
"ext-xmlwriter": "*",
- "php": ">=7.2",
- "phpunit/php-file-iterator": "^2.0.2",
- "phpunit/php-text-template": "^1.2.1",
- "phpunit/php-token-stream": "^3.1.3 || ^4.0",
- "sebastian/code-unit-reverse-lookup": "^1.0.1",
- "sebastian/environment": "^4.2.2",
- "sebastian/version": "^2.0.1",
- "theseer/tokenizer": "^1.1.3"
+ "nikic/php-parser": "^4.19.1 || ^5.1.0",
+ "php": ">=7.3",
+ "phpunit/php-file-iterator": "^3.0.6",
+ "phpunit/php-text-template": "^2.0.4",
+ "sebastian/code-unit-reverse-lookup": "^2.0.3",
+ "sebastian/complexity": "^2.0.3",
+ "sebastian/environment": "^5.1.5",
+ "sebastian/lines-of-code": "^1.0.4",
+ "sebastian/version": "^3.0.2",
+ "theseer/tokenizer": "^1.2.3"
},
"require-dev": {
- "phpunit/phpunit": "^8.2.2"
+ "phpunit/phpunit": "^9.6"
},
"suggest": {
- "ext-xdebug": "^2.7.2"
+ "ext-pcov": "PHP extension that provides line coverage",
+ "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "7.0-dev"
+ "dev-main": "9.2.x-dev"
}
},
"autoload": {
@@ -718,7 +1021,8 @@
],
"support": {
"issues": "https://github.com/sebastianbergmann/php-code-coverage/issues",
- "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/7.0.17"
+ "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy",
+ "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.32"
},
"funding": [
{
@@ -726,32 +1030,32 @@
"type": "github"
}
],
- "time": "2024-03-02T06:09:37+00:00"
+ "time": "2024-08-22T04:23:01+00:00"
},
{
"name": "phpunit/php-file-iterator",
- "version": "2.0.6",
+ "version": "3.0.6",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/php-file-iterator.git",
- "reference": "69deeb8664f611f156a924154985fbd4911eb36b"
+ "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/69deeb8664f611f156a924154985fbd4911eb36b",
- "reference": "69deeb8664f611f156a924154985fbd4911eb36b",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf",
+ "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf",
"shasum": ""
},
"require": {
- "php": ">=7.1"
+ "php": ">=7.3"
},
"require-dev": {
- "phpunit/phpunit": "^8.5"
+ "phpunit/phpunit": "^9.3"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "2.0.x-dev"
+ "dev-master": "3.0-dev"
}
},
"autoload": {
@@ -778,7 +1082,70 @@
],
"support": {
"issues": "https://github.com/sebastianbergmann/php-file-iterator/issues",
- "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/2.0.6"
+ "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.6"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2021-12-02T12:48:52+00:00"
+ },
+ {
+ "name": "phpunit/php-invoker",
+ "version": "3.1.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-invoker.git",
+ "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67",
+ "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "ext-pcntl": "*",
+ "phpunit/phpunit": "^9.3"
+ },
+ "suggest": {
+ "ext-pcntl": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.1-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Invoke callables with a timeout",
+ "homepage": "https://github.com/sebastianbergmann/php-invoker/",
+ "keywords": [
+ "process"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/php-invoker/issues",
+ "source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1"
},
"funding": [
{
@@ -786,26 +1153,34 @@
"type": "github"
}
],
- "time": "2024-03-01T13:39:50+00:00"
+ "time": "2020-09-28T05:58:55+00:00"
},
{
"name": "phpunit/php-text-template",
- "version": "1.2.1",
+ "version": "2.0.4",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/php-text-template.git",
- "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686"
+ "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686",
- "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28",
+ "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28",
"shasum": ""
},
"require": {
- "php": ">=5.3.3"
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
},
"type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0-dev"
+ }
+ },
"autoload": {
"classmap": [
"src/"
@@ -829,37 +1204,135 @@
],
"support": {
"issues": "https://github.com/sebastianbergmann/php-text-template/issues",
- "source": "https://github.com/sebastianbergmann/php-text-template/tree/1.2.1"
+ "source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4"
},
- "time": "2015-06-21T13:50:34+00:00"
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-26T05:33:50+00:00"
},
{
"name": "phpunit/php-timer",
- "version": "2.1.4",
+ "version": "5.0.3",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/php-timer.git",
- "reference": "a691211e94ff39a34811abd521c31bd5b305b0bb"
+ "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2",
+ "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "5.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Utility class for timing",
+ "homepage": "https://github.com/sebastianbergmann/php-timer/",
+ "keywords": [
+ "timer"
+ ],
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/php-timer/issues",
+ "source": "https://github.com/sebastianbergmann/php-timer/tree/5.0.3"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2020-10-26T13:16:10+00:00"
+ },
+ {
+ "name": "phpunit/phpunit",
+ "version": "9.6.35",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/phpunit.git",
+ "reference": "0edba2f3a0c48df3553cb9b640810b30df60302b"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/a691211e94ff39a34811abd521c31bd5b305b0bb",
- "reference": "a691211e94ff39a34811abd521c31bd5b305b0bb",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/0edba2f3a0c48df3553cb9b640810b30df60302b",
+ "reference": "0edba2f3a0c48df3553cb9b640810b30df60302b",
"shasum": ""
},
"require": {
- "php": ">=7.1"
+ "doctrine/instantiator": "^1.5.0 || ^2",
+ "ext-dom": "*",
+ "ext-filter": "*",
+ "ext-json": "*",
+ "ext-libxml": "*",
+ "ext-mbstring": "*",
+ "ext-xmlwriter": "*",
+ "myclabs/deep-copy": "^1.13.4",
+ "phar-io/manifest": "^2.0.4",
+ "phar-io/version": "^3.2.1",
+ "php": ">=7.3",
+ "phpunit/php-code-coverage": "^9.2.32",
+ "phpunit/php-file-iterator": "^3.0.6",
+ "phpunit/php-invoker": "^3.1.1",
+ "phpunit/php-text-template": "^2.0.4",
+ "phpunit/php-timer": "^5.0.3",
+ "sebastian/cli-parser": "^1.0.2",
+ "sebastian/code-unit": "^1.0.8",
+ "sebastian/comparator": "^4.0.10",
+ "sebastian/diff": "^4.0.6",
+ "sebastian/environment": "^5.1.5",
+ "sebastian/exporter": "^4.0.8",
+ "sebastian/global-state": "^5.0.8",
+ "sebastian/object-enumerator": "^4.0.4",
+ "sebastian/resource-operations": "^3.0.4",
+ "sebastian/type": "^3.2.1",
+ "sebastian/version": "^3.0.2"
},
- "require-dev": {
- "phpunit/phpunit": "^8.5"
+ "suggest": {
+ "ext-soap": "To be able to generate mocks based on WSDL files",
+ "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage"
},
+ "bin": [
+ "phpunit"
+ ],
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "2.1-dev"
+ "dev-master": "9.6-dev"
}
},
"autoload": {
+ "files": [
+ "src/Framework/Assert/Functions.php"
+ ],
"classmap": [
"src/"
]
@@ -875,48 +1348,50 @@
"role": "lead"
}
],
- "description": "Utility class for timing",
- "homepage": "https://github.com/sebastianbergmann/php-timer/",
+ "description": "The PHP Unit Testing framework.",
+ "homepage": "https://phpunit.de/",
"keywords": [
- "timer"
+ "phpunit",
+ "testing",
+ "xunit"
],
"support": {
- "issues": "https://github.com/sebastianbergmann/php-timer/issues",
- "source": "https://github.com/sebastianbergmann/php-timer/tree/2.1.4"
+ "issues": "https://github.com/sebastianbergmann/phpunit/issues",
+ "security": "https://github.com/sebastianbergmann/phpunit/security/policy",
+ "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.35"
},
"funding": [
{
- "url": "https://github.com/sebastianbergmann",
- "type": "github"
+ "url": "https://phpunit.de/sponsoring.html",
+ "type": "other"
}
],
- "time": "2024-03-01T13:42:41+00:00"
+ "time": "2026-07-06T14:48:07+00:00"
},
{
- "name": "phpunit/php-token-stream",
- "version": "3.1.3",
+ "name": "sebastian/cli-parser",
+ "version": "1.0.2",
"source": {
"type": "git",
- "url": "https://github.com/sebastianbergmann/php-token-stream.git",
- "reference": "9c1da83261628cb24b6a6df371b6e312b3954768"
+ "url": "https://github.com/sebastianbergmann/cli-parser.git",
+ "reference": "2b56bea83a09de3ac06bb18b92f068e60cc6f50b"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/9c1da83261628cb24b6a6df371b6e312b3954768",
- "reference": "9c1da83261628cb24b6a6df371b6e312b3954768",
+ "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/2b56bea83a09de3ac06bb18b92f068e60cc6f50b",
+ "reference": "2b56bea83a09de3ac06bb18b92f068e60cc6f50b",
"shasum": ""
},
"require": {
- "ext-tokenizer": "*",
- "php": ">=7.1"
+ "php": ">=7.3"
},
"require-dev": {
- "phpunit/phpunit": "^7.0"
+ "phpunit/phpunit": "^9.3"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "3.1-dev"
+ "dev-master": "1.0-dev"
}
},
"autoload": {
@@ -931,17 +1406,15 @@
"authors": [
{
"name": "Sebastian Bergmann",
- "email": "sebastian@phpunit.de"
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
}
],
- "description": "Wrapper around PHP's tokenizer extension.",
- "homepage": "https://github.com/sebastianbergmann/php-token-stream/",
- "keywords": [
- "tokenizer"
- ],
+ "description": "Library for parsing CLI options",
+ "homepage": "https://github.com/sebastianbergmann/cli-parser",
"support": {
- "issues": "https://github.com/sebastianbergmann/php-token-stream/issues",
- "source": "https://github.com/sebastianbergmann/php-token-stream/tree/3.1.3"
+ "issues": "https://github.com/sebastianbergmann/cli-parser/issues",
+ "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.2"
},
"funding": [
{
@@ -949,61 +1422,32 @@
"type": "github"
}
],
- "abandoned": true,
- "time": "2021-07-26T12:15:06+00:00"
+ "time": "2024-03-02T06:27:43+00:00"
},
{
- "name": "phpunit/phpunit",
- "version": "8.5.52",
+ "name": "sebastian/code-unit",
+ "version": "1.0.8",
"source": {
"type": "git",
- "url": "https://github.com/sebastianbergmann/phpunit.git",
- "reference": "1015741814413c156abb0f53d7db7bbd03c6e858"
+ "url": "https://github.com/sebastianbergmann/code-unit.git",
+ "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/1015741814413c156abb0f53d7db7bbd03c6e858",
- "reference": "1015741814413c156abb0f53d7db7bbd03c6e858",
+ "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/1fc9f64c0927627ef78ba436c9b17d967e68e120",
+ "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120",
"shasum": ""
},
"require": {
- "doctrine/instantiator": "^1.5.0",
- "ext-dom": "*",
- "ext-json": "*",
- "ext-libxml": "*",
- "ext-mbstring": "*",
- "ext-xml": "*",
- "ext-xmlwriter": "*",
- "myclabs/deep-copy": "^1.13.4",
- "phar-io/manifest": "^2.0.4",
- "phar-io/version": "^3.2.1",
- "php": ">=7.2",
- "phpunit/php-code-coverage": "^7.0.17",
- "phpunit/php-file-iterator": "^2.0.6",
- "phpunit/php-text-template": "^1.2.1",
- "phpunit/php-timer": "^2.1.4",
- "sebastian/comparator": "^3.0.7",
- "sebastian/diff": "^3.0.6",
- "sebastian/environment": "^4.2.5",
- "sebastian/exporter": "^3.1.8",
- "sebastian/global-state": "^3.0.6",
- "sebastian/object-enumerator": "^3.0.5",
- "sebastian/resource-operations": "^2.0.3",
- "sebastian/type": "^1.1.5",
- "sebastian/version": "^2.0.1"
+ "php": ">=7.3"
},
- "suggest": {
- "ext-soap": "To be able to generate mocks based on WSDL files",
- "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage",
- "phpunit/php-invoker": "To allow enforcing time limits"
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
},
- "bin": [
- "phpunit"
- ],
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "8.5-dev"
+ "dev-master": "1.0-dev"
}
},
"autoload": {
@@ -1022,66 +1466,44 @@
"role": "lead"
}
],
- "description": "The PHP Unit Testing framework.",
- "homepage": "https://phpunit.de/",
- "keywords": [
- "phpunit",
- "testing",
- "xunit"
- ],
+ "description": "Collection of value objects that represent the PHP code units",
+ "homepage": "https://github.com/sebastianbergmann/code-unit",
"support": {
- "issues": "https://github.com/sebastianbergmann/phpunit/issues",
- "security": "https://github.com/sebastianbergmann/phpunit/security/policy",
- "source": "https://github.com/sebastianbergmann/phpunit/tree/8.5.52"
+ "issues": "https://github.com/sebastianbergmann/code-unit/issues",
+ "source": "https://github.com/sebastianbergmann/code-unit/tree/1.0.8"
},
"funding": [
- {
- "url": "https://phpunit.de/sponsors.html",
- "type": "custom"
- },
{
"url": "https://github.com/sebastianbergmann",
"type": "github"
- },
- {
- "url": "https://liberapay.com/sebastianbergmann",
- "type": "liberapay"
- },
- {
- "url": "https://thanks.dev/u/gh/sebastianbergmann",
- "type": "thanks_dev"
- },
- {
- "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit",
- "type": "tidelift"
}
],
- "time": "2026-01-27T05:20:18+00:00"
+ "time": "2020-10-26T13:08:54+00:00"
},
{
"name": "sebastian/code-unit-reverse-lookup",
- "version": "1.0.3",
+ "version": "2.0.3",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git",
- "reference": "92a1a52e86d34cde6caa54f1b5ffa9fda18e5d54"
+ "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/92a1a52e86d34cde6caa54f1b5ffa9fda18e5d54",
- "reference": "92a1a52e86d34cde6caa54f1b5ffa9fda18e5d54",
+ "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5",
+ "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5",
"shasum": ""
},
"require": {
- "php": ">=5.6"
+ "php": ">=7.3"
},
"require-dev": {
- "phpunit/phpunit": "^8.5"
+ "phpunit/phpunit": "^9.3"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.0.x-dev"
+ "dev-master": "2.0-dev"
}
},
"autoload": {
@@ -1103,7 +1525,7 @@
"homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/",
"support": {
"issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues",
- "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/1.0.3"
+ "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3"
},
"funding": [
{
@@ -1111,34 +1533,34 @@
"type": "github"
}
],
- "time": "2024-03-01T13:45:45+00:00"
+ "time": "2020-09-28T05:30:19+00:00"
},
{
"name": "sebastian/comparator",
- "version": "3.0.7",
+ "version": "4.0.10",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/comparator.git",
- "reference": "bc7d8ac2fe1cce229bff9b5fd4efe65918a1ff52"
+ "reference": "e4df00b9b3571187db2831ae9aada2c6efbd715d"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/bc7d8ac2fe1cce229bff9b5fd4efe65918a1ff52",
- "reference": "bc7d8ac2fe1cce229bff9b5fd4efe65918a1ff52",
+ "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/e4df00b9b3571187db2831ae9aada2c6efbd715d",
+ "reference": "e4df00b9b3571187db2831ae9aada2c6efbd715d",
"shasum": ""
},
"require": {
- "php": ">=7.1",
- "sebastian/diff": "^3.0",
- "sebastian/exporter": "^3.1"
+ "php": ">=7.3",
+ "sebastian/diff": "^4.0",
+ "sebastian/exporter": "^4.0"
},
"require-dev": {
- "phpunit/phpunit": "^8.5"
+ "phpunit/phpunit": "^9.3"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "3.0-dev"
+ "dev-master": "4.0-dev"
}
},
"autoload": {
@@ -1177,7 +1599,7 @@
],
"support": {
"issues": "https://github.com/sebastianbergmann/comparator/issues",
- "source": "https://github.com/sebastianbergmann/comparator/tree/3.0.7"
+ "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.10"
},
"funding": [
{
@@ -1197,33 +1619,90 @@
"type": "tidelift"
}
],
- "time": "2026-01-24T09:20:25+00:00"
+ "time": "2026-01-24T09:22:56+00:00"
+ },
+ {
+ "name": "sebastian/complexity",
+ "version": "2.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/complexity.git",
+ "reference": "25f207c40d62b8b7aa32f5ab026c53561964053a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/25f207c40d62b8b7aa32f5ab026c53561964053a",
+ "reference": "25f207c40d62b8b7aa32f5ab026c53561964053a",
+ "shasum": ""
+ },
+ "require": {
+ "nikic/php-parser": "^4.18 || ^5.0",
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "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",
+ "role": "lead"
+ }
+ ],
+ "description": "Library for calculating the complexity of PHP code units",
+ "homepage": "https://github.com/sebastianbergmann/complexity",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/complexity/issues",
+ "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.3"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-12-22T06:19:30+00:00"
},
{
"name": "sebastian/diff",
- "version": "3.0.6",
+ "version": "4.0.6",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/diff.git",
- "reference": "98ff311ca519c3aa73ccd3de053bdb377171d7b6"
+ "reference": "ba01945089c3a293b01ba9badc29ad55b106b0bc"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/98ff311ca519c3aa73ccd3de053bdb377171d7b6",
- "reference": "98ff311ca519c3aa73ccd3de053bdb377171d7b6",
+ "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/ba01945089c3a293b01ba9badc29ad55b106b0bc",
+ "reference": "ba01945089c3a293b01ba9badc29ad55b106b0bc",
"shasum": ""
},
"require": {
- "php": ">=7.1"
+ "php": ">=7.3"
},
"require-dev": {
- "phpunit/phpunit": "^7.5 || ^8.0",
- "symfony/process": "^2 || ^3.3 || ^4"
+ "phpunit/phpunit": "^9.3",
+ "symfony/process": "^4.2 || ^5"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "3.0-dev"
+ "dev-master": "4.0-dev"
}
},
"autoload": {
@@ -1255,7 +1734,7 @@
],
"support": {
"issues": "https://github.com/sebastianbergmann/diff/issues",
- "source": "https://github.com/sebastianbergmann/diff/tree/3.0.6"
+ "source": "https://github.com/sebastianbergmann/diff/tree/4.0.6"
},
"funding": [
{
@@ -1263,27 +1742,27 @@
"type": "github"
}
],
- "time": "2024-03-02T06:16:36+00:00"
+ "time": "2024-03-02T06:30:58+00:00"
},
{
"name": "sebastian/environment",
- "version": "4.2.5",
+ "version": "5.1.5",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/environment.git",
- "reference": "56932f6049a0482853056ffd617c91ffcc754205"
+ "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/56932f6049a0482853056ffd617c91ffcc754205",
- "reference": "56932f6049a0482853056ffd617c91ffcc754205",
+ "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/830c43a844f1f8d5b7a1f6d6076b784454d8b7ed",
+ "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed",
"shasum": ""
},
"require": {
- "php": ">=7.1"
+ "php": ">=7.3"
},
"require-dev": {
- "phpunit/phpunit": "^7.5"
+ "phpunit/phpunit": "^9.3"
},
"suggest": {
"ext-posix": "*"
@@ -1291,7 +1770,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "4.2-dev"
+ "dev-master": "5.1-dev"
}
},
"autoload": {
@@ -1318,7 +1797,7 @@
],
"support": {
"issues": "https://github.com/sebastianbergmann/environment/issues",
- "source": "https://github.com/sebastianbergmann/environment/tree/4.2.5"
+ "source": "https://github.com/sebastianbergmann/environment/tree/5.1.5"
},
"funding": [
{
@@ -1326,34 +1805,34 @@
"type": "github"
}
],
- "time": "2024-03-01T13:49:59+00:00"
+ "time": "2023-02-03T06:03:51+00:00"
},
{
"name": "sebastian/exporter",
- "version": "3.1.8",
+ "version": "4.0.8",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/exporter.git",
- "reference": "64cfeaa341951ceb2019d7b98232399d57bb2296"
+ "reference": "14c6ba52f95a36c3d27c835d65efc7123c446e8c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/64cfeaa341951ceb2019d7b98232399d57bb2296",
- "reference": "64cfeaa341951ceb2019d7b98232399d57bb2296",
+ "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/14c6ba52f95a36c3d27c835d65efc7123c446e8c",
+ "reference": "14c6ba52f95a36c3d27c835d65efc7123c446e8c",
"shasum": ""
},
"require": {
- "php": ">=7.2",
- "sebastian/recursion-context": "^3.0"
+ "php": ">=7.3",
+ "sebastian/recursion-context": "^4.0"
},
"require-dev": {
"ext-mbstring": "*",
- "phpunit/phpunit": "^8.5"
+ "phpunit/phpunit": "^9.3"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "3.1.x-dev"
+ "dev-master": "4.0-dev"
}
},
"autoload": {
@@ -1388,14 +1867,14 @@
}
],
"description": "Provides the functionality to export PHP variables for visualization",
- "homepage": "http://www.github.com/sebastianbergmann/exporter",
+ "homepage": "https://www.github.com/sebastianbergmann/exporter",
"keywords": [
"export",
"exporter"
],
"support": {
"issues": "https://github.com/sebastianbergmann/exporter/issues",
- "source": "https://github.com/sebastianbergmann/exporter/tree/3.1.8"
+ "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.8"
},
"funding": [
{
@@ -1415,30 +1894,30 @@
"type": "tidelift"
}
],
- "time": "2025-09-24T05:55:14+00:00"
+ "time": "2025-09-24T06:03:27+00:00"
},
{
"name": "sebastian/global-state",
- "version": "3.0.6",
+ "version": "5.0.8",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/global-state.git",
- "reference": "800689427e3e8cf57a8fe38fcd1d4344c9b2f046"
+ "reference": "b6781316bdcd28260904e7cc18ec983d0d2ef4f6"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/800689427e3e8cf57a8fe38fcd1d4344c9b2f046",
- "reference": "800689427e3e8cf57a8fe38fcd1d4344c9b2f046",
+ "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/b6781316bdcd28260904e7cc18ec983d0d2ef4f6",
+ "reference": "b6781316bdcd28260904e7cc18ec983d0d2ef4f6",
"shasum": ""
},
"require": {
- "php": ">=7.2",
- "sebastian/object-reflector": "^1.1.1",
- "sebastian/recursion-context": "^3.0"
+ "php": ">=7.3",
+ "sebastian/object-reflector": "^2.0",
+ "sebastian/recursion-context": "^4.0"
},
"require-dev": {
"ext-dom": "*",
- "phpunit/phpunit": "^8.0"
+ "phpunit/phpunit": "^9.3"
},
"suggest": {
"ext-uopz": "*"
@@ -1446,7 +1925,7 @@
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "3.0-dev"
+ "dev-master": "5.0-dev"
}
},
"autoload": {
@@ -1471,7 +1950,7 @@
],
"support": {
"issues": "https://github.com/sebastianbergmann/global-state/issues",
- "source": "https://github.com/sebastianbergmann/global-state/tree/3.0.6"
+ "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.8"
},
"funding": [
{
@@ -1491,34 +1970,91 @@
"type": "tidelift"
}
],
- "time": "2025-08-10T05:40:12+00:00"
+ "time": "2025-08-10T07:10:35+00:00"
+ },
+ {
+ "name": "sebastian/lines-of-code",
+ "version": "1.0.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/lines-of-code.git",
+ "reference": "e1e4a170560925c26d424b6a03aed157e7dcc5c5"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/e1e4a170560925c26d424b6a03aed157e7dcc5c5",
+ "reference": "e1e4a170560925c26d424b6a03aed157e7dcc5c5",
+ "shasum": ""
+ },
+ "require": {
+ "nikic/php-parser": "^4.18 || ^5.0",
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.3"
+ },
+ "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",
+ "role": "lead"
+ }
+ ],
+ "description": "Library for counting the lines of code in PHP source code",
+ "homepage": "https://github.com/sebastianbergmann/lines-of-code",
+ "support": {
+ "issues": "https://github.com/sebastianbergmann/lines-of-code/issues",
+ "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.4"
+ },
+ "funding": [
+ {
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
+ }
+ ],
+ "time": "2023-12-22T06:20:34+00:00"
},
{
"name": "sebastian/object-enumerator",
- "version": "3.0.5",
+ "version": "4.0.4",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/object-enumerator.git",
- "reference": "ac5b293dba925751b808e02923399fb44ff0d541"
+ "reference": "5c9eeac41b290a3712d88851518825ad78f45c71"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/ac5b293dba925751b808e02923399fb44ff0d541",
- "reference": "ac5b293dba925751b808e02923399fb44ff0d541",
+ "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71",
+ "reference": "5c9eeac41b290a3712d88851518825ad78f45c71",
"shasum": ""
},
"require": {
- "php": ">=7.0",
- "sebastian/object-reflector": "^1.1.1",
- "sebastian/recursion-context": "^3.0"
+ "php": ">=7.3",
+ "sebastian/object-reflector": "^2.0",
+ "sebastian/recursion-context": "^4.0"
},
"require-dev": {
- "phpunit/phpunit": "^6.0"
+ "phpunit/phpunit": "^9.3"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "3.0.x-dev"
+ "dev-master": "4.0-dev"
}
},
"autoload": {
@@ -1540,7 +2076,7 @@
"homepage": "https://github.com/sebastianbergmann/object-enumerator/",
"support": {
"issues": "https://github.com/sebastianbergmann/object-enumerator/issues",
- "source": "https://github.com/sebastianbergmann/object-enumerator/tree/3.0.5"
+ "source": "https://github.com/sebastianbergmann/object-enumerator/tree/4.0.4"
},
"funding": [
{
@@ -1548,32 +2084,32 @@
"type": "github"
}
],
- "time": "2024-03-01T13:54:02+00:00"
+ "time": "2020-10-26T13:12:34+00:00"
},
{
"name": "sebastian/object-reflector",
- "version": "1.1.3",
+ "version": "2.0.4",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/object-reflector.git",
- "reference": "1d439c229e61f244ff1f211e5c99737f90c67def"
+ "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/1d439c229e61f244ff1f211e5c99737f90c67def",
- "reference": "1d439c229e61f244ff1f211e5c99737f90c67def",
+ "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7",
+ "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7",
"shasum": ""
},
"require": {
- "php": ">=7.0"
+ "php": ">=7.3"
},
"require-dev": {
- "phpunit/phpunit": "^6.0"
+ "phpunit/phpunit": "^9.3"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.1-dev"
+ "dev-master": "2.0-dev"
}
},
"autoload": {
@@ -1595,7 +2131,7 @@
"homepage": "https://github.com/sebastianbergmann/object-reflector/",
"support": {
"issues": "https://github.com/sebastianbergmann/object-reflector/issues",
- "source": "https://github.com/sebastianbergmann/object-reflector/tree/1.1.3"
+ "source": "https://github.com/sebastianbergmann/object-reflector/tree/2.0.4"
},
"funding": [
{
@@ -1603,32 +2139,32 @@
"type": "github"
}
],
- "time": "2024-03-01T13:56:04+00:00"
+ "time": "2020-10-26T13:14:26+00:00"
},
{
"name": "sebastian/recursion-context",
- "version": "3.0.3",
+ "version": "4.0.6",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/recursion-context.git",
- "reference": "8fe7e75986a9d24b4cceae847314035df7703a5a"
+ "reference": "539c6691e0623af6dc6f9c20384c120f963465a0"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/8fe7e75986a9d24b4cceae847314035df7703a5a",
- "reference": "8fe7e75986a9d24b4cceae847314035df7703a5a",
+ "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/539c6691e0623af6dc6f9c20384c120f963465a0",
+ "reference": "539c6691e0623af6dc6f9c20384c120f963465a0",
"shasum": ""
},
"require": {
- "php": ">=7.0"
+ "php": ">=7.3"
},
"require-dev": {
- "phpunit/phpunit": "^6.0"
+ "phpunit/phpunit": "^9.3"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "3.0.x-dev"
+ "dev-master": "4.0-dev"
}
},
"autoload": {
@@ -1655,10 +2191,10 @@
}
],
"description": "Provides functionality to recursively process PHP variables",
- "homepage": "http://www.github.com/sebastianbergmann/recursion-context",
+ "homepage": "https://github.com/sebastianbergmann/recursion-context",
"support": {
"issues": "https://github.com/sebastianbergmann/recursion-context/issues",
- "source": "https://github.com/sebastianbergmann/recursion-context/tree/3.0.3"
+ "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.6"
},
"funding": [
{
@@ -1678,29 +2214,32 @@
"type": "tidelift"
}
],
- "time": "2025-08-10T05:25:53+00:00"
+ "time": "2025-08-10T06:57:39+00:00"
},
{
"name": "sebastian/resource-operations",
- "version": "2.0.3",
+ "version": "3.0.4",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/resource-operations.git",
- "reference": "72a7f7674d053d548003b16ff5a106e7e0e06eee"
+ "reference": "05d5692a7993ecccd56a03e40cd7e5b09b1d404e"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/72a7f7674d053d548003b16ff5a106e7e0e06eee",
- "reference": "72a7f7674d053d548003b16ff5a106e7e0e06eee",
+ "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/05d5692a7993ecccd56a03e40cd7e5b09b1d404e",
+ "reference": "05d5692a7993ecccd56a03e40cd7e5b09b1d404e",
"shasum": ""
},
"require": {
- "php": ">=7.1"
+ "php": ">=7.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^9.0"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "2.0-dev"
+ "dev-main": "3.0-dev"
}
},
"autoload": {
@@ -1721,7 +2260,7 @@
"description": "Provides a list of PHP built-in functions that operate on resources",
"homepage": "https://www.github.com/sebastianbergmann/resource-operations",
"support": {
- "source": "https://github.com/sebastianbergmann/resource-operations/tree/2.0.3"
+ "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.4"
},
"funding": [
{
@@ -1729,32 +2268,32 @@
"type": "github"
}
],
- "time": "2024-03-01T13:59:09+00:00"
+ "time": "2024-03-14T16:00:52+00:00"
},
{
"name": "sebastian/type",
- "version": "1.1.5",
+ "version": "3.2.1",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/type.git",
- "reference": "18f071c3a29892b037d35e6b20ddf3ea39b42874"
+ "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/18f071c3a29892b037d35e6b20ddf3ea39b42874",
- "reference": "18f071c3a29892b037d35e6b20ddf3ea39b42874",
+ "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7",
+ "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7",
"shasum": ""
},
"require": {
- "php": ">=7.2"
+ "php": ">=7.3"
},
"require-dev": {
- "phpunit/phpunit": "^8.2"
+ "phpunit/phpunit": "^9.5"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "1.1-dev"
+ "dev-master": "3.2-dev"
}
},
"autoload": {
@@ -1777,7 +2316,7 @@
"homepage": "https://github.com/sebastianbergmann/type",
"support": {
"issues": "https://github.com/sebastianbergmann/type/issues",
- "source": "https://github.com/sebastianbergmann/type/tree/1.1.5"
+ "source": "https://github.com/sebastianbergmann/type/tree/3.2.1"
},
"funding": [
{
@@ -1785,29 +2324,29 @@
"type": "github"
}
],
- "time": "2024-03-01T14:04:07+00:00"
+ "time": "2023-02-03T06:13:03+00:00"
},
{
"name": "sebastian/version",
- "version": "2.0.1",
+ "version": "3.0.2",
"source": {
"type": "git",
"url": "https://github.com/sebastianbergmann/version.git",
- "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019"
+ "reference": "c6c1022351a901512170118436c764e473f6de8c"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019",
- "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019",
+ "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c",
+ "reference": "c6c1022351a901512170118436c764e473f6de8c",
"shasum": ""
},
"require": {
- "php": ">=5.6"
+ "php": ">=7.3"
},
"type": "library",
"extra": {
"branch-alias": {
- "dev-master": "2.0.x-dev"
+ "dev-master": "3.0-dev"
}
},
"autoload": {
@@ -1830,70 +2369,28 @@
"homepage": "https://github.com/sebastianbergmann/version",
"support": {
"issues": "https://github.com/sebastianbergmann/version/issues",
- "source": "https://github.com/sebastianbergmann/version/tree/master"
- },
- "time": "2016-10-03T07:35:21+00:00"
- },
- {
- "name": "sirbrillig/phpcs-variable-analysis",
- "version": "v2.11.2",
- "source": {
- "type": "git",
- "url": "https://github.com/sirbrillig/phpcs-variable-analysis.git",
- "reference": "3fad28475bfbdbf8aa5c440f8a8f89824983d85e"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/sirbrillig/phpcs-variable-analysis/zipball/3fad28475bfbdbf8aa5c440f8a8f89824983d85e",
- "reference": "3fad28475bfbdbf8aa5c440f8a8f89824983d85e",
- "shasum": ""
- },
- "require": {
- "php": ">=5.4.0",
- "squizlabs/php_codesniffer": "^3.5"
- },
- "require-dev": {
- "dealerdirect/phpcodesniffer-composer-installer": "^0.7.0",
- "limedeck/phpunit-detailed-printer": "^3.1 || ^4.0 || ^5.0",
- "phpstan/phpstan": "^0.11.8",
- "phpunit/phpunit": "^5.0 || ^6.5 || ^7.0 || ^8.0",
- "sirbrillig/phpcs-import-detection": "^1.1"
- },
- "type": "phpcodesniffer-standard",
- "autoload": {
- "psr-4": {
- "VariableAnalysis\\": "VariableAnalysis/"
- }
+ "source": "https://github.com/sebastianbergmann/version/tree/3.0.2"
},
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "BSD-2-Clause"
- ],
- "authors": [
- {
- "name": "Sam Graham",
- "email": "php-codesniffer-variableanalysis@illusori.co.uk"
- },
+ "funding": [
{
- "name": "Payton Swick",
- "email": "payton@foolord.com"
+ "url": "https://github.com/sebastianbergmann",
+ "type": "github"
}
],
- "description": "A PHPCS sniff to detect problems with variables.",
- "time": "2021-07-06T23:45:17+00:00"
+ "time": "2020-09-28T06:39:44+00:00"
},
{
"name": "squizlabs/php_codesniffer",
- "version": "3.13.0",
+ "version": "3.13.5",
"source": {
"type": "git",
"url": "https://github.com/PHPCSStandards/PHP_CodeSniffer.git",
- "reference": "65ff2489553b83b4597e89c3b8b721487011d186"
+ "reference": "0ca86845ce43291e8f5692c7356fccf3bcf02bf4"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/65ff2489553b83b4597e89c3b8b721487011d186",
- "reference": "65ff2489553b83b4597e89c3b8b721487011d186",
+ "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/0ca86845ce43291e8f5692c7356fccf3bcf02bf4",
+ "reference": "0ca86845ce43291e8f5692c7356fccf3bcf02bf4",
"shasum": ""
},
"require": {
@@ -1910,11 +2407,6 @@
"bin/phpcs"
],
"type": "library",
- "extra": {
- "branch-alias": {
- "dev-master": "3.x-dev"
- }
- },
"notification-url": "https://packagist.org/downloads/",
"license": [
"BSD-3-Clause"
@@ -1964,7 +2456,7 @@
"type": "thanks_dev"
}
],
- "time": "2025-05-11T03:36:00+00:00"
+ "time": "2025-11-04T16:30:35+00:00"
},
{
"name": "theseer/tokenizer",
@@ -2018,30 +2510,38 @@
},
{
"name": "wp-coding-standards/wpcs",
- "version": "2.3.0",
+ "version": "3.4.0",
"source": {
"type": "git",
"url": "https://github.com/WordPress/WordPress-Coding-Standards.git",
- "reference": "7da1894633f168fe244afc6de00d141f27517b62"
+ "reference": "469c18ceab4d642b15bad4c65ebf3b307bfd55ab"
},
"dist": {
"type": "zip",
- "url": "https://api.github.com/repos/WordPress/WordPress-Coding-Standards/zipball/7da1894633f168fe244afc6de00d141f27517b62",
- "reference": "7da1894633f168fe244afc6de00d141f27517b62",
+ "url": "https://api.github.com/repos/WordPress/WordPress-Coding-Standards/zipball/469c18ceab4d642b15bad4c65ebf3b307bfd55ab",
+ "reference": "469c18ceab4d642b15bad4c65ebf3b307bfd55ab",
"shasum": ""
},
"require": {
- "php": ">=5.4",
- "squizlabs/php_codesniffer": "^3.3.1"
+ "ext-filter": "*",
+ "ext-libxml": "*",
+ "ext-tokenizer": "*",
+ "ext-xmlreader": "*",
+ "php": ">=7.2",
+ "phpcsstandards/phpcsextra": "^1.5.0",
+ "phpcsstandards/phpcsutils": "^1.2.2",
+ "squizlabs/php_codesniffer": "^3.13.5"
},
"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"
+ "php-parallel-lint/php-console-highlighter": "^1.0.0",
+ "php-parallel-lint/php-parallel-lint": "^1.4.0",
+ "phpcompatibility/php-compatibility": "^10.0.0@dev",
+ "phpcsstandards/phpcsdevtools": "^1.2.0",
+ "phpunit/phpunit": "^8.0 || ^9.0"
},
"suggest": {
- "dealerdirect/phpcodesniffer-composer-installer": "^0.6 || This Composer plugin will sort out the PHPCS 'installed_paths' automatically."
+ "ext-iconv": "For improved results",
+ "ext-mbstring": "For improved results"
},
"type": "phpcodesniffer-standard",
"notification-url": "https://packagist.org/downloads/",
@@ -2058,79 +2558,21 @@
"keywords": [
"phpcs",
"standards",
+ "static analysis",
"wordpress"
],
- "time": "2020-05-13T23:57:56+00:00"
- },
- {
- "name": "wptrt/wpthemereview",
- "version": "0.2.1",
- "source": {
- "type": "git",
- "url": "https://github.com/WPTT/WPThemeReview.git",
- "reference": "462e59020dad9399ed2fe8e61f2a21b5e206e420"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/WPTT/WPThemeReview/zipball/462e59020dad9399ed2fe8e61f2a21b5e206e420",
- "reference": "462e59020dad9399ed2fe8e61f2a21b5e206e420",
- "shasum": ""
- },
- "require": {
- "php": ">=5.4",
- "phpcompatibility/phpcompatibility-wp": "^2.0",
- "squizlabs/php_codesniffer": "^3.3.1",
- "wp-coding-standards/wpcs": "^2.2.0"
- },
- "require-dev": {
- "dealerdirect/phpcodesniffer-composer-installer": "^0.5.0",
- "phpcompatibility/php-compatibility": "^9.0",
- "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0",
- "roave/security-advisories": "dev-master"
- },
- "suggest": {
- "dealerdirect/phpcodesniffer-composer-installer": "^0.5.0 || This Composer plugin will sort out the PHPCS 'installed_paths' automatically."
+ "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"
},
- "type": "phpcodesniffer-standard",
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "authors": [
- {
- "name": "Theme Review Team",
- "homepage": "https://make.wordpress.org/themes/handbook/",
- "role": "Strategy and rule setting"
- },
- {
- "name": "Ulrich Pogson",
- "homepage": "https://github.com/grappler",
- "role": "Lead developer"
- },
- {
- "name": "Juliette Reinders Folmer",
- "homepage": "https://github.com/jrfnl",
- "role": "Lead developer"
- },
- {
- "name": "Denis Žoljom",
- "homepage": "https://github.com/dingo-d",
- "role": "Plugin integration lead"
- },
+ "funding": [
{
- "name": "Contributors",
- "homepage": "https://github.com/WPTRT/WPThemeReview/graphs/contributors"
+ "url": "https://opencollective.com/php_codesniffer",
+ "type": "custom"
}
],
- "description": "PHP_CodeSniffer rules (sniffs) to verify theme compliance with the rules for theme hosting on wordpress.org",
- "homepage": "https://make.wordpress.org/themes/handbook/review/",
- "keywords": [
- "phpcs",
- "standards",
- "themes",
- "wordpress"
- ],
- "time": "2019-11-17T20:05:55+00:00"
+ "time": "2026-07-16T13:05:29+00:00"
},
{
"name": "yoast/phpunit-polyfills",
@@ -2198,9 +2640,7 @@
],
"aliases": [],
"minimum-stability": "stable",
- "stability-flags": {
- "codeinwp/phpcs-ruleset": 20
- },
+ "stability-flags": {},
"prefer-stable": false,
"prefer-lowest": false,
"platform": {
@@ -2209,7 +2649,7 @@
},
"platform-dev": {},
"platform-overrides": {
- "php": "7.2"
+ "php": "7.4"
},
"plugin-api-version": "2.9.0"
}
diff --git a/includes/classes/shortcodes/wp-maintenance-mode-shortcode-loginform.php b/includes/classes/shortcodes/wp-maintenance-mode-shortcode-loginform.php
index cb51ae5..aadba7d 100644
--- a/includes/classes/shortcodes/wp-maintenance-mode-shortcode-loginform.php
+++ b/includes/classes/shortcodes/wp-maintenance-mode-shortcode-loginform.php
@@ -22,7 +22,6 @@ public static function output( $atts ) {
include_once wpmm_get_template_path( 'loginform.php' );
}
-
}
}
diff --git a/includes/classes/wp-maintenance-mode-admin.php b/includes/classes/wp-maintenance-mode-admin.php
index 1f36a03..2981043 100644
--- a/includes/classes/wp-maintenance-mode-admin.php
+++ b/includes/classes/wp-maintenance-mode-admin.php
@@ -911,7 +911,7 @@ public function toggle_gutenberg() {
*
* @return void
*/
- function wpmm_update_sdk_options() {
+ public function wpmm_update_sdk_options() {
// check nonce existence
if ( empty( $_POST['_wpnonce'] ) ) {
die( esc_html__( 'The nonce field must not be empty.', 'wp-maintenance-mode' ) );
diff --git a/includes/classes/wp-maintenance-mode-shortcodes.php b/includes/classes/wp-maintenance-mode-shortcodes.php
index 2d2cadb..877196f 100644
--- a/includes/classes/wp-maintenance-mode-shortcodes.php
+++ b/includes/classes/wp-maintenance-mode-shortcodes.php
@@ -27,12 +27,12 @@ public static function init() {
* Shortcode Wrapper
*
* @since 2.0.3
- * @param string $function
+ * @param string $callback
* @param array $atts
* @param array $wrapper
* @return string
*/
- public static function shortcode_wrapper( $function, $atts = array(), $wrapper = array(
+ public static function shortcode_wrapper( $callback, $atts = array(), $wrapper = array(
'before' => null,
'after' => null,
) ) {
@@ -40,7 +40,7 @@ public static function shortcode_wrapper( $function, $atts = array(), $wrapper =
// @codingStandardsIgnoreStart
echo wp_kses_post( $wrapper['before'] );
- call_user_func( $function, $atts );
+ call_user_func( $callback, $atts );
echo wp_kses_post( $wrapper['after'] );
// @codingStandardsIgnoreEnd
@@ -57,7 +57,6 @@ public static function shortcode_wrapper( $function, $atts = array(), $wrapper =
public static function loginform( $atts ) {
return self::shortcode_wrapper( array( 'WP_Maintenance_Mode_Shortcode_Loginform', 'output' ), $atts );
}
-
}
}
diff --git a/includes/classes/wp-maintenance-mode.php b/includes/classes/wp-maintenance-mode.php
index 8933e46..ad908ce 100644
--- a/includes/classes/wp-maintenance-mode.php
+++ b/includes/classes/wp-maintenance-mode.php
@@ -113,7 +113,7 @@ function ( $value ) {
$page_id = $this->plugin_settings['design']['page_id'];
if ( ! function_exists( 'is_plugin_active' ) ) {
- include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
+ include_once ABSPATH . 'wp-admin/includes/plugin.php';
}
if ( is_plugin_active( 'otter-blocks/otter-blocks.php' ) ) {
@@ -144,7 +144,7 @@ function ( $value ) {
// make maintenance page private when maintenance mode is disabled
add_action(
'init',
- function() {
+ function () {
if ( ! isset( $this->plugin_settings['design']['page_id'] ) ) {
return;
}
@@ -161,7 +161,6 @@ function() {
}
add_action( 'init', array( $this, 'initialize_telemetry' ) );
-
}
/**
@@ -1150,7 +1149,7 @@ public function add_style_fse() {
foreach ( $this->style_buffer as $style ) {
if ( $elems->item( $i )->C14N() == $style->C14N() ) {
$common_positions[] = $i;
- };
+ }
}
}
@@ -1357,7 +1356,7 @@ public function send_contact() {
$message = ob_get_clean();
// add temporary filters
- $from_name = function() use ( $name ) {
+ $from_name = function () use ( $name ) {
return $name;
};
add_filter( 'wp_mail_content_type', 'wpmm_change_mail_content_type', 10, 1 );
@@ -1383,14 +1382,14 @@ public function send_contact() {
/**
* Save subscriber into database.
*
- * @param Form_Data_Request $form_data The form data.
+ * @param \ThemeIsle\GutenbergBlocks\Integration\Form_Data_Request $form_data The form data.
* @return void
*/
public function otter_add_subscriber( $form_data ) {
if ( $form_data ) {
$input_data = $form_data->get_data_from_payload( 'formInputsData' );
$input_data = array_map(
- function( $input_field ) {
+ function ( $input_field ) {
if ( isset( $input_field['type'] ) && 'email' === $input_field['type'] ) {
return $input_field['value'];
}
@@ -1463,7 +1462,7 @@ public function initialize_telemetry() {
add_filter( 'themeisle_sdk_enable_telemetry', '__return_true' );
add_filter(
'themeisle_sdk_telemetry_products',
- function( $products ) {
+ function ( $products ) {
foreach ( $products as &$product ) {
if ( isset( $product['slug'] ) && 'wp' === $product['slug'] ) {
$product['slug'] = 'wp_maintenance_mode';
@@ -1474,7 +1473,6 @@ function( $products ) {
}
);
}
-
}
}
diff --git a/includes/functions/helpers.php b/includes/functions/helpers.php
index 40a2dbc..5ab5840 100644
--- a/includes/functions/helpers.php
+++ b/includes/functions/helpers.php
@@ -242,11 +242,11 @@ function wpmm_get_template_path( $template_name, $overrideable = false ) {
*
* @since 2.4.0
* @param string $option
- * @param mixed $default
+ * @param mixed $default_value
* @return mixed
*/
-function wpmm_get_option( $option, $default = false ) {
- return stripslashes_deep( get_option( $option, $default ) );
+function wpmm_get_option( $option, $default_value = false ) {
+ return stripslashes_deep( get_option( $option, $default_value ) );
}
/**
@@ -258,11 +258,11 @@ function wpmm_get_option( $option, $default = false ) {
* G-..........
*
* @since 2.0.7
- * @param string $string
+ * @param string $tracking_code
* @return string
*/
-function wpmm_sanitize_ga_code( $string ) {
- preg_match( '/(UA-\d{4,10}(-\d{1,4})?|G-\w+)/', $string, $matches );
+function wpmm_sanitize_ga_code( $tracking_code ) {
+ preg_match( '/(UA-\d{4,10}(-\d{1,4})?|G-\w+)/', $tracking_code, $matches );
return isset( $matches[0] ) ? $matches[0] : '';
}
diff --git a/package.json b/package.json
index 54008e0..82f1ce9 100644
--- a/package.json
+++ b/package.json
@@ -10,13 +10,27 @@
"scripts": {
"build": "grunt",
"dist": "bash ./bin/dist.sh",
- "release": "npx semantic-release"
+ "release": "npx semantic-release",
+ "wp-env": "wp-env",
+ "env:start": "node bin/wp-env-up.js",
+ "env:stop": "wp-env stop",
+ "env:cleanup": "wp-env cleanup",
+ "lint:php": "wp-env run --env-cwd=wp-content/plugins/wp-maintenance-mode cli composer run-script lint",
+ "format:php": "wp-env run --env-cwd=wp-content/plugins/wp-maintenance-mode cli composer run-script format",
+ "test:unit:php:setup": "npm run env:start",
+ "test:unit:php:base": "wp-env run --env-cwd=wp-content/plugins/wp-maintenance-mode cli bash -c 'WORDPRESS_TABLE_PREFIX=wptests_ composer run-script phpunit'",
+ "test:unit:php": "npm-run-all test:unit:php:setup test:unit:php:base",
+ "test:e2e": "playwright test --config tests/e2e/playwright.config.js",
+ "test:e2e:ui": "playwright test --config tests/e2e/playwright.config.js --ui"
},
"main": "Gruntfile.js",
"devDependencies": {
+ "@playwright/test": "^1.61.1",
"@semantic-release/changelog": "^5.0.1",
"@semantic-release/exec": "^5.0.0",
"@semantic-release/git": "^9.0.0",
+ "@wordpress/e2e-test-utils-playwright": "^1.51.0",
+ "@wordpress/env": "^11.11.0",
"@wordpress/eslint-plugin": "^14.0.0",
"autoprefixer": "^9.8.6",
"conventional-changelog-simple-preset": "^1.0.14",
@@ -28,6 +42,7 @@
"grunt-postcss": "^0.9.0",
"grunt-version": "^3.0.0",
"grunt-wp-readme-to-markdown": "^2.1.0",
+ "npm-run-all": "^4.1.5",
"replace-in-file": "^6.1.0",
"semantic-release": "^17.3.7",
"semantic-release-slack-bot": "^3.5.3",
diff --git a/phpcs.xml b/phpcs.xml
index e9da487..bf8d756 100755
--- a/phpcs.xml
+++ b/phpcs.xml
@@ -29,6 +29,8 @@
+
+
diff --git a/phpstan-baseline.neon b/phpstan-baseline.neon
new file mode 100644
index 0000000..9e2fc09
--- /dev/null
+++ b/phpstan-baseline.neon
@@ -0,0 +1,661 @@
+parameters:
+ ignoreErrors:
+ -
+ rawMessage: 'Method WP_Maintenance_Mode_Shortcode_Loginform::output() has no return type specified.'
+ identifier: missingType.return
+ count: 1
+ path: includes/classes/shortcodes/wp-maintenance-mode-shortcode-loginform.php
+
+ -
+ rawMessage: 'Method WP_Maintenance_Mode_Shortcode_Loginform::output() has parameter $atts with no value type specified in iterable type array.'
+ identifier: missingType.iterableValue
+ count: 1
+ path: includes/classes/shortcodes/wp-maintenance-mode-shortcode-loginform.php
+
+ -
+ rawMessage: 'Instanceof between int<1, max> and WP_Error will always evaluate to false.'
+ identifier: instanceof.alwaysFalse
+ count: 1
+ path: includes/classes/wp-maintenance-mode-admin.php
+
+ -
+ rawMessage: 'Method WP_Maintenance_Mode_Admin::add_black_friday_data() has parameter $configs with no value type specified in iterable type array.'
+ identifier: missingType.iterableValue
+ count: 1
+ path: includes/classes/wp-maintenance-mode-admin.php
+
+ -
+ rawMessage: 'Method WP_Maintenance_Mode_Admin::add_black_friday_data() return type has no value type specified in iterable type array.'
+ identifier: missingType.iterableValue
+ count: 1
+ path: includes/classes/wp-maintenance-mode-admin.php
+
+ -
+ rawMessage: 'Method WP_Maintenance_Mode_Admin::add_display_post_states() has parameter $post_states with no value type specified in iterable type array.'
+ identifier: missingType.iterableValue
+ count: 1
+ path: includes/classes/wp-maintenance-mode-admin.php
+
+ -
+ rawMessage: 'Method WP_Maintenance_Mode_Admin::add_display_post_states() return type has no value type specified in iterable type array.'
+ identifier: missingType.iterableValue
+ count: 1
+ path: includes/classes/wp-maintenance-mode-admin.php
+
+ -
+ rawMessage: 'Method WP_Maintenance_Mode_Admin::add_inline_global_style() has no return type specified.'
+ identifier: missingType.return
+ count: 1
+ path: includes/classes/wp-maintenance-mode-admin.php
+
+ -
+ rawMessage: 'Method WP_Maintenance_Mode_Admin::add_notices() has no return type specified.'
+ identifier: missingType.return
+ count: 1
+ path: includes/classes/wp-maintenance-mode-admin.php
+
+ -
+ rawMessage: 'Method WP_Maintenance_Mode_Admin::add_plugin_menu() has no return type specified.'
+ identifier: missingType.return
+ count: 1
+ path: includes/classes/wp-maintenance-mode-admin.php
+
+ -
+ rawMessage: 'Method WP_Maintenance_Mode_Admin::add_safe_style_css() has parameter $properties with no value type specified in iterable type array.'
+ identifier: missingType.iterableValue
+ count: 1
+ path: includes/classes/wp-maintenance-mode-admin.php
+
+ -
+ rawMessage: 'Method WP_Maintenance_Mode_Admin::add_safe_style_css() return type has no value type specified in iterable type array.'
+ identifier: missingType.iterableValue
+ count: 1
+ path: includes/classes/wp-maintenance-mode-admin.php
+
+ -
+ rawMessage: 'Method WP_Maintenance_Mode_Admin::add_settings_link() has parameter $links with no value type specified in iterable type array.'
+ identifier: missingType.iterableValue
+ count: 1
+ path: includes/classes/wp-maintenance-mode-admin.php
+
+ -
+ rawMessage: 'Method WP_Maintenance_Mode_Admin::add_settings_link() return type has no value type specified in iterable type array.'
+ identifier: missingType.iterableValue
+ count: 1
+ path: includes/classes/wp-maintenance-mode-admin.php
+
+ -
+ rawMessage: 'Method WP_Maintenance_Mode_Admin::admin_footer_text() has no return type specified.'
+ identifier: missingType.return
+ count: 1
+ path: includes/classes/wp-maintenance-mode-admin.php
+
+ -
+ rawMessage: 'Method WP_Maintenance_Mode_Admin::delete_cache() has no return type specified.'
+ identifier: missingType.return
+ count: 1
+ path: includes/classes/wp-maintenance-mode-admin.php
+
+ -
+ rawMessage: 'Method WP_Maintenance_Mode_Admin::dismiss_notices() has no return type specified.'
+ identifier: missingType.return
+ count: 1
+ path: includes/classes/wp-maintenance-mode-admin.php
+
+ -
+ rawMessage: 'Method WP_Maintenance_Mode_Admin::display_plugin_settings() has no return type specified.'
+ identifier: missingType.return
+ count: 1
+ path: includes/classes/wp-maintenance-mode-admin.php
+
+ -
+ rawMessage: 'Method WP_Maintenance_Mode_Admin::enqueue_admin_scripts() has no return type specified.'
+ identifier: missingType.return
+ count: 1
+ path: includes/classes/wp-maintenance-mode-admin.php
+
+ -
+ rawMessage: 'Method WP_Maintenance_Mode_Admin::get_dismissed_notices() return type has no value type specified in iterable type array.'
+ identifier: missingType.iterableValue
+ count: 1
+ path: includes/classes/wp-maintenance-mode-admin.php
+
+ -
+ rawMessage: 'Method WP_Maintenance_Mode_Admin::get_otter_notice() has parameter $location with no type specified.'
+ identifier: missingType.parameter
+ count: 1
+ path: includes/classes/wp-maintenance-mode-admin.php
+
+ -
+ rawMessage: 'Method WP_Maintenance_Mode_Admin::get_policy_link() should return string but return statement is missing.'
+ identifier: return.missing
+ count: 1
+ path: includes/classes/wp-maintenance-mode-admin.php
+
+ -
+ rawMessage: 'Method WP_Maintenance_Mode_Admin::load_default_settings() has no return type specified.'
+ identifier: missingType.return
+ count: 1
+ path: includes/classes/wp-maintenance-mode-admin.php
+
+ -
+ rawMessage: 'Method WP_Maintenance_Mode_Admin::maybe_redirect() has no return type specified.'
+ identifier: missingType.return
+ count: 1
+ path: includes/classes/wp-maintenance-mode-admin.php
+
+ -
+ rawMessage: 'Method WP_Maintenance_Mode_Admin::reset_plugin_settings() has no return type specified.'
+ identifier: missingType.return
+ count: 1
+ path: includes/classes/wp-maintenance-mode-admin.php
+
+ -
+ rawMessage: 'Method WP_Maintenance_Mode_Admin::save_dismissed_notices() has no return type specified.'
+ identifier: missingType.return
+ count: 1
+ path: includes/classes/wp-maintenance-mode-admin.php
+
+ -
+ rawMessage: 'Method WP_Maintenance_Mode_Admin::save_plugin_settings() has no return type specified.'
+ identifier: missingType.return
+ count: 1
+ path: includes/classes/wp-maintenance-mode-admin.php
+
+ -
+ rawMessage: 'Method WP_Maintenance_Mode_Admin::save_plugin_settings_notice() has no return type specified.'
+ identifier: missingType.return
+ count: 1
+ path: includes/classes/wp-maintenance-mode-admin.php
+
+ -
+ rawMessage: 'Method WP_Maintenance_Mode_Admin::set_datajs_file() has no return type specified.'
+ identifier: missingType.return
+ count: 1
+ path: includes/classes/wp-maintenance-mode-admin.php
+
+ -
+ rawMessage: 'Method WP_Maintenance_Mode_Admin::set_datajs_file() has parameter $messages with no value type specified in iterable type array.'
+ identifier: missingType.iterableValue
+ count: 1
+ path: includes/classes/wp-maintenance-mode-admin.php
+
+ -
+ rawMessage: 'Method WP_Maintenance_Mode_Admin::subscribers_empty_list() has no return type specified.'
+ identifier: missingType.return
+ count: 1
+ path: includes/classes/wp-maintenance-mode-admin.php
+
+ -
+ rawMessage: 'Method WP_Maintenance_Mode_Admin::subscribers_export() has no return type specified.'
+ identifier: missingType.return
+ count: 1
+ path: includes/classes/wp-maintenance-mode-admin.php
+
+ -
+ rawMessage: 'Parameter #2 $callback of function array_filter expects (callable(string): bool)|null, ''trim'' given.'
+ identifier: argument.type
+ count: 1
+ path: includes/classes/wp-maintenance-mode-admin.php
+
+ -
+ rawMessage: Property WP_Maintenance_Mode_Admin::$dismissed_notices_key has no type specified.
+ identifier: missingType.property
+ count: 1
+ path: includes/classes/wp-maintenance-mode-admin.php
+
+ -
+ rawMessage: Property WP_Maintenance_Mode_Admin::$instance has no type specified.
+ identifier: missingType.property
+ count: 1
+ path: includes/classes/wp-maintenance-mode-admin.php
+
+ -
+ rawMessage: Property WP_Maintenance_Mode_Admin::$plugin_basename has no type specified.
+ identifier: missingType.property
+ count: 1
+ path: includes/classes/wp-maintenance-mode-admin.php
+
+ -
+ rawMessage: Property WP_Maintenance_Mode_Admin::$plugin_default_settings has no type specified.
+ identifier: missingType.property
+ count: 1
+ path: includes/classes/wp-maintenance-mode-admin.php
+
+ -
+ rawMessage: Property WP_Maintenance_Mode_Admin::$plugin_network_settings has no type specified.
+ identifier: missingType.property
+ count: 1
+ path: includes/classes/wp-maintenance-mode-admin.php
+
+ -
+ rawMessage: Property WP_Maintenance_Mode_Admin::$plugin_screen_hook_suffix has no type specified.
+ identifier: missingType.property
+ count: 1
+ path: includes/classes/wp-maintenance-mode-admin.php
+
+ -
+ rawMessage: Property WP_Maintenance_Mode_Admin::$plugin_settings has no type specified.
+ identifier: missingType.property
+ count: 1
+ path: includes/classes/wp-maintenance-mode-admin.php
+
+ -
+ rawMessage: Property WP_Maintenance_Mode_Admin::$plugin_slug has no type specified.
+ identifier: missingType.property
+ count: 1
+ path: includes/classes/wp-maintenance-mode-admin.php
+
+ -
+ rawMessage: 'Method WP_Maintenance_Mode_Shortcodes::init() has no return type specified.'
+ identifier: missingType.return
+ count: 1
+ path: includes/classes/wp-maintenance-mode-shortcodes.php
+
+ -
+ rawMessage: 'Method WP_Maintenance_Mode_Shortcodes::loginform() has parameter $atts with no value type specified in iterable type array.'
+ identifier: missingType.iterableValue
+ count: 1
+ path: includes/classes/wp-maintenance-mode-shortcodes.php
+
+ -
+ rawMessage: 'Method WP_Maintenance_Mode_Shortcodes::shortcode_wrapper() has parameter $atts with no value type specified in iterable type array.'
+ identifier: missingType.iterableValue
+ count: 1
+ path: includes/classes/wp-maintenance-mode-shortcodes.php
+
+ -
+ rawMessage: 'Method WP_Maintenance_Mode_Shortcodes::shortcode_wrapper() has parameter $wrapper with no value type specified in iterable type array.'
+ identifier: missingType.iterableValue
+ count: 1
+ path: includes/classes/wp-maintenance-mode-shortcodes.php
+
+ -
+ rawMessage: 'Parameter #1 $callback of static method WP_Maintenance_Mode_Shortcodes::shortcode_wrapper() expects string, array given.'
+ identifier: argument.type
+ count: 1
+ path: includes/classes/wp-maintenance-mode-shortcodes.php
+
+ -
+ rawMessage: 'Function remove_filter invoked with 4 parameters, 2-3 required.'
+ identifier: arguments.count
+ count: 1
+ path: includes/classes/wp-maintenance-mode.php
+
+ -
+ rawMessage: If condition is always true.
+ identifier: if.alwaysTrue
+ count: 1
+ path: includes/classes/wp-maintenance-mode.php
+
+ -
+ rawMessage: 'Method WP_Maintenance_Mode::activate() has no return type specified.'
+ identifier: missingType.return
+ count: 1
+ path: includes/classes/wp-maintenance-mode.php
+
+ -
+ rawMessage: 'Method WP_Maintenance_Mode::activate_new_site() has no return type specified.'
+ identifier: missingType.return
+ count: 1
+ path: includes/classes/wp-maintenance-mode.php
+
+ -
+ rawMessage: 'Method WP_Maintenance_Mode::add_bot_extras() has no return type specified.'
+ identifier: missingType.return
+ count: 1
+ path: includes/classes/wp-maintenance-mode.php
+
+ -
+ rawMessage: 'Method WP_Maintenance_Mode::add_css_files() has no return type specified.'
+ identifier: missingType.return
+ count: 1
+ path: includes/classes/wp-maintenance-mode.php
+
+ -
+ rawMessage: 'Method WP_Maintenance_Mode::add_google_analytics_code() has no return type specified.'
+ identifier: missingType.return
+ count: 1
+ path: includes/classes/wp-maintenance-mode.php
+
+ -
+ rawMessage: 'Method WP_Maintenance_Mode::add_inline_css_style() has no return type specified.'
+ identifier: missingType.return
+ count: 1
+ path: includes/classes/wp-maintenance-mode.php
+
+ -
+ rawMessage: 'Method WP_Maintenance_Mode::add_js_files() has no return type specified.'
+ identifier: missingType.return
+ count: 1
+ path: includes/classes/wp-maintenance-mode.php
+
+ -
+ rawMessage: 'Method WP_Maintenance_Mode::add_maintenance_template() has parameter $templates with no type specified.'
+ identifier: missingType.parameter
+ count: 1
+ path: includes/classes/wp-maintenance-mode.php
+
+ -
+ rawMessage: 'Method WP_Maintenance_Mode::add_subscriber() has no return type specified.'
+ identifier: missingType.return
+ count: 1
+ path: includes/classes/wp-maintenance-mode.php
+
+ -
+ rawMessage: 'Method WP_Maintenance_Mode::check_update() has no return type specified.'
+ identifier: missingType.return
+ count: 1
+ path: includes/classes/wp-maintenance-mode.php
+
+ -
+ rawMessage: 'Method WP_Maintenance_Mode::deactivate() has no return type specified.'
+ identifier: missingType.return
+ count: 1
+ path: includes/classes/wp-maintenance-mode.php
+
+ -
+ rawMessage: 'Method WP_Maintenance_Mode::default_settings() return type has no value type specified in iterable type array.'
+ identifier: missingType.iterableValue
+ count: 1
+ path: includes/classes/wp-maintenance-mode.php
+
+ -
+ rawMessage: 'Method WP_Maintenance_Mode::get_blog_ids() return type has no value type specified in iterable type array.'
+ identifier: missingType.iterableValue
+ count: 1
+ path: includes/classes/wp-maintenance-mode.php
+
+ -
+ rawMessage: 'Method WP_Maintenance_Mode::get_page_categories() return type has no value type specified in iterable type array.'
+ identifier: missingType.iterableValue
+ count: 1
+ path: includes/classes/wp-maintenance-mode.php
+
+ -
+ rawMessage: 'Method WP_Maintenance_Mode::get_page_status_by_category() has parameter $category with no type specified.'
+ identifier: missingType.parameter
+ count: 1
+ path: includes/classes/wp-maintenance-mode.php
+
+ -
+ rawMessage: 'Method WP_Maintenance_Mode::get_page_status_by_category() should return string but return statement is missing.'
+ identifier: return.missing
+ count: 1
+ path: includes/classes/wp-maintenance-mode.php
+
+ -
+ rawMessage: 'Method WP_Maintenance_Mode::get_plugin_network_settings() return type has no value type specified in iterable type array.'
+ identifier: missingType.iterableValue
+ count: 1
+ path: includes/classes/wp-maintenance-mode.php
+
+ -
+ rawMessage: 'Method WP_Maintenance_Mode::get_plugin_settings() return type has no value type specified in iterable type array.'
+ identifier: missingType.iterableValue
+ count: 1
+ path: includes/classes/wp-maintenance-mode.php
+
+ -
+ rawMessage: 'Method WP_Maintenance_Mode::init() has no return type specified.'
+ identifier: missingType.return
+ count: 1
+ path: includes/classes/wp-maintenance-mode.php
+
+ -
+ rawMessage: 'Method WP_Maintenance_Mode::load_plugin_textdomain() has no return type specified.'
+ identifier: missingType.return
+ count: 1
+ path: includes/classes/wp-maintenance-mode.php
+
+ -
+ rawMessage: 'Method WP_Maintenance_Mode::send_contact() has no return type specified.'
+ identifier: missingType.return
+ count: 1
+ path: includes/classes/wp-maintenance-mode.php
+
+ -
+ rawMessage: 'Method WP_Maintenance_Mode::set_current_page_category() has parameter $category with no type specified.'
+ identifier: missingType.parameter
+ count: 1
+ path: includes/classes/wp-maintenance-mode.php
+
+ -
+ rawMessage: 'Method WP_Maintenance_Mode::single_activate() has no return type specified.'
+ identifier: missingType.return
+ count: 1
+ path: includes/classes/wp-maintenance-mode.php
+
+ -
+ rawMessage: 'Method WP_Maintenance_Mode::single_deactivate() has no return type specified.'
+ identifier: missingType.return
+ count: 1
+ path: includes/classes/wp-maintenance-mode.php
+
+ -
+ rawMessage: 'Method WP_Maintenance_Mode::use_maintenance_template() has parameter $template with no type specified.'
+ identifier: missingType.parameter
+ count: 1
+ path: includes/classes/wp-maintenance-mode.php
+
+ -
+ rawMessage: Property WP_Maintenance_Mode::$current_page_category has no type specified.
+ identifier: missingType.property
+ count: 1
+ path: includes/classes/wp-maintenance-mode.php
+
+ -
+ rawMessage: Property WP_Maintenance_Mode::$instance has no type specified.
+ identifier: missingType.property
+ count: 1
+ path: includes/classes/wp-maintenance-mode.php
+
+ -
+ rawMessage: Property WP_Maintenance_Mode::$plugin_basename has no type specified.
+ identifier: missingType.property
+ count: 1
+ path: includes/classes/wp-maintenance-mode.php
+
+ -
+ rawMessage: Property WP_Maintenance_Mode::$plugin_network_settings has no type specified.
+ identifier: missingType.property
+ count: 1
+ path: includes/classes/wp-maintenance-mode.php
+
+ -
+ rawMessage: Property WP_Maintenance_Mode::$plugin_settings has no type specified.
+ identifier: missingType.property
+ count: 1
+ path: includes/classes/wp-maintenance-mode.php
+
+ -
+ rawMessage: Property WP_Maintenance_Mode::$plugin_slug has no type specified.
+ identifier: missingType.property
+ count: 1
+ path: includes/classes/wp-maintenance-mode.php
+
+ -
+ rawMessage: Property WP_Maintenance_Mode::$style_buffer has no type specified.
+ identifier: missingType.property
+ count: 1
+ path: includes/classes/wp-maintenance-mode.php
+
+ -
+ rawMessage: Right side of && is always false.
+ identifier: booleanAnd.rightAlwaysFalse
+ count: 1
+ path: includes/classes/wp-maintenance-mode.php
+
+ -
+ rawMessage: Right side of && is always true.
+ identifier: booleanAnd.rightAlwaysTrue
+ count: 1
+ path: includes/classes/wp-maintenance-mode.php
+
+ -
+ rawMessage: 'Strict comparison using === between mixed~(0|0.0|''''|''0''|array{}|false|null) and '''' will always evaluate to false.'
+ identifier: identical.alwaysFalse
+ count: 1
+ path: includes/classes/wp-maintenance-mode.php
+
+ -
+ rawMessage: 'Variable $css_rules in empty() always exists and is not falsy.'
+ identifier: empty.variable
+ count: 2
+ path: includes/classes/wp-maintenance-mode.php
+
+ -
+ rawMessage: 'Call to function method_exists() with ''Cache_Enabler'' and ''clear_site_cache'' will always evaluate to false.'
+ identifier: function.impossibleType
+ count: 1
+ path: includes/functions/helpers.php
+
+ -
+ rawMessage: 'Call to function method_exists() with ''Endurance_Page_Cache'' and ''purge_all'' will always evaluate to false.'
+ identifier: function.impossibleType
+ count: 1
+ path: includes/functions/helpers.php
+
+ -
+ rawMessage: 'Call to function method_exists() with ''Swift_Performance…'' and ''clear_all_cache'' will always evaluate to false.'
+ identifier: function.impossibleType
+ count: 1
+ path: includes/functions/helpers.php
+
+ -
+ rawMessage: 'Call to function method_exists() with ''\\LiteSpeed\\Purge'' and ''purge_all'' will always evaluate to false.'
+ identifier: function.impossibleType
+ count: 1
+ path: includes/functions/helpers.php
+
+ -
+ rawMessage: 'Call to function method_exists() with ''\\SiteGround…'' and ''purge_cache'' will always evaluate to false.'
+ identifier: function.impossibleType
+ count: 1
+ path: includes/functions/helpers.php
+
+ -
+ rawMessage: 'Call to function method_exists() with Purger and ''purge_all'' will always evaluate to true.'
+ identifier: function.alreadyNarrowedType
+ count: 1
+ path: includes/functions/helpers.php
+
+ -
+ rawMessage: 'Function remove_filter invoked with 4 parameters, 2-3 required.'
+ identifier: arguments.count
+ count: 1
+ path: includes/functions/helpers.php
+
+ -
+ rawMessage: 'Function wpmm_delete_cache() has no return type specified.'
+ identifier: missingType.return
+ count: 1
+ path: includes/functions/helpers.php
+
+ -
+ rawMessage: 'Function wpmm_form_hidden_fields() has no return type specified.'
+ identifier: missingType.return
+ count: 1
+ path: includes/functions/helpers.php
+
+ -
+ rawMessage: 'Function wpmm_gdpr_textarea_allowed_html() return type has no value type specified in iterable type array.'
+ identifier: missingType.iterableValue
+ count: 1
+ path: includes/functions/helpers.php
+
+ -
+ rawMessage: 'Function wpmm_get_backgrounds() return type has no value type specified in iterable type array.'
+ identifier: missingType.iterableValue
+ count: 1
+ path: includes/functions/helpers.php
+
+ -
+ rawMessage: 'Function wpmm_get_banners() return type has no value type specified in iterable type array.'
+ identifier: missingType.iterableValue
+ count: 1
+ path: includes/functions/helpers.php
+
+ -
+ rawMessage: 'Function wpmm_get_user_roles() return type has no value type specified in iterable type array.'
+ identifier: missingType.iterableValue
+ count: 1
+ path: includes/functions/helpers.php
+
+ -
+ rawMessage: 'Function wpmm_get_utmized_url() has parameter $utms with no value type specified in iterable type array.'
+ identifier: missingType.iterableValue
+ count: 1
+ path: includes/functions/helpers.php
+
+ -
+ rawMessage: 'Function wpmm_maybe_define_constant() has no return type specified.'
+ identifier: missingType.return
+ count: 1
+ path: includes/functions/helpers.php
+
+ -
+ rawMessage: 'Function wpmm_multiselect() has parameter $values with no value type specified in iterable type array.'
+ identifier: missingType.iterableValue
+ count: 1
+ path: includes/functions/helpers.php
+
+ -
+ rawMessage: 'Function wpmm_multiselect() should return string but return statement is missing.'
+ identifier: return.missing
+ count: 1
+ path: includes/functions/helpers.php
+
+ -
+ rawMessage: 'Function wpmm_option_page_url() has no return type specified.'
+ identifier: missingType.return
+ count: 1
+ path: includes/functions/helpers.php
+
+ -
+ rawMessage: 'Function wpmm_plugin_info() return type has no value type specified in iterable type array.'
+ identifier: missingType.iterableValue
+ count: 1
+ path: includes/functions/helpers.php
+
+ -
+ rawMessage: 'Function wpmm_set_nocache_constants() has no return type specified.'
+ identifier: missingType.return
+ count: 1
+ path: includes/functions/helpers.php
+
+ -
+ rawMessage: 'Function wpmm_translated_string_allowed_html() return type has no value type specified in iterable type array.'
+ identifier: missingType.iterableValue
+ count: 1
+ path: includes/functions/helpers.php
+
+ -
+ rawMessage: 'Function wpmm_add_extra_plugin_headers() has parameter $headers with no value type specified in iterable type array.'
+ identifier: missingType.iterableValue
+ count: 1
+ path: includes/functions/hooks.php
+
+ -
+ rawMessage: 'Function wpmm_add_extra_plugin_headers() return type has no value type specified in iterable type array.'
+ identifier: missingType.iterableValue
+ count: 1
+ path: includes/functions/hooks.php
+
+ -
+ rawMessage: 'Function single_uninstall() has no return type specified.'
+ identifier: missingType.return
+ count: 1
+ path: uninstall.php
+
+ -
+ rawMessage: 'Function wpmm_load_sdk() has parameter $products with no value type specified in iterable type array.'
+ identifier: missingType.iterableValue
+ count: 1
+ path: wp-maintenance-mode.php
+
+ -
+ rawMessage: 'Function wpmm_load_sdk() return type has no value type specified in iterable type array.'
+ identifier: missingType.iterableValue
+ count: 1
+ path: wp-maintenance-mode.php
diff --git a/phpstan.neon b/phpstan.neon
new file mode 100644
index 0000000..a4a6ea7
--- /dev/null
+++ b/phpstan.neon
@@ -0,0 +1,17 @@
+parameters:
+ level: 6
+ paths:
+ - %currentWorkingDirectory%/includes
+ - %currentWorkingDirectory%/wp-maintenance-mode.php
+ - %currentWorkingDirectory%/uninstall.php
+ scanDirectories:
+ - %currentWorkingDirectory%/vendor/codeinwp/themeisle-sdk
+ bootstrapFiles:
+ - %currentWorkingDirectory%/vendor/php-stubs/wordpress-stubs/wordpress-stubs.php
+ - %currentWorkingDirectory%/tests/static-analysis-stubs/constants.php
+ - %currentWorkingDirectory%/tests/static-analysis-stubs/integrations.php
+ dynamicConstantNames:
+ - WPMM_ASSETS_SUFFIX
+includes:
+ - %currentWorkingDirectory%/phpstan-baseline.neon
+ - phar://phpstan.phar/conf/bleedingEdge.neon
diff --git a/tests/access-control-test.php b/tests/access-control-test.php
new file mode 100644
index 0000000..7217d63
--- /dev/null
+++ b/tests/access-control-test.php
@@ -0,0 +1,167 @@
+server_backup = $_SERVER;
+ $this->set_plugin_settings( self::$frontend->default_settings() );
+ }
+
+ public function tear_down() {
+ $_SERVER = $this->server_backup;
+ parent::tear_down();
+ }
+
+ /**
+ * Point the frontend singleton at the given settings.
+ *
+ * The singleton hydrates its settings cache once at plugins_loaded, so the
+ * cache has to be refreshed for per-test settings (setup plumbing, not an
+ * assertion target).
+ *
+ * @param array $settings A full wpmm_settings array.
+ */
+ protected function set_plugin_settings( array $settings ) {
+ update_option( 'wpmm_settings', $settings );
+
+ $prop = new ReflectionProperty( 'WP_Maintenance_Mode', 'plugin_settings' );
+ $prop->setAccessible( true );
+ $prop->setValue( self::$frontend, $settings );
+ }
+
+ /*
+ * check_user_role()
+ */
+
+ public function test_administrators_bypass_maintenance_mode() {
+ wp_set_current_user( self::factory()->user->create( array( 'role' => 'administrator' ) ) );
+
+ $this->assertTrue( self::$frontend->check_user_role() );
+ }
+
+ public function test_subscribers_are_blocked_by_default() {
+ wp_set_current_user( self::factory()->user->create( array( 'role' => 'subscriber' ) ) );
+
+ $this->assertFalse( self::$frontend->check_user_role() );
+ }
+
+ public function test_logged_out_visitors_are_blocked() {
+ wp_set_current_user( 0 );
+
+ $this->assertFalse( self::$frontend->check_user_role() );
+ }
+
+ public function test_frontend_role_setting_grants_access() {
+ $settings = self::$frontend->default_settings();
+ $settings['general']['frontend_role'] = array( 'subscriber' );
+ $this->set_plugin_settings( $settings );
+
+ wp_set_current_user( self::factory()->user->create( array( 'role' => 'subscriber' ) ) );
+
+ $this->assertTrue( self::$frontend->check_user_role() );
+ }
+
+ /*
+ * check_exclude()
+ */
+
+ public function test_feed_urls_are_excluded_by_default() {
+ $_SERVER['REQUEST_URI'] = '/feed/';
+
+ $this->assertTrue( self::$frontend->check_exclude() );
+ }
+
+ public function test_regular_urls_are_not_excluded() {
+ $_SERVER['REQUEST_URI'] = '/some-page/';
+
+ $this->assertFalse( self::$frontend->check_exclude() );
+ }
+
+ public function test_custom_slug_in_exclude_list_is_excluded() {
+ $settings = self::$frontend->default_settings();
+ $settings['general']['exclude'][] = 'status-update';
+ $this->set_plugin_settings( $settings );
+
+ $_SERVER['REQUEST_URI'] = '/status-update/';
+
+ $this->assertTrue( self::$frontend->check_exclude() );
+ }
+
+ public function test_visitor_ip_in_exclude_list_is_excluded() {
+ $settings = self::$frontend->default_settings();
+ $settings['general']['exclude'][] = '10.11.12.13';
+ $this->set_plugin_settings( $settings );
+
+ $_SERVER['REQUEST_URI'] = '/some-page/';
+ $_SERVER['REMOTE_ADDR'] = '10.11.12.13';
+
+ $this->assertTrue( self::$frontend->check_exclude() );
+ }
+
+ public function test_exclude_entries_support_trailing_comments() {
+ $settings = self::$frontend->default_settings();
+ $settings['general']['exclude'][] = 'status-update # public status page';
+ $this->set_plugin_settings( $settings );
+
+ $_SERVER['REQUEST_URI'] = '/status-update/';
+
+ $this->assertTrue( self::$frontend->check_exclude() );
+ }
+
+ /*
+ * check_search_bots()
+ */
+
+ public function test_search_bots_bypass_when_the_option_is_enabled() {
+ $settings = self::$frontend->default_settings();
+ $settings['general']['bypass_bots'] = 1;
+ $this->set_plugin_settings( $settings );
+
+ $_SERVER['HTTP_USER_AGENT'] = 'Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)';
+
+ $this->assertTrue( self::$frontend->check_search_bots() );
+ }
+
+ public function test_search_bots_are_blocked_while_the_option_is_disabled() {
+ $_SERVER['HTTP_USER_AGENT'] = 'Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)';
+
+ $this->assertFalse( self::$frontend->check_search_bots() );
+ }
+
+ public function test_regular_browsers_are_not_treated_as_bots() {
+ $settings = self::$frontend->default_settings();
+ $settings['general']['bypass_bots'] = 1;
+ $this->set_plugin_settings( $settings );
+
+ $_SERVER['HTTP_USER_AGENT'] = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/126.0 Safari/537.36';
+
+ $this->assertFalse( self::$frontend->check_search_bots() );
+ }
+}
diff --git a/tests/ajax-api-test.php b/tests/ajax-api-test.php
new file mode 100644
index 0000000..22e56a4
--- /dev/null
+++ b/tests/ajax-api-test.php
@@ -0,0 +1,495 @@
+default_settings() );
+
+
+ self::$frontend = WP_Maintenance_Mode::get_instance();
+
+ // The frontend singleton was built during bootstrap, before wpmm_settings
+ // existed; refresh its settings cache so handlers see the defaults.
+ $settings = new ReflectionProperty( 'WP_Maintenance_Mode', 'plugin_settings' );
+ $settings->setAccessible( true );
+ $settings->setValue( self::$frontend, get_option( 'wpmm_settings' ) );
+
+ // The admin class is only loaded on is_admin() requests, which the test
+ // bootstrap is not; its constructor registers all wp_ajax_wpmm_* hooks.
+ require_once WPMM_CLASSES_PATH . 'wp-maintenance-mode-admin.php';
+ self::$admin = WP_Maintenance_Mode_Admin::get_instance();
+
+ // The instance normally hydrates its settings caches on init, which has
+ // already fired by the time the class is loaded here.
+ self::$admin->load_default_settings();
+ }
+
+ public function set_up() {
+ parent::set_up();
+
+ global $wpdb;
+ $wpdb->query( "DELETE FROM {$wpdb->prefix}wpmm_subscribers" );
+ update_option( 'wpmm_settings', WP_Maintenance_Mode::get_instance()->default_settings() );
+
+ // Hook registration must happen per test: the suite snapshots the hook
+ // state once per process (first test's set_up) and every tear_down
+ // restores that snapshot, so anything registered in a class-level
+ // fixture evaporates after the first test of this class.
+ //
+ // The frontend AJAX hooks are only registered while maintenance mode is
+ // enabled at plugins_loaded; register them against the same handlers.
+ add_action( 'wp_ajax_nopriv_wpmm_add_subscriber', array( self::$frontend, 'add_subscriber' ) );
+ add_action( 'wp_ajax_nopriv_wpmm_send_contact', array( self::$frontend, 'send_contact' ) );
+
+ // The admin constructor registered its wp_ajax_* hooks when the
+ // singleton was created in wpSetUpBeforeClass; re-register the ones
+ // under test against the same instance.
+ add_action( 'wp_ajax_wpmm_subscribers_export', array( self::$admin, 'subscribers_export' ) );
+ add_action( 'wp_ajax_wpmm_subscribers_empty_list', array( self::$admin, 'subscribers_empty_list' ) );
+ add_action( 'wp_ajax_wpmm_dismiss_notices', array( self::$admin, 'dismiss_notices' ) );
+ add_action( 'wp_ajax_wpmm_reset_settings', array( self::$admin, 'reset_plugin_settings' ) );
+ add_action( 'wp_ajax_wpmm_select_page', array( self::$admin, 'select_page' ) );
+ add_action( 'wp_ajax_wpmm_skip_insert_template', array( self::$admin, 'skip_insert_template' ) );
+ add_action( 'wp_ajax_wpmm_skip_wizard', array( self::$admin, 'skip_wizard' ) );
+ add_action( 'wp_ajax_wpmm_subscribe', array( self::$admin, 'subscribe_newsletter' ) );
+ add_action( 'wp_ajax_wpmm_change_template_category', array( self::$admin, 'change_template_category' ) );
+ add_action( 'wp_ajax_wpmm_toggle_gutenberg', array( self::$admin, 'toggle_gutenberg' ) );
+
+ // _handleAjax() fires admin_init without defining DOING_AJAX; whenever a
+ // test leaves the install marked fresh, maybe_redirect() would redirect
+ // to the wizard and exit, killing the PHPUnit process.
+ remove_action( 'admin_init', array( self::$admin, 'maybe_redirect' ) );
+
+ // The ajax testcase removes these in a class-level fixture, which the
+ // per-process hook snapshot undoes; without the removal, admin_init
+ // reaches out to wordpress.org for core/plugin/theme update checks.
+ remove_action( 'admin_init', '_maybe_update_core' );
+ remove_action( 'admin_init', '_maybe_update_plugins' );
+ remove_action( 'admin_init', '_maybe_update_themes' );
+
+ // Replace the suite's die handler (registered at priority 1) with one
+ // that signals via an Error the plugin's catch-all blocks cannot eat.
+ add_filter( 'wp_die_ajax_handler', array( $this, 'get_error_safe_die_handler' ), 2 );
+ }
+
+ /**
+ * Filter callback returning the die handler used during these tests.
+ *
+ * @return callable
+ */
+ public function get_error_safe_die_handler() {
+ return array( $this, 'error_safe_die_handler' );
+ }
+
+ /**
+ * Collects the response like the suite's die handler, then stops the
+ * handler with an Error-based signal.
+ *
+ * @param string|int $message The wp_die message.
+ * @throws WPMM_Ajax_Die_Signal
+ */
+ public function error_safe_die_handler( $message ) {
+ $this->_last_response .= ob_get_clean();
+
+ throw new WPMM_Ajax_Die_Signal( is_scalar( $message ) ? (string) $message : '' );
+ }
+
+ /**
+ * Run a handler and return the decoded JSON response.
+ *
+ * @param string $action The ajax action, with the nopriv_ prefix when logged out.
+ * @return array
+ */
+ protected function handle( $action ) {
+ try {
+ $this->_handleAjax( $action );
+ } catch ( WPMM_Ajax_Die_Signal $e ) {
+ // wp_send_json_*() stops here; the payload is in _last_response.
+ unset( $e );
+ }
+
+ return json_decode( $this->_last_response, true );
+ }
+
+ /*
+ * wpmm_add_subscriber (nopriv)
+ */
+
+ public function test_add_subscriber_rejects_invalid_email() {
+ wp_set_current_user( 0 );
+ $_POST['email'] = 'not-an-email';
+ $_POST['_wpnonce'] = wp_create_nonce( 'wpmts_nonce_subscribe' );
+
+ $response = $this->handle( 'nopriv_wpmm_add_subscriber' );
+
+ $this->assertFalse( $response['success'] );
+ $this->assertSame( 'Please enter a valid email address.', $response['data'] );
+ $this->assertSame( 0, wpmm_get_subscribers_count() );
+ }
+
+ public function test_add_subscriber_rejects_missing_nonce() {
+ wp_set_current_user( 0 );
+ $_POST['email'] = 'visitor@example.com';
+
+ $response = $this->handle( 'nopriv_wpmm_add_subscriber' );
+
+ $this->assertFalse( $response['success'] );
+ $this->assertSame( 'Security check.', $response['data'] );
+ $this->assertSame( 0, wpmm_get_subscribers_count() );
+ }
+
+ public function test_add_subscriber_saves_subscriber_once() {
+ wp_set_current_user( 0 );
+ $_POST['email'] = 'visitor@example.com';
+ $_POST['_wpnonce'] = wp_create_nonce( 'wpmts_nonce_subscribe' );
+
+ $response = $this->handle( 'nopriv_wpmm_add_subscriber' );
+
+ $this->assertTrue( $response['success'] );
+ $this->assertSame( 'You successfully subscribed. Thanks!', $response['data'] );
+ $this->assertSame( 1, wpmm_get_subscribers_count() );
+
+ // Subscribing the same address twice must not create a duplicate.
+ $this->_last_response = '';
+ $this->handle( 'nopriv_wpmm_add_subscriber' );
+ $this->assertSame( 1, wpmm_get_subscribers_count() );
+ }
+
+ /*
+ * wpmm_send_contact (nopriv)
+ */
+
+ public function test_send_contact_requires_all_fields() {
+ wp_set_current_user( 0 );
+ $_POST['name'] = 'Visitor';
+ $_POST['email'] = 'visitor@example.com';
+ // no content
+
+ $response = $this->handle( 'nopriv_wpmm_send_contact' );
+
+ $this->assertFalse( $response['success'] );
+ $this->assertSame( 'All fields required.', $response['data'] );
+ }
+
+ public function test_send_contact_emails_the_site_admin() {
+ reset_phpmailer_instance();
+
+ // wp-env sites live on localhost, and PHPMailer rejects the resulting
+ // default sender wordpress@localhost as an invalid address.
+ add_filter(
+ 'wp_mail_from',
+ function () {
+ return 'wordpress@example.com';
+ }
+ );
+
+ wp_set_current_user( 0 );
+ $_POST['name'] = 'Visitor';
+ $_POST['email'] = 'visitor@example.com';
+ $_POST['content'] = 'Hello, when will the site be back?';
+ $_POST['_wpnonce'] = wp_create_nonce( 'wpmts_nonce_contact' );
+
+ $response = $this->handle( 'nopriv_wpmm_send_contact' );
+
+ $this->assertTrue( $response['success'] );
+
+ $mailer = tests_retrieve_phpmailer_instance();
+ $this->assertSame( get_option( 'admin_email' ), $mailer->get_recipient( 'to' )->address );
+ $this->assertStringContainsString( 'when will the site be back', $mailer->get_sent()->body );
+
+ reset_phpmailer_instance();
+ }
+
+ /*
+ * wpmm_reset_settings
+ */
+
+ public function test_reset_settings_requires_capability() {
+ $this->_setRole( 'subscriber' );
+ $_POST['tab'] = 'design';
+ $_POST['_wpnonce'] = wp_create_nonce( 'tab-design' );
+
+ $response = $this->handle( 'wpmm_reset_settings' );
+
+ $this->assertFalse( $response['success'] );
+ $this->assertSame( 'You do not have access to this resource.', $response['data'] );
+ }
+
+ public function test_reset_settings_restores_tab_defaults() {
+ $this->_setRole( 'administrator' );
+
+ $settings = get_option( 'wpmm_settings' );
+ $settings['design']['title'] = 'Customized title';
+ update_option( 'wpmm_settings', $settings );
+
+ $_POST['tab'] = 'design';
+ $_POST['_wpnonce'] = wp_create_nonce( 'tab-design' );
+
+ $response = $this->handle( 'wpmm_reset_settings' );
+
+ $this->assertTrue( $response['success'] );
+
+ $defaults = WP_Maintenance_Mode::get_instance()->default_settings();
+ $saved = get_option( 'wpmm_settings' );
+ $this->assertSame( $defaults['design']['title'], $saved['design']['title'] );
+ }
+
+ /*
+ * wpmm_select_page
+ */
+
+ public function test_select_page_updates_selection_and_template() {
+ $this->_setRole( 'administrator' );
+
+ $page_id = self::factory()->post->create(
+ array(
+ 'post_type' => 'page',
+ 'post_status' => 'publish',
+ 'post_title' => 'Future maintenance page',
+ )
+ );
+
+ $_POST['page_id'] = (string) $page_id;
+ $_POST['_wpnonce'] = wp_create_nonce( 'tab-design' );
+
+ $response = $this->handle( 'wpmm_select_page' );
+
+ $this->assertTrue( $response['success'] );
+
+ $saved = get_option( 'wpmm_settings' );
+ $this->assertEquals( $page_id, $saved['design']['page_id'] );
+ $this->assertSame( 'templates/wpmm-page-template.php', get_post_meta( $page_id, '_wp_page_template', true ) );
+ }
+
+ /*
+ * wpmm_skip_wizard / wpmm_skip_insert_template
+ */
+
+ public function test_skip_wizard_marks_install_as_not_fresh() {
+ $this->_setRole( 'administrator' );
+ update_option( 'wpmm_fresh_install', '1' );
+
+ $_POST['_wpnonce'] = wp_create_nonce( 'wizard' );
+
+ $response = $this->handle( 'wpmm_skip_wizard' );
+
+ $this->assertTrue( $response['success'] );
+ $this->assertEmpty( get_option( 'wpmm_fresh_install' ) );
+ }
+
+ public function test_skip_insert_template_marks_install_as_not_fresh() {
+ $this->_setRole( 'administrator' );
+ update_option( 'wpmm_fresh_install', '1' );
+
+ $_POST['_wpnonce'] = wp_create_nonce( 'wizard' );
+
+ $response = $this->handle( 'wpmm_skip_insert_template' );
+
+ $this->assertTrue( $response['success'] );
+ $this->assertEmpty( get_option( 'wpmm_fresh_install' ) );
+ }
+
+ /*
+ * wpmm_change_template_category
+ */
+
+ public function test_change_template_category_updates_settings() {
+ $this->_setRole( 'administrator' );
+
+ $_POST['category'] = 'coming-soon';
+ $_POST['_wpnonce'] = wp_create_nonce( 'tab-design' );
+
+ $response = $this->handle( 'wpmm_change_template_category' );
+
+ $this->assertTrue( $response['success'] );
+
+ $saved = get_option( 'wpmm_settings' );
+ $this->assertSame( 'coming-soon', $saved['design']['template_category'] );
+ }
+
+ /*
+ * wpmm_toggle_gutenberg
+ */
+
+ public function test_toggle_gutenberg_flips_the_new_look_option() {
+ $this->_setRole( 'administrator' );
+ delete_option( 'wpmm_new_look' );
+ delete_option( 'wpmm_migration_time' );
+
+ $_POST['source'] = 'dashboard';
+ $_POST['_wpnonce'] = wp_create_nonce( 'notice_nonce_dashboard' );
+
+ $response = $this->handle( 'wpmm_toggle_gutenberg' );
+
+ $this->assertTrue( $response['success'] );
+ $this->assertTrue( (bool) get_option( 'wpmm_new_look' ) );
+ $this->assertNotEmpty( get_option( 'wpmm_migration_time' ) );
+ }
+
+ /*
+ * wpmm_subscribe (plugin newsletter, external HTTP)
+ */
+
+ public function test_subscribe_newsletter_posts_the_email_to_the_remote_service() {
+ $this->_setRole( 'administrator' );
+
+ $captured = null;
+ add_filter(
+ 'pre_http_request',
+ function ( $preempt, $args, $url ) use ( &$captured ) {
+ if ( WP_Maintenance_Mode_Admin::SUBSCRIBE_ROUTE !== $url ) {
+ return $preempt;
+ }
+
+ $captured = array(
+ 'url' => $url,
+ 'body' => $args['body'],
+ );
+
+ return array(
+ 'headers' => array(),
+ 'body' => '{}',
+ 'response' => array(
+ 'code' => 200,
+ 'message' => 'OK',
+ ),
+ );
+ },
+ 10,
+ 3
+ );
+
+ $_POST['email'] = 'owner@example.com';
+ $_POST['_wpnonce'] = wp_create_nonce( 'wizard' );
+
+ $response = $this->handle( 'wpmm_subscribe' );
+
+ $this->assertTrue( $response['success'] );
+ $this->assertNotNull( $captured );
+ $this->assertStringContainsString( 'owner@example.com', $captured['body'] );
+ }
+
+ public function test_subscribe_newsletter_reports_remote_failures() {
+ $this->_setRole( 'administrator' );
+
+ add_filter(
+ 'pre_http_request',
+ function ( $preempt, $args, $url ) {
+ if ( WP_Maintenance_Mode_Admin::SUBSCRIBE_ROUTE !== $url ) {
+ return $preempt;
+ }
+
+ return new WP_Error( 'http_request_failed', 'Could not resolve host.' );
+ },
+ 10,
+ 3
+ );
+
+ $_POST['email'] = 'owner@example.com';
+ $_POST['_wpnonce'] = wp_create_nonce( 'wizard' );
+
+ $response = $this->handle( 'wpmm_subscribe' );
+
+ $this->assertFalse( $response['success'] );
+ $this->assertSame( 'Could not resolve host.', $response['data'] );
+ }
+
+ /*
+ * wpmm_subscribers_empty_list / wpmm_subscribers_export
+ */
+
+ public function test_subscribers_empty_list_deletes_all_subscribers() {
+ $this->_setRole( 'administrator' );
+
+ self::$frontend->insert_subscriber( 'visitor@example.com' );
+ $this->assertSame( 1, wpmm_get_subscribers_count() );
+
+ $_POST['_wpnonce'] = wp_create_nonce( 'tab-modules' );
+
+ $response = $this->handle( 'wpmm_subscribers_empty_list' );
+
+ $this->assertTrue( $response['success'] );
+ $this->assertSame( 0, wpmm_get_subscribers_count() );
+ }
+
+ public function test_subscribers_export_requires_capability() {
+ $this->_setRole( 'subscriber' );
+
+ $_GET['_wpnonce'] = wp_create_nonce( 'tab-modules' );
+
+ $response = $this->handle( 'wpmm_subscribers_export' );
+
+ $this->assertFalse( $response['success'] );
+ $this->assertSame( 'You do not have access to this resource.', $response['data'] );
+ }
+
+ /*
+ * wpmm_dismiss_notices
+ */
+
+ public function test_dismiss_notices_records_the_notice_for_the_user() {
+ $this->_setRole( 'administrator' );
+
+ $_POST['notice_key'] = 'rate';
+ $_POST['_nonce'] = wp_create_nonce( 'notice_nonce_rate' );
+
+ $response = $this->handle( 'wpmm_dismiss_notices' );
+
+ $this->assertTrue( $response['success'] );
+ $this->assertContains( 'rate', self::$admin->get_dismissed_notices( get_current_user_id() ) );
+ }
+
+ public function test_dismiss_notices_rejects_a_foreign_nonce() {
+ $this->_setRole( 'administrator' );
+
+ $_POST['notice_key'] = 'rate';
+ $_POST['_nonce'] = wp_create_nonce( 'notice_nonce_other' );
+
+ $response = $this->handle( 'wpmm_dismiss_notices' );
+
+ $this->assertFalse( $response['success'] );
+ $this->assertSame( 'Security check.', $response['data'] );
+ }
+}
diff --git a/tests/e2e/global-setup.js b/tests/e2e/global-setup.js
new file mode 100644
index 0000000..8410cf9
--- /dev/null
+++ b/tests/e2e/global-setup.js
@@ -0,0 +1,20 @@
+/**
+ * WordPress dependencies
+ */
+import { RequestUtils } from '@wordpress/e2e-test-utils-playwright';
+
+async function globalSetup( config ) {
+ const { storageState, baseURL } = config.projects[ 0 ].use;
+ const storageStatePath =
+ typeof storageState === 'string' ? storageState : undefined;
+
+ const requestUtils = await RequestUtils.setup( {
+ baseURL,
+ storageStatePath,
+ } );
+
+ // Authenticate and persist the admin storage state so specs start logged in.
+ await requestUtils.setupRest();
+}
+
+export default globalSetup;
diff --git a/tests/e2e/playwright.config.js b/tests/e2e/playwright.config.js
new file mode 100644
index 0000000..a93a8e3
--- /dev/null
+++ b/tests/e2e/playwright.config.js
@@ -0,0 +1,59 @@
+/**
+ * External dependencies
+ */
+import fs from 'fs';
+import path from 'path';
+import { defineConfig, devices } from '@playwright/test';
+
+const STORAGE_STATE_PATH =
+ process.env.STORAGE_STATE_PATH ||
+ path.join( process.cwd(), 'artifacts/storage-states/admin.json' );
+
+// Port precedence: WP_BASE_URL > WP_ENV_PORT > .wp-env.override.json > 8888.
+// The override file pins a per-checkout port (written by `npm run env:start`)
+// and is read by wp-env itself, so the suite follows it with no env var.
+const getOverridePort = () => {
+ try {
+ const override = JSON.parse(
+ fs.readFileSync(
+ path.join( process.cwd(), '.wp-env.override.json' ),
+ 'utf8'
+ )
+ );
+ return parseInt( override.port, 10 ) || undefined;
+ } catch ( e ) {
+ return undefined;
+ }
+};
+
+const WP_ENV_PORT = parseInt( process.env.WP_ENV_PORT || '', 10 ) || getOverridePort() || 8888;
+const WP_BASE_URL = process.env.WP_BASE_URL || `http://localhost:${ WP_ENV_PORT }`;
+
+// @wordpress/e2e-test-utils-playwright reads WP_BASE_URL directly (its
+// RequestUtils falls back to localhost:8889), so export the resolved URL.
+process.env.WP_BASE_URL = WP_BASE_URL;
+
+export default defineConfig( {
+ testDir: 'specs',
+ outputDir: path.join( process.cwd(), 'artifacts/test-results' ),
+ globalSetup: './global-setup.js',
+ // Maintenance mode is a site-wide option: every spec flips global state,
+ // so specs must never run in parallel. Do not raise the worker count.
+ workers: 1,
+ fullyParallel: false,
+ forbidOnly: !! process.env.CI,
+ retries: process.env.CI ? 2 : 0,
+ reporter: process.env.CI ? [ [ 'github' ], [ 'list' ] ] : 'list',
+ use: {
+ baseURL: WP_BASE_URL,
+ storageState: STORAGE_STATE_PATH,
+ trace: 'retain-on-failure',
+ video: 'off',
+ },
+ projects: [
+ {
+ name: 'chromium',
+ use: { ...devices[ 'Desktop Chrome' ] },
+ },
+ ],
+} );
diff --git a/tests/e2e/specs/access-rules.spec.js b/tests/e2e/specs/access-rules.spec.js
new file mode 100644
index 0000000..bfcc22b
--- /dev/null
+++ b/tests/e2e/specs/access-rules.spec.js
@@ -0,0 +1,207 @@
+/**
+ * WordPress dependencies
+ */
+import { test, expect } from '@wordpress/e2e-test-utils-playwright';
+
+/**
+ * Internal dependencies
+ */
+import {
+ visitPluginSettings,
+ activateSettingsTab,
+ saveSettingsForm,
+ openAsVisitor,
+} from '../utils.js';
+
+const DEFAULT_EXCLUDE_LIST = 'feed\nwp-login\nlogin';
+const GOOGLEBOT_UA =
+ 'Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)';
+
+/**
+ * Apply changes to the General tab form and save them in one round-trip.
+ *
+ * @param {Object} admin The admin fixture.
+ * @param {Object} page The admin page fixture.
+ * @param {Function} apply Callback receiving the General tab form locator.
+ */
+async function saveGeneralSettings( admin, page, apply ) {
+ await visitPluginSettings( admin );
+ await activateSettingsTab( page, 'general' );
+
+ const form = page.locator( '#tab-general form' );
+ await apply( form );
+ await saveSettingsForm( page, form );
+}
+
+test.describe( 'maintenance mode access rules', () => {
+ test( 'excluded URLs stay reachable for visitors while maintenance mode is active', async ( {
+ admin,
+ page,
+ browser,
+ requestUtils,
+ } ) => {
+ await requestUtils.rest( {
+ path: '/wp/v2/pages',
+ method: 'POST',
+ data: {
+ title: 'Status update',
+ slug: 'status-update',
+ status: 'publish',
+ content: 'All systems operational.',
+ },
+ } );
+
+ await saveGeneralSettings( admin, page, async ( form ) => {
+ await form
+ .locator( 'input[name="options[general][status]"][value="1"]' )
+ .check( { force: true } );
+ await form
+ .locator( 'textarea[name="options[general][exclude]"]' )
+ .fill( `${ DEFAULT_EXCLUDE_LIST }\nstatus-update`, {
+ force: true,
+ } );
+ } );
+
+ // The excluded page is served normally.
+ const excluded = await openAsVisitor( browser, '/status-update/' );
+ expect( excluded.response.status() ).toBe( 200 );
+ await expect( excluded.page.locator( 'body' ) ).toContainText(
+ 'All systems operational.'
+ );
+ await excluded.context.close();
+
+ // Everything else is still under maintenance.
+ const visitor = await openAsVisitor( browser );
+ expect( visitor.response.status() ).toBe( 503 );
+ await visitor.context.close();
+
+ await saveGeneralSettings( admin, page, async ( form ) => {
+ await form
+ .locator( 'input[name="options[general][status]"][value="0"]' )
+ .check( { force: true } );
+ await form
+ .locator( 'textarea[name="options[general][exclude]"]' )
+ .fill( DEFAULT_EXCLUDE_LIST, { force: true } );
+ } );
+ } );
+
+ test( 'search bots see the site only while bot bypass is enabled', async ( {
+ admin,
+ page,
+ browser,
+ } ) => {
+ // Bypass off: a crawler is blocked like any visitor.
+ await saveGeneralSettings( admin, page, async ( form ) => {
+ await form
+ .locator( 'input[name="options[general][status]"][value="1"]' )
+ .check( { force: true } );
+ await form
+ .locator( 'select[name="options[general][bypass_bots]"]' )
+ .selectOption( '0', { force: true } );
+ } );
+
+ const blockedBot = await openAsVisitor( browser, '/', {
+ userAgent: GOOGLEBOT_UA,
+ } );
+ expect( blockedBot.response.status() ).toBe( 503 );
+ await blockedBot.context.close();
+
+ // Bypass on: the crawler gets the real site.
+ await saveGeneralSettings( admin, page, async ( form ) => {
+ await form
+ .locator( 'select[name="options[general][bypass_bots]"]' )
+ .selectOption( '1', { force: true } );
+ } );
+
+ const bot = await openAsVisitor( browser, '/', {
+ userAgent: GOOGLEBOT_UA,
+ } );
+ expect( bot.response.status() ).toBe( 200 );
+ await expect( bot.page.locator( 'body' ) ).not.toContainText(
+ 'Sorry for the inconvenience'
+ );
+ await bot.context.close();
+
+ // A regular visitor still gets the maintenance page.
+ const visitor = await openAsVisitor( browser );
+ expect( visitor.response.status() ).toBe( 503 );
+ await visitor.context.close();
+
+ await saveGeneralSettings( admin, page, async ( form ) => {
+ await form
+ .locator( 'input[name="options[general][status]"][value="0"]' )
+ .check( { force: true } );
+ await form
+ .locator( 'select[name="options[general][bypass_bots]"]' )
+ .selectOption( '0', { force: true } );
+ } );
+ } );
+
+ test( 'feeds and the REST API stay reachable during maintenance', async ( {
+ admin,
+ page,
+ browser,
+ } ) => {
+ await saveGeneralSettings( admin, page, async ( form ) => {
+ await form
+ .locator( 'input[name="options[general][status]"][value="1"]' )
+ .check( { force: true } );
+ } );
+
+ // "feed" is on the default exclude list.
+ const feed = await openAsVisitor( browser, '/feed/' );
+ expect( feed.response.status() ).toBe( 200 );
+ expect( feed.response.headers()[ 'content-type' ] ).toContain( 'xml' );
+ await feed.context.close();
+
+ // REST requests never reach the template_redirect takeover; this pins
+ // the current behavior so a change to it is a conscious decision.
+ const rest = await openAsVisitor( browser, '/wp-json/wp/v2/types' );
+ expect( rest.response.status() ).toBe( 200 );
+ await rest.context.close();
+
+ await saveGeneralSettings( admin, page, async ( form ) => {
+ await form
+ .locator( 'input[name="options[general][status]"][value="0"]' )
+ .check( { force: true } );
+ } );
+ } );
+
+ test( 'the maintenance response advertises Retry-After and the configured robots policy', async ( {
+ admin,
+ page,
+ browser,
+ } ) => {
+ await saveGeneralSettings( admin, page, async ( form ) => {
+ await form
+ .locator( 'input[name="options[general][status]"][value="1"]' )
+ .check( { force: true } );
+ await form
+ .locator( 'select[name="options[general][meta_robots]"]' )
+ .selectOption( '1', { force: true } );
+ } );
+
+ const visitor = await openAsVisitor( browser );
+ expect( visitor.response.status() ).toBe( 503 );
+ expect(
+ Number( visitor.response.headers()[ 'retry-after' ] )
+ ).toBeGreaterThan( 0 );
+ // WordPress core injects its own robots meta (max-image-preview), so
+ // assert the plugin's tag specifically.
+ await expect(
+ visitor.page.locator(
+ 'meta[name="robots"][content="noindex, nofollow"]'
+ )
+ ).toBeAttached();
+ await visitor.context.close();
+
+ await saveGeneralSettings( admin, page, async ( form ) => {
+ await form
+ .locator( 'input[name="options[general][status]"][value="0"]' )
+ .check( { force: true } );
+ await form
+ .locator( 'select[name="options[general][meta_robots]"]' )
+ .selectOption( '0', { force: true } );
+ } );
+ } );
+} );
diff --git a/tests/e2e/specs/design.spec.js b/tests/e2e/specs/design.spec.js
new file mode 100644
index 0000000..75b59b4
--- /dev/null
+++ b/tests/e2e/specs/design.spec.js
@@ -0,0 +1,88 @@
+/**
+ * WordPress dependencies
+ */
+import { test, expect } from '@wordpress/e2e-test-utils-playwright';
+
+/**
+ * Internal dependencies
+ */
+import {
+ visitPluginSettings,
+ activateSettingsTab,
+ setMaintenanceMode,
+ saveSettingsForm,
+ openAsVisitor,
+} from '../utils.js';
+
+const DEFAULT_HEADING = 'Maintenance mode';
+
+test.describe( 'maintenance page design', () => {
+ test( 'custom title and heading show up on the maintenance page', async ( {
+ admin,
+ page,
+ browser,
+ } ) => {
+ await visitPluginSettings( admin );
+ await activateSettingsTab( page, 'design' );
+ const designForm = page.locator( '#tab-design form' );
+ await designForm
+ .locator( 'input[name="options[design][title]"]' )
+ .fill( 'Back soon — Acme Co', { force: true } );
+ await designForm
+ .locator( 'input[name="options[design][heading]"]' )
+ .fill( 'We are polishing things up', { force: true } );
+ await saveSettingsForm( page, designForm );
+
+ await setMaintenanceMode( admin, page, true );
+
+ const visitor = await openAsVisitor( browser );
+ expect( visitor.response.status() ).toBe( 503 );
+ await expect( visitor.page ).toHaveTitle( 'Back soon — Acme Co' );
+ await expect(
+ visitor.page.getByRole( 'heading', {
+ name: 'We are polishing things up',
+ } )
+ ).toBeVisible();
+ await visitor.context.close();
+
+ await setMaintenanceMode( admin, page, false );
+
+ // Hand the design defaults back for the specs that follow.
+ await visitPluginSettings( admin );
+ await activateSettingsTab( page, 'design' );
+ const cleanupForm = page.locator( '#tab-design form' );
+ await cleanupForm
+ .locator( 'input[name="options[design][title]"]' )
+ .fill( DEFAULT_HEADING, { force: true } );
+ await cleanupForm
+ .locator( 'input[name="options[design][heading]"]' )
+ .fill( DEFAULT_HEADING, { force: true } );
+ await saveSettingsForm( page, cleanupForm );
+ } );
+
+ test( 'the reset button restores the design tab defaults', async ( {
+ admin,
+ page,
+ } ) => {
+ await visitPluginSettings( admin );
+ await activateSettingsTab( page, 'design' );
+ const designForm = page.locator( '#tab-design form' );
+ const headingField = designForm.locator(
+ 'input[name="options[design][heading]"]'
+ );
+ await headingField.fill( 'A heading to be discarded', {
+ force: true,
+ } );
+ await saveSettingsForm( page, designForm );
+
+ // The reset control posts wpmm_reset_settings and reloads the page.
+ await activateSettingsTab( page, 'design' );
+ await page
+ .locator( 'input.reset_settings[data-tab="design"]' )
+ .click( { force: true } );
+
+ await expect(
+ page.locator( 'input[name="options[design][heading]"]' )
+ ).toHaveValue( DEFAULT_HEADING );
+ } );
+} );
diff --git a/tests/e2e/specs/maintenance-mode.spec.js b/tests/e2e/specs/maintenance-mode.spec.js
new file mode 100644
index 0000000..885faaf
--- /dev/null
+++ b/tests/e2e/specs/maintenance-mode.spec.js
@@ -0,0 +1,91 @@
+/**
+ * WordPress dependencies
+ */
+import { test, expect } from '@wordpress/e2e-test-utils-playwright';
+
+/**
+ * Internal dependencies
+ */
+import { setMaintenanceMode, openAsVisitor } from '../utils.js';
+
+test.describe( 'maintenance mode lifecycle', () => {
+ test( 'the site is public while maintenance mode is off', async ( {
+ admin,
+ page,
+ browser,
+ } ) => {
+ await setMaintenanceMode( admin, page, false );
+
+ const visitor = await openAsVisitor( browser );
+ expect( visitor.response.status() ).toBe( 200 );
+ await expect( visitor.page.locator( 'body' ) ).not.toContainText(
+ 'Sorry for the inconvenience'
+ );
+ await visitor.context.close();
+ } );
+
+ test( 'visitors get the 503 maintenance page while active, admins and the login page stay reachable', async ( {
+ admin,
+ page,
+ browser,
+ } ) => {
+ await setMaintenanceMode( admin, page, true );
+
+ // A logged-out visitor is served the maintenance page with a 503.
+ const visitor = await openAsVisitor( browser );
+ expect( visitor.response.status() ).toBe( 503 );
+ await expect( visitor.page.locator( 'body' ) ).toContainText(
+ 'Sorry for the inconvenience'
+ );
+ await visitor.context.close();
+
+ // The login page stays excluded from the takeover.
+ const login = await openAsVisitor( browser, '/wp-login.php' );
+ expect( login.response.status() ).toBe( 200 );
+ await expect(
+ login.page.locator( 'input[name="log"]' )
+ ).toBeVisible();
+ await login.context.close();
+
+ // A logged-in administrator still sees the real site.
+ const adminResponse = await page.goto( '/' );
+ expect( adminResponse.status() ).toBe( 200 );
+ await expect( page.locator( 'body' ) ).not.toContainText(
+ 'Sorry for the inconvenience'
+ );
+ } );
+
+ test( 'admins get a warning notice in wp-admin while maintenance mode is active', async ( {
+ admin,
+ page,
+ } ) => {
+ await setMaintenanceMode( admin, page, true );
+
+ await admin.visitAdminPage( 'index.php', '' );
+ await expect(
+ page.getByText( /The Maintenance Mode is/ ).first()
+ ).toBeVisible();
+
+ await setMaintenanceMode( admin, page, false );
+
+ await admin.visitAdminPage( 'index.php', '' );
+ await expect(
+ page.getByText( /The Maintenance Mode is/ )
+ ).toHaveCount( 0 );
+ } );
+
+ test( 'disabling maintenance mode makes the site public again', async ( {
+ admin,
+ page,
+ browser,
+ } ) => {
+ await setMaintenanceMode( admin, page, false );
+
+ const visitor = await openAsVisitor( browser );
+ expect( visitor.response.status() ).toBe( 200 );
+ await expect( visitor.page.locator( 'body' ) ).not.toContainText(
+ 'Sorry for the inconvenience'
+ );
+ await visitor.context.close();
+ } );
+} );
diff --git a/tests/e2e/specs/modules.spec.js b/tests/e2e/specs/modules.spec.js
new file mode 100644
index 0000000..e845ab6
--- /dev/null
+++ b/tests/e2e/specs/modules.spec.js
@@ -0,0 +1,211 @@
+/**
+ * WordPress dependencies
+ */
+import { test, expect } from '@wordpress/e2e-test-utils-playwright';
+
+/**
+ * Internal dependencies
+ */
+import {
+ visitPluginSettings,
+ activateSettingsTab,
+ setMaintenanceMode,
+ saveSettingsForm,
+ openAsVisitor,
+} from '../utils.js';
+
+/**
+ * Apply changes to the Modules tab form and save them.
+ *
+ * @param {Object} admin The admin fixture.
+ * @param {Object} page The admin page fixture.
+ * @param {Function} apply Callback receiving the Modules tab form locator.
+ */
+async function saveModulesSettings( admin, page, apply ) {
+ await visitPluginSettings( admin );
+ await activateSettingsTab( page, 'modules' );
+
+ const form = page.locator( '#tab-modules form' );
+ await apply( form );
+ await saveSettingsForm( page, form );
+}
+
+test.describe( 'maintenance page modules', () => {
+ test( 'the countdown module renders for visitors', async ( {
+ admin,
+ page,
+ browser,
+ } ) => {
+ await saveModulesSettings( admin, page, async ( form ) => {
+ await form
+ .locator( 'select[name="options[modules][countdown_status]"]' )
+ .selectOption( '1', { force: true } );
+ } );
+ await setMaintenanceMode( admin, page, true );
+
+ const visitor = await openAsVisitor( browser );
+ await expect( visitor.page.locator( '.countdown' ) ).toBeAttached();
+ await visitor.context.close();
+
+ await setMaintenanceMode( admin, page, false );
+ await saveModulesSettings( admin, page, async ( form ) => {
+ await form
+ .locator( 'select[name="options[modules][countdown_status]"]' )
+ .selectOption( '0', { force: true } );
+ } );
+ } );
+
+ test( 'the social module links to the configured profiles', async ( {
+ admin,
+ page,
+ browser,
+ } ) => {
+ await saveModulesSettings( admin, page, async ( form ) => {
+ await form
+ .locator( 'select[name="options[modules][social_status]"]' )
+ .selectOption( '1', { force: true } );
+ await form
+ .locator( 'input[name="options[modules][social_twitter]"]' )
+ .fill( 'https://twitter.com/acme', { force: true } );
+ await form
+ .locator( 'input[name="options[modules][social_github]"]' )
+ .fill( 'https://github.com/acme', { force: true } );
+ } );
+ await setMaintenanceMode( admin, page, true );
+
+ const visitor = await openAsVisitor( browser );
+ await expect( visitor.page.locator( '.social a.tw' ) ).toHaveAttribute(
+ 'href',
+ 'https://twitter.com/acme'
+ );
+ await expect(
+ visitor.page.locator( '.social a.git' )
+ ).toHaveAttribute( 'href', 'https://github.com/acme' );
+ await visitor.context.close();
+
+ await setMaintenanceMode( admin, page, false );
+ await saveModulesSettings( admin, page, async ( form ) => {
+ await form
+ .locator( 'select[name="options[modules][social_status]"]' )
+ .selectOption( '0', { force: true } );
+ await form
+ .locator( 'input[name="options[modules][social_twitter]"]' )
+ .fill( '', { force: true } );
+ await form
+ .locator( 'input[name="options[modules][social_github]"]' )
+ .fill( '', { force: true } );
+ } );
+ } );
+
+ test( 'the contact module renders its form fields', async ( {
+ admin,
+ page,
+ browser,
+ } ) => {
+ await saveModulesSettings( admin, page, async ( form ) => {
+ await form
+ .locator( 'select[name="options[modules][contact_status]"]' )
+ .selectOption( '1', { force: true } );
+ } );
+ await setMaintenanceMode( admin, page, true );
+
+ const visitor = await openAsVisitor( browser );
+ const contactForm = visitor.page.locator( '.contact form.contact_form' );
+ await expect( contactForm ).toBeAttached();
+ await expect(
+ contactForm.locator( 'input[name="name"]' )
+ ).toBeAttached();
+ await expect(
+ contactForm.locator( 'input[name="email"]' )
+ ).toBeAttached();
+ await expect(
+ contactForm.locator( 'textarea[name="content"]' )
+ ).toBeAttached();
+ await visitor.context.close();
+
+ await setMaintenanceMode( admin, page, false );
+ await saveModulesSettings( admin, page, async ( form ) => {
+ await form
+ .locator( 'select[name="options[modules][contact_status]"]' )
+ .selectOption( '0', { force: true } );
+ } );
+ } );
+
+ test( 'the Google Analytics module embeds the tracking code', async ( {
+ admin,
+ page,
+ browser,
+ } ) => {
+ await saveModulesSettings( admin, page, async ( form ) => {
+ await form
+ .locator( 'select[name="options[modules][ga_status]"]' )
+ .selectOption( '1', { force: true } );
+ await form
+ .locator( 'input[name="options[modules][ga_code]"]' )
+ .fill( 'G-E2ETRACK1', { force: true } );
+ } );
+ await setMaintenanceMode( admin, page, true );
+
+ const visitor = await openAsVisitor( browser );
+ expect( await visitor.page.content() ).toContain( 'G-E2ETRACK1' );
+ await visitor.context.close();
+
+ await setMaintenanceMode( admin, page, false );
+ await saveModulesSettings( admin, page, async ( form ) => {
+ await form
+ .locator( 'select[name="options[modules][ga_status]"]' )
+ .selectOption( '0', { force: true } );
+ await form
+ .locator( 'input[name="options[modules][ga_code]"]' )
+ .fill( '', { force: true } );
+ } );
+ } );
+
+ test( 'the GDPR module adds a consent checkbox to the subscribe form', async ( {
+ admin,
+ page,
+ browser,
+ } ) => {
+ await saveModulesSettings( admin, page, async ( form ) => {
+ await form
+ .locator( 'select[name="options[modules][subscribe_status]"]' )
+ .selectOption( '1', { force: true } );
+ } );
+
+ await visitPluginSettings( admin );
+ await activateSettingsTab( page, 'gdpr' );
+ const gdprForm = page.locator( '#tab-gdpr form' );
+ await gdprForm
+ .locator( 'input[name="options[gdpr][status]"][value="1"]' )
+ .check( { force: true } );
+ await saveSettingsForm( page, gdprForm );
+
+ await setMaintenanceMode( admin, page, true );
+
+ const visitor = await openAsVisitor( browser );
+ const subscribeForm = visitor.page.locator( 'form.subscribe_form' );
+ await expect(
+ subscribeForm.locator( 'input[name="acceptance"]' )
+ ).toBeAttached();
+ await expect( subscribeForm.locator( '.privacy_tail' ) ).toContainText(
+ 'Privacy Policy'
+ );
+ await visitor.context.close();
+
+ await setMaintenanceMode( admin, page, false );
+
+ await visitPluginSettings( admin );
+ await activateSettingsTab( page, 'gdpr' );
+ const gdprCleanup = page.locator( '#tab-gdpr form' );
+ await gdprCleanup
+ .locator( 'input[name="options[gdpr][status]"][value="0"]' )
+ .check( { force: true } );
+ await saveSettingsForm( page, gdprCleanup );
+
+ await saveModulesSettings( admin, page, async ( form ) => {
+ await form
+ .locator( 'select[name="options[modules][subscribe_status]"]' )
+ .selectOption( '0', { force: true } );
+ } );
+ } );
+} );
diff --git a/tests/e2e/specs/roles.spec.js b/tests/e2e/specs/roles.spec.js
new file mode 100644
index 0000000..68fcaba
--- /dev/null
+++ b/tests/e2e/specs/roles.spec.js
@@ -0,0 +1,118 @@
+/**
+ * WordPress dependencies
+ */
+import { test, expect } from '@wordpress/e2e-test-utils-playwright';
+
+/**
+ * Internal dependencies
+ */
+import {
+ visitPluginSettings,
+ activateSettingsTab,
+ setMaintenanceMode,
+ saveSettingsForm,
+} from '../utils.js';
+
+// Unique per run so a failed previous run's leftover user can't collide.
+const RUN_ID = Date.now();
+const SUBSCRIBER = {
+ username: `e2e-frontend-role-${ RUN_ID }`,
+ email: `e2e-frontend-role-${ RUN_ID }@example.com`,
+ password: 'e2e-Str0ng-Pass!',
+};
+
+/**
+ * Select the given roles in the Frontend Role setting and save.
+ *
+ * The visible widget is a chosen.js enhancement; the values that submit are
+ * the ones on the underlying (hidden) multi-select.
+ *
+ * @param {Object} admin The admin fixture.
+ * @param {Object} page The admin page fixture.
+ * @param {Array} roles Role slugs to allow on the frontend.
+ */
+async function setFrontendRoles( admin, page, roles ) {
+ await visitPluginSettings( admin );
+ await activateSettingsTab( page, 'general' );
+
+ const form = page.locator( '#tab-general form' );
+ await form
+ .locator( 'select[name="options[general][frontend_role][]"]' )
+ .selectOption( roles, { force: true } );
+ await saveSettingsForm( page, form );
+}
+
+test.describe( 'frontend role access', () => {
+ test( 'a logged-in subscriber bypasses maintenance mode only while their role is allowed', async ( {
+ admin,
+ page,
+ browser,
+ requestUtils,
+ } ) => {
+ // Sweep users left behind by previously failed runs.
+ const leftovers = await requestUtils.rest( {
+ path: '/wp/v2/users',
+ params: { search: 'e2e-frontend-role', per_page: 100 },
+ } );
+ for ( const leftover of leftovers ) {
+ await requestUtils.rest( {
+ path: `/wp/v2/users/${ leftover.id }`,
+ method: 'DELETE',
+ params: { force: true, reassign: 1 },
+ } );
+ }
+
+ const user = await requestUtils.rest( {
+ path: '/wp/v2/users',
+ method: 'POST',
+ data: {
+ username: SUBSCRIBER.username,
+ email: SUBSCRIBER.email,
+ password: SUBSCRIBER.password,
+ roles: [ 'subscriber' ],
+ },
+ } );
+
+ await setMaintenanceMode( admin, page, true );
+ await setFrontendRoles( admin, page, [ 'subscriber' ] );
+
+ // Log the subscriber in through the real login form.
+ const context = await browser.newContext();
+ await context.clearCookies();
+ const subscriberPage = await context.newPage();
+ await subscriberPage.goto( '/wp-login.php' );
+ await subscriberPage
+ .locator( 'input[name="log"]' )
+ .fill( SUBSCRIBER.username );
+ await subscriberPage
+ .locator( 'input[name="pwd"]' )
+ .fill( SUBSCRIBER.password );
+ await Promise.all( [
+ subscriberPage.waitForURL( /wp-admin|profile/ ),
+ subscriberPage.locator( '#wp-submit' ).click(),
+ ] );
+
+ // Allowed role: the subscriber sees the real site.
+ const allowed = await subscriberPage.goto( '/' );
+ expect( allowed.status() ).toBe( 200 );
+ await expect( subscriberPage.locator( 'body' ) ).not.toContainText(
+ 'Sorry for the inconvenience'
+ );
+
+ // Revoke the role: the same logged-in session is blocked again.
+ await setFrontendRoles( admin, page, [] );
+ const blocked = await subscriberPage.goto( '/' );
+ expect( blocked.status() ).toBe( 503 );
+ await expect( subscriberPage.locator( 'body' ) ).toContainText(
+ 'Sorry for the inconvenience'
+ );
+ await context.close();
+
+ await setMaintenanceMode( admin, page, false );
+ await requestUtils.rest( {
+ path: `/wp/v2/users/${ user.id }`,
+ method: 'DELETE',
+ params: { force: true, reassign: 1 },
+ } );
+ } );
+} );
diff --git a/tests/e2e/specs/subscribe-form.spec.js b/tests/e2e/specs/subscribe-form.spec.js
new file mode 100644
index 0000000..bfc2942
--- /dev/null
+++ b/tests/e2e/specs/subscribe-form.spec.js
@@ -0,0 +1,160 @@
+/**
+ * External dependencies
+ */
+import fs from 'fs';
+
+/**
+ * WordPress dependencies
+ */
+import { test, expect } from '@wordpress/e2e-test-utils-playwright';
+
+/**
+ * Internal dependencies
+ */
+import {
+ visitPluginSettings,
+ activateSettingsTab,
+ setMaintenanceMode,
+ saveSettingsForm,
+ openAsVisitor,
+} from '../utils.js';
+
+/**
+ * Enable or disable the subscribe module on the Modules tab.
+ *
+ * @param {Object} admin The admin fixture.
+ * @param {Object} page The admin page fixture.
+ * @param {boolean} enabled Whether the subscribe form should show.
+ */
+async function setSubscribeModule( admin, page, enabled ) {
+ await visitPluginSettings( admin );
+ await activateSettingsTab( page, 'modules' );
+
+ const modulesForm = page.locator( '#tab-modules form' );
+ await modulesForm
+ .locator( 'select[name="options[modules][subscribe_status]"]' )
+ .selectOption( enabled ? '1' : '0', { force: true } );
+ await saveSettingsForm( page, modulesForm );
+}
+
+test.describe( 'subscribe form on the maintenance page', () => {
+ test( 'a visitor can subscribe and gets a confirmation', async ( {
+ admin,
+ page,
+ browser,
+ } ) => {
+ await setSubscribeModule( admin, page, true );
+ await setMaintenanceMode( admin, page, true );
+
+ const visitor = await openAsVisitor( browser );
+ expect( visitor.response.status() ).toBe( 503 );
+
+ const email = `visitor-${ Date.now() }@example.com`;
+ await visitor.page.getByPlaceholder( 'your e-mail...' ).fill( email );
+ await visitor.page
+ .locator( 'input[type="submit"][value="Subscribe"]' )
+ .click();
+
+ // The frontend script posts to admin-ajax (wpmm_add_subscriber) and
+ // swaps the form for the server's confirmation message.
+ await expect(
+ visitor.page.locator( '.subscribe_wrapper' )
+ ).toContainText( 'You successfully subscribed. Thanks!' );
+ await visitor.context.close();
+
+ await setMaintenanceMode( admin, page, false );
+ await setSubscribeModule( admin, page, false );
+ } );
+
+ test( 'client-side validation rejects an invalid email before anything is sent', async ( {
+ admin,
+ page,
+ browser,
+ } ) => {
+ await setSubscribeModule( admin, page, true );
+ await setMaintenanceMode( admin, page, true );
+
+ const visitor = await openAsVisitor( browser );
+ await visitor.page
+ .getByPlaceholder( 'your e-mail...' )
+ .fill( 'not-an-email' );
+ await visitor.page
+ .locator( 'input[type="submit"][value="Subscribe"]' )
+ .click();
+
+ // jquery-validate blocks the submit and renders an inline error (the
+ // stylesheet keeps the label itself hidden in this layout); the form
+ // stays in place instead of the confirmation message.
+ await expect( visitor.page.locator( 'label.error' ) ).toContainText(
+ 'Please enter a valid email address.'
+ );
+ await expect(
+ visitor.page.locator( 'form.subscribe_form' )
+ ).toBeAttached();
+ await expect( visitor.page.locator( 'body' ) ).not.toContainText(
+ 'You successfully subscribed'
+ );
+ await visitor.context.close();
+
+ await setMaintenanceMode( admin, page, false );
+ await setSubscribeModule( admin, page, false );
+ } );
+
+ test( 'an admin can see, export, and empty the subscribers list', async ( {
+ admin,
+ page,
+ browser,
+ } ) => {
+ await setSubscribeModule( admin, page, true );
+ await setMaintenanceMode( admin, page, true );
+
+ // Start from a clean list; the buttons only render when there are rows.
+ await visitPluginSettings( admin );
+ await activateSettingsTab( page, 'modules' );
+ const emptyButton = page.locator( '#subscribers-empty-list' );
+ if ( await emptyButton.count() ) {
+ await emptyButton.click( { force: true } );
+ await expect( page.locator( '#subscribers_wrap' ) ).toContainText(
+ 'You have 0 subscribers'
+ );
+ }
+
+ const email = `exported-${ Date.now() }@example.com`;
+ const visitor = await openAsVisitor( browser );
+ await visitor.page.getByPlaceholder( 'your e-mail...' ).fill( email );
+ await visitor.page
+ .locator( 'input[type="submit"][value="Subscribe"]' )
+ .click();
+ await expect(
+ visitor.page.locator( '.subscribe_wrapper' )
+ ).toContainText( 'You successfully subscribed' );
+ await visitor.context.close();
+
+ // The Modules tab reflects the new subscriber.
+ await visitPluginSettings( admin );
+ await activateSettingsTab( page, 'modules' );
+ await expect( page.locator( '#subscribers_wrap' ) ).toContainText(
+ 'You have 1 subscriber'
+ );
+
+ // Export downloads a CSV containing the subscriber (the click loads
+ // the admin-ajax export URL in a hidden iframe).
+ const downloadPromise = page.waitForEvent( 'download' );
+ await page.locator( '#subscribers-export' ).click( { force: true } );
+ const download = await downloadPromise;
+ const csv = fs.readFileSync( await download.path(), 'utf8' );
+ expect( csv ).toContain( 'email' );
+ expect( csv ).toContain( email );
+
+ // Emptying the list resets the counter without a reload.
+ await page
+ .locator( '#subscribers-empty-list' )
+ .click( { force: true } );
+ await expect( page.locator( '#subscribers_wrap' ) ).toContainText(
+ 'You have 0 subscribers'
+ );
+
+ await setMaintenanceMode( admin, page, false );
+ await setSubscribeModule( admin, page, false );
+ } );
+} );
diff --git a/tests/e2e/utils.js b/tests/e2e/utils.js
new file mode 100644
index 0000000..5477de7
--- /dev/null
+++ b/tests/e2e/utils.js
@@ -0,0 +1,110 @@
+/**
+ * Shared helpers for the wp-maintenance-mode E2E specs.
+ *
+ * A note on the force: true interactions below: after any form POST + redirect
+ * (every settings save), headless Chromium stops producing animation frames
+ * for the page. Playwright's default actionability check waits for the element
+ * to be stable across two animation frames, so every non-forced interaction
+ * after a save hangs until timeout. The elements are static admin form
+ * controls, and each helper verifies the resulting state explicitly, so
+ * skipping the actionability wait is safe here.
+ */
+
+/**
+ * WordPress dependencies
+ */
+import { expect } from '@wordpress/e2e-test-utils-playwright';
+
+/**
+ * Open the plugin settings screen (LightStart top-level menu page).
+ *
+ * @param {Object} admin The @wordpress/e2e-test-utils-playwright admin fixture.
+ */
+export async function visitPluginSettings( admin ) {
+ await admin.visitAdminPage( 'admin.php', 'page=wp-maintenance-mode' );
+}
+
+/**
+ * Activate a tab on the plugin settings screen and wait for its panel.
+ *
+ * Navigating to the hash-less settings URL while another tab's hash is set is
+ * a same-document navigation, so the previous tab could still be active —
+ * always activate explicitly instead of relying on the default.
+ *
+ * @param {Object} page The admin page fixture.
+ * @param {string} tab Tab slug: general, design, modules, bot, gdpr.
+ */
+export async function activateSettingsTab( page, tab ) {
+ const link = page.locator( `a.nav-tab[href="#${ tab }"]` );
+ await expect( link ).toBeVisible();
+ await link.click( { force: true } );
+ await expect( page.locator( `#tab-${ tab }` ) ).toBeVisible();
+}
+
+/**
+ * Submit a settings tab form and wait for the save round-trip.
+ *
+ * The submit goes through admin-post.php and redirects back to the settings
+ * page with ?updated=1, which WordPress strips from the address bar right
+ * after load — so wait for the redirect response instead of the URL.
+ *
+ * @param {Object} page The admin page fixture.
+ * @param {Object} form Locator of the tab's settings form.
+ */
+export async function saveSettingsForm( page, form ) {
+ await Promise.all( [
+ page.waitForResponse( ( response ) =>
+ response.url().includes( 'updated=1' )
+ ),
+ form
+ .getByRole( 'button', { name: 'Save settings' } )
+ .click( { force: true } ),
+ ] );
+ await page.waitForLoadState();
+}
+
+/**
+ * Toggle maintenance mode through the General tab of the settings screen.
+ *
+ * @param {Object} admin The admin fixture.
+ * @param {Object} page The admin page fixture.
+ * @param {boolean} enabled Whether maintenance mode should be on.
+ */
+export async function setMaintenanceMode( admin, page, enabled ) {
+ await visitPluginSettings( admin );
+ await activateSettingsTab( page, 'general' );
+
+ const generalForm = page.locator( '#tab-general form' );
+ const radio = generalForm.locator(
+ `input[name="options[general][status]"][value="${ enabled ? 1 : 0 }"]`
+ );
+ await expect( radio ).toBeVisible();
+ await radio.check( { force: true } );
+
+ await saveSettingsForm( page, generalForm );
+
+ // The chosen status still being checked after the reload proves it persisted.
+ await expect(
+ page.locator(
+ `input[name="options[general][status]"][value="${ enabled ? 1 : 0 }"]`
+ )
+ ).toBeChecked();
+}
+
+/**
+ * Open a page as a logged-out visitor and return { page, response, context }.
+ *
+ * @param {Object} browser The Playwright browser fixture.
+ * @param {string} url URL (or path) to open.
+ * @param {Object} contextOptions Extra context options (e.g. userAgent).
+ */
+export async function openAsVisitor( browser, url = '/', contextOptions = {} ) {
+ // Contexts created through the runner's browser fixture inherit the
+ // config's admin storageState, so drop the login cookies explicitly.
+ const context = await browser.newContext( contextOptions );
+ await context.clearCookies();
+ const page = await context.newPage();
+ const response = await page.goto( url );
+
+ return { context, page, response };
+}
diff --git a/tests/frontend-behavior-test.php b/tests/frontend-behavior-test.php
new file mode 100644
index 0000000..06972d2
--- /dev/null
+++ b/tests/frontend-behavior-test.php
@@ -0,0 +1,158 @@
+set_plugin_settings( self::$frontend->default_settings() );
+ }
+
+ /**
+ * Point the frontend singleton at the given settings (setup plumbing; the
+ * singleton hydrates its cache once at plugins_loaded).
+ *
+ * @param array $settings A full wpmm_settings array.
+ */
+ protected function set_plugin_settings( array $settings ) {
+ update_option( 'wpmm_settings', $settings );
+
+ $prop = new ReflectionProperty( 'WP_Maintenance_Mode', 'plugin_settings' );
+ $prop->setAccessible( true );
+ $prop->setValue( self::$frontend, $settings );
+ }
+
+ /*
+ * Page template integration
+ */
+
+ public function test_the_plugin_template_is_offered_in_the_page_templates_dropdown() {
+ $templates = apply_filters( 'theme_page_templates', array( 'existing.php' => 'Existing' ) );
+
+ $this->assertArrayHasKey( 'templates/wpmm-page-template.php', $templates );
+ $this->assertArrayHasKey( 'existing.php', $templates );
+ }
+
+ public function test_pages_using_the_plugin_template_load_the_plugin_view() {
+ $page_id = self::factory()->post->create( array( 'post_type' => 'page' ) );
+ update_post_meta( $page_id, '_wp_page_template', 'templates/wpmm-page-template.php' );
+ $GLOBALS['post'] = get_post( $page_id );
+
+ $template = self::$frontend->use_maintenance_template( 'page.php' );
+
+ $this->assertSame( WPMM_VIEWS_PATH . 'wpmm-page-template.php', $template );
+ }
+
+ public function test_pages_without_the_plugin_template_keep_the_theme_template() {
+ $page_id = self::factory()->post->create( array( 'post_type' => 'page' ) );
+ $GLOBALS['post'] = get_post( $page_id );
+
+ $this->assertSame( 'page.php', self::$frontend->use_maintenance_template( 'page.php' ) );
+ }
+
+ /*
+ * calculate_backtime() — feeds the Retry-After header
+ */
+
+ public function test_backtime_defaults_to_an_hour() {
+ $this->assertSame( 3600, self::$frontend->calculate_backtime() );
+ }
+
+ public function test_backtime_follows_the_countdown_settings() {
+ $settings = self::$frontend->default_settings();
+ $settings['modules']['countdown_status'] = 1;
+ $settings['modules']['countdown_details'] = array(
+ 'days' => 1,
+ 'hours' => 2,
+ 'minutes' => 30,
+ );
+ $this->set_plugin_settings( $settings );
+
+ // 1 day + 2 hours + 30 minutes, from the worked example.
+ $this->assertSame( 95400, self::$frontend->calculate_backtime() );
+ }
+
+ /*
+ * add_google_analytics_code()
+ */
+
+ public function test_google_analytics_snippet_is_skipped_while_disabled() {
+ ob_start();
+ $result = self::$frontend->add_google_analytics_code();
+ $output = ob_get_clean();
+
+ $this->assertFalse( $result );
+ $this->assertSame( '', $output );
+ }
+
+ public function test_google_analytics_snippet_renders_the_sanitized_code() {
+ $settings = self::$frontend->default_settings();
+ $settings['modules']['ga_status'] = 1;
+ $settings['modules']['ga_code'] = 'injectedG-UNIT99';
+ $this->set_plugin_settings( $settings );
+
+ ob_start();
+ self::$frontend->add_google_analytics_code();
+ $output = ob_get_clean();
+
+ $this->assertStringContainsString( 'G-UNIT99', $output );
+ $this->assertStringNotContainsString( '', $output );
+ }
+
+ /*
+ * v1.8 → v2 settings migration
+ */
+
+ public function test_activation_migrates_v18_options_into_the_v2_settings() {
+ delete_option( 'wpmm_settings' );
+ delete_option( 'wpmm_notice' );
+ update_option(
+ 'wp-maintenance-mode',
+ array(
+ 'active' => 1,
+ 'bypass' => 1,
+ 'index' => 1,
+ 'rewrite' => 'https://example.com/elsewhere',
+ 'exclude' => array( 'my-old-slug' ),
+ 'notice' => 0,
+ 'role' => array( 'editor' ),
+ 'role_frontend' => array( 'editor' ),
+ )
+ );
+
+ WP_Maintenance_Mode::single_activate();
+
+ $settings = get_option( 'wpmm_settings' );
+ $this->assertEquals( 1, $settings['general']['status'] );
+ $this->assertEquals( 1, $settings['general']['bypass_bots'] );
+ $this->assertEquals( 1, $settings['general']['meta_robots'] );
+ $this->assertSame( 'https://example.com/elsewhere', $settings['general']['redirection'] );
+ $this->assertContains( 'my-old-slug', $settings['general']['exclude'] );
+ $this->assertContains( 'wp-login', $settings['general']['exclude'] );
+ $this->assertEquals( 0, $settings['general']['notice'] );
+ $this->assertSame( array( 'editor' ), $settings['general']['backend_role'] );
+ $this->assertSame( array( 'editor' ), $settings['general']['frontend_role'] );
+
+ // Upgraded installs are pointed at the relaunched settings screen.
+ $notice = get_option( 'wpmm_notice' );
+ $this->assertNotEmpty( $notice['msg'] );
+ }
+}
diff --git a/tests/generic-test.php b/tests/generic-test.php
index e6326cc..12b4609 100644
--- a/tests/generic-test.php
+++ b/tests/generic-test.php
@@ -18,7 +18,9 @@ public function test_constants() {
$this->assertTrue( defined('WPMM_JS_URL') );
$this->assertTrue( defined('WPMM_CSS_URL') );
$this->assertTrue( defined('WPMM_IMAGES_URL') );
- $this->assertTrue( defined('WPMM_ASSETS_SUFFIX') && WPMM_ASSETS_SUFFIX === '.min' );
+ // wp-env runs with SCRIPT_DEBUG enabled, which switches the suffix off.
+ $expected_suffix = defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ? '' : '.min';
+ $this->assertTrue( defined('WPMM_ASSETS_SUFFIX') && WPMM_ASSETS_SUFFIX === $expected_suffix );
}
public function test_wpmm_maybe_define_constant() {
diff --git a/tests/helpers-test.php b/tests/helpers-test.php
new file mode 100644
index 0000000..841a479
--- /dev/null
+++ b/tests/helpers-test.php
@@ -0,0 +1,121 @@
+assertSame( 'UA-1234567-1', wpmm_sanitize_ga_code( 'UA-1234567-1' ) );
+ }
+
+ public function test_sanitize_ga_code_accepts_ga4_ids() {
+ $this->assertSame( 'G-AB12CD34EF', wpmm_sanitize_ga_code( 'G-AB12CD34EF' ) );
+ }
+
+ public function test_sanitize_ga_code_extracts_the_id_from_markup() {
+ $this->assertSame( 'UA-12345', wpmm_sanitize_ga_code( 'UA-12345' ) );
+ }
+
+ public function test_sanitize_ga_code_rejects_input_without_an_id() {
+ $this->assertSame( '', wpmm_sanitize_ga_code( 'definitely not a tracking code' ) );
+ }
+
+ /*
+ * wpmm_get_capability()
+ */
+
+ public function test_capability_defaults_to_manage_options() {
+ $this->assertSame( 'manage_options', wpmm_get_capability( 'settings' ) );
+ }
+
+ public function test_capability_honors_the_action_specific_filter() {
+ add_filter(
+ 'wpmm_settings_capability',
+ function () {
+ return 'edit_pages';
+ }
+ );
+
+ $this->assertSame( 'edit_pages', wpmm_get_capability( 'settings' ) );
+ $this->assertSame( 'manage_options', wpmm_get_capability( 'subscribers' ) );
+ }
+
+ public function test_capability_global_filter_overrides_action_specific_one() {
+ add_filter(
+ 'wpmm_settings_capability',
+ function () {
+ return 'edit_pages';
+ }
+ );
+ add_filter(
+ 'wpmm_all_actions_capability',
+ function () {
+ return 'manage_network';
+ }
+ );
+
+ $this->assertSame( 'manage_network', wpmm_get_capability( 'settings' ) );
+ }
+
+ /*
+ * wpmm_form_hidden_fields()
+ */
+
+ public function test_form_hidden_fields_output_a_valid_nonce_and_routing_fields() {
+ wp_set_current_user( self::factory()->user->create( array( 'role' => 'administrator' ) ) );
+
+ ob_start();
+ wpmm_form_hidden_fields( 'general' );
+ $output = ob_get_clean();
+
+ $this->assertStringContainsString( 'value="general" name="tab"', $output );
+ $this->assertStringContainsString( 'value="wpmm_save_settings" name="action"', $output );
+
+ // The rendered nonce must verify against the tab-specific action.
+ $this->assertSame( 1, preg_match( '/id="_wpnonce" name="_wpnonce" value="([^"]+)"/', $output, $matches ) );
+ $this->assertNotFalse( wp_verify_nonce( $matches[1], 'tab-general' ) );
+ }
+
+ /*
+ * wpmm_do_shortcode()
+ */
+
+ public function test_do_shortcode_expands_registered_shortcodes() {
+ add_shortcode(
+ 'wpmm_test_probe',
+ function () {
+ return 'EXPANDED';
+ }
+ );
+
+ $this->assertSame( 'before EXPANDED after', wpmm_do_shortcode( 'before [wpmm_test_probe] after' ) );
+
+ remove_shortcode( 'wpmm_test_probe' );
+ }
+
+ /*
+ * wpmm_get_option()
+ */
+
+ public function test_get_option_strips_slashes_from_stored_values() {
+ update_option( 'wpmm_settings', array( 'design' => array( 'title' => "It\\'s coming soon" ) ) );
+
+ $value = wpmm_get_option( 'wpmm_settings' );
+
+ $this->assertSame( "It's coming soon", $value['design']['title'] );
+ }
+
+ public function test_get_option_returns_the_default_when_the_option_is_missing() {
+ delete_option( 'wpmm_settings' );
+
+ $this->assertSame( 'fallback', wpmm_get_option( 'wpmm_settings', 'fallback' ) );
+ }
+}
diff --git a/tests/static-analysis-stubs/constants.php b/tests/static-analysis-stubs/constants.php
new file mode 100644
index 0000000..616b05b
--- /dev/null
+++ b/tests/static-analysis-stubs/constants.php
@@ -0,0 +1,36 @@
+ esc_url( WPMM_IMAGES_URL . 'icon.svg' ),
'location' => 'wp-maintenance-mode',
@@ -104,7 +104,7 @@ function wpmm_load_sdk( $products ) {
add_filter(
'wp_maintenance_mode_load_promotions',
- function() {
+ function () {
return array( 'otter' );
}
);
diff --git a/yarn.lock b/yarn.lock
index 947c707..04e9135 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -1004,11 +1004,209 @@
esquery "^1.4.0"
jsdoc-type-pratt-parser "~3.1.0"
+"@formatjs/ecma402-abstract@2.3.6":
+ version "2.3.6"
+ resolved "https://registry.yarnpkg.com/@formatjs/ecma402-abstract/-/ecma402-abstract-2.3.6.tgz#d6ca9d3579054fe1e1a0a0b5e872e0d64922e4e1"
+ integrity sha512-HJnTFeRM2kVFVr5gr5kH1XP6K0JcJtE7Lzvtr3FS/so5f1kpsqqqxy5JF+FRaO6H2qmcMfAUIox7AJteieRtVw==
+ dependencies:
+ "@formatjs/fast-memoize" "2.2.7"
+ "@formatjs/intl-localematcher" "0.6.2"
+ decimal.js "^10.4.3"
+ tslib "^2.8.0"
+
+"@formatjs/fast-memoize@2.2.7":
+ version "2.2.7"
+ resolved "https://registry.yarnpkg.com/@formatjs/fast-memoize/-/fast-memoize-2.2.7.tgz#707f9ddaeb522a32f6715bb7950b0831f4cc7b15"
+ integrity sha512-Yabmi9nSvyOMrlSeGGWDiH7rf3a7sIwplbvo/dlz9WCIjzIQAfy1RMf4S0X3yG724n5Ghu2GmEl5NJIV6O9sZQ==
+ dependencies:
+ tslib "^2.8.0"
+
+"@formatjs/icu-messageformat-parser@2.11.4":
+ version "2.11.4"
+ resolved "https://registry.yarnpkg.com/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.11.4.tgz#63bd2cd82d08ae2bef55adeeb86486df68826f32"
+ integrity sha512-7kR78cRrPNB4fjGFZg3Rmj5aah8rQj9KPzuLsmcSn4ipLXQvC04keycTI1F7kJYDwIXtT2+7IDEto842CfZBtw==
+ dependencies:
+ "@formatjs/ecma402-abstract" "2.3.6"
+ "@formatjs/icu-skeleton-parser" "1.8.16"
+ tslib "^2.8.0"
+
+"@formatjs/icu-skeleton-parser@1.8.16":
+ version "1.8.16"
+ resolved "https://registry.yarnpkg.com/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.8.16.tgz#13f81f6845c7cf6599623006aacaf7d6b4ad2970"
+ integrity sha512-H13E9Xl+PxBd8D5/6TVUluSpxGNvFSlN/b3coUp0e0JpuWXXnQDiavIpY3NnvSp4xhEMoXyyBvVfdFX8jglOHQ==
+ dependencies:
+ "@formatjs/ecma402-abstract" "2.3.6"
+ tslib "^2.8.0"
+
+"@formatjs/intl-localematcher@0.6.2":
+ version "0.6.2"
+ resolved "https://registry.yarnpkg.com/@formatjs/intl-localematcher/-/intl-localematcher-0.6.2.tgz#e9ebe0b4082d7d48e5b2d753579fb7ece4eaefea"
+ integrity sha512-XOMO2Hupl0wdd172Y06h6kLpBz6Dv+J4okPLl4LPtzbr8f66WbIoy4ev98EBuZ6ZK4h5ydTN6XneT4QVpD7cdA==
+ dependencies:
+ tslib "^2.8.0"
+
"@gar/promisify@^1.0.1":
version "1.1.2"
resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.2.tgz#30aa825f11d438671d585bd44e7fd564535fc210"
integrity sha512-82cpyJyKRoQoRi+14ibCeGPu0CwypgtBAdBhq1WfvagpCZNKqwXbKwXllYSMG91DhmG4jt9gN8eP6lGOtozuaw==
+"@inquirer/ansi@^1.0.2":
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/@inquirer/ansi/-/ansi-1.0.2.tgz#674a4c4d81ad460695cb2a1fc69d78cd187f337e"
+ integrity sha512-S8qNSZiYzFd0wAcyG5AXCvUHC5Sr7xpZ9wZ2py9XR88jUz8wooStVx5M6dRzczbBWjic9NP7+rY0Xi7qqK/aMQ==
+
+"@inquirer/checkbox@^4.3.2":
+ version "4.3.2"
+ resolved "https://registry.yarnpkg.com/@inquirer/checkbox/-/checkbox-4.3.2.tgz#e1483e6519d6ffef97281a54d2a5baa0d81b3f3b"
+ integrity sha512-VXukHf0RR1doGe6Sm4F0Em7SWYLTHSsbGfJdS9Ja2bX5/D5uwVOEjr07cncLROdBvmnvCATYEWlHqYmXv2IlQA==
+ dependencies:
+ "@inquirer/ansi" "^1.0.2"
+ "@inquirer/core" "^10.3.2"
+ "@inquirer/figures" "^1.0.15"
+ "@inquirer/type" "^3.0.10"
+ yoctocolors-cjs "^2.1.3"
+
+"@inquirer/confirm@^5.1.21":
+ version "5.1.21"
+ resolved "https://registry.yarnpkg.com/@inquirer/confirm/-/confirm-5.1.21.tgz#610c4acd7797d94890a6e2dde2c98eb1e891dd12"
+ integrity sha512-KR8edRkIsUayMXV+o3Gv+q4jlhENF9nMYUZs9PA2HzrXeHI8M5uDag70U7RJn9yyiMZSbtF5/UexBtAVtZGSbQ==
+ dependencies:
+ "@inquirer/core" "^10.3.2"
+ "@inquirer/type" "^3.0.10"
+
+"@inquirer/core@^10.3.2":
+ version "10.3.2"
+ resolved "https://registry.yarnpkg.com/@inquirer/core/-/core-10.3.2.tgz#535979ff3ff4fe1e7cc4f83e2320504c743b7e20"
+ integrity sha512-43RTuEbfP8MbKzedNqBrlhhNKVwoK//vUFNW3Q3vZ88BLcrs4kYpGg+B2mm5p2K/HfygoCxuKwJJiv8PbGmE0A==
+ dependencies:
+ "@inquirer/ansi" "^1.0.2"
+ "@inquirer/figures" "^1.0.15"
+ "@inquirer/type" "^3.0.10"
+ cli-width "^4.1.0"
+ mute-stream "^2.0.0"
+ signal-exit "^4.1.0"
+ wrap-ansi "^6.2.0"
+ yoctocolors-cjs "^2.1.3"
+
+"@inquirer/editor@^4.2.23":
+ version "4.2.23"
+ resolved "https://registry.yarnpkg.com/@inquirer/editor/-/editor-4.2.23.tgz#fe046a3bfdae931262de98c1052437d794322e0b"
+ integrity sha512-aLSROkEwirotxZ1pBaP8tugXRFCxW94gwrQLxXfrZsKkfjOYC1aRvAZuhpJOb5cu4IBTJdsCigUlf2iCOu4ZDQ==
+ dependencies:
+ "@inquirer/core" "^10.3.2"
+ "@inquirer/external-editor" "^1.0.3"
+ "@inquirer/type" "^3.0.10"
+
+"@inquirer/expand@^4.0.23":
+ version "4.0.23"
+ resolved "https://registry.yarnpkg.com/@inquirer/expand/-/expand-4.0.23.tgz#a38b5f32226d75717c370bdfed792313b92bdc05"
+ integrity sha512-nRzdOyFYnpeYTTR2qFwEVmIWypzdAx/sIkCMeTNTcflFOovfqUk+HcFhQQVBftAh9gmGrpFj6QcGEqrDMDOiew==
+ dependencies:
+ "@inquirer/core" "^10.3.2"
+ "@inquirer/type" "^3.0.10"
+ yoctocolors-cjs "^2.1.3"
+
+"@inquirer/external-editor@^1.0.3":
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/@inquirer/external-editor/-/external-editor-1.0.3.tgz#c23988291ee676290fdab3fd306e64010a6d13b8"
+ integrity sha512-RWbSrDiYmO4LbejWY7ttpxczuwQyZLBUyygsA9Nsv95hpzUWwnNTVQmAq3xuh7vNwCp07UTmE5i11XAEExx4RA==
+ dependencies:
+ chardet "^2.1.1"
+ iconv-lite "^0.7.0"
+
+"@inquirer/figures@^1.0.15":
+ version "1.0.15"
+ resolved "https://registry.yarnpkg.com/@inquirer/figures/-/figures-1.0.15.tgz#dbb49ed80df11df74268023b496ac5d9acd22b3a"
+ integrity sha512-t2IEY+unGHOzAaVM5Xx6DEWKeXlDDcNPeDyUpsRc6CUhBfU3VQOEl+Vssh7VNp1dR8MdUJBWhuObjXCsVpjN5g==
+
+"@inquirer/input@^4.3.1":
+ version "4.3.1"
+ resolved "https://registry.yarnpkg.com/@inquirer/input/-/input-4.3.1.tgz#778683b4c4c4d95d05d4b05c4a854964b73565b4"
+ integrity sha512-kN0pAM4yPrLjJ1XJBjDxyfDduXOuQHrBB8aLDMueuwUGn+vNpF7Gq7TvyVxx8u4SHlFFj4trmj+a2cbpG4Jn1g==
+ dependencies:
+ "@inquirer/core" "^10.3.2"
+ "@inquirer/type" "^3.0.10"
+
+"@inquirer/number@^3.0.23":
+ version "3.0.23"
+ resolved "https://registry.yarnpkg.com/@inquirer/number/-/number-3.0.23.tgz#3fdec2540d642093fd7526818fd8d4bdc7335094"
+ integrity sha512-5Smv0OK7K0KUzUfYUXDXQc9jrf8OHo4ktlEayFlelCjwMXz0299Y8OrI+lj7i4gCBY15UObk76q0QtxjzFcFcg==
+ dependencies:
+ "@inquirer/core" "^10.3.2"
+ "@inquirer/type" "^3.0.10"
+
+"@inquirer/password@^4.0.23":
+ version "4.0.23"
+ resolved "https://registry.yarnpkg.com/@inquirer/password/-/password-4.0.23.tgz#b9f5187c8c92fd7aa9eceb9d8f2ead0d7e7b000d"
+ integrity sha512-zREJHjhT5vJBMZX/IUbyI9zVtVfOLiTO66MrF/3GFZYZ7T4YILW5MSkEYHceSii/KtRk+4i3RE7E1CUXA2jHcA==
+ dependencies:
+ "@inquirer/ansi" "^1.0.2"
+ "@inquirer/core" "^10.3.2"
+ "@inquirer/type" "^3.0.10"
+
+"@inquirer/prompts@^7.2.0":
+ version "7.10.1"
+ resolved "https://registry.yarnpkg.com/@inquirer/prompts/-/prompts-7.10.1.tgz#e1436c0484cf04c22548c74e2cd239e989d5f847"
+ integrity sha512-Dx/y9bCQcXLI5ooQ5KyvA4FTgeo2jYj/7plWfV5Ak5wDPKQZgudKez2ixyfz7tKXzcJciTxqLeK7R9HItwiByg==
+ dependencies:
+ "@inquirer/checkbox" "^4.3.2"
+ "@inquirer/confirm" "^5.1.21"
+ "@inquirer/editor" "^4.2.23"
+ "@inquirer/expand" "^4.0.23"
+ "@inquirer/input" "^4.3.1"
+ "@inquirer/number" "^3.0.23"
+ "@inquirer/password" "^4.0.23"
+ "@inquirer/rawlist" "^4.1.11"
+ "@inquirer/search" "^3.2.2"
+ "@inquirer/select" "^4.4.2"
+
+"@inquirer/rawlist@^4.1.11":
+ version "4.1.11"
+ resolved "https://registry.yarnpkg.com/@inquirer/rawlist/-/rawlist-4.1.11.tgz#313c8c3ffccb7d41e990c606465726b4a898a033"
+ integrity sha512-+LLQB8XGr3I5LZN/GuAHo+GpDJegQwuPARLChlMICNdwW7OwV2izlCSCxN6cqpL0sMXmbKbFcItJgdQq5EBXTw==
+ dependencies:
+ "@inquirer/core" "^10.3.2"
+ "@inquirer/type" "^3.0.10"
+ yoctocolors-cjs "^2.1.3"
+
+"@inquirer/search@^3.2.2":
+ version "3.2.2"
+ resolved "https://registry.yarnpkg.com/@inquirer/search/-/search-3.2.2.tgz#4cc6fd574dcd434e4399badc37c742c3fd534ac8"
+ integrity sha512-p2bvRfENXCZdWF/U2BXvnSI9h+tuA8iNqtUKb9UWbmLYCRQxd8WkvwWvYn+3NgYaNwdUkHytJMGG4MMLucI1kA==
+ dependencies:
+ "@inquirer/core" "^10.3.2"
+ "@inquirer/figures" "^1.0.15"
+ "@inquirer/type" "^3.0.10"
+ yoctocolors-cjs "^2.1.3"
+
+"@inquirer/select@^4.4.2":
+ version "4.4.2"
+ resolved "https://registry.yarnpkg.com/@inquirer/select/-/select-4.4.2.tgz#2ac8fca960913f18f1d1b35323ed8fcd27d89323"
+ integrity sha512-l4xMuJo55MAe+N7Qr4rX90vypFwCajSakx59qe/tMaC1aEHWLyw68wF4o0A4SLAY4E0nd+Vt+EyskeDIqu1M6w==
+ dependencies:
+ "@inquirer/ansi" "^1.0.2"
+ "@inquirer/core" "^10.3.2"
+ "@inquirer/figures" "^1.0.15"
+ "@inquirer/type" "^3.0.10"
+ yoctocolors-cjs "^2.1.3"
+
+"@inquirer/type@^3.0.10":
+ version "3.0.10"
+ resolved "https://registry.yarnpkg.com/@inquirer/type/-/type-3.0.10.tgz#11ed564ec78432a200ea2601a212d24af8150d50"
+ integrity sha512-BvziSRxfz5Ov8ch0z/n3oijRSEcEsHnhggm4xFZe93DHcUCTlutlq9Ox4SVENAfcRD22UQq7T/atg9Wr3k09eA==
+
+"@isaacs/cliui@^8.0.2":
+ version "8.0.2"
+ resolved "https://registry.yarnpkg.com/@isaacs/cliui/-/cliui-8.0.2.tgz#b37667b7bc181c168782259bab42474fbf52b550"
+ integrity sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==
+ dependencies:
+ string-width "^5.1.2"
+ string-width-cjs "npm:string-width@^4.2.0"
+ strip-ansi "^7.0.1"
+ strip-ansi-cjs "npm:strip-ansi@^6.0.1"
+ wrap-ansi "^8.1.0"
+ wrap-ansi-cjs "npm:wrap-ansi@^7.0.0"
+
"@isaacs/string-locale-compare@^1.0.1", "@isaacs/string-locale-compare@^1.1.0":
version "1.1.0"
resolved "https://registry.yarnpkg.com/@isaacs/string-locale-compare/-/string-locale-compare-1.1.0.tgz#291c227e93fd407a96ecd59879a35809120e432b"
@@ -1054,6 +1252,23 @@
"@jridgewell/resolve-uri" "^3.0.3"
"@jridgewell/sourcemap-codec" "^1.4.10"
+"@kwsites/file-exists@^1.1.1":
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/@kwsites/file-exists/-/file-exists-1.1.1.tgz#ad1efcac13e1987d8dbaf235ef3be5b0d96faa99"
+ integrity sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw==
+ dependencies:
+ debug "^4.1.1"
+
+"@kwsites/promise-deferred@^1.1.1":
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/@kwsites/promise-deferred/-/promise-deferred-1.1.1.tgz#8ace5259254426ccef57f3175bc64ed7095ed919"
+ integrity sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==
+
+"@nodable/entities@^3.0.0":
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/@nodable/entities/-/entities-3.0.0.tgz#694703bc864d30eaed55c2e3def00dbd61493670"
+ integrity sha512-8L9xFeTYKhm49xfIypoe2W5wV1m/3Z58kT+7kR9A8OyFxcPduI4VmxaUMQyKYrRjUoLLSXv6EKKID5Tvj9cUVw==
+
"@nodelib/fs.scandir@2.1.5":
version "2.1.5"
resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5"
@@ -1227,6 +1442,69 @@
node-gyp "^7.1.0"
read-package-json-fast "^2.0.1"
+"@octokit/app@^14.0.2":
+ version "14.1.0"
+ resolved "https://registry.yarnpkg.com/@octokit/app/-/app-14.1.0.tgz#2d491dc70746773b83f61edf5c56817dd7d3854b"
+ integrity sha512-g3uEsGOQCBl1+W1rgfwoRFUIR6PtvB2T1E4RpygeUU5LrLvlOqcxrt5lfykIeRpUPpupreGJUYl70fqMDXdTpw==
+ dependencies:
+ "@octokit/auth-app" "^6.0.0"
+ "@octokit/auth-unauthenticated" "^5.0.0"
+ "@octokit/core" "^5.0.0"
+ "@octokit/oauth-app" "^6.0.0"
+ "@octokit/plugin-paginate-rest" "^9.0.0"
+ "@octokit/types" "^12.0.0"
+ "@octokit/webhooks" "^12.0.4"
+
+"@octokit/auth-app@^6.0.0":
+ version "6.1.4"
+ resolved "https://registry.yarnpkg.com/@octokit/auth-app/-/auth-app-6.1.4.tgz#e27c14e9c3b9815da4b8d13d97159b94159f9be8"
+ integrity sha512-QkXkSOHZK4dA5oUqY5Dk3S+5pN2s1igPjEASNQV8/vgJgW034fQWR16u7VsNOK/EljA00eyjYF5mWNxWKWhHRQ==
+ dependencies:
+ "@octokit/auth-oauth-app" "^7.1.0"
+ "@octokit/auth-oauth-user" "^4.1.0"
+ "@octokit/request" "^8.3.1"
+ "@octokit/request-error" "^5.1.0"
+ "@octokit/types" "^13.1.0"
+ deprecation "^2.3.1"
+ lru-cache "npm:@wolfy1339/lru-cache@^11.0.2-patch.1"
+ universal-github-app-jwt "^1.1.2"
+ universal-user-agent "^6.0.0"
+
+"@octokit/auth-oauth-app@^7.0.0", "@octokit/auth-oauth-app@^7.1.0":
+ version "7.1.0"
+ resolved "https://registry.yarnpkg.com/@octokit/auth-oauth-app/-/auth-oauth-app-7.1.0.tgz#d0f74e19ebd5a4829cb780c107cedd6c894f20fc"
+ integrity sha512-w+SyJN/b0l/HEb4EOPRudo7uUOSW51jcK1jwLa+4r7PA8FPFpoxEnHBHMITqCsc/3Vo2qqFjgQfz/xUUvsSQnA==
+ dependencies:
+ "@octokit/auth-oauth-device" "^6.1.0"
+ "@octokit/auth-oauth-user" "^4.1.0"
+ "@octokit/request" "^8.3.1"
+ "@octokit/types" "^13.0.0"
+ "@types/btoa-lite" "^1.0.0"
+ btoa-lite "^1.0.0"
+ universal-user-agent "^6.0.0"
+
+"@octokit/auth-oauth-device@^6.1.0":
+ version "6.1.0"
+ resolved "https://registry.yarnpkg.com/@octokit/auth-oauth-device/-/auth-oauth-device-6.1.0.tgz#f868213a3db05fe27e68d1fc607502a322379dd9"
+ integrity sha512-FNQ7cb8kASufd6Ej4gnJ3f1QB5vJitkoV1O0/g6e6lUsQ7+VsSNRHRmFScN2tV4IgKA12frrr/cegUs0t+0/Lw==
+ dependencies:
+ "@octokit/oauth-methods" "^4.1.0"
+ "@octokit/request" "^8.3.1"
+ "@octokit/types" "^13.0.0"
+ universal-user-agent "^6.0.0"
+
+"@octokit/auth-oauth-user@^4.0.0", "@octokit/auth-oauth-user@^4.1.0":
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/@octokit/auth-oauth-user/-/auth-oauth-user-4.1.0.tgz#32e5529f8bd961af9839a1f8c6ab0c8ad2184eee"
+ integrity sha512-FrEp8mtFuS/BrJyjpur+4GARteUCrPeR/tZJzD8YourzoVhRics7u7we/aDcKv+yywRNwNi/P4fRi631rG/OyQ==
+ dependencies:
+ "@octokit/auth-oauth-device" "^6.1.0"
+ "@octokit/oauth-methods" "^4.1.0"
+ "@octokit/request" "^8.3.1"
+ "@octokit/types" "^13.0.0"
+ btoa-lite "^1.0.0"
+ universal-user-agent "^6.0.0"
+
"@octokit/auth-token@^2.4.4":
version "2.5.0"
resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-2.5.0.tgz#27c37ea26c205f28443402477ffd261311f21e36"
@@ -1234,6 +1512,19 @@
dependencies:
"@octokit/types" "^6.0.3"
+"@octokit/auth-token@^4.0.0":
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-4.0.0.tgz#40d203ea827b9f17f42a29c6afb93b7745ef80c7"
+ integrity sha512-tY/msAuJo6ARbK6SPIxZrPBms3xPbfwBrulZe0Wtr/DIY9lje2HeV1uoebShn6mx7SjCHif6EjMvoREj+gZ+SA==
+
+"@octokit/auth-unauthenticated@^5.0.0":
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/@octokit/auth-unauthenticated/-/auth-unauthenticated-5.0.1.tgz#d8032211728333068b2e07b53997c29e59a03507"
+ integrity sha512-oxeWzmBFxWd+XolxKTc4zr+h3mt+yofn4r7OfoIkR/Cj/o70eEGmPsFbueyJE2iBAGpjgTnEOKM3pnuEGVmiqg==
+ dependencies:
+ "@octokit/request-error" "^5.0.0"
+ "@octokit/types" "^12.0.0"
+
"@octokit/core@^3.5.1":
version "3.5.1"
resolved "https://registry.yarnpkg.com/@octokit/core/-/core-3.5.1.tgz#8601ceeb1ec0e1b1b8217b960a413ed8e947809b"
@@ -1247,6 +1538,19 @@
before-after-hook "^2.2.0"
universal-user-agent "^6.0.0"
+"@octokit/core@^5.0.0":
+ version "5.2.2"
+ resolved "https://registry.yarnpkg.com/@octokit/core/-/core-5.2.2.tgz#252805732de9b4e8e4f658d34b80c4c9b2534761"
+ integrity sha512-/g2d4sW9nUDJOMz3mabVQvOGhVa4e/BN/Um7yca9Bb2XTzPPnfTWHWQg+IsEYO7M3Vx+EXvaM/I2pJWIMun1bg==
+ dependencies:
+ "@octokit/auth-token" "^4.0.0"
+ "@octokit/graphql" "^7.1.0"
+ "@octokit/request" "^8.4.1"
+ "@octokit/request-error" "^5.1.1"
+ "@octokit/types" "^13.0.0"
+ before-after-hook "^2.2.0"
+ universal-user-agent "^6.0.0"
+
"@octokit/endpoint@^6.0.1":
version "6.0.12"
resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-6.0.12.tgz#3b4d47a4b0e79b1027fb8d75d4221928b2d05658"
@@ -1256,6 +1560,14 @@
is-plain-object "^5.0.0"
universal-user-agent "^6.0.0"
+"@octokit/endpoint@^9.0.6":
+ version "9.0.6"
+ resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-9.0.6.tgz#114d912108fe692d8b139cfe7fc0846dfd11b6c0"
+ integrity sha512-H1fNTMA57HbkFESSt3Y9+FBICv+0jFceJFPWDePYlR/iMGrwM5ph+Dd4XRQs+8X+PUFURLQgX9ChPfhJ/1uNQw==
+ dependencies:
+ "@octokit/types" "^13.1.0"
+ universal-user-agent "^6.0.0"
+
"@octokit/graphql@^4.5.8":
version "4.8.0"
resolved "https://registry.yarnpkg.com/@octokit/graphql/-/graphql-4.8.0.tgz#664d9b11c0e12112cbf78e10f49a05959aa22cc3"
@@ -1265,11 +1577,65 @@
"@octokit/types" "^6.0.3"
universal-user-agent "^6.0.0"
+"@octokit/graphql@^7.1.0":
+ version "7.1.1"
+ resolved "https://registry.yarnpkg.com/@octokit/graphql/-/graphql-7.1.1.tgz#79d9f3d0c96a8fd13d64186fe5c33606d48b79cc"
+ integrity sha512-3mkDltSfcDUoa176nlGoA32RGjeWjl3K7F/BwHwRMJUW/IteSa4bnSV8p2ThNkcIcZU2umkZWxwETSSCJf2Q7g==
+ dependencies:
+ "@octokit/request" "^8.4.1"
+ "@octokit/types" "^13.0.0"
+ universal-user-agent "^6.0.0"
+
+"@octokit/oauth-app@^6.0.0":
+ version "6.1.0"
+ resolved "https://registry.yarnpkg.com/@octokit/oauth-app/-/oauth-app-6.1.0.tgz#22c276f6ad2364c6999837bfdd5d9c1092838726"
+ integrity sha512-nIn/8eUJ/BKUVzxUXd5vpzl1rwaVxMyYbQkNZjHrF7Vk/yu98/YDF/N2KeWO7uZ0g3b5EyiFXFkZI8rJ+DH1/g==
+ dependencies:
+ "@octokit/auth-oauth-app" "^7.0.0"
+ "@octokit/auth-oauth-user" "^4.0.0"
+ "@octokit/auth-unauthenticated" "^5.0.0"
+ "@octokit/core" "^5.0.0"
+ "@octokit/oauth-authorization-url" "^6.0.2"
+ "@octokit/oauth-methods" "^4.0.0"
+ "@types/aws-lambda" "^8.10.83"
+ universal-user-agent "^6.0.0"
+
+"@octokit/oauth-authorization-url@^6.0.2":
+ version "6.0.2"
+ resolved "https://registry.yarnpkg.com/@octokit/oauth-authorization-url/-/oauth-authorization-url-6.0.2.tgz#cc82ca29cc5e339c9921672f39f2b3f5c8eb6ef2"
+ integrity sha512-CdoJukjXXxqLNK4y/VOiVzQVjibqoj/xHgInekviUJV73y/BSIcwvJ/4aNHPBPKcPWFnd4/lO9uqRV65jXhcLA==
+
+"@octokit/oauth-methods@^4.0.0", "@octokit/oauth-methods@^4.1.0":
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/@octokit/oauth-methods/-/oauth-methods-4.1.0.tgz#1403ac9c4d4e277922fddc4c89fa8a782f8f791b"
+ integrity sha512-4tuKnCRecJ6CG6gr0XcEXdZtkTDbfbnD5oaHBmLERTjTMZNi2CbfEHZxPU41xXLDG4DfKf+sonu00zvKI9NSbw==
+ dependencies:
+ "@octokit/oauth-authorization-url" "^6.0.2"
+ "@octokit/request" "^8.3.1"
+ "@octokit/request-error" "^5.1.0"
+ "@octokit/types" "^13.0.0"
+ btoa-lite "^1.0.0"
+
"@octokit/openapi-types@^11.2.0":
version "11.2.0"
resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-11.2.0.tgz#b38d7fc3736d52a1e96b230c1ccd4a58a2f400a6"
integrity sha512-PBsVO+15KSlGmiI8QAzaqvsNlZlrDlyAJYcrXBCvVUxCp7VnXjkwPoFHgjEJXx3WF9BAwkA6nfCUA7i9sODzKA==
+"@octokit/openapi-types@^20.0.0":
+ version "20.0.0"
+ resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-20.0.0.tgz#9ec2daa0090eeb865ee147636e0c00f73790c6e5"
+ integrity sha512-EtqRBEjp1dL/15V7WiX5LJMIxxkdiGJnabzYx5Apx4FkQIFgAfKumXeYAqqJCj1s+BMX4cPFIFC4OLCR6stlnA==
+
+"@octokit/openapi-types@^24.2.0":
+ version "24.2.0"
+ resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-24.2.0.tgz#3d55c32eac0d38da1a7083a9c3b0cca77924f7d3"
+ integrity sha512-9sIH3nSUttelJSXUrmGzl7QUBFul0/mB8HRYl3fOlgHbIWG+WnYDXU3v/2zMtAvuzZ/ed00Ei6on975FhBfzrg==
+
+"@octokit/plugin-paginate-graphql@^4.0.0":
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-graphql/-/plugin-paginate-graphql-4.0.1.tgz#9c0b1145b93a2b8635943f497c127969d54512fc"
+ integrity sha512-R8ZQNmrIKKpHWC6V2gum4x9LG2qF1RxRjo27gjQcG3j+vf2tLsEfE7I/wRWEPzYMaenr1M+qDAtNcwZve1ce1A==
+
"@octokit/plugin-paginate-rest@^2.16.8":
version "2.17.0"
resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.17.0.tgz#32e9c7cab2a374421d3d0de239102287d791bce7"
@@ -1277,11 +1643,25 @@
dependencies:
"@octokit/types" "^6.34.0"
+"@octokit/plugin-paginate-rest@^9.0.0":
+ version "9.2.2"
+ resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-9.2.2.tgz#c516bc498736bcdaa9095b9a1d10d9d0501ae831"
+ integrity sha512-u3KYkGF7GcZnSD/3UP0S7K5XUFT2FkOQdcfXZGZQPGv3lm4F2Xbf71lvjldr8c1H3nNbF+33cLEkWYbokGWqiQ==
+ dependencies:
+ "@octokit/types" "^12.6.0"
+
"@octokit/plugin-request-log@^1.0.4":
version "1.0.4"
resolved "https://registry.yarnpkg.com/@octokit/plugin-request-log/-/plugin-request-log-1.0.4.tgz#5e50ed7083a613816b1e4a28aeec5fb7f1462e85"
integrity sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==
+"@octokit/plugin-rest-endpoint-methods@^10.0.0":
+ version "10.4.1"
+ resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-10.4.1.tgz#41ba478a558b9f554793075b2e20cd2ef973be17"
+ integrity sha512-xV1b+ceKV9KytQe3zCVqjg+8GTGfDYwaT1ATU5isiUyVtlVAO3HNdzpS4sr4GBx4hxQ46s7ITtZrAsxG22+rVg==
+ dependencies:
+ "@octokit/types" "^12.6.0"
+
"@octokit/plugin-rest-endpoint-methods@^5.12.0":
version "5.13.0"
resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-5.13.0.tgz#8c46109021a3412233f6f50d28786f8e552427ba"
@@ -1290,6 +1670,23 @@
"@octokit/types" "^6.34.0"
deprecation "^2.3.1"
+"@octokit/plugin-retry@^6.0.0":
+ version "6.1.0"
+ resolved "https://registry.yarnpkg.com/@octokit/plugin-retry/-/plugin-retry-6.1.0.tgz#cf5b92223246327ca9c7e17262b93ffde028ab0a"
+ integrity sha512-WrO3bvq4E1Xh1r2mT9w6SDFg01gFmP81nIG77+p/MqW1JeXXgL++6umim3t6x0Zj5pZm3rXAN+0HEjmmdhIRig==
+ dependencies:
+ "@octokit/request-error" "^5.0.0"
+ "@octokit/types" "^13.0.0"
+ bottleneck "^2.15.3"
+
+"@octokit/plugin-throttling@^8.0.0":
+ version "8.2.0"
+ resolved "https://registry.yarnpkg.com/@octokit/plugin-throttling/-/plugin-throttling-8.2.0.tgz#9ec3ea2e37b92fac63f06911d0c8141b46dc4941"
+ integrity sha512-nOpWtLayKFpgqmgD0y3GqXafMFuKcA4tRPZIfu7BArd2lEZeb1988nhWhwx4aZWmjDmUfdgVf7W+Tt4AmvRmMQ==
+ dependencies:
+ "@octokit/types" "^12.2.0"
+ bottleneck "^2.15.3"
+
"@octokit/request-error@^2.0.5", "@octokit/request-error@^2.1.0":
version "2.1.0"
resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-2.1.0.tgz#9e150357831bfc788d13a4fd4b1913d60c74d677"
@@ -1299,6 +1696,15 @@
deprecation "^2.0.0"
once "^1.4.0"
+"@octokit/request-error@^5.0.0", "@octokit/request-error@^5.1.0", "@octokit/request-error@^5.1.1":
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-5.1.1.tgz#b9218f9c1166e68bb4d0c89b638edc62c9334805"
+ integrity sha512-v9iyEQJH6ZntoENr9/yXxjuezh4My67CBSu9r6Ve/05Iu5gNgnisNWOsoJHTP6k0Rr0+HQIpnH+kyammu90q/g==
+ dependencies:
+ "@octokit/types" "^13.1.0"
+ deprecation "^2.0.0"
+ once "^1.4.0"
+
"@octokit/request@^5.6.0":
version "5.6.3"
resolved "https://registry.yarnpkg.com/@octokit/request/-/request-5.6.3.tgz#19a022515a5bba965ac06c9d1334514eb50c48b0"
@@ -1311,6 +1717,16 @@
node-fetch "^2.6.7"
universal-user-agent "^6.0.0"
+"@octokit/request@^8.3.1", "@octokit/request@^8.4.1":
+ version "8.4.1"
+ resolved "https://registry.yarnpkg.com/@octokit/request/-/request-8.4.1.tgz#715a015ccf993087977ea4365c44791fc4572486"
+ integrity sha512-qnB2+SY3hkCmBxZsR/MPCybNmbJe4KAlfWErXq+rBKkQJlbjdJeS85VI9r8UqeLYLvnAenU8Q1okM/0MBsAGXw==
+ dependencies:
+ "@octokit/endpoint" "^9.0.6"
+ "@octokit/request-error" "^5.1.1"
+ "@octokit/types" "^13.1.0"
+ universal-user-agent "^6.0.0"
+
"@octokit/rest@^18.0.0":
version "18.12.0"
resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-18.12.0.tgz#f06bc4952fc87130308d810ca9d00e79f6988881"
@@ -1321,6 +1737,20 @@
"@octokit/plugin-request-log" "^1.0.4"
"@octokit/plugin-rest-endpoint-methods" "^5.12.0"
+"@octokit/types@^12.0.0", "@octokit/types@^12.2.0", "@octokit/types@^12.6.0":
+ version "12.6.0"
+ resolved "https://registry.yarnpkg.com/@octokit/types/-/types-12.6.0.tgz#8100fb9eeedfe083aae66473bd97b15b62aedcb2"
+ integrity sha512-1rhSOfRa6H9w4YwK0yrf5faDaDTb+yLyBUKOCV4xtCDB5VmIPqd/v9yr9o6SAzOAlRxMiRiCic6JVM1/kunVkw==
+ dependencies:
+ "@octokit/openapi-types" "^20.0.0"
+
+"@octokit/types@^13.0.0", "@octokit/types@^13.1.0":
+ version "13.10.0"
+ resolved "https://registry.yarnpkg.com/@octokit/types/-/types-13.10.0.tgz#3e7c6b19c0236c270656e4ea666148c2b51fd1a3"
+ integrity sha512-ifLaO34EbbPj0Xgro4G5lP5asESjwHracYJvVaPIyXMuiuXLlhic3S47cBdTb+jfODkTE5YtGCLt3Ay3+J97sA==
+ dependencies:
+ "@octokit/openapi-types" "^24.2.0"
+
"@octokit/types@^6.0.3", "@octokit/types@^6.16.1", "@octokit/types@^6.34.0":
version "6.34.0"
resolved "https://registry.yarnpkg.com/@octokit/types/-/types-6.34.0.tgz#c6021333334d1ecfb5d370a8798162ddf1ae8218"
@@ -1328,6 +1758,485 @@
dependencies:
"@octokit/openapi-types" "^11.2.0"
+"@octokit/webhooks-methods@^4.1.0":
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/@octokit/webhooks-methods/-/webhooks-methods-4.1.0.tgz#681a6c86c9b21d4ec9e29108fb053ae7512be033"
+ integrity sha512-zoQyKw8h9STNPqtm28UGOYFE7O6D4Il8VJwhAtMHFt2C4L0VQT1qGKLeefUOqHNs1mNRYSadVv7x0z8U2yyeWQ==
+
+"@octokit/webhooks-types@7.6.1":
+ version "7.6.1"
+ resolved "https://registry.yarnpkg.com/@octokit/webhooks-types/-/webhooks-types-7.6.1.tgz#bc96371057c2d54c982c9f8f642655b26cd588eb"
+ integrity sha512-S8u2cJzklBC0FgTwWVLaM8tMrDuDMVE4xiTK4EYXM9GntyvrdbSoxqDQa+Fh57CCNApyIpyeqPhhFEmHPfrXgw==
+
+"@octokit/webhooks@^12.0.4":
+ version "12.3.2"
+ resolved "https://registry.yarnpkg.com/@octokit/webhooks/-/webhooks-12.3.2.tgz#adea72fbfbb612bd8b01a56741bd4cf572e10a0c"
+ integrity sha512-exj1MzVXoP7xnAcAB3jZ97pTvVPkQF9y6GA/dvYC47HV7vLv+24XRS6b/v/XnyikpEuvMhugEXdGtAlU086WkQ==
+ dependencies:
+ "@octokit/request-error" "^5.0.0"
+ "@octokit/webhooks-methods" "^4.1.0"
+ "@octokit/webhooks-types" "7.6.1"
+ aggregate-error "^3.1.0"
+
+"@opentelemetry/api-logs@0.57.2":
+ version "0.57.2"
+ resolved "https://registry.yarnpkg.com/@opentelemetry/api-logs/-/api-logs-0.57.2.tgz#d4001b9aa3580367b40fe889f3540014f766cc87"
+ integrity sha512-uIX52NnTM0iBh84MShlpouI7UKqkZ7MrUszTmaypHBu4r7NofznSnQRfJ+uUeDtQDj6w8eFGg5KBLDAwAPz1+A==
+ dependencies:
+ "@opentelemetry/api" "^1.3.0"
+
+"@opentelemetry/api@^1.3.0", "@opentelemetry/api@^1.9.0":
+ version "1.9.1"
+ resolved "https://registry.yarnpkg.com/@opentelemetry/api/-/api-1.9.1.tgz#c1b0346de336ba55af2d5a7970882037baedec05"
+ integrity sha512-gLyJlPHPZYdAk1JENA9LeHejZe1Ti77/pTeFm/nMXmQH/HFZlcS/O2XJB+L8fkbrNSqhdtlvjBVjxwUYanNH5Q==
+
+"@opentelemetry/context-async-hooks@^1.30.1":
+ version "1.30.1"
+ resolved "https://registry.yarnpkg.com/@opentelemetry/context-async-hooks/-/context-async-hooks-1.30.1.tgz#4f76280691a742597fd0bf682982126857622948"
+ integrity sha512-s5vvxXPVdjqS3kTLKMeBMvop9hbWkwzBpu+mUO2M7sZtlkyDJGwFe33wRKnbaYDo8ExRVBIIdwIGrqpxHuKttA==
+
+"@opentelemetry/core@1.30.1", "@opentelemetry/core@^1.1.0", "@opentelemetry/core@^1.26.0", "@opentelemetry/core@^1.30.1", "@opentelemetry/core@^1.8.0":
+ version "1.30.1"
+ resolved "https://registry.yarnpkg.com/@opentelemetry/core/-/core-1.30.1.tgz#a0b468bb396358df801881709ea38299fc30ab27"
+ integrity sha512-OOCM2C/QIURhJMuKaekP3TRBxBKxG/TWWA0TL2J6nXUtDnuCtccy49LUJF8xPFXMX+0LMcxFpCo8M9cGY1W6rQ==
+ dependencies:
+ "@opentelemetry/semantic-conventions" "1.28.0"
+
+"@opentelemetry/instrumentation-amqplib@^0.46.1":
+ version "0.46.1"
+ resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-amqplib/-/instrumentation-amqplib-0.46.1.tgz#7101678488d0e942162ca85c9ac6e93e1f3e0008"
+ integrity sha512-AyXVnlCf/xV3K/rNumzKxZqsULyITJH6OVLiW6730JPRqWA7Zc9bvYoVNpN6iOpTU8CasH34SU/ksVJmObFibQ==
+ dependencies:
+ "@opentelemetry/core" "^1.8.0"
+ "@opentelemetry/instrumentation" "^0.57.1"
+ "@opentelemetry/semantic-conventions" "^1.27.0"
+
+"@opentelemetry/instrumentation-connect@0.43.1":
+ version "0.43.1"
+ resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-connect/-/instrumentation-connect-0.43.1.tgz#8ce88b94ce211c7bbdc9bd984b7a37876061bde3"
+ integrity sha512-ht7YGWQuV5BopMcw5Q2hXn3I8eG8TH0J/kc/GMcW4CuNTgiP6wCu44BOnucJWL3CmFWaRHI//vWyAhaC8BwePw==
+ dependencies:
+ "@opentelemetry/core" "^1.8.0"
+ "@opentelemetry/instrumentation" "^0.57.1"
+ "@opentelemetry/semantic-conventions" "^1.27.0"
+ "@types/connect" "3.4.38"
+
+"@opentelemetry/instrumentation-dataloader@0.16.1":
+ version "0.16.1"
+ resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-dataloader/-/instrumentation-dataloader-0.16.1.tgz#5d1d2c79f067c3102df7101f1753060ed93a1566"
+ integrity sha512-K/qU4CjnzOpNkkKO4DfCLSQshejRNAJtd4esgigo/50nxCB6XCyi1dhAblUHM9jG5dRm8eu0FB+t87nIo99LYQ==
+ dependencies:
+ "@opentelemetry/instrumentation" "^0.57.1"
+
+"@opentelemetry/instrumentation-express@0.47.1":
+ version "0.47.1"
+ resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-express/-/instrumentation-express-0.47.1.tgz#7cf74f35e43cc3c8186edd1249fdb225849c48b2"
+ integrity sha512-QNXPTWteDclR2B4pDFpz0TNghgB33UMjUt14B+BZPmtH1MwUFAfLHBaP5If0Z5NZC+jaH8oF2glgYjrmhZWmSw==
+ dependencies:
+ "@opentelemetry/core" "^1.8.0"
+ "@opentelemetry/instrumentation" "^0.57.1"
+ "@opentelemetry/semantic-conventions" "^1.27.0"
+
+"@opentelemetry/instrumentation-fs@0.19.1":
+ version "0.19.1"
+ resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-fs/-/instrumentation-fs-0.19.1.tgz#ebfe40781949574a66a82b8511d9bcd414dbfe98"
+ integrity sha512-6g0FhB3B9UobAR60BGTcXg4IHZ6aaYJzp0Ki5FhnxyAPt8Ns+9SSvgcrnsN2eGmk3RWG5vYycUGOEApycQL24A==
+ dependencies:
+ "@opentelemetry/core" "^1.8.0"
+ "@opentelemetry/instrumentation" "^0.57.1"
+
+"@opentelemetry/instrumentation-generic-pool@0.43.1":
+ version "0.43.1"
+ resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-generic-pool/-/instrumentation-generic-pool-0.43.1.tgz#6d1e181b32debc9510bdbbd63fe4ce5bc310d577"
+ integrity sha512-M6qGYsp1cURtvVLGDrPPZemMFEbuMmCXgQYTReC/IbimV5sGrLBjB+/hANUpRZjX67nGLdKSVLZuQQAiNz+sww==
+ dependencies:
+ "@opentelemetry/instrumentation" "^0.57.1"
+
+"@opentelemetry/instrumentation-graphql@0.47.1":
+ version "0.47.1"
+ resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-graphql/-/instrumentation-graphql-0.47.1.tgz#1037bb546c82060d6d5d6f5dbd8765e31ccf6c26"
+ integrity sha512-EGQRWMGqwiuVma8ZLAZnExQ7sBvbOx0N/AE/nlafISPs8S+QtXX+Viy6dcQwVWwYHQPAcuY3bFt3xgoAwb4ZNQ==
+ dependencies:
+ "@opentelemetry/instrumentation" "^0.57.1"
+
+"@opentelemetry/instrumentation-hapi@0.45.2":
+ version "0.45.2"
+ resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-hapi/-/instrumentation-hapi-0.45.2.tgz#14d670e0bbbdf864187a9f80265a9219ed2d01cf"
+ integrity sha512-7Ehow/7Wp3aoyCrZwQpU7a2CnoMq0XhIcioFuKjBb0PLYfBfmTsFTUyatlHu0fRxhwcRsSQRTvEhmZu8CppBpQ==
+ dependencies:
+ "@opentelemetry/core" "^1.8.0"
+ "@opentelemetry/instrumentation" "^0.57.1"
+ "@opentelemetry/semantic-conventions" "^1.27.0"
+
+"@opentelemetry/instrumentation-http@0.57.2":
+ version "0.57.2"
+ resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-http/-/instrumentation-http-0.57.2.tgz#f425eda67b6241c3abe08e4ea972169b85ef3064"
+ integrity sha512-1Uz5iJ9ZAlFOiPuwYg29Bf7bJJc/GeoeJIFKJYQf67nTVKFe8RHbEtxgkOmK4UGZNHKXcpW4P8cWBYzBn1USpg==
+ dependencies:
+ "@opentelemetry/core" "1.30.1"
+ "@opentelemetry/instrumentation" "0.57.2"
+ "@opentelemetry/semantic-conventions" "1.28.0"
+ forwarded-parse "2.1.2"
+ semver "^7.5.2"
+
+"@opentelemetry/instrumentation-ioredis@0.47.1":
+ version "0.47.1"
+ resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-ioredis/-/instrumentation-ioredis-0.47.1.tgz#5cedd0ebe8cfd3569513a9b44945827bf844b331"
+ integrity sha512-OtFGSN+kgk/aoKgdkKQnBsQFDiG8WdCxu+UrHr0bXScdAmtSzLSraLo7wFIb25RVHfRWvzI5kZomqJYEg/l1iA==
+ dependencies:
+ "@opentelemetry/instrumentation" "^0.57.1"
+ "@opentelemetry/redis-common" "^0.36.2"
+ "@opentelemetry/semantic-conventions" "^1.27.0"
+
+"@opentelemetry/instrumentation-kafkajs@0.7.1":
+ version "0.7.1"
+ resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-kafkajs/-/instrumentation-kafkajs-0.7.1.tgz#cc7a31a5fe2c14171611da8e46827f762f332625"
+ integrity sha512-OtjaKs8H7oysfErajdYr1yuWSjMAectT7Dwr+axIoZqT9lmEOkD/H/3rgAs8h/NIuEi2imSXD+vL4MZtOuJfqQ==
+ dependencies:
+ "@opentelemetry/instrumentation" "^0.57.1"
+ "@opentelemetry/semantic-conventions" "^1.27.0"
+
+"@opentelemetry/instrumentation-knex@0.44.1":
+ version "0.44.1"
+ resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-knex/-/instrumentation-knex-0.44.1.tgz#72f4efd798695c077ab218045d4c682231fbb36a"
+ integrity sha512-U4dQxkNhvPexffjEmGwCq68FuftFK15JgUF05y/HlK3M6W/G2iEaACIfXdSnwVNe9Qh0sPfw8LbOPxrWzGWGMQ==
+ dependencies:
+ "@opentelemetry/instrumentation" "^0.57.1"
+ "@opentelemetry/semantic-conventions" "^1.27.0"
+
+"@opentelemetry/instrumentation-koa@0.47.1":
+ version "0.47.1"
+ resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-koa/-/instrumentation-koa-0.47.1.tgz#ba57eccd44a75ec59e3129757fda4e8c8dd7ce2c"
+ integrity sha512-l/c+Z9F86cOiPJUllUCt09v+kICKvT+Vg1vOAJHtHPsJIzurGayucfCMq2acd/A/yxeNWunl9d9eqZ0G+XiI6A==
+ dependencies:
+ "@opentelemetry/core" "^1.8.0"
+ "@opentelemetry/instrumentation" "^0.57.1"
+ "@opentelemetry/semantic-conventions" "^1.27.0"
+
+"@opentelemetry/instrumentation-lru-memoizer@0.44.1":
+ version "0.44.1"
+ resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-lru-memoizer/-/instrumentation-lru-memoizer-0.44.1.tgz#1f0ec28130f8c379d310dc531a8b25780be8e445"
+ integrity sha512-5MPkYCvG2yw7WONEjYj5lr5JFehTobW7wX+ZUFy81oF2lr9IPfZk9qO+FTaM0bGEiymwfLwKe6jE15nHn1nmHg==
+ dependencies:
+ "@opentelemetry/instrumentation" "^0.57.1"
+
+"@opentelemetry/instrumentation-mongodb@0.52.0":
+ version "0.52.0"
+ resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-mongodb/-/instrumentation-mongodb-0.52.0.tgz#a5ed123f3fac5d7d08347353cd37d9cf00893746"
+ integrity sha512-1xmAqOtRUQGR7QfJFfGV/M2kC7wmI2WgZdpru8hJl3S0r4hW0n3OQpEHlSGXJAaNFyvT+ilnwkT+g5L4ljHR6g==
+ dependencies:
+ "@opentelemetry/instrumentation" "^0.57.1"
+ "@opentelemetry/semantic-conventions" "^1.27.0"
+
+"@opentelemetry/instrumentation-mongoose@0.46.1":
+ version "0.46.1"
+ resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-mongoose/-/instrumentation-mongoose-0.46.1.tgz#23f22b7d4d5a548ac8add2a52ec2fec4e61c7de1"
+ integrity sha512-3kINtW1LUTPkiXFRSSBmva1SXzS/72we/jL22N+BnF3DFcoewkdkHPYOIdAAk9gSicJ4d5Ojtt1/HeibEc5OQg==
+ dependencies:
+ "@opentelemetry/core" "^1.8.0"
+ "@opentelemetry/instrumentation" "^0.57.1"
+ "@opentelemetry/semantic-conventions" "^1.27.0"
+
+"@opentelemetry/instrumentation-mysql2@0.45.2":
+ version "0.45.2"
+ resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-mysql2/-/instrumentation-mysql2-0.45.2.tgz#590ed22f274a6999e57c3283433a119274cb572b"
+ integrity sha512-h6Ad60FjCYdJZ5DTz1Lk2VmQsShiViKe0G7sYikb0GHI0NVvApp2XQNRHNjEMz87roFttGPLHOYVPlfy+yVIhQ==
+ dependencies:
+ "@opentelemetry/instrumentation" "^0.57.1"
+ "@opentelemetry/semantic-conventions" "^1.27.0"
+ "@opentelemetry/sql-common" "^0.40.1"
+
+"@opentelemetry/instrumentation-mysql@0.45.1":
+ version "0.45.1"
+ resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-mysql/-/instrumentation-mysql-0.45.1.tgz#6fb3fdf7b5afa62bfa4ce73fae213539bb660841"
+ integrity sha512-TKp4hQ8iKQsY7vnp/j0yJJ4ZsP109Ht6l4RHTj0lNEG1TfgTrIH5vJMbgmoYXWzNHAqBH2e7fncN12p3BP8LFg==
+ dependencies:
+ "@opentelemetry/instrumentation" "^0.57.1"
+ "@opentelemetry/semantic-conventions" "^1.27.0"
+ "@types/mysql" "2.15.26"
+
+"@opentelemetry/instrumentation-pg@0.51.1":
+ version "0.51.1"
+ resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-pg/-/instrumentation-pg-0.51.1.tgz#a999a13fa56dc67da49a1ccf8f5e56a9ed409477"
+ integrity sha512-QxgjSrxyWZc7Vk+qGSfsejPVFL1AgAJdSBMYZdDUbwg730D09ub3PXScB9d04vIqPriZ+0dqzjmQx0yWKiCi2Q==
+ dependencies:
+ "@opentelemetry/core" "^1.26.0"
+ "@opentelemetry/instrumentation" "^0.57.1"
+ "@opentelemetry/semantic-conventions" "^1.27.0"
+ "@opentelemetry/sql-common" "^0.40.1"
+ "@types/pg" "8.6.1"
+ "@types/pg-pool" "2.0.6"
+
+"@opentelemetry/instrumentation-redis-4@0.46.1":
+ version "0.46.1"
+ resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-redis-4/-/instrumentation-redis-4-0.46.1.tgz#325697dfccda3e70662769c6db230a37812697c6"
+ integrity sha512-UMqleEoabYMsWoTkqyt9WAzXwZ4BlFZHO40wr3d5ZvtjKCHlD4YXLm+6OLCeIi/HkX7EXvQaz8gtAwkwwSEvcQ==
+ dependencies:
+ "@opentelemetry/instrumentation" "^0.57.1"
+ "@opentelemetry/redis-common" "^0.36.2"
+ "@opentelemetry/semantic-conventions" "^1.27.0"
+
+"@opentelemetry/instrumentation-tedious@0.18.1":
+ version "0.18.1"
+ resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-tedious/-/instrumentation-tedious-0.18.1.tgz#d87dba9d0ddfc77f9fcbcceabcc31cb5a5f7bb11"
+ integrity sha512-5Cuy/nj0HBaH+ZJ4leuD7RjgvA844aY2WW+B5uLcWtxGjRZl3MNLuxnNg5DYWZNPO+NafSSnra0q49KWAHsKBg==
+ dependencies:
+ "@opentelemetry/instrumentation" "^0.57.1"
+ "@opentelemetry/semantic-conventions" "^1.27.0"
+ "@types/tedious" "^4.0.14"
+
+"@opentelemetry/instrumentation-undici@0.10.1":
+ version "0.10.1"
+ resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation-undici/-/instrumentation-undici-0.10.1.tgz#228b7fc267e55533708be16c43e70bbb51a691de"
+ integrity sha512-rkOGikPEyRpMCmNu9AQuV5dtRlDmJp2dK5sw8roVshAGoB6hH/3QjDtRhdwd75SsJwgynWUNRUYe0wAkTo16tQ==
+ dependencies:
+ "@opentelemetry/core" "^1.8.0"
+ "@opentelemetry/instrumentation" "^0.57.1"
+
+"@opentelemetry/instrumentation@0.57.2", "@opentelemetry/instrumentation@^0.52.0 || ^0.53.0 || ^0.54.0 || ^0.55.0 || ^0.56.0 || ^0.57.0", "@opentelemetry/instrumentation@^0.57.1", "@opentelemetry/instrumentation@^0.57.2":
+ version "0.57.2"
+ resolved "https://registry.yarnpkg.com/@opentelemetry/instrumentation/-/instrumentation-0.57.2.tgz#8924549d7941ba1b5c6f04d5529cf48330456d1d"
+ integrity sha512-BdBGhQBh8IjZ2oIIX6F2/Q3LKm/FDDKi6ccYKcBTeilh6SNdNKveDOLk73BkSJjQLJk6qe4Yh+hHw1UPhCDdrg==
+ dependencies:
+ "@opentelemetry/api-logs" "0.57.2"
+ "@types/shimmer" "^1.2.0"
+ import-in-the-middle "^1.8.1"
+ require-in-the-middle "^7.1.1"
+ semver "^7.5.2"
+ shimmer "^1.2.1"
+
+"@opentelemetry/redis-common@^0.36.2":
+ version "0.36.2"
+ resolved "https://registry.yarnpkg.com/@opentelemetry/redis-common/-/redis-common-0.36.2.tgz#906ac8e4d804d4109f3ebd5c224ac988276fdc47"
+ integrity sha512-faYX1N0gpLhej/6nyp6bgRjzAKXn5GOEMYY7YhciSfCoITAktLUtQ36d24QEWNA1/WA1y6qQunCe0OhHRkVl9g==
+
+"@opentelemetry/resources@1.30.1", "@opentelemetry/resources@^1.30.1":
+ version "1.30.1"
+ resolved "https://registry.yarnpkg.com/@opentelemetry/resources/-/resources-1.30.1.tgz#a4eae17ebd96947fdc7a64f931ca4b71e18ce964"
+ integrity sha512-5UxZqiAgLYGFjS4s9qm5mBVo433u+dSPUFWVWXmLAD4wB65oMCoXaJP1KJa9DIYYMeHu3z4BZcStG3LC593cWA==
+ dependencies:
+ "@opentelemetry/core" "1.30.1"
+ "@opentelemetry/semantic-conventions" "1.28.0"
+
+"@opentelemetry/sdk-trace-base@^1.30.1":
+ version "1.30.1"
+ resolved "https://registry.yarnpkg.com/@opentelemetry/sdk-trace-base/-/sdk-trace-base-1.30.1.tgz#41a42234096dc98e8f454d24551fc80b816feb34"
+ integrity sha512-jVPgBbH1gCy2Lb7X0AVQ8XAfgg0pJ4nvl8/IiQA6nxOsPvS+0zMJaFSs2ltXe0J6C8dqjcnpyqINDJmU30+uOg==
+ dependencies:
+ "@opentelemetry/core" "1.30.1"
+ "@opentelemetry/resources" "1.30.1"
+ "@opentelemetry/semantic-conventions" "1.28.0"
+
+"@opentelemetry/semantic-conventions@1.28.0":
+ version "1.28.0"
+ resolved "https://registry.yarnpkg.com/@opentelemetry/semantic-conventions/-/semantic-conventions-1.28.0.tgz#337fb2bca0453d0726696e745f50064411f646d6"
+ integrity sha512-lp4qAiMTD4sNWW4DbKLBkfiMZ4jbAboJIGOQr5DvciMRI494OapieI9qiODpOt0XBr1LjIDy1xAGAnVs5supTA==
+
+"@opentelemetry/semantic-conventions@^1.27.0", "@opentelemetry/semantic-conventions@^1.34.0":
+ version "1.43.0"
+ resolved "https://registry.yarnpkg.com/@opentelemetry/semantic-conventions/-/semantic-conventions-1.43.0.tgz#f3f467e36c27332f0e735ec86cdcd78dd6f27865"
+ integrity sha512-eSYWTm620tTk45EKSedaUL8MFYI8hW164hIXsgIHyxu3VobUB3fFCu5t0hQby6OoWRPsG1KkKUG2M5UadiLiVg==
+
+"@opentelemetry/sql-common@^0.40.1":
+ version "0.40.1"
+ resolved "https://registry.yarnpkg.com/@opentelemetry/sql-common/-/sql-common-0.40.1.tgz#93fbc48d8017449f5b3c3274f2268a08af2b83b6"
+ integrity sha512-nSDlnHSqzC3pXn/wZEZVLuAuJ1MYMXPBwtv2qAbCa3847SaHItdE7SzUq/Jtb0KZmh1zfAbNi3AAMjztTT4Ugg==
+ dependencies:
+ "@opentelemetry/core" "^1.1.0"
+
+"@paulirish/trace_engine@0.0.59":
+ version "0.0.59"
+ resolved "https://registry.yarnpkg.com/@paulirish/trace_engine/-/trace_engine-0.0.59.tgz#962ab03d85350e5133e300fe68a20ca0fcddbd0a"
+ integrity sha512-439NUzQGmH+9Y017/xCchBP9571J4bzhpcNhrxorf7r37wcyJZkgUfrUsRL3xl+JDcZ6ORhoFCzCw98c6S3YHw==
+ dependencies:
+ legacy-javascript latest
+ third-party-web latest
+
+"@php-wasm/cli-util@3.1.46":
+ version "3.1.46"
+ resolved "https://registry.yarnpkg.com/@php-wasm/cli-util/-/cli-util-3.1.46.tgz#092ed4216fa2e3e603fc3e35cc9b671d19c7bb74"
+ integrity sha512-m3bDR/PyiiJzdRMwUBfbXG2VwB+OhrAcCAmLbjB3dkkPxJ7mSCnNbInDY43fkpUuiqTCzamrrgt/tpGdtLPTiQ==
+ dependencies:
+ "@php-wasm/util" "3.1.46"
+ fast-xml-parser "^5.8.0"
+ jsonc-parser "3.3.1"
+
+"@php-wasm/logger@3.1.46":
+ version "3.1.46"
+ resolved "https://registry.yarnpkg.com/@php-wasm/logger/-/logger-3.1.46.tgz#100b6150640e525f7d89b1f4d627d50266237937"
+ integrity sha512-PfnDq5ammh5FXxkGX1TGEck9gmW3i76IvBCqtX4D45xnSBIuCeu8uf2oWuty2j/c8wTEO8vyRDdvCj5oow7bXw==
+
+"@php-wasm/node-5-2@3.1.46":
+ version "3.1.46"
+ resolved "https://registry.yarnpkg.com/@php-wasm/node-5-2/-/node-5-2-3.1.46.tgz#26d8a3b15be6bf1d24d14fb05fe51204578ff98d"
+ integrity sha512-J77WzhYO0cBPDktaoBZ7y980knhN4/nghhVjv7fj57fWYA1m5ZbCGOqcZUys7sQm/vdahcpaU27vqUCHXBrbZw==
+ dependencies:
+ "@php-wasm/universal" "3.1.46"
+ wasm-feature-detect "1.8.0"
+
+"@php-wasm/node-7-4@3.1.46":
+ version "3.1.46"
+ resolved "https://registry.yarnpkg.com/@php-wasm/node-7-4/-/node-7-4-3.1.46.tgz#ea6af9717d833da59b9cd1eacf37d99f7137461f"
+ integrity sha512-HC3li/qX49C5FJKff0X+uewMFzVI5IE2hBhTb0DsJGn5xME1F7W6WoZ4hjrKkIGkjIbATPmiDGspUoHrvmX83A==
+ dependencies:
+ "@php-wasm/universal" "3.1.46"
+ wasm-feature-detect "1.8.0"
+
+"@php-wasm/node-8-0@3.1.46":
+ version "3.1.46"
+ resolved "https://registry.yarnpkg.com/@php-wasm/node-8-0/-/node-8-0-3.1.46.tgz#a0a1cf4d465f56aa07e01ec6d3747e98d0466616"
+ integrity sha512-insUfErssn1NpQ3DNpRYOgTRf89/R7j2b7svMOU05J2sb6v3UFSmkKIR8MndxgvgW5uQhvyQyGHVa79B93ykiA==
+ dependencies:
+ "@php-wasm/universal" "3.1.46"
+ wasm-feature-detect "1.8.0"
+
+"@php-wasm/node-8-1@3.1.46":
+ version "3.1.46"
+ resolved "https://registry.yarnpkg.com/@php-wasm/node-8-1/-/node-8-1-3.1.46.tgz#498894b3c2d17e2f2b8dcbe7ac0a049beb5b0a89"
+ integrity sha512-nPvpbUqAwHmrUSbaLFHgUZDuvyAfo1OfMjLXdgqMjn5nb2QnjlKota4afA/2F6j2WxzjdiXZxro1bSa5fB+OlQ==
+ dependencies:
+ "@php-wasm/universal" "3.1.46"
+ wasm-feature-detect "1.8.0"
+
+"@php-wasm/node-8-2@3.1.46":
+ version "3.1.46"
+ resolved "https://registry.yarnpkg.com/@php-wasm/node-8-2/-/node-8-2-3.1.46.tgz#241fe40f9bb976087a5ddd6f5c267facd28f7f97"
+ integrity sha512-CyDiEZjDBQMsrEnNN+1ZOXcgB4K5bYZ8lmYYDdmGnto7U4nAyzPOT+LydkRoLd27AqabJqnimwkryduDptbE/A==
+ dependencies:
+ "@php-wasm/universal" "3.1.46"
+ wasm-feature-detect "1.8.0"
+
+"@php-wasm/node-8-3@3.1.46":
+ version "3.1.46"
+ resolved "https://registry.yarnpkg.com/@php-wasm/node-8-3/-/node-8-3-3.1.46.tgz#277f8302284d37552c2a5691f790451f66b7a7c8"
+ integrity sha512-ZSH1rPvVuhIYJkGE/GRkQtv7RoQlO0IMWkHLJGt+JrTeaDxxm8Mv/F0H67MrA80q43zzNdNQaUEPn+ZrN/GSwg==
+ dependencies:
+ "@php-wasm/universal" "3.1.46"
+ wasm-feature-detect "1.8.0"
+
+"@php-wasm/node-8-4@3.1.46":
+ version "3.1.46"
+ resolved "https://registry.yarnpkg.com/@php-wasm/node-8-4/-/node-8-4-3.1.46.tgz#2298f307eaced01d796d67e5dcf14d5d055c14b9"
+ integrity sha512-4Wl7hwp6p3m0jaliIMYJz8cIY7obJF3HKxoHKxOcVllKgP+cSr5c/iwFcgYct4goC9sP7wr/xQGeClGQ51aP0A==
+ dependencies:
+ "@php-wasm/universal" "3.1.46"
+ wasm-feature-detect "1.8.0"
+
+"@php-wasm/node-8-5@3.1.46":
+ version "3.1.46"
+ resolved "https://registry.yarnpkg.com/@php-wasm/node-8-5/-/node-8-5-3.1.46.tgz#74bcab49fac6474005bda8270ba546958214548c"
+ integrity sha512-ndL2jnGCVVwhAmHPgo3tWZ+I6q2Flz6OWbbQwGVBQcXqqPdZuVHh+0Gb5KTTn1cGtCErdpL+3ysLwN7tk5LqUA==
+ dependencies:
+ "@php-wasm/universal" "3.1.46"
+ wasm-feature-detect "1.8.0"
+
+"@php-wasm/node@3.1.46":
+ version "3.1.46"
+ resolved "https://registry.yarnpkg.com/@php-wasm/node/-/node-3.1.46.tgz#38787daee344bf30e34ba27ec675908b84992f7b"
+ integrity sha512-PHmV+nAQka6l4SB7GyAbkneqnyhTvfjhC9jArKNF7sUDGwVDdvvu0Fh5JRY4G1Eam3Z5gopD4YwDySJCfdq8LA==
+ dependencies:
+ "@php-wasm/cli-util" "3.1.46"
+ "@php-wasm/logger" "3.1.46"
+ "@php-wasm/node-5-2" "3.1.46"
+ "@php-wasm/node-7-4" "3.1.46"
+ "@php-wasm/node-8-0" "3.1.46"
+ "@php-wasm/node-8-1" "3.1.46"
+ "@php-wasm/node-8-2" "3.1.46"
+ "@php-wasm/node-8-3" "3.1.46"
+ "@php-wasm/node-8-4" "3.1.46"
+ "@php-wasm/node-8-5" "3.1.46"
+ "@php-wasm/universal" "3.1.46"
+ "@php-wasm/util" "3.1.46"
+ fs-ext-extra-prebuilt "2.2.7"
+ wasm-feature-detect "1.8.0"
+ ws "8.21.0"
+
+"@php-wasm/progress@3.1.46":
+ version "3.1.46"
+ resolved "https://registry.yarnpkg.com/@php-wasm/progress/-/progress-3.1.46.tgz#0050fea1412f0a67951ca98e7bb25f1b3c93a819"
+ integrity sha512-WmmgEm6yz322M3pzgAUjxckyhpVxr2WWlHyVYDyaMZWU6UIDUHfiRZRPzADohNyYvV3g0/zMNaDGmxz+TTXwQQ==
+ dependencies:
+ "@php-wasm/logger" "3.1.46"
+
+"@php-wasm/scopes@3.1.46":
+ version "3.1.46"
+ resolved "https://registry.yarnpkg.com/@php-wasm/scopes/-/scopes-3.1.46.tgz#164c3c1776f619cc2e26848beee429b3b68213b1"
+ integrity sha512-WkH55sjdRSE+FIljMy97ScPIhGLbdVZOSmwXJkctEvmflZqtDIS4fOs9qRKj2dV+Nh4ewyfcWUSf5tTMJnyAuA==
+
+"@php-wasm/stream-compression@3.1.46":
+ version "3.1.46"
+ resolved "https://registry.yarnpkg.com/@php-wasm/stream-compression/-/stream-compression-3.1.46.tgz#286a8e6a416583fe45a0c0b3491f48ec89c969f9"
+ integrity sha512-+oUw4CPX52FgYXEh5C+MgJAg7Cy5OeaVuh7HnQR6oxb69nU63/r8tHTLV/WrWRyjBYh321uJzLV7Gg29qmiUtg==
+ dependencies:
+ "@php-wasm/util" "3.1.46"
+
+"@php-wasm/universal@3.1.46":
+ version "3.1.46"
+ resolved "https://registry.yarnpkg.com/@php-wasm/universal/-/universal-3.1.46.tgz#5e71ef418cf5c02081246090402949c7535241e5"
+ integrity sha512-sx0KyN5kcsCMzwy+XJAyoOukSA5TEZYd0LK3l9kRP3I0CSd5h6JItkf5eZ42WltB+wD+aTRdqSwc/Mvkc7qBjQ==
+ dependencies:
+ "@php-wasm/logger" "3.1.46"
+ "@php-wasm/progress" "3.1.46"
+ "@php-wasm/stream-compression" "3.1.46"
+ "@php-wasm/util" "3.1.46"
+ ini "4.1.2"
+
+"@php-wasm/util@3.1.46":
+ version "3.1.46"
+ resolved "https://registry.yarnpkg.com/@php-wasm/util/-/util-3.1.46.tgz#26996c882d75006337668318e040bffc123abc98"
+ integrity sha512-Yh9HNbx+rB2R1tScUvvAsbJVIB7msjWceWYogyR2YvAOqlDL0ymZyaQ65+K3QcHh/8HostTRwwgQh5oK4DLDrA==
+
+"@php-wasm/web-service-worker@3.1.46":
+ version "3.1.46"
+ resolved "https://registry.yarnpkg.com/@php-wasm/web-service-worker/-/web-service-worker-3.1.46.tgz#86f6361a7ce3b5a0653bdf89c89678ef2ee44892"
+ integrity sha512-GwQzZbEnF+7a3wGqDaMCdbsCuDUdOvTyHAul40TbSATUZ1FdUVagI94pMMMQtYCCxQFnEuO/WxzwDKJJ3hpaug==
+ dependencies:
+ "@php-wasm/scopes" "3.1.46"
+ "@php-wasm/universal" "3.1.46"
+
+"@php-wasm/xdebug-bridge@3.1.46":
+ version "3.1.46"
+ resolved "https://registry.yarnpkg.com/@php-wasm/xdebug-bridge/-/xdebug-bridge-3.1.46.tgz#db15fa501c5a279202b1b15f8fe732724bf2e6bc"
+ integrity sha512-no8Hr5Uw6EcwKjwUbBHlu2gTCZ5v4szeQT1AKjDYazM8Mur1AtaL2/q8X0IB8Hy4NDV/Jxgt33lxCh1n8XnnWA==
+ dependencies:
+ "@php-wasm/logger" "3.1.46"
+ "@php-wasm/universal" "3.1.46"
+ ws "8.21.0"
+ xml2js "0.6.2"
+ yargs "17.7.2"
+
+"@pkgjs/parseargs@^0.11.0":
+ version "0.11.0"
+ resolved "https://registry.yarnpkg.com/@pkgjs/parseargs/-/parseargs-0.11.0.tgz#a77ea742fab25775145434eb1d2328cf5013ac33"
+ integrity sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==
+
+"@playwright/test@^1.61.1":
+ version "1.61.1"
+ resolved "https://registry.yarnpkg.com/@playwright/test/-/test-1.61.1.tgz#48568dc22af7819e55fa5e8e3bc79b7e6a3e6675"
+ integrity sha512-8nKv6+0RJSL9FE4jYOEGXnPeM/Hg12qZpmqzZjRh3qM0Y7c3z1mrOTfFLids72RDQYVh9WpLEfR5WdpNX4fkig==
+ dependencies:
+ playwright "1.61.1"
+
+"@prisma/instrumentation@6.11.1":
+ version "6.11.1"
+ resolved "https://registry.yarnpkg.com/@prisma/instrumentation/-/instrumentation-6.11.1.tgz#db3c40dbf325cf7a816504b8bc009ca3d4734c2f"
+ integrity sha512-mrZOev24EDhnefmnZX7WVVT7v+r9LttPRqf54ONvj6re4XMF7wFTpK2tLJi4XHB7fFp/6xhYbgRel8YV7gQiyA==
+ dependencies:
+ "@opentelemetry/instrumentation" "^0.52.0 || ^0.53.0 || ^0.54.0 || ^0.55.0 || ^0.56.0 || ^0.57.0"
+
+"@puppeteer/browsers@2.13.2":
+ version "2.13.2"
+ resolved "https://registry.yarnpkg.com/@puppeteer/browsers/-/browsers-2.13.2.tgz#dcc8e7a4545d9680a8a72c53f132e80afc582284"
+ integrity sha512-5EUZSUIc37H6aIXyWO0Z4y8NlF8NnjgmqeQgOGiswAU7pY0HOo16ho4+alIWmSfdZnjqBRawMsP3I5YqLSn6kw==
+ dependencies:
+ debug "^4.4.3"
+ extract-zip "^2.0.1"
+ progress "^2.0.3"
+ proxy-agent "^6.5.0"
+ semver "^7.7.4"
+ tar-fs "^3.1.1"
+ yargs "^17.7.2"
+
"@semantic-release/changelog@^5.0.1":
version "5.0.1"
resolved "https://registry.yarnpkg.com/@semantic-release/changelog/-/changelog-5.0.1.tgz#50a84b63e5d391b7debfe021421589fa2bcdafe4"
@@ -1439,11 +2348,134 @@
lodash "^4.17.4"
read-pkg-up "^7.0.0"
+"@sentry/core@9.47.1":
+ version "9.47.1"
+ resolved "https://registry.yarnpkg.com/@sentry/core/-/core-9.47.1.tgz#6b95b8a03ade1ca04f8b9b457bc751eb8be0c06a"
+ integrity sha512-KX62+qIt4xgy8eHKHiikfhz2p5fOciXd0Cl+dNzhgPFq8klq4MGMNaf148GB3M/vBqP4nw/eFvRMAayFCgdRQw==
+
+"@sentry/node-core@9.47.1":
+ version "9.47.1"
+ resolved "https://registry.yarnpkg.com/@sentry/node-core/-/node-core-9.47.1.tgz#e07281bbd4c3d2e1d76444efcb1149b471b92d0e"
+ integrity sha512-7TEOiCGkyShJ8CKtsri9lbgMCbB+qNts2Xq37itiMPN2m+lIukK3OX//L8DC5nfKYZlgikrefS63/vJtm669hQ==
+ dependencies:
+ "@sentry/core" "9.47.1"
+ "@sentry/opentelemetry" "9.47.1"
+ import-in-the-middle "^1.14.2"
+
+"@sentry/node@^9.28.1":
+ version "9.47.1"
+ resolved "https://registry.yarnpkg.com/@sentry/node/-/node-9.47.1.tgz#955b1956a885e487bdf8592d4515880d608036aa"
+ integrity sha512-CDbkasBz3fnWRKSFs6mmaRepM2pa+tbZkrqhPWifFfIkJDidtVW40p6OnquTvPXyPAszCnDZRnZT14xyvNmKPQ==
+ dependencies:
+ "@opentelemetry/api" "^1.9.0"
+ "@opentelemetry/context-async-hooks" "^1.30.1"
+ "@opentelemetry/core" "^1.30.1"
+ "@opentelemetry/instrumentation" "^0.57.2"
+ "@opentelemetry/instrumentation-amqplib" "^0.46.1"
+ "@opentelemetry/instrumentation-connect" "0.43.1"
+ "@opentelemetry/instrumentation-dataloader" "0.16.1"
+ "@opentelemetry/instrumentation-express" "0.47.1"
+ "@opentelemetry/instrumentation-fs" "0.19.1"
+ "@opentelemetry/instrumentation-generic-pool" "0.43.1"
+ "@opentelemetry/instrumentation-graphql" "0.47.1"
+ "@opentelemetry/instrumentation-hapi" "0.45.2"
+ "@opentelemetry/instrumentation-http" "0.57.2"
+ "@opentelemetry/instrumentation-ioredis" "0.47.1"
+ "@opentelemetry/instrumentation-kafkajs" "0.7.1"
+ "@opentelemetry/instrumentation-knex" "0.44.1"
+ "@opentelemetry/instrumentation-koa" "0.47.1"
+ "@opentelemetry/instrumentation-lru-memoizer" "0.44.1"
+ "@opentelemetry/instrumentation-mongodb" "0.52.0"
+ "@opentelemetry/instrumentation-mongoose" "0.46.1"
+ "@opentelemetry/instrumentation-mysql" "0.45.1"
+ "@opentelemetry/instrumentation-mysql2" "0.45.2"
+ "@opentelemetry/instrumentation-pg" "0.51.1"
+ "@opentelemetry/instrumentation-redis-4" "0.46.1"
+ "@opentelemetry/instrumentation-tedious" "0.18.1"
+ "@opentelemetry/instrumentation-undici" "0.10.1"
+ "@opentelemetry/resources" "^1.30.1"
+ "@opentelemetry/sdk-trace-base" "^1.30.1"
+ "@opentelemetry/semantic-conventions" "^1.34.0"
+ "@prisma/instrumentation" "6.11.1"
+ "@sentry/core" "9.47.1"
+ "@sentry/node-core" "9.47.1"
+ "@sentry/opentelemetry" "9.47.1"
+ import-in-the-middle "^1.14.2"
+ minimatch "^9.0.0"
+
+"@sentry/opentelemetry@9.47.1":
+ version "9.47.1"
+ resolved "https://registry.yarnpkg.com/@sentry/opentelemetry/-/opentelemetry-9.47.1.tgz#005673a6e912e32ee224162d3362de5777c0f1ba"
+ integrity sha512-STtFpjF7lwzeoedDJV+5XA6P89BfmFwFftmHSGSe3UTI8z8IoiR5yB6X2vCjSPvXlfeOs13qCNNCEZyznxM8Xw==
+ dependencies:
+ "@sentry/core" "9.47.1"
+
+"@simple-git/args-pathspec@^1.0.3":
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/@simple-git/args-pathspec/-/args-pathspec-1.0.3.tgz#9ef4a2ad5f49ab4056362d03f93f775b93118ca5"
+ integrity sha512-ngJMaHlsWDTfjyq9F3VIQ8b7NXbBLq5j9i5bJ6XLYtD6qlDXT7fdKY2KscWWUF8t18xx052Y/PUO1K1TRc9yKA==
+
+"@simple-git/argv-parser@^1.1.0":
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/@simple-git/argv-parser/-/argv-parser-1.1.1.tgz#275b839c6eeb5030872c73b1ea839a416885da9d"
+ integrity sha512-Q9lBcfQ+VQCpQqGJFHe5yooOS5hGdLFFbJ5R+R5aDsnkPCahtn1hSkMcORX65J2Z5lxSkD0lQorMsncuBQxYUw==
+ dependencies:
+ "@simple-git/args-pathspec" "^1.0.3"
+
+"@sindresorhus/is@^4.0.0":
+ version "4.6.0"
+ resolved "https://registry.yarnpkg.com/@sindresorhus/is/-/is-4.6.0.tgz#3c7c9c46e678feefe7a2e5bb609d3dbd665ffb3f"
+ integrity sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==
+
+"@szmarczak/http-timer@^4.0.5":
+ version "4.0.6"
+ resolved "https://registry.yarnpkg.com/@szmarczak/http-timer/-/http-timer-4.0.6.tgz#b4a914bb62e7c272d4e5989fe4440f812ab1d807"
+ integrity sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==
+ dependencies:
+ defer-to-connect "^2.0.0"
+
"@tootallnate/once@1":
version "1.1.2"
resolved "https://registry.yarnpkg.com/@tootallnate/once/-/once-1.1.2.tgz#ccb91445360179a04e7fe6aff78c00ffc1eeaf82"
integrity sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==
+"@tootallnate/quickjs-emscripten@^0.23.0":
+ version "0.23.0"
+ resolved "https://registry.yarnpkg.com/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz#db4ecfd499a9765ab24002c3b696d02e6d32a12c"
+ integrity sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==
+
+"@types/aws-lambda@^8.10.83":
+ version "8.10.162"
+ resolved "https://registry.yarnpkg.com/@types/aws-lambda/-/aws-lambda-8.10.162.tgz#589cfecdda3a996e9bdf20a73a26a0811cafb549"
+ integrity sha512-Fn658grtLOci1oxi1391vvDWJRKNGWRSqfxRkmN/Iy3c0tQH1USMKEXcPYHLvope+ZgTFocx9FRQJx1muBL6qw==
+
+"@types/btoa-lite@^1.0.0":
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/@types/btoa-lite/-/btoa-lite-1.0.2.tgz#82bb6aab00abf7cff3ca2825abe010c0cd536ae5"
+ integrity sha512-ZYbcE2x7yrvNFJiU7xJGrpF/ihpkM7zKgw8bha3LNJSesvTtUNxbpzaT7WXBIryf6jovisrxTBvymxMeLLj1Mg==
+
+"@types/cacheable-request@^6.0.1":
+ version "6.0.3"
+ resolved "https://registry.yarnpkg.com/@types/cacheable-request/-/cacheable-request-6.0.3.tgz#a430b3260466ca7b5ca5bfd735693b36e7a9d183"
+ integrity sha512-IQ3EbTzGxIigb1I3qPZc1rWJnH0BmSKv5QYTalEwweFvyBDLSAe24zP0le/hyi7ecGfZVlIVAg4BZqb8WBwKqw==
+ dependencies:
+ "@types/http-cache-semantics" "*"
+ "@types/keyv" "^3.1.4"
+ "@types/node" "*"
+ "@types/responselike" "^1.0.0"
+
+"@types/connect@3.4.38":
+ version "3.4.38"
+ resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.38.tgz#5ba7f3bc4fbbdeaff8dded952e5ff2cc53f8d858"
+ integrity sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==
+ dependencies:
+ "@types/node" "*"
+
+"@types/http-cache-semantics@*":
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/@types/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz#f6a7788f438cbfde15f29acad46512b4c01913b3"
+ integrity sha512-L3LgimLHXtGkWikKnsPg0/VFx9OGZaC+eN1u4r+OB1XRqH3meBIAVC2zr1WdMH+RHmnRkqliQAOHNJ/E0j/e0Q==
+
"@types/json-schema@^7.0.9":
version "7.0.11"
resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3"
@@ -1454,6 +2486,21 @@
resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee"
integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==
+"@types/jsonwebtoken@^9.0.0":
+ version "9.0.10"
+ resolved "https://registry.yarnpkg.com/@types/jsonwebtoken/-/jsonwebtoken-9.0.10.tgz#a7932a47177dcd4283b6146f3bd5c26d82647f09"
+ integrity sha512-asx5hIG9Qmf/1oStypjanR7iKTv0gXQ1Ov/jfrX6kS/EO0OFni8orbmGCn0672NHR3kXHwpAwR+B368ZGN/2rA==
+ dependencies:
+ "@types/ms" "*"
+ "@types/node" "*"
+
+"@types/keyv@^3.1.4":
+ version "3.1.4"
+ resolved "https://registry.yarnpkg.com/@types/keyv/-/keyv-3.1.4.tgz#3ccdb1c6751b0c7e52300bcdacd5bcbf8faa75b6"
+ integrity sha512-BQ5aZNSCpj7D6K2ksrRCTmKRLEpnPvWDiLPfoGyhZ++8YtiK9d/3DBKPJgry359X/P1PfruyYwvnvwFjuEiEIg==
+ dependencies:
+ "@types/node" "*"
+
"@types/mdast@^3.0.0":
version "3.0.10"
resolved "https://registry.yarnpkg.com/@types/mdast/-/mdast-3.0.10.tgz#4724244a82a4598884cbbe9bcfd73dff927ee8af"
@@ -1466,6 +2513,25 @@
resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.2.tgz#ee771e2ba4b3dc5b372935d549fd9617bf345b8c"
integrity sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==
+"@types/ms@*":
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/@types/ms/-/ms-2.1.0.tgz#052aa67a48eccc4309d7f0191b7e41434b90bb78"
+ integrity sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==
+
+"@types/mysql@2.15.26":
+ version "2.15.26"
+ resolved "https://registry.yarnpkg.com/@types/mysql/-/mysql-2.15.26.tgz#f0de1484b9e2354d587e7d2bd17a873cc8300836"
+ integrity sha512-DSLCOXhkvfS5WNNPbfn2KdICAmk8lLc+/PNvnPnF7gOdMZCxopXduqv0OQ13y/yA/zXTSikZZqVgybUxOEg6YQ==
+ dependencies:
+ "@types/node" "*"
+
+"@types/node@*":
+ version "26.1.1"
+ resolved "https://registry.yarnpkg.com/@types/node/-/node-26.1.1.tgz#bad758d601e97d6cf457d204ee76a35fce7bd119"
+ integrity sha512-nxAkRSVkN1Y0JC1W8ky/fTfkGsMmcrRsbx+3XoZE+rMOX71kLYTV7fLXpqud1GpbpP5TuffXFqfX7fH2GgZREw==
+ dependencies:
+ undici-types "~8.3.0"
+
"@types/normalize-package-data@^2.4.0":
version "2.4.1"
resolved "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz#d3357479a0fdfdd5907fe67e17e0a85c906e1301"
@@ -1476,6 +2542,31 @@
resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0"
integrity sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==
+"@types/pg-pool@2.0.6":
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/@types/pg-pool/-/pg-pool-2.0.6.tgz#1376d9dc5aec4bb2ec67ce28d7e9858227403c77"
+ integrity sha512-TaAUE5rq2VQYxab5Ts7WZhKNmuN78Q6PiFonTDdpbx8a1H0M1vhy3rhiMjl+e2iHmogyMw7jZF4FrE6eJUy5HQ==
+ dependencies:
+ "@types/pg" "*"
+
+"@types/pg@*":
+ version "8.20.0"
+ resolved "https://registry.yarnpkg.com/@types/pg/-/pg-8.20.0.tgz#8bd03d3ac6b19143a8de7d66a9d13da32cd91526"
+ integrity sha512-bEPFOaMAHTEP1EzpvHTbmwR8UsFyHSKsRisLIHVMXnpNefSbGA1bD6CVy+qKjGSqmZqNqBDV2azOBo8TgkcVow==
+ dependencies:
+ "@types/node" "*"
+ pg-protocol "*"
+ pg-types "^2.2.0"
+
+"@types/pg@8.6.1":
+ version "8.6.1"
+ resolved "https://registry.yarnpkg.com/@types/pg/-/pg-8.6.1.tgz#099450b8dc977e8197a44f5229cedef95c8747f9"
+ integrity sha512-1Kc4oAGzAl7uqUStZCDvaLFqZrW9qWSjXOmBfdgyBP5La7Us6Mg4GBvRlSoaZMhQF/zSj1C8CtKMBkoiT8eL8w==
+ dependencies:
+ "@types/node" "*"
+ pg-protocol "*"
+ pg-types "^2.2.0"
+
"@types/prop-types@*":
version "15.7.5"
resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.7.5.tgz#5f19d2b85a98e9558036f6a3cacc8819420f05cf"
@@ -1502,6 +2593,13 @@
"@types/scheduler" "*"
csstype "^3.0.2"
+"@types/responselike@^1.0.0":
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/@types/responselike/-/responselike-1.0.3.tgz#cc29706f0a397cfe6df89debfe4bf5cea159db50"
+ integrity sha512-H/+L+UkTV33uf49PH5pCAUBVPNj2nDBXTN+qS1dOwyyg24l3CcicicCA7ca+HMvJBZcFgl5r8e+RR6elsb4Lyw==
+ dependencies:
+ "@types/node" "*"
+
"@types/retry@^0.12.0":
version "0.12.1"
resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.1.tgz#d8f1c0d0dc23afad6dc16a9e993a0865774b4065"
@@ -1517,11 +2615,30 @@
resolved "https://registry.yarnpkg.com/@types/semver/-/semver-7.3.13.tgz#da4bfd73f49bd541d28920ab0e2bf0ee80f71c91"
integrity sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==
+"@types/shimmer@^1.2.0":
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/@types/shimmer/-/shimmer-1.2.0.tgz#9b706af96fa06416828842397a70dfbbf1c14ded"
+ integrity sha512-UE7oxhQLLd9gub6JKIAhDq06T0F6FnztwMNRvYgjeQSBeMc1ZG/tA47EwfduvkuQS8apbkM/lpLpWsaCeYsXVg==
+
+"@types/tedious@^4.0.14":
+ version "4.0.14"
+ resolved "https://registry.yarnpkg.com/@types/tedious/-/tedious-4.0.14.tgz#868118e7a67808258c05158e9cad89ca58a2aec1"
+ integrity sha512-KHPsfX/FoVbUGbyYvk1q9MMQHLPeRZhRJZdO45Q4YjvFkv4hMNghCWTvy7rdKessBsmtz4euWCWAB6/tVpI1Iw==
+ dependencies:
+ "@types/node" "*"
+
"@types/unist@*", "@types/unist@^2.0.0", "@types/unist@^2.0.2":
version "2.0.6"
resolved "https://registry.yarnpkg.com/@types/unist/-/unist-2.0.6.tgz#250a7b16c3b91f672a24552ec64678eeb1d3a08d"
integrity sha512-PBjIUxZHOuj0R15/xuwJYjFi+KZdNFrehocChv4g5hu6aFroHue8m0lBP0POdK2nKzbw0cgV1mws8+V/JAcEkQ==
+"@types/yauzl@^2.9.1":
+ version "2.10.3"
+ resolved "https://registry.yarnpkg.com/@types/yauzl/-/yauzl-2.10.3.tgz#e9b2808b4f109504a03cda958259876f61017999"
+ integrity sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==
+ dependencies:
+ "@types/node" "*"
+
"@typescript-eslint/eslint-plugin@^5.3.0":
version "5.34.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.34.0.tgz#d690f60e335596f38b01792e8f4b361d9bd0cb35"
@@ -1678,6 +2795,17 @@
resolved "https://registry.yarnpkg.com/@wordpress/browserslist-config/-/browserslist-config-5.10.0.tgz#0ea1bf1d072de2348513bdb883ca3f93fab01535"
integrity sha512-NYqAGHJno4/AqikS6pok4BuudUBZR/pd3fhSzQUVaCFgK2C5qzauaGU9C7J6sRJ1NDchJu05Ubu7gRkA8dIASA==
+"@wordpress/e2e-test-utils-playwright@^1.51.0":
+ version "1.51.0"
+ resolved "https://registry.yarnpkg.com/@wordpress/e2e-test-utils-playwright/-/e2e-test-utils-playwright-1.51.0.tgz#ffd35686a286c5fac77fceea5c319092d4fb6314"
+ integrity sha512-ekxMfC8MUTf0fKjAQd2IO4m/l1jXC9NznveRf7r8ntmx9nXqd9IHOiYJcH2SBo20C53nWdA4w8+Mbqedf0qzEw==
+ dependencies:
+ change-case "^4.1.2"
+ get-port "^5.1.1"
+ lighthouse "^12.2.2"
+ mime "^3.0.0"
+ web-vitals "^4.2.1"
+
"@wordpress/element@^5.4.0":
version "5.4.0"
resolved "https://registry.yarnpkg.com/@wordpress/element/-/element-5.4.0.tgz#7d80644d428a1756839b90eab271ccea6976cdf5"
@@ -1692,6 +2820,25 @@
react "^18.2.0"
react-dom "^18.2.0"
+"@wordpress/env@^11.11.0":
+ version "11.11.0"
+ resolved "https://registry.yarnpkg.com/@wordpress/env/-/env-11.11.0.tgz#b28e3853723772282f06435522a7c4b918747091"
+ integrity sha512-E4Riaan41uAcm70FFTD78Z1qtObQJwRlIyXdsr04X+mrg8XkBuHSqM1iSvgqnOpVzUuF9EYANYKF0CTm9tKW5w==
+ dependencies:
+ "@inquirer/prompts" "^7.2.0"
+ "@wp-playground/cli" "^3.0.48"
+ adm-zip "^0.5.9"
+ chalk "^4.1.1"
+ copy-dir "^1.3.0"
+ cross-spawn "^7.0.6"
+ docker-compose "^0.24.3"
+ got "^11.8.5"
+ js-yaml "^3.15.0"
+ ora "^4.0.2"
+ rimraf "^5.0.10"
+ simple-git "^3.24.0"
+ yargs "^17.3.0"
+
"@wordpress/escape-html@^2.27.0":
version "2.27.0"
resolved "https://registry.yarnpkg.com/@wordpress/escape-html/-/escape-html-2.27.0.tgz#424312af2327c5e59e068be29538cb0c7296d375"
@@ -1731,6 +2878,90 @@
resolved "https://registry.yarnpkg.com/@wordpress/warning/-/warning-2.27.0.tgz#19f5f4b85a121069b810ffaca05f2e9f8a3e24c5"
integrity sha512-s5JIGBNGTnYVsNN0zxCRxbi2Gs+q+tqSZNAznHQWkCeANaB22LeUQw7KL13T0ekFL6y1h2jNP9tWSU5/mnMTCg==
+"@wp-playground/blueprints@3.1.46":
+ version "3.1.46"
+ resolved "https://registry.yarnpkg.com/@wp-playground/blueprints/-/blueprints-3.1.46.tgz#46405621787158993054f78c006f95a15c16fef3"
+ integrity sha512-3X6AtHU8FyK4XtQKBN6lS3HKWykLl9TQ+t+iM3c6XYtQJatENoKmsZjv/JFgKEo6c+JP4ma8CsEdb6PqwJYEuw==
+ dependencies:
+ "@php-wasm/logger" "3.1.46"
+ "@php-wasm/progress" "3.1.46"
+ "@php-wasm/stream-compression" "3.1.46"
+ "@php-wasm/universal" "3.1.46"
+ "@php-wasm/util" "3.1.46"
+ "@php-wasm/web-service-worker" "3.1.46"
+ "@wp-playground/common" "3.1.46"
+ "@wp-playground/storage" "3.1.46"
+ "@wp-playground/wordpress" "3.1.46"
+ ajv "8.18.0"
+
+"@wp-playground/cli@^3.0.48":
+ version "3.1.46"
+ resolved "https://registry.yarnpkg.com/@wp-playground/cli/-/cli-3.1.46.tgz#f461b8a5b1fcda8a6511acde6c4c9f3d1b23e3e8"
+ integrity sha512-rn20w2Fp72wwnnOB+UyvvZ9zRx1dsPXC7KSMgJFEvoLNEVdp3bXcvyv8U5XZpeAPqkZB7nhMJDwOhcLR4SqVOA==
+ dependencies:
+ "@php-wasm/cli-util" "3.1.46"
+ "@php-wasm/logger" "3.1.46"
+ "@php-wasm/node" "3.1.46"
+ "@php-wasm/progress" "3.1.46"
+ "@php-wasm/universal" "3.1.46"
+ "@php-wasm/util" "3.1.46"
+ "@php-wasm/xdebug-bridge" "3.1.46"
+ "@wp-playground/blueprints" "3.1.46"
+ "@wp-playground/common" "3.1.46"
+ "@wp-playground/storage" "3.1.46"
+ "@wp-playground/tools" "3.1.46"
+ "@wp-playground/wordpress" "3.1.46"
+ express "4.22.2"
+ fs-extra "11.1.1"
+ tmp-promise "3.0.3"
+ wasm-feature-detect "1.8.0"
+ yargs "17.7.2"
+
+"@wp-playground/common@3.1.46":
+ version "3.1.46"
+ resolved "https://registry.yarnpkg.com/@wp-playground/common/-/common-3.1.46.tgz#b93cba79862f6c786dd2243eb58910d4bea44f68"
+ integrity sha512-MZ4ZSsh9GG7oHYhe38T+9uW6mGDvlwoH8IyJWNJN/PgH5SPPUHnP1CtmiMTl/p+sOf4ELf4A/REa16OtoJ83Qg==
+ dependencies:
+ "@php-wasm/universal" "3.1.46"
+ "@php-wasm/util" "3.1.46"
+
+"@wp-playground/storage@3.1.46":
+ version "3.1.46"
+ resolved "https://registry.yarnpkg.com/@wp-playground/storage/-/storage-3.1.46.tgz#92857f2a436b391ca244c49ffc16b4c5ad046c8c"
+ integrity sha512-NH9Tkt4WBpFtgZ6KrUkPJygsjzbbN1UVQ7IBawQba4dB2mjx2HNznUT3qyCPpQL6Vn8dO9YFHQ4fRLxvWbeCpw==
+ dependencies:
+ "@php-wasm/stream-compression" "3.1.46"
+ "@php-wasm/universal" "3.1.46"
+ "@php-wasm/util" "3.1.46"
+ "@zip.js/zip.js" "2.7.57"
+ isomorphic-git "1.37.6"
+ octokit "3.1.2"
+ pako "^1.0.10"
+ sha.js "2.4.12"
+
+"@wp-playground/tools@3.1.46":
+ version "3.1.46"
+ resolved "https://registry.yarnpkg.com/@wp-playground/tools/-/tools-3.1.46.tgz#1c20f3135db5e942850ba71a938cd6645a36fba7"
+ integrity sha512-rSov51gL1HnxgXkhw2TO9EIuldj3aaBYPGQ+MQsmF5adV5CSYdw+wq2ZJS/wpUiePyv6gvdZJTWaVqbjINFc2w==
+ dependencies:
+ "@wp-playground/blueprints" "3.1.46"
+
+"@wp-playground/wordpress@3.1.46":
+ version "3.1.46"
+ resolved "https://registry.yarnpkg.com/@wp-playground/wordpress/-/wordpress-3.1.46.tgz#e7289545e80f24fcfe11081e737c16cd62c693c9"
+ integrity sha512-QGzxrSmlm3ewiyU6NB2VDMgqZ5ZPuuSsPg4YkRnQrX489v0ohqCLp/jUe/+5nvXKGNg4KnR/37QrerEtLryXcw==
+ dependencies:
+ "@php-wasm/logger" "3.1.46"
+ "@php-wasm/universal" "3.1.46"
+ "@php-wasm/util" "3.1.46"
+ "@wp-playground/common" "3.1.46"
+ zstddec "^0.2.0"
+
+"@zip.js/zip.js@2.7.57":
+ version "2.7.57"
+ resolved "https://registry.yarnpkg.com/@zip.js/zip.js/-/zip.js-2.7.57.tgz#66a7ddc071f3e3aa789af50647c04a525685e1a4"
+ integrity sha512-BtonQ1/jDnGiMed6OkV6rZYW78gLmLswkHOzyMrMb+CAR7CZO8phOHO6c2qw6qb1g1betN7kwEHhhZk30dv+NA==
+
JSONStream@^1.0.4:
version "1.3.5"
resolved "https://registry.yarnpkg.com/JSONStream/-/JSONStream-1.3.5.tgz#3208c1f08d3a4d99261ab64f92302bc15e111ca0"
@@ -1744,6 +2975,36 @@ abbrev@1, abbrev@~1.1.1:
resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8"
integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==
+abort-controller@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392"
+ integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==
+ dependencies:
+ event-target-shim "^5.0.0"
+
+accepts@~1.3.8:
+ version "1.3.8"
+ resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e"
+ integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==
+ dependencies:
+ mime-types "~2.1.34"
+ negotiator "0.6.3"
+
+acorn-import-attributes@^1.9.5:
+ version "1.9.5"
+ resolved "https://registry.yarnpkg.com/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz#7eb1557b1ba05ef18b5ed0ec67591bfab04688ef"
+ integrity sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==
+
+acorn@^8.14.0:
+ version "8.17.0"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.17.0.tgz#1785adb84faf8d8add10369b93826fc2bd08f1fe"
+ integrity sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==
+
+adm-zip@^0.5.9:
+ version "0.5.18"
+ resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.5.18.tgz#283a05f2bf1e3fd315f0f31cde29b7a6e3c1619d"
+ integrity sha512-ufJnssQGbxzLNS1Ho9bCtX4rQKCCvoVuDLHoJyc3F9dOGDB4BkWs2Ci0kv53lqocAEQ/Cbi+I2XCsNYGqVYqng==
+
agent-base@6, agent-base@^6.0.2:
version "6.0.2"
resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-6.0.2.tgz#49fff58577cfee3f37176feab4c22e00f86d7f77"
@@ -1751,6 +3012,11 @@ agent-base@6, agent-base@^6.0.2:
dependencies:
debug "4"
+agent-base@^7.1.0, agent-base@^7.1.2:
+ version "7.1.4"
+ resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.4.tgz#e3cd76d4c548ee895d3c3fd8dc1f6c5b9032e7a8"
+ integrity sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==
+
agentkeepalive@^4.1.3:
version "4.2.0"
resolved "https://registry.yarnpkg.com/agentkeepalive/-/agentkeepalive-4.2.0.tgz#616ce94ccb41d1a39a45d203d8076fe98713062d"
@@ -1760,7 +3026,7 @@ agentkeepalive@^4.1.3:
depd "^1.1.2"
humanize-ms "^1.2.1"
-aggregate-error@^3.0.0:
+aggregate-error@^3.0.0, aggregate-error@^3.1.0:
version "3.1.0"
resolved "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.1.0.tgz#92670ff50f5359bdb7a3e0d40d0ec30c5737687a"
integrity sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==
@@ -1768,6 +3034,16 @@ aggregate-error@^3.0.0:
clean-stack "^2.0.0"
indent-string "^4.0.0"
+ajv@8.18.0:
+ version "8.18.0"
+ resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.18.0.tgz#8864186b6738d003eb3a933172bb3833e10cefbc"
+ integrity sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==
+ dependencies:
+ fast-deep-equal "^3.1.3"
+ fast-uri "^3.0.1"
+ json-schema-traverse "^1.0.0"
+ require-from-string "^2.0.2"
+
ajv@^6.12.3:
version "6.12.6"
resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4"
@@ -1783,6 +3059,11 @@ alphanum-sort@^1.0.0:
resolved "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz#97a1119649b211ad33691d9f9f486a8ec9fbe0a3"
integrity sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=
+ansi-colors@^4.1.1:
+ version "4.1.3"
+ resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.3.tgz#37611340eb2243e70cc604cad35d63270d48781b"
+ integrity sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==
+
ansi-escapes@^4.3.1:
version "4.3.2"
resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e"
@@ -1805,6 +3086,11 @@ ansi-regex@^5.0.1:
resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304"
integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==
+ansi-regex@^6.2.2:
+ version "6.2.2"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-6.2.2.tgz#60216eea464d864597ce2832000738a0589650c1"
+ integrity sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==
+
ansi-styles@^2.2.1:
version "2.2.1"
resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
@@ -1824,6 +3110,11 @@ ansi-styles@^4.0.0, ansi-styles@^4.1.0, ansi-styles@^4.3.0:
dependencies:
color-convert "^2.0.1"
+ansi-styles@^6.1.0:
+ version "6.2.3"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-6.2.3.tgz#c044d5dcc521a076413472597a1acb1f103c4041"
+ integrity sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==
+
ansicolors@~0.3.2:
version "0.3.2"
resolved "https://registry.yarnpkg.com/ansicolors/-/ansicolors-0.3.2.tgz#665597de86a9ffe3aa9bfbe6cae5c6ea426b4979"
@@ -1834,6 +3125,11 @@ ansistyles@~0.1.3:
resolved "https://registry.yarnpkg.com/ansistyles/-/ansistyles-0.1.3.tgz#5de60415bda071bb37127854c864f41b23254539"
integrity sha512-6QWEyvMgIXX0eO972y7YPBLSBsq7UWKFAoNNTLGaOJ9bstcEL9sCbcjf96dVfNDdUsRoGOK82vWFJlKApXds7g==
+anynum@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/anynum/-/anynum-1.0.1.tgz#2aac00e08dfad3726c1d462e60dbc2f831659a44"
+ integrity sha512-N6//FLET/tXYNM/F6ABca1oH6fWB+KlTt909Le28WMDBk8oaT4vY17DCrwg2MvmuqUKt3Ni4N5dGJ/EoBgcO6A==
+
aproba@^1.0.3:
version "1.2.0"
resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz#6802e6264efd18c790a1b0d517f0f2627bf2c94a"
@@ -1885,6 +3181,14 @@ aria-query@^4.2.2:
"@babel/runtime" "^7.10.2"
"@babel/runtime-corejs3" "^7.10.2"
+array-buffer-byte-length@^1.0.1, array-buffer-byte-length@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/array-buffer-byte-length/-/array-buffer-byte-length-1.0.2.tgz#384d12a37295aec3769ab022ad323a18a51ccf8b"
+ integrity sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==
+ dependencies:
+ call-bound "^1.0.3"
+ is-array-buffer "^3.0.5"
+
array-each@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/array-each/-/array-each-1.0.1.tgz#a794af0c05ab1752846ee753a1f211a05ba0c44f"
@@ -1895,6 +3199,11 @@ array-find-index@^1.0.1:
resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1"
integrity sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=
+array-flatten@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2"
+ integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==
+
array-ify@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/array-ify/-/array-ify-1.0.0.tgz#9e528762b4a9066ad163a6962a364418e9626ece"
@@ -1941,6 +3250,19 @@ array.prototype.flatmap@^1.3.0:
es-abstract "^1.19.2"
es-shim-unscopables "^1.0.0"
+arraybuffer.prototype.slice@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.4.tgz#9d760d84dbdd06d0cbf92c8849615a1a7ab3183c"
+ integrity sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==
+ dependencies:
+ array-buffer-byte-length "^1.0.1"
+ call-bind "^1.0.8"
+ define-properties "^1.2.1"
+ es-abstract "^1.23.5"
+ es-errors "^1.3.0"
+ get-intrinsic "^1.2.6"
+ is-array-buffer "^3.0.4"
+
arrify@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d"
@@ -1968,6 +3290,23 @@ ast-types-flow@^0.0.7:
resolved "https://registry.yarnpkg.com/ast-types-flow/-/ast-types-flow-0.0.7.tgz#f70b735c6bca1a5c9c22d982c3e39e7feba3bdad"
integrity sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==
+ast-types@^0.13.4:
+ version "0.13.4"
+ resolved "https://registry.yarnpkg.com/ast-types/-/ast-types-0.13.4.tgz#ee0d77b343263965ecc3fb62da16e7222b2b6782"
+ integrity sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==
+ dependencies:
+ tslib "^2.0.1"
+
+async-function@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/async-function/-/async-function-1.0.0.tgz#509c9fca60eaf85034c6829838188e4e4c8ffb2b"
+ integrity sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==
+
+async-lock@^1.4.1:
+ version "1.4.1"
+ resolved "https://registry.yarnpkg.com/async-lock/-/async-lock-1.4.1.tgz#56b8718915a9b68b10fce2f2a9a3dddf765ef53f"
+ integrity sha512-Az2ZTpuytrtqENulXwO3GGv1Bztugx6TT37NIo7imr/Qo0gsYiGtSdBa2B6fsXhTpVZDNfu1Qn3pk531e3q+nQ==
+
async@^2.6.0:
version "2.6.3"
resolved "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz#d72625e2344a3656e3a3ad4fa749fa83299d82ff"
@@ -1990,6 +3329,14 @@ at-least-node@^1.0.0:
resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2"
integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==
+atomically@^2.0.3:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/atomically/-/atomically-2.1.1.tgz#c54efb605ecc92e1e8b752638806d2c14c31e78d"
+ integrity sha512-P4w9o2dqARji6P7MHprklbfiArZAWvo07yW7qs3pdljb3BWr12FIB7W+p0zJiuiVsUpRO0iZn1kFFcpPegg0tQ==
+ dependencies:
+ stubborn-fs "^2.0.0"
+ when-exit "^2.1.4"
+
autoprefixer@^9.8.6:
version "9.8.8"
resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.8.8.tgz#fd4bd4595385fa6f06599de749a4d5f7a474957a"
@@ -2003,6 +3350,13 @@ autoprefixer@^9.8.6:
postcss "^7.0.32"
postcss-value-parser "^4.1.0"
+available-typed-arrays@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz#a5cc375d6a03c2efc87a553f3e0b1522def14846"
+ integrity sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==
+ dependencies:
+ possible-typed-array-names "^1.0.0"
+
aws-sign2@~0.7.0:
version "0.7.0"
resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8"
@@ -2013,6 +3367,11 @@ aws4@^1.8.0:
resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.11.0.tgz#d61f46d83b2519250e2784daf5b09479a8b41c59"
integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==
+axe-core@^4.10.3:
+ version "4.12.1"
+ resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.12.1.tgz#69fe2bf6dfc0b24973af91b1d8e945f79e1b7c44"
+ integrity sha512-s7iGf5GaVMxEG0ENN9x+xTr7GFZCb1ZP/1uATUpCEK2X78nDB3RwbtFCo9pGAf9ru+VwoQ464DkaLEeRM08wJA==
+
axe-core@^4.4.3:
version "4.4.3"
resolved "https://registry.yarnpkg.com/axe-core/-/axe-core-4.4.3.tgz#11c74d23d5013c0fa5d183796729bc3482bd2f6f"
@@ -2023,6 +3382,11 @@ axobject-query@^2.2.0:
resolved "https://registry.yarnpkg.com/axobject-query/-/axobject-query-2.2.0.tgz#943d47e10c0b704aa42275e20edf3722648989be"
integrity sha512-Td525n+iPOOyUQIeBfcASuG6uJsDOITl7Mds5gFyerkWiX7qhUTdYUBlSgNMyVqtSJqwpt1kXGLdUt6SykLMRA==
+b4a@^1.6.4, b4a@^1.8.1:
+ version "1.8.1"
+ resolved "https://registry.yarnpkg.com/b4a/-/b4a-1.8.1.tgz#7f16334ca80127aeb26064a28841acbf174840a4"
+ integrity sha512-aiqre1Nr0B/6DgE2N5vwTc+2/oQZ4Wh1t4NznYY4E00y8LCt6NqdRv81so00oo27D8MVKTpUa/MwUUtBLXCoDw==
+
babel-plugin-dynamic-import-node@^2.3.3:
version "2.3.3"
resolved "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz#84fda19c976ec5c6defef57f9427b3def66e17a3"
@@ -2064,6 +3428,53 @@ balanced-match@^1.0.0:
resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
+bare-events@^2.5.4, bare-events@^2.7.0:
+ version "2.9.1"
+ resolved "https://registry.yarnpkg.com/bare-events/-/bare-events-2.9.1.tgz#5c86616966343bcb03a1b3155feab253eadbf349"
+ integrity sha512-Z0oHEHAFDZkffN8Qc39zNZjQlMDkPJRyyyZieU1VH7u8c5S+qHZ2S8ixdKIAxEjfHO7FJxXmJWgteOghVanIsg==
+
+bare-fs@^4.0.1, bare-fs@^4.5.5:
+ version "4.7.4"
+ resolved "https://registry.yarnpkg.com/bare-fs/-/bare-fs-4.7.4.tgz#435087d42477f067eddf3c2c746e74e9db6177bc"
+ integrity sha512-y1kC+ffIx/tPLdTE693uNjHfzTfr+ravR5tvWlMXe25nELbkqV400S71qHDwbkAQ1FVEZobB1NFRzFbCCcyBCQ==
+ dependencies:
+ bare-events "^2.5.4"
+ bare-path "^3.0.0"
+ bare-stream "^2.6.4"
+ bare-url "^2.2.2"
+ fast-fifo "^1.3.2"
+
+bare-path@^3.0.0:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/bare-path/-/bare-path-3.1.1.tgz#d4a207c088609b4663a7556a46a97342398bf7e2"
+ integrity sha512-JprUlveX3QjApC1cTpsUOiscADftCGVWkzitbHsRqv84hzYwYHw2mbluddsq5TvI8mH/8Ov1f4BiMAdcB0oYnQ==
+
+bare-stream@^2.6.4:
+ version "2.13.3"
+ resolved "https://registry.yarnpkg.com/bare-stream/-/bare-stream-2.13.3.tgz#f6186c7cbb4bbf53a4560f35e48b16373ba51ce6"
+ integrity sha512-Kc+brLqvEqGkjyfiwJmImAOqLZL7OsoLKuavx+hJjgVV3nLTOjloJyPMFxjUPerGGHrNH0fLU06jjykMLWrERQ==
+ dependencies:
+ b4a "^1.8.1"
+ streamx "^2.25.0"
+ teex "^1.0.1"
+
+bare-url@^2.2.2:
+ version "2.4.6"
+ resolved "https://registry.yarnpkg.com/bare-url/-/bare-url-2.4.6.tgz#628f223160e03e7a3a0a5cd761f61c6444d1729b"
+ integrity sha512-iQxPClE07hETVpbRoX7JXX3v/ZQViCxe/SYCxylRLzdEx1xJAufPptfiOqR8tqiCtmbtMDANKWszzjLu1PMAZQ==
+ dependencies:
+ bare-path "^3.0.0"
+
+base64-js@^1.3.1:
+ version "1.5.1"
+ resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a"
+ integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
+
+basic-ftp@^5.0.2:
+ version "5.3.1"
+ resolved "https://registry.yarnpkg.com/basic-ftp/-/basic-ftp-5.3.1.tgz#3148ee9af43c0522514a4f973fecb1d3cbb6d71e"
+ integrity sha512-bopVNp6ugyA150DDuZfPFdt1KZ5a94ZDiwX4hMgZDzF+GttD80lEy8kj98kbyhLXnPvhtIo93mdnLIjpCAeeOw==
+
bcrypt-pbkdf@^1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz#a4301d389b6a43f9b67ff3ca11a3f6637e360e9e"
@@ -2093,6 +3504,24 @@ binary-extensions@^2.2.0:
resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.2.0.tgz#75f502eeaf9ffde42fc98829645be4ea76bd9e2d"
integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==
+body-parser@~1.20.5:
+ version "1.20.6"
+ resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.6.tgz#60c789c78e0992d906da0a29d71ae01d15c1ed76"
+ integrity sha512-p5tAzS57i5MV9fZFDj9LeIiTZEufbSe2eDozP+ElheSUq1m74CRq1jI4mYNDdVs9vQztXFLuk/Gd6BWTdwRJ5g==
+ dependencies:
+ bytes "~3.1.2"
+ content-type "~1.0.5"
+ debug "2.6.9"
+ depd "2.0.0"
+ destroy "~1.2.0"
+ http-errors "~2.0.1"
+ iconv-lite "~0.4.24"
+ on-finished "~2.4.1"
+ qs "~6.15.1"
+ raw-body "~2.5.3"
+ type-is "~1.6.18"
+ unpipe "~1.0.0"
+
body@^5.1.0:
version "5.1.0"
resolved "https://registry.yarnpkg.com/body/-/body-5.1.0.tgz#e4ba0ce410a46936323367609ecb4e6553125069"
@@ -2108,7 +3537,7 @@ boolbase@^1.0.0, boolbase@~1.0.0:
resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e"
integrity sha1-aN/1++YMUes3cl6p4+0xDcwed24=
-bottleneck@^2.18.1:
+bottleneck@^2.15.3, bottleneck@^2.18.1:
version "2.19.5"
resolved "https://registry.yarnpkg.com/bottleneck/-/bottleneck-2.19.5.tgz#5df0b90f59fd47656ebe63c78a98419205cadd91"
integrity sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==
@@ -2121,6 +3550,13 @@ brace-expansion@^1.1.7:
balanced-match "^1.0.0"
concat-map "0.0.1"
+brace-expansion@^2.0.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.1.2.tgz#0bba2271feb7d458b0d31ad13625aaa4754431e2"
+ integrity sha512-w5JZcKgdhDOgOwm8H+KgbosopHMuGcl6qbulwjtz3SM7I7P3yW1eAjzMPLrIE+NQ9vjgANKHWeMHnrT0OXW1oA==
+ dependencies:
+ balanced-match "^1.0.0"
+
braces@^3.0.1:
version "3.0.2"
resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107"
@@ -2156,11 +3592,34 @@ browserslist@^4.17.6, browserslist@^4.20.2, browserslist@^4.21.3:
node-releases "^2.0.6"
update-browserslist-db "^1.0.5"
+btoa-lite@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/btoa-lite/-/btoa-lite-1.0.0.tgz#337766da15801210fdd956c22e9c6891ab9d0337"
+ integrity sha512-gvW7InbIyF8AicrqWoptdW08pUxuhq8BEgowNajy9RhiE86fmGAGl+bLKo6oB8QP0CkqHLowfN0oJdKC/J6LbA==
+
+buffer-crc32@~0.2.3:
+ version "0.2.13"
+ resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242"
+ integrity sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==
+
+buffer-equal-constant-time@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz#f8e71132f7ffe6e01a5c9697a4c6f3e48d5cc819"
+ integrity sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==
+
buffer-from@^1.0.0:
version "1.1.2"
resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5"
integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==
+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"
+
builtins@^1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/builtins/-/builtins-1.0.3.tgz#cb94faeb61c8696451db36534e1422f94f0aee88"
@@ -2171,6 +3630,11 @@ bytes@1:
resolved "https://registry.yarnpkg.com/bytes/-/bytes-1.0.0.tgz#3569ede8ba34315fab99c3e92cb04c7220de1fa8"
integrity sha1-NWnt6Lo0MV+rmcPpLLBMciDeH6g=
+bytes@~3.1.2:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5"
+ integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==
+
cacache@^15.0.3, cacache@^15.0.5, cacache@^15.2.0, cacache@^15.3.0:
version "15.3.0"
resolved "https://registry.yarnpkg.com/cacache/-/cacache-15.3.0.tgz#dc85380fb2f556fe3dda4c719bfa0ec875a7f1eb"
@@ -2195,6 +3659,32 @@ cacache@^15.0.3, cacache@^15.0.5, cacache@^15.2.0, cacache@^15.3.0:
tar "^6.0.2"
unique-filename "^1.1.1"
+cacheable-lookup@^5.0.3:
+ version "5.0.4"
+ resolved "https://registry.yarnpkg.com/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz#5a6b865b2c44357be3d5ebc2a467b032719a7005"
+ integrity sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==
+
+cacheable-request@^7.0.2:
+ version "7.0.4"
+ resolved "https://registry.yarnpkg.com/cacheable-request/-/cacheable-request-7.0.4.tgz#7a33ebf08613178b403635be7b899d3e69bbe817"
+ integrity sha512-v+p6ongsrp0yTGbJXjgxPow2+DL93DASP4kXCDKb8/bwRtt9OEF3whggkkDkGNzgcWy2XaF4a8nZglC7uElscg==
+ dependencies:
+ clone-response "^1.0.2"
+ get-stream "^5.1.0"
+ http-cache-semantics "^4.0.0"
+ keyv "^4.0.0"
+ lowercase-keys "^2.0.0"
+ normalize-url "^6.0.1"
+ responselike "^2.0.0"
+
+call-bind-apply-helpers@^1.0.1, call-bind-apply-helpers@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz#4b5428c222be985d79c3d82657479dbe0b59b2d6"
+ integrity sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==
+ dependencies:
+ es-errors "^1.3.0"
+ function-bind "^1.1.2"
+
call-bind@^1.0.0, call-bind@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.2.tgz#b1d4e89e688119c3c9a903ad30abb2f6a919be3c"
@@ -2203,6 +3693,24 @@ call-bind@^1.0.0, call-bind@^1.0.2:
function-bind "^1.1.1"
get-intrinsic "^1.0.2"
+call-bind@^1.0.7, call-bind@^1.0.8, call-bind@^1.0.9:
+ version "1.0.9"
+ resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.9.tgz#39a644700c80bc7d0ca9102fc6d1d43b2fd7eee7"
+ integrity sha512-a/hy+pNsFUTR+Iz8TCJvXudKVLAnz/DyeSUo10I5yvFDQJBFU2s9uqQpoSrJlroHUKoKqzg+epxyP9lqFdzfBQ==
+ dependencies:
+ call-bind-apply-helpers "^1.0.2"
+ es-define-property "^1.0.1"
+ get-intrinsic "^1.3.0"
+ set-function-length "^1.2.2"
+
+call-bound@^1.0.2, call-bound@^1.0.3, call-bound@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/call-bound/-/call-bound-1.0.4.tgz#238de935d2a2a692928c538c7ccfa91067fd062a"
+ integrity sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==
+ dependencies:
+ call-bind-apply-helpers "^1.0.2"
+ get-intrinsic "^1.3.0"
+
caller-callsite@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz#847e0fce0a223750a9a027c54b33731ad3154134"
@@ -2329,7 +3837,15 @@ chalk@^2.0.0, chalk@^2.1.0, chalk@^2.3.2, chalk@^2.4.1, chalk@^2.4.2:
escape-string-regexp "^1.0.5"
supports-color "^5.3.0"
-chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2, chalk@~4.1.0:
+chalk@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz#3f73c2bf526591f574cc492c51e2456349f844e4"
+ 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.1, chalk@^4.1.2, chalk@~4.1.0:
version "4.1.2"
resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01"
integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==
@@ -2370,11 +3886,34 @@ character-reference-invalid@^1.0.0:
resolved "https://registry.yarnpkg.com/character-reference-invalid/-/character-reference-invalid-1.1.4.tgz#083329cda0eae272ab3dbbf37e9a382c13af1560"
integrity sha512-mKKUkUbhPpQlCOfIuZkvSEgktjPFIsZKRRbC6KWVEMvlzblj3i3asQv5ODsrwt0N3pHAEvjP8KTQPHkp0+6jOg==
+chardet@^2.1.1:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/chardet/-/chardet-2.2.0.tgz#005d664f2cbd4961888d2e2c32c5a69e59d8eec4"
+ integrity sha512-rddelWYNPRrXq6PtNEN2S3f6t9ILzvqaN5pVgi4kqt9jHQaXIial9PznB5iSPVlQSLNaaH22ItWz3EJtQ10+OA==
+
chownr@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/chownr/-/chownr-2.0.0.tgz#15bfbe53d2eab4cf70f18a8cd68ebe5b3cb1dece"
integrity sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==
+chrome-launcher@^1.2.0:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/chrome-launcher/-/chrome-launcher-1.2.1.tgz#a84877c123192bdadb40dc274b74caf164e98032"
+ integrity sha512-qmFR5PLMzHyuNJHwOloHPAHhbaNglkfeV/xDtt5b7xiFFyU1I+AZZX0PYseMuhenJSSirgxELYIbswcoc+5H4A==
+ dependencies:
+ "@types/node" "*"
+ escape-string-regexp "^4.0.0"
+ is-wsl "^2.2.0"
+ lighthouse-logger "^2.0.1"
+
+chromium-bidi@14.0.0:
+ version "14.0.0"
+ resolved "https://registry.yarnpkg.com/chromium-bidi/-/chromium-bidi-14.0.0.tgz#15a12ab083ae519a49a724e94994ca0a9ced9c8e"
+ integrity sha512-9gYlLtS6tStdRWzrtXaTMnqcM4dudNegMXJxkR0I/CXObHalYeYcAMPrL19eroNZHtJ8DQmu1E+ZNOYu/IXMXw==
+ dependencies:
+ mitt "^3.0.1"
+ zod "^3.24.1"
+
cidr-regex@^3.1.1:
version "3.1.1"
resolved "https://registry.yarnpkg.com/cidr-regex/-/cidr-regex-3.1.1.tgz#ba1972c57c66f61875f18fd7dd487469770b571d"
@@ -2382,6 +3921,16 @@ cidr-regex@^3.1.1:
dependencies:
ip-regex "^4.1.0"
+cjs-module-lexer@^1.2.2:
+ version "1.4.3"
+ resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.4.3.tgz#0f79731eb8cfe1ec72acd4066efac9d61991b00d"
+ integrity sha512-9z8TZaGM1pfswYeXrUpzPrkx8UnWYdhJclsiYMm6x/w5+nN+8Tf/LnAgfLGQCm59qAOxU8WwHEq2vNwF6i4j+Q==
+
+clean-git-ref@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/clean-git-ref/-/clean-git-ref-2.0.1.tgz#dcc0ca093b90e527e67adb5a5e55b1af6816dcd9"
+ integrity sha512-bLSptAy2P0s6hU4PzuIMKmMJJSE6gLXGH1cntDu7bWJUksvuM+7ReOK61mozULErYvP6a15rnYl0zFDef+pyPw==
+
clean-stack@^2.0.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz#ee8472dbb129e727b31e8a10a427dee9dfe4008b"
@@ -2395,6 +3944,18 @@ cli-columns@^3.1.2:
string-width "^2.0.0"
strip-ansi "^3.0.1"
+cli-cursor@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307"
+ integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==
+ dependencies:
+ restore-cursor "^3.1.0"
+
+cli-spinners@^2.2.0:
+ version "2.9.2"
+ resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.2.tgz#1773a8f4b9c4d6ac31563df53b3fc1d79462fe41"
+ integrity sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==
+
cli-table3@^0.6.0:
version "0.6.1"
resolved "https://registry.yarnpkg.com/cli-table3/-/cli-table3-0.6.1.tgz#36ce9b7af4847f288d3cdd081fbd09bf7bd237b8"
@@ -2404,6 +3965,11 @@ cli-table3@^0.6.0:
optionalDependencies:
colors "1.4.0"
+cli-width@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-4.1.0.tgz#42daac41d3c254ef38ad8ac037672130173691c5"
+ integrity sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==
+
cli@~1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/cli/-/cli-1.0.1.tgz#22817534f24bfa4950c34d532d48ecbc621b8c14"
@@ -2421,6 +3987,22 @@ cliui@^7.0.2:
strip-ansi "^6.0.0"
wrap-ansi "^7.0.0"
+cliui@^8.0.1:
+ version "8.0.1"
+ resolved "https://registry.yarnpkg.com/cliui/-/cliui-8.0.1.tgz#0c04b075db02cbfe60dc8e6cf2f5486b1a3608aa"
+ 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-response@^1.0.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/clone-response/-/clone-response-1.0.3.tgz#af2032aa47816399cf5f0a1d0db902f517abb8c3"
+ integrity sha512-ROoL94jJH2dUVML2Y/5PEDNaSHgeOdSDicUyS7izcF63G6sTc/FTjLub4b8Il9S8S0beOfYt0TaA5qvFK+w0wA==
+ dependencies:
+ mimic-response "^1.0.0"
+
clone@^1.0.2:
version "1.0.4"
resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e"
@@ -2563,6 +4145,16 @@ concat-stream@^1.4.1:
readable-stream "^2.2.2"
typedarray "^0.0.6"
+configstore@^7.0.0:
+ version "7.1.0"
+ resolved "https://registry.yarnpkg.com/configstore/-/configstore-7.1.0.tgz#45ba833d2d3ba0b8b7f0cff5c0544a45374af76b"
+ integrity sha512-N4oog6YJWbR9kGyXvS7jEykLDXIE2C0ILYqNBZBp9iwiJpoCBWYsuAdW6PPFn6w06jjnC+3JstVvWHO4cZqvRg==
+ dependencies:
+ atomically "^2.0.3"
+ dot-prop "^9.0.0"
+ graceful-fs "^4.2.11"
+ xdg-basedir "^5.1.0"
+
console-browserify@1.1.x:
version "1.1.0"
resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10"
@@ -2584,6 +4176,18 @@ constant-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.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe"
+ integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==
+ dependencies:
+ safe-buffer "5.2.1"
+
+content-type@~1.0.4, content-type@~1.0.5:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/content-type/-/content-type-1.0.5.tgz#8b773162656d1d1086784c8f23a54ce6d73d7918"
+ integrity sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==
+
continuable-cache@^0.3.1:
version "0.3.1"
resolved "https://registry.yarnpkg.com/continuable-cache/-/continuable-cache-0.3.1.tgz#bd727a7faed77e71ff3985ac93351a912733ad0f"
@@ -2648,6 +4252,21 @@ convert-source-map@^1.7.0:
dependencies:
safe-buffer "~5.1.1"
+cookie-signature@~1.0.6:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.7.tgz#ab5dd7ab757c54e60f37ef6550f481c426d10454"
+ integrity sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==
+
+cookie@~0.7.1:
+ version "0.7.2"
+ resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.7.2.tgz#556369c472a2ba910f2979891b526b3436237ed7"
+ integrity sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==
+
+copy-dir@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/copy-dir/-/copy-dir-1.3.0.tgz#8c65130e11d8313a6ac2c0578e4c6c6f70b456ba"
+ integrity sha512-Q4+qBFnN4bwGwvtXXzbp4P/4iNk0MaiGAzvQ8OiMtlLjkIKjmNN689uVzShSM0908q7GoFHXIPx4zi75ocoaHw==
+
core-js-compat@^3.21.0, core-js-compat@^3.22.1:
version "3.24.1"
resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.24.1.tgz#d1af84a17e18dfdd401ee39da9996f9a7ba887de"
@@ -2697,7 +4316,23 @@ cosmiconfig@^7.0.0:
path-type "^4.0.0"
yaml "^1.10.0"
-cross-spawn@^7.0.0, cross-spawn@^7.0.3:
+crc-32@^1.2.0:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/crc-32/-/crc-32-1.2.2.tgz#3cad35a934b8bf71f25ca524b6da51fb7eace2ff"
+ integrity sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==
+
+cross-spawn@^6.0.5:
+ version "6.0.6"
+ resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.6.tgz#30d0efa0712ddb7eb5a76e1e8721bffafa6b5d57"
+ integrity sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==
+ dependencies:
+ nice-try "^1.0.4"
+ path-key "^2.0.1"
+ semver "^5.5.0"
+ shebang-command "^1.2.0"
+ which "^1.2.9"
+
+cross-spawn@^7.0.0, cross-spawn@^7.0.3, cross-spawn@^7.0.6:
version "7.0.6"
resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f"
integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==
@@ -2711,6 +4346,11 @@ crypto-random-string@^2.0.0:
resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-2.0.0.tgz#ef2a7a966ec11083388369baa02ebead229b30d5"
integrity sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==
+csp_evaluator@1.1.5:
+ version "1.1.5"
+ resolved "https://registry.yarnpkg.com/csp_evaluator/-/csp_evaluator-1.1.5.tgz#33788d695b7b539b17d5b6eba494431ce931faff"
+ integrity sha512-EL/iN9etCTzw/fBnp0/uj0f5BOOGvZut2mzsiiBZ/FdT6gFQCKRO/tmcKOxn5drWZ2Ndm/xBb1SI4zwWbGtmIw==
+
css-color-names@0.0.4, css-color-names@^0.0.4:
version "0.0.4"
resolved "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz#808adc2e79cf84738069b646cb20ec27beb629e0"
@@ -2864,6 +4504,38 @@ dashdash@^1.12.0:
dependencies:
assert-plus "^1.0.0"
+data-uri-to-buffer@^6.0.2:
+ version "6.0.2"
+ resolved "https://registry.yarnpkg.com/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz#8a58bb67384b261a38ef18bea1810cb01badd28b"
+ integrity sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==
+
+data-view-buffer@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/data-view-buffer/-/data-view-buffer-1.0.2.tgz#211a03ba95ecaf7798a8c7198d79536211f88570"
+ integrity sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==
+ dependencies:
+ call-bound "^1.0.3"
+ es-errors "^1.3.0"
+ is-data-view "^1.0.2"
+
+data-view-byte-length@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/data-view-byte-length/-/data-view-byte-length-1.0.2.tgz#9e80f7ca52453ce3e93d25a35318767ea7704735"
+ integrity sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==
+ dependencies:
+ call-bound "^1.0.3"
+ es-errors "^1.3.0"
+ is-data-view "^1.0.2"
+
+data-view-byte-offset@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/data-view-byte-offset/-/data-view-byte-offset-1.0.1.tgz#068307f9b71ab76dbbe10291389e020856606191"
+ integrity sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==
+ dependencies:
+ call-bound "^1.0.2"
+ es-errors "^1.3.0"
+ is-data-view "^1.0.1"
+
date-now@^0.1.4:
version "0.1.4"
resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b"
@@ -2881,6 +4553,13 @@ dateformat@^3.0.0, dateformat@~3.0.3:
resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae"
integrity sha512-jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==
+debug@2.6.9, debug@^2.6.9:
+ version "2.6.9"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
+ integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
+ dependencies:
+ ms "2.0.0"
+
debug@4, debug@^4.0.0, debug@^4.1.0, debug@^4.3.1:
version "4.3.3"
resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664"
@@ -2888,13 +4567,6 @@ debug@4, debug@^4.0.0, debug@^4.1.0, debug@^4.3.1:
dependencies:
ms "2.1.2"
-debug@^2.6.9:
- version "2.6.9"
- resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f"
- integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
- dependencies:
- ms "2.0.0"
-
debug@^3.1.0, debug@^3.2.7:
version "3.2.7"
resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.7.tgz#72580b7e9145fb39b6676f9c5e5fb100b934179a"
@@ -2909,6 +4581,13 @@ debug@^4.1.1, debug@^4.3.4:
dependencies:
ms "2.1.2"
+debug@^4.3.5, debug@^4.4.0, debug@^4.4.1, debug@^4.4.3:
+ version "4.4.3"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.3.tgz#c6ae432d9bd9662582fce08709b038c58e9e3d6a"
+ integrity sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==
+ dependencies:
+ ms "^2.1.3"
+
debuglog@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/debuglog/-/debuglog-1.0.1.tgz#aa24ffb9ac3df9a2351837cfb2d279360cd78492"
@@ -2927,6 +4606,18 @@ decamelize@^1.1.0, decamelize@^1.1.2:
resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290"
integrity sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=
+decimal.js@^10.4.3:
+ version "10.6.0"
+ resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.6.0.tgz#e649a43e3ab953a72192ff5983865e509f37ed9a"
+ integrity sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==
+
+decompress-response@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc"
+ integrity sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==
+ dependencies:
+ mimic-response "^3.1.0"
+
deep-extend@^0.6.0:
version "0.6.0"
resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac"
@@ -2939,6 +4630,25 @@ defaults@^1.0.3:
dependencies:
clone "^1.0.2"
+defer-to-connect@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/defer-to-connect/-/defer-to-connect-2.0.1.tgz#8016bdb4143e4632b77a3449c6236277de520587"
+ integrity sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==
+
+define-data-property@^1.0.1, define-data-property@^1.1.4:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/define-data-property/-/define-data-property-1.1.4.tgz#894dc141bb7d3060ae4366f6a0107e68fbe48c5e"
+ integrity sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==
+ dependencies:
+ es-define-property "^1.0.0"
+ es-errors "^1.3.0"
+ gopd "^1.0.1"
+
+define-lazy-prop@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f"
+ integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==
+
define-properties@^1.1.3:
version "1.1.3"
resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz#cf88da6cbee26fe6db7094f61d870cbd84cee9f1"
@@ -2954,6 +4664,24 @@ define-properties@^1.1.4:
has-property-descriptors "^1.0.0"
object-keys "^1.1.1"
+define-properties@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/define-properties/-/define-properties-1.2.1.tgz#10781cc616eb951a80a034bafcaa7377f6af2b6c"
+ integrity sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==
+ dependencies:
+ define-data-property "^1.0.1"
+ has-property-descriptors "^1.0.0"
+ object-keys "^1.1.1"
+
+degenerator@^5.0.0:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/degenerator/-/degenerator-5.0.1.tgz#9403bf297c6dad9a1ece409b37db27954f91f2f5"
+ integrity sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==
+ dependencies:
+ ast-types "^0.13.4"
+ escodegen "^2.1.0"
+ esprima "^4.0.1"
+
del@^6.0.0:
version "6.0.0"
resolved "https://registry.yarnpkg.com/del/-/del-6.0.0.tgz#0b40d0332cea743f1614f818be4feb717714c952"
@@ -2978,6 +4706,11 @@ delegates@^1.0.0:
resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a"
integrity sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=
+depd@2.0.0, depd@~2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df"
+ integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==
+
depd@^1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9"
@@ -2988,11 +4721,26 @@ deprecation@^2.0.0, deprecation@^2.3.1:
resolved "https://registry.yarnpkg.com/deprecation/-/deprecation-2.3.1.tgz#6368cbdb40abf3373b525ac87e4a260c3a700919"
integrity sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==
+destroy@1.2.0, destroy@~1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015"
+ integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==
+
detect-file@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7"
integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=
+devtools-protocol@0.0.1507524:
+ version "0.0.1507524"
+ resolved "https://registry.yarnpkg.com/devtools-protocol/-/devtools-protocol-0.0.1507524.tgz#8c9156a5765ee6c0a76a7ed40c0cc114ee796833"
+ integrity sha512-OjaNE7qpk6GRTXtqQjAE5bGx6+c4F1zZH0YXtpZQLM92HNXx4zMAaqlKhP4T52DosG6hDW8gPMNhGOF8xbwk/w==
+
+devtools-protocol@0.0.1608973:
+ version "0.0.1608973"
+ resolved "https://registry.yarnpkg.com/devtools-protocol/-/devtools-protocol-0.0.1608973.tgz#56e0a2a999b06d416ee928ca06aeba95a5880515"
+ integrity sha512-Tpm17fxYzt+J7VrGdc1k8YdRqS3YV7se/M6KeemEqvUbq/n7At1rWVuXMxQgpWkdwSdIEKYbU//Bve+Shm4YNQ==
+
dezalgo@^1.0.0:
version "1.0.3"
resolved "https://registry.yarnpkg.com/dezalgo/-/dezalgo-1.0.3.tgz#7f742de066fc748bc8db820569dddce49bf0d456"
@@ -3001,6 +4749,11 @@ dezalgo@^1.0.0:
asap "^2.0.0"
wrappy "1"
+diff3@0.0.3:
+ version "0.0.3"
+ resolved "https://registry.yarnpkg.com/diff3/-/diff3-0.0.3.tgz#d4e5c3a4cdf4e5fe1211ab42e693fcb4321580fc"
+ integrity sha512-iSq8ngPOt0K53A6eVr4d5Kn6GNrM2nQZtC740pzIriHtn4pOQ2lyzEXQMBeVcWERN0ye7fhBsk9PbLLQOnUx/g==
+
diff@^3.0.0:
version "3.5.0"
resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12"
@@ -3018,6 +4771,13 @@ dir-glob@^3.0.0, dir-glob@^3.0.1:
dependencies:
path-type "^4.0.0"
+docker-compose@^0.24.3:
+ version "0.24.8"
+ resolved "https://registry.yarnpkg.com/docker-compose/-/docker-compose-0.24.8.tgz#6c125e6b9e04cf68ced47e2596ef2bb93ee9694e"
+ integrity sha512-plizRs/Vf15H+GCVxq2EUvyPK7ei9b/cVesHvjnX4xaXjM9spHe2Ytq0BitndFgvTJ3E3NljPNUEl7BAN43iZw==
+ dependencies:
+ yaml "^2.2.2"
+
doctrine@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d"
@@ -3088,6 +4848,22 @@ dot-prop@^5.1.0, dot-prop@^5.2.0:
dependencies:
is-obj "^2.0.0"
+dot-prop@^9.0.0:
+ version "9.0.0"
+ resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-9.0.0.tgz#bae5982fe6dc6b8fddb92efef4f2ddff26779e92"
+ integrity sha512-1gxPBJpI/pcjQhKgIU91II6Wkay+dLcN3M6rf2uwP8hRur3HtQXjVrdAK3sjC0piaEuxzMwjXChcETiJl47lAQ==
+ dependencies:
+ type-fest "^4.18.2"
+
+dunder-proto@^1.0.0, dunder-proto@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/dunder-proto/-/dunder-proto-1.0.1.tgz#d7ae667e1dc83482f8b70fd0f6eefc50da30f58a"
+ integrity sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==
+ dependencies:
+ call-bind-apply-helpers "^1.0.1"
+ es-errors "^1.3.0"
+ gopd "^1.2.0"
+
duplexer2@~0.1.0:
version "0.1.4"
resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.1.4.tgz#8b12dab878c0d69e3e7891051662a32fc6bddcc1"
@@ -3095,6 +4871,11 @@ duplexer2@~0.1.0:
dependencies:
readable-stream "^2.0.2"
+eastasianwidth@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/eastasianwidth/-/eastasianwidth-0.2.0.tgz#696ce2ec0aa0e6ea93a397ffcf24aa7840c827cb"
+ integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==
+
ecc-jsbn@~0.1.1:
version "0.1.2"
resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz#3a83a904e54353287874c564b7549386849a98c9"
@@ -3103,6 +4884,18 @@ ecc-jsbn@~0.1.1:
jsbn "~0.1.0"
safer-buffer "^2.1.0"
+ecdsa-sig-formatter@1.0.11:
+ version "1.0.11"
+ resolved "https://registry.yarnpkg.com/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz#ae0f0fa2d85045ef14a817daa3ce9acd0489e5bf"
+ integrity sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==
+ dependencies:
+ safe-buffer "^5.0.1"
+
+ee-first@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
+ integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==
+
electron-to-chromium@^1.4.17:
version "1.4.53"
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.53.tgz#5d80a91c399b44952ef485857fb5b9d4387d2e60"
@@ -3123,6 +4916,11 @@ emoji-regex@^9.2.2:
resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-9.2.2.tgz#840c8803b0d8047f4ff0cf963176b32d4ef3ed72"
integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==
+encodeurl@~2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-2.0.0.tgz#7b8ea898077d7e409d3ac45474ea38eaf0857a58"
+ integrity sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==
+
encoding@^0.1.12:
version "0.1.13"
resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9"
@@ -3137,6 +4935,14 @@ end-of-stream@^1.1.0:
dependencies:
once "^1.4.0"
+enquirer@^2.3.6:
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/enquirer/-/enquirer-2.4.1.tgz#93334b3fbd74fc7097b224ab4a8fb7e40bf4ae56"
+ integrity sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==
+ dependencies:
+ ansi-colors "^4.1.1"
+ strip-ansi "^6.0.1"
+
entities@1.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/entities/-/entities-1.0.0.tgz#b2987aa3821347fcde642b24fdfc9e4fb712bf26"
@@ -3180,6 +4986,16 @@ error@^7.0.0:
dependencies:
string-template "~0.2.1"
+es-abstract-get@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/es-abstract-get/-/es-abstract-get-1.0.0.tgz#1eae87101f42bedeb6a740e8c5051271aef89088"
+ integrity sha512-6PMWXpdhshVvFp+FoWYs1EvG1Nj0tvk0dZM+XcK0xMEM1czRVcP6ohqPWHy6qPagSpC8j4+p89WXlT+xXJs/fg==
+ dependencies:
+ es-errors "^1.3.0"
+ es-object-atoms "^1.1.2"
+ is-callable "^1.2.7"
+ object-inspect "^1.13.4"
+
es-abstract@^1.17.2, es-abstract@^1.19.1:
version "1.19.1"
resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.19.1.tgz#d4885796876916959de78edaa0df456627115ec3"
@@ -3235,6 +5051,93 @@ es-abstract@^1.19.0, es-abstract@^1.19.2, es-abstract@^1.19.5:
string.prototype.trimstart "^1.0.5"
unbox-primitive "^1.0.2"
+es-abstract@^1.23.2, es-abstract@^1.23.5, es-abstract@^1.23.9, es-abstract@^1.24.2:
+ version "1.24.2"
+ resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.24.2.tgz#2dbd38c180735ee983f77585140a2706a963ed9a"
+ integrity sha512-2FpH9Q5i2RRwyEP1AylXe6nYLR5OhaJTZwmlcP0dL/+JCbgg7yyEo/sEK6HeGZRf3dFpWwThaRHVApXSkW3xeg==
+ dependencies:
+ array-buffer-byte-length "^1.0.2"
+ arraybuffer.prototype.slice "^1.0.4"
+ available-typed-arrays "^1.0.7"
+ call-bind "^1.0.8"
+ call-bound "^1.0.4"
+ data-view-buffer "^1.0.2"
+ data-view-byte-length "^1.0.2"
+ data-view-byte-offset "^1.0.1"
+ es-define-property "^1.0.1"
+ es-errors "^1.3.0"
+ es-object-atoms "^1.1.1"
+ es-set-tostringtag "^2.1.0"
+ es-to-primitive "^1.3.0"
+ function.prototype.name "^1.1.8"
+ get-intrinsic "^1.3.0"
+ get-proto "^1.0.1"
+ get-symbol-description "^1.1.0"
+ globalthis "^1.0.4"
+ gopd "^1.2.0"
+ has-property-descriptors "^1.0.2"
+ has-proto "^1.2.0"
+ has-symbols "^1.1.0"
+ hasown "^2.0.2"
+ internal-slot "^1.1.0"
+ is-array-buffer "^3.0.5"
+ is-callable "^1.2.7"
+ is-data-view "^1.0.2"
+ is-negative-zero "^2.0.3"
+ is-regex "^1.2.1"
+ is-set "^2.0.3"
+ is-shared-array-buffer "^1.0.4"
+ is-string "^1.1.1"
+ is-typed-array "^1.1.15"
+ is-weakref "^1.1.1"
+ math-intrinsics "^1.1.0"
+ object-inspect "^1.13.4"
+ object-keys "^1.1.1"
+ object.assign "^4.1.7"
+ own-keys "^1.0.1"
+ regexp.prototype.flags "^1.5.4"
+ safe-array-concat "^1.1.3"
+ safe-push-apply "^1.0.0"
+ safe-regex-test "^1.1.0"
+ set-proto "^1.0.0"
+ stop-iteration-iterator "^1.1.0"
+ string.prototype.trim "^1.2.10"
+ string.prototype.trimend "^1.0.9"
+ string.prototype.trimstart "^1.0.8"
+ typed-array-buffer "^1.0.3"
+ typed-array-byte-length "^1.0.3"
+ typed-array-byte-offset "^1.0.4"
+ typed-array-length "^1.0.7"
+ unbox-primitive "^1.1.0"
+ which-typed-array "^1.1.19"
+
+es-define-property@^1.0.0, es-define-property@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/es-define-property/-/es-define-property-1.0.1.tgz#983eb2f9a6724e9303f61addf011c72e09e0b0fa"
+ integrity sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==
+
+es-errors@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/es-errors/-/es-errors-1.3.0.tgz#05f75a25dab98e4fb1dcd5e1472c0546d5057c8f"
+ integrity sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==
+
+es-object-atoms@^1.0.0, es-object-atoms@^1.1.1, es-object-atoms@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/es-object-atoms/-/es-object-atoms-1.1.2.tgz#a2d0b373205724dfa525d23b0c3e1b1ca582c99b"
+ integrity sha512-HWcBoN6NileqtSydK2FqHbS/LoDd2pqrnQHLyJzBj4kOp/ky2MWMN694xOfkK8/SnUsW2DH7EfyVlydKCsm1Zw==
+ dependencies:
+ es-errors "^1.3.0"
+
+es-set-tostringtag@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz#f31dbbe0c183b00a6d26eb6325c810c0fd18bd4d"
+ integrity sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==
+ dependencies:
+ es-errors "^1.3.0"
+ get-intrinsic "^1.2.6"
+ has-tostringtag "^1.0.2"
+ hasown "^2.0.2"
+
es-shim-unscopables@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz#702e632193201e3edf8713635d083d378e510241"
@@ -3251,11 +5154,28 @@ es-to-primitive@^1.2.1:
is-date-object "^1.0.1"
is-symbol "^1.0.2"
+es-to-primitive@^1.3.0:
+ version "1.3.4"
+ resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.3.4.tgz#0c854291cf0d7b439d6b9e5771ea837ffaf1f991"
+ integrity sha512-yPDz7wqpg1/mmHLmS3tcfTfbw5f1eryXvyghYBffGdERwe+mV7ZcWzTR8LR17Kvqt3qfPurjlonmnq3MKXIOXw==
+ dependencies:
+ es-abstract-get "^1.0.0"
+ es-define-property "^1.0.1"
+ es-errors "^1.3.0"
+ is-callable "^1.2.7"
+ is-date-object "^1.1.0"
+ is-symbol "^1.1.1"
+
escalade@^3.1.1:
version "3.1.1"
resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40"
integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==
+escape-html@~1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
+ 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.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
@@ -3266,6 +5186,17 @@ escape-string-regexp@^4.0.0:
resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34"
integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
+escodegen@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/escodegen/-/escodegen-2.1.0.tgz#ba93bbb7a43986d29d6041f99f5262da773e2e17"
+ 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.5.0"
resolved "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz#5a81680ec934beca02c7b1a61cf8ca34b66feab1"
@@ -3401,7 +5332,7 @@ eslint-visitor-keys@^3.3.0:
resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz#f6480fa6b1f30efe2d1968aa8ac745b862469826"
integrity sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==
-esprima@^4.0.0, esprima@~4.0.0:
+esprima@^4.0.0, esprima@^4.0.1, esprima@~4.0.0:
version "4.0.1"
resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71"
integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
@@ -3435,11 +5366,33 @@ esutils@^2.0.2:
resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64"
integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
+etag@~1.8.1:
+ version "1.8.1"
+ resolved "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz#41ae2eeb65efa62268aebfea83ac7d79299b0887"
+ integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==
+
+event-target-shim@^5.0.0:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789"
+ integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==
+
eventemitter2@~0.4.13:
version "0.4.14"
resolved "https://registry.yarnpkg.com/eventemitter2/-/eventemitter2-0.4.14.tgz#8f61b75cde012b2e9eb284d4545583b5643b61ab"
integrity sha1-j2G3XN4BKy6esoTUVFWDtWQ7Yas=
+events-universal@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/events-universal/-/events-universal-1.0.1.tgz#b56a84fd611b6610e0a2d0f09f80fdf931e2dfe6"
+ integrity sha512-LUd5euvbMLpwOF8m6ivPCbhQeSiYVNb8Vs0fQ8QjXo0JTkEHpz8pxdQf0gStltaPpw0Cca8b39KxvK9cfKRiAw==
+ dependencies:
+ bare-events "^2.7.0"
+
+events@^3.3.0:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400"
+ integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==
+
execa@^4.0.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a"
@@ -3482,11 +5435,59 @@ expand-tilde@^2.0.0, expand-tilde@^2.0.2:
dependencies:
homedir-polyfill "^1.0.1"
+express@4.22.2:
+ version "4.22.2"
+ resolved "https://registry.yarnpkg.com/express/-/express-4.22.2.tgz#c17ae0981e5efc24b22272f0e041c4662503b700"
+ integrity sha512-IuL+Elrou2ZvCFHs18/CIzy2Nzvo25nZ1/D2eIZlz7c+QUayAcYoiM2BthCjs+EBHVpjYjcuLDAiCWgeIX3X1Q==
+ dependencies:
+ accepts "~1.3.8"
+ array-flatten "1.1.1"
+ body-parser "~1.20.5"
+ content-disposition "~0.5.4"
+ content-type "~1.0.4"
+ cookie "~0.7.1"
+ cookie-signature "~1.0.6"
+ debug "2.6.9"
+ depd "2.0.0"
+ encodeurl "~2.0.0"
+ escape-html "~1.0.3"
+ etag "~1.8.1"
+ finalhandler "~1.3.1"
+ fresh "~0.5.2"
+ http-errors "~2.0.0"
+ merge-descriptors "1.0.3"
+ methods "~1.1.2"
+ on-finished "~2.4.1"
+ parseurl "~1.3.3"
+ path-to-regexp "~0.1.12"
+ proxy-addr "~2.0.7"
+ qs "~6.15.1"
+ range-parser "~1.2.1"
+ safe-buffer "5.2.1"
+ send "~0.19.0"
+ serve-static "~1.16.2"
+ setprototypeof "1.2.0"
+ statuses "~2.0.1"
+ type-is "~1.6.18"
+ utils-merge "1.0.1"
+ vary "~1.1.2"
+
extend@^3.0.0, extend@^3.0.2, extend@~3.0.2:
version "3.0.2"
resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa"
integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==
+extract-zip@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/extract-zip/-/extract-zip-2.0.1.tgz#663dca56fe46df890d5f131ef4a06d22bb8ba13a"
+ 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"
+
extsprintf@1.3.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05"
@@ -3497,7 +5498,7 @@ extsprintf@^1.2.0:
resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.1.tgz#8d172c064867f235c0c84a596806d279bf4bcc07"
integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA==
-fast-deep-equal@^3.1.1:
+fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3:
version "3.1.3"
resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
@@ -3507,6 +5508,11 @@ fast-diff@^1.1.2:
resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03"
integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==
+fast-fifo@^1.2.0, fast-fifo@^1.3.2:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/fast-fifo/-/fast-fifo-1.3.2.tgz#286e31de96eb96d38a97899815740ba2a4f3640c"
+ integrity sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==
+
fast-glob@^3.2.9:
version "3.2.11"
resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.11.tgz#a1172ad95ceb8a16e20caa5c5e56480e5129c1d9"
@@ -3523,6 +5529,31 @@ fast-json-stable-stringify@^2.0.0:
resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633"
integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==
+fast-uri@^3.0.1:
+ version "3.1.4"
+ resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.1.4.tgz#3b3daf9ce68f41f956df0b505132c0cfce9ec7af"
+ integrity sha512-8JnbkQ4juDyvYs4mgFGQqg4yCYtFDtUtmp2QIQq11ZZe5CFQ5wcqm1rqDgAh/QdMySuBnPzMUiJUNZG5N/AiQw==
+
+fast-xml-builder@^1.2.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/fast-xml-builder/-/fast-xml-builder-1.3.0.tgz#bc849804796fe47bf915022dd939b0fc30ba455d"
+ integrity sha512-F74cZEdCvuw9P41GAC3rod4X04jjWGM1JPEv/GWSqFTWLsdyMSBMBMlm9Hk3GLBgLBbdBNY8yee0pQh2RBVESQ==
+ dependencies:
+ path-expression-matcher "^1.6.2"
+ xml-naming "^0.3.0"
+
+fast-xml-parser@^5.8.0:
+ version "5.10.1"
+ resolved "https://registry.yarnpkg.com/fast-xml-parser/-/fast-xml-parser-5.10.1.tgz#19313f7c9386c47fa4a1de527547b73ed2cfcede"
+ integrity sha512-IEMIf7298kXuZSRFoGfMYrl7is8LpavODgbNz1cwIudv7KwVFnuU+UsMporfq6PD6aXSlawZlARiA3UywCTfMw==
+ dependencies:
+ "@nodable/entities" "^3.0.0"
+ fast-xml-builder "^1.2.0"
+ is-unsafe "^2.0.0"
+ path-expression-matcher "^1.6.2"
+ strnum "^2.4.1"
+ xml-naming "^0.3.0"
+
fastest-levenshtein@^1.0.12:
version "1.0.12"
resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz#9990f7d3a88cc5a9ffd1f1745745251700d497e2"
@@ -3542,6 +5573,13 @@ faye-websocket@~0.10.0:
dependencies:
websocket-driver ">=0.5.1"
+fd-slicer@~1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.1.0.tgz#25c7c89cb1f9077f8891bbe61d8f390eae256f1e"
+ integrity sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==
+ dependencies:
+ pend "~1.2.0"
+
figures@^1.0.0, figures@^1.0.1:
version "1.7.0"
resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e"
@@ -3571,6 +5609,19 @@ fill-range@^7.0.1:
dependencies:
to-regex-range "^5.0.1"
+finalhandler@~1.3.1:
+ version "1.3.2"
+ resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.3.2.tgz#1ebc2228fc7673aac4a472c310cc05b77d852b88"
+ integrity sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==
+ dependencies:
+ debug "2.6.9"
+ encodeurl "~2.0.0"
+ escape-html "~1.0.3"
+ on-finished "~2.4.1"
+ parseurl "~1.3.3"
+ statuses "~2.0.2"
+ unpipe "~1.0.0"
+
find-up@^1.0.0:
version "1.1.2"
resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f"
@@ -3634,6 +5685,13 @@ flagged-respawn@^1.0.1:
resolved "https://registry.yarnpkg.com/flagged-respawn/-/flagged-respawn-1.0.1.tgz#e7de6f1279ddd9ca9aac8a5971d618606b3aab41"
integrity sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q==
+for-each@^0.3.3, for-each@^0.3.5:
+ version "0.3.5"
+ resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.5.tgz#d650688027826920feeb0af747ee7b9421a41d47"
+ integrity sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==
+ dependencies:
+ is-callable "^1.2.7"
+
for-in@^1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80"
@@ -3646,6 +5704,14 @@ for-own@^1.0.0:
dependencies:
for-in "^1.0.1"
+foreground-child@^3.1.0:
+ version "3.3.1"
+ resolved "https://registry.yarnpkg.com/foreground-child/-/foreground-child-3.3.1.tgz#32e8e9ed1b68a3497befb9ac2b6adf92a638576f"
+ integrity sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==
+ dependencies:
+ cross-spawn "^7.0.6"
+ signal-exit "^4.0.1"
+
forever-agent@~0.6.1:
version "0.6.1"
resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91"
@@ -3660,6 +5726,21 @@ form-data@~2.3.2:
combined-stream "^1.0.6"
mime-types "^2.1.12"
+forwarded-parse@2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/forwarded-parse/-/forwarded-parse-2.1.2.tgz#08511eddaaa2ddfd56ba11138eee7df117a09325"
+ integrity sha512-alTFZZQDKMporBH77856pXgzhEzaUVmLCDk+egLgIgHst3Tpndzz8MnKe+GzRJRfvVdn69HhpW7cmXzvtLvJAw==
+
+forwarded@0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811"
+ integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==
+
+fresh@~0.5.2:
+ version "0.5.2"
+ resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7"
+ integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==
+
from2@^2.3.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af"
@@ -3673,6 +5754,22 @@ fromentries@^1.3.2:
resolved "https://registry.yarnpkg.com/fromentries/-/fromentries-1.3.2.tgz#e4bca6808816bf8f93b52750f1127f5a6fd86e3a"
integrity sha512-cHEpEQHUg0f8XdtZCc2ZAhrHzKzT0MrFUTcvx+hfxYu7rGMDc5SKoXFh+n4YigxsHXRzc6OrCshdR1bWH6HHyg==
+fs-ext-extra-prebuilt@2.2.7:
+ version "2.2.7"
+ resolved "https://registry.yarnpkg.com/fs-ext-extra-prebuilt/-/fs-ext-extra-prebuilt-2.2.7.tgz#4c95c45a4607f9eab287403b8a3723e4215a1c52"
+ integrity sha512-Q7rayYRBDIvDF01HWOwSSjoaP+05N1g+o3BXL1Zf8Frw2JkjSmi4EtvCBITuW30l6hB2m2TW1pehdh8wyU/+gw==
+ dependencies:
+ nan "^2.24.0"
+
+fs-extra@11.1.1:
+ version "11.1.1"
+ resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-11.1.1.tgz#da69f7c39f3b002378b0954bb6ae7efdc0876e2d"
+ integrity sha512-MGIE4HOvQCeUCzmlHs0vXpih4ysz4wg9qiSAu6cd42lVwPbTM1TjV7RusoyQqMmk/95gdQZX72u+YW+c3eEpFQ==
+ dependencies:
+ graceful-fs "^4.2.0"
+ jsonfile "^6.0.1"
+ universalify "^2.0.0"
+
fs-extra@^10.0.0:
version "10.0.0"
resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-10.0.0.tgz#9ff61b655dde53fb34a82df84bb214ce802e17c1"
@@ -3704,11 +5801,21 @@ fs.realpath@^1.0.0:
resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8=
+fsevents@2.3.2:
+ version "2.3.2"
+ resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a"
+ integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==
+
function-bind@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d"
integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
+function-bind@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c"
+ integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==
+
function.prototype.name@^1.1.5:
version "1.1.5"
resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.1.5.tgz#cce0505fe1ffb80503e6f9e46cc64e46a12a9621"
@@ -3719,12 +5826,27 @@ function.prototype.name@^1.1.5:
es-abstract "^1.19.0"
functions-have-names "^1.2.2"
+function.prototype.name@^1.1.6, function.prototype.name@^1.1.8:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/function.prototype.name/-/function.prototype.name-1.2.0.tgz#758f3e84fa542672454bd5e14cb081a5ce07f70c"
+ integrity sha512-jObKIik1P2QjPHP5nz5BaOtUlfgS0fWo8IUByNXkM+o+02sJOi94em77GwJKQSJ3gfPHdgzLNrHc1uokV4P/ew==
+ dependencies:
+ call-bind "^1.0.9"
+ call-bound "^1.0.4"
+ es-define-property "^1.0.1"
+ es-errors "^1.3.0"
+ functions-have-names "^1.2.3"
+ has-property-descriptors "^1.0.2"
+ hasown "^2.0.4"
+ is-callable "^1.2.7"
+ is-document.all "^1.0.0"
+
functional-red-black-tree@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327"
integrity sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==
-functions-have-names@^1.2.2:
+functions-have-names@^1.2.2, functions-have-names@^1.2.3:
version "1.2.3"
resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834"
integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==
@@ -3765,6 +5887,11 @@ gaze@^1.1.0:
dependencies:
globule "^1.0.0"
+generator-function@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/generator-function/-/generator-function-2.0.1.tgz#0e75dd410d1243687a0ba2e951b94eedb8f737a2"
+ integrity sha512-SFdFmIJi+ybC0vjlHN0ZGVGHc3lgE0DxPAT0djjVg+kjOnSqclqmj0KQ7ykTOLP6YxoqOvuAODGdcHJn+43q3g==
+
gensync@^1.0.0-beta.2:
version "1.0.0-beta.2"
resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0"
@@ -3784,12 +5911,41 @@ get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1:
has "^1.0.3"
has-symbols "^1.0.1"
+get-intrinsic@^1.2.4, get-intrinsic@^1.2.5, get-intrinsic@^1.2.6, get-intrinsic@^1.2.7, get-intrinsic@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/get-intrinsic/-/get-intrinsic-1.3.0.tgz#743f0e3b6964a93a5491ed1bffaae054d7f98d01"
+ integrity sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==
+ dependencies:
+ call-bind-apply-helpers "^1.0.2"
+ es-define-property "^1.0.1"
+ es-errors "^1.3.0"
+ es-object-atoms "^1.1.1"
+ function-bind "^1.1.2"
+ get-proto "^1.0.1"
+ gopd "^1.2.0"
+ has-symbols "^1.1.0"
+ hasown "^2.0.2"
+ math-intrinsics "^1.1.0"
+
+get-port@^5.1.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/get-port/-/get-port-5.1.1.tgz#0469ed07563479de6efb986baf053dcd7d4e3193"
+ integrity sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==
+
+get-proto@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/get-proto/-/get-proto-1.0.1.tgz#150b3f2743869ef3e851ec0c49d15b1d14d00ee1"
+ integrity sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==
+ dependencies:
+ dunder-proto "^1.0.1"
+ es-object-atoms "^1.0.0"
+
get-stdin@^4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe"
integrity sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=
-get-stream@^5.0.0:
+get-stream@^5.0.0, get-stream@^5.1.0:
version "5.2.0"
resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-5.2.0.tgz#4966a1795ee5ace65e706c4b7beb71257d6e22d3"
integrity sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==
@@ -3809,6 +5965,24 @@ get-symbol-description@^1.0.0:
call-bind "^1.0.2"
get-intrinsic "^1.1.1"
+get-symbol-description@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/get-symbol-description/-/get-symbol-description-1.1.0.tgz#7bdd54e0befe8ffc9f3b4e203220d9f1e881b6ee"
+ integrity sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==
+ dependencies:
+ call-bound "^1.0.3"
+ es-errors "^1.3.0"
+ get-intrinsic "^1.2.6"
+
+get-uri@^6.0.1:
+ version "6.0.5"
+ resolved "https://registry.yarnpkg.com/get-uri/-/get-uri-6.0.5.tgz#714892aa4a871db671abc5395e5e9447bc306a16"
+ integrity sha512-b1O07XYq8eRuVzBNgJLstU6FYc1tS6wnMtF1I1D9lE8LxZSOGZ7LhxN54yPP6mGw5f2CkXY2BQUL9Fx41qvcIg==
+ dependencies:
+ basic-ftp "^5.0.2"
+ data-uri-to-buffer "^6.0.2"
+ debug "^4.3.4"
+
getobject@~1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/getobject/-/getobject-1.0.2.tgz#25ec87a50370f6dcc3c6ba7ef43c4c16215c4c89"
@@ -3840,6 +6014,18 @@ glob-parent@^5.1.2:
dependencies:
is-glob "^4.0.1"
+glob@^10.3.7:
+ version "10.5.0"
+ resolved "https://registry.yarnpkg.com/glob/-/glob-10.5.0.tgz#8ec0355919cd3338c28428a23d4f24ecc5fe738c"
+ integrity sha512-DfXN8DfhJ7NH3Oe7cFmu3NCu1wKbkReJ8TorzSAFbSKrlNaQSKfIzqYqVY8zlbs2NLBbWpRiU52GX2PbaBVNkg==
+ dependencies:
+ foreground-child "^3.1.0"
+ jackspeak "^3.1.2"
+ minimatch "^9.0.4"
+ minipass "^7.1.2"
+ package-json-from-dist "^1.0.0"
+ path-scurry "^1.11.1"
+
glob@^7.1.1, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@^7.2.0:
version "7.2.0"
resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023"
@@ -3907,6 +6093,14 @@ globals@^13.12.0:
dependencies:
type-fest "^0.20.2"
+globalthis@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/globalthis/-/globalthis-1.0.4.tgz#7430ed3a975d97bfb59bcce41f5cabbafa651236"
+ integrity sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==
+ dependencies:
+ define-properties "^1.2.1"
+ gopd "^1.0.1"
+
globby@^11.0.0, globby@^11.0.1, globby@^11.1.0:
version "11.1.0"
resolved "https://registry.yarnpkg.com/globby/-/globby-11.1.0.tgz#bd4be98bb042f83d796f7e3811991fbe82a0d34b"
@@ -3928,11 +6122,38 @@ globule@^1.0.0:
lodash "~4.17.10"
minimatch "~3.0.2"
+gopd@^1.0.1, gopd@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.2.0.tgz#89f56b8217bdbc8802bd299df6d7f1081d7e51a1"
+ integrity sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==
+
+got@^11.8.5:
+ version "11.8.6"
+ resolved "https://registry.yarnpkg.com/got/-/got-11.8.6.tgz#276e827ead8772eddbcfc97170590b841823233a"
+ integrity sha512-6tfZ91bOr7bOXnK7PRDCGBLa1H4U080YHNaAQ2KsMGlLEzRbk44nsZF2E1IeRc3vtJHPVbKCYgdFbaGO2ljd8g==
+ dependencies:
+ "@sindresorhus/is" "^4.0.0"
+ "@szmarczak/http-timer" "^4.0.5"
+ "@types/cacheable-request" "^6.0.1"
+ "@types/responselike" "^1.0.0"
+ cacheable-lookup "^5.0.3"
+ cacheable-request "^7.0.2"
+ decompress-response "^6.0.0"
+ http2-wrapper "^1.0.0-beta.5.2"
+ lowercase-keys "^2.0.0"
+ p-cancelable "^2.0.0"
+ responselike "^2.0.0"
+
graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.2.0, graceful-fs@^4.2.4:
version "4.2.9"
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.9.tgz#041b05df45755e587a24942279b9d113146e1c96"
integrity sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==
+graceful-fs@^4.2.11:
+ version "4.2.11"
+ resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3"
+ integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==
+
graceful-fs@^4.2.3, graceful-fs@^4.2.8:
version "4.2.10"
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c"
@@ -4129,6 +6350,20 @@ has-property-descriptors@^1.0.0:
dependencies:
get-intrinsic "^1.1.1"
+has-property-descriptors@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz#963ed7d071dc7bf5f084c5bfbe0d1b6222586854"
+ integrity sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==
+ dependencies:
+ es-define-property "^1.0.0"
+
+has-proto@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/has-proto/-/has-proto-1.2.0.tgz#5de5a6eabd95fdffd9818b43055e8065e39fe9d5"
+ integrity sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==
+ dependencies:
+ dunder-proto "^1.0.0"
+
has-symbols@^1.0.1, has-symbols@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.2.tgz#165d3070c00309752a1236a479331e3ac56f1423"
@@ -4139,6 +6374,11 @@ has-symbols@^1.0.3:
resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.3.tgz#bb7b2c4349251dce87b125f7bdf874aa7c8b39f8"
integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==
+has-symbols@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.1.0.tgz#fc9c6a783a084951d0b971fe1018de813707a338"
+ integrity sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==
+
has-tostringtag@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz#7e133818a7d394734f941e73c3d3f9291e658b25"
@@ -4146,6 +6386,13 @@ has-tostringtag@^1.0.0:
dependencies:
has-symbols "^1.0.2"
+has-tostringtag@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/has-tostringtag/-/has-tostringtag-1.0.2.tgz#2cdc42d40bef2e5b4eeab7c01a73c54ce7ab5abc"
+ integrity sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==
+ dependencies:
+ has-symbols "^1.0.3"
+
has-unicode@^2.0.0, has-unicode@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9"
@@ -4158,6 +6405,13 @@ has@^1.0.0, has@^1.0.3:
dependencies:
function-bind "^1.1.1"
+hasown@^2.0.2, hasown@^2.0.3, hasown@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.4.tgz#8c62d8cb90beb2aad5d0a5b67581ad9854c3f003"
+ integrity sha512-T2UbfbBEF32wiepXIsMlTW9+dDYC6wMh/t/vYA4tuOMKqWz/n3vr1NFSxQiyP+zk2mXsoMA/i/7qV6LKut1t1A==
+ dependencies:
+ function-bind "^1.1.2"
+
header-case@^2.0.4:
version "2.0.4"
resolved "https://registry.yarnpkg.com/header-case/-/header-case-2.0.4.tgz#5a42e63b55177349cf405beb8d775acabb92c063"
@@ -4221,11 +6475,32 @@ htmlparser2@3.8.x:
entities "1.0"
readable-stream "1.1"
+http-cache-semantics@^4.0.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.2.0.tgz#205f4db64f8562b76a4ff9235aa5279839a09dd5"
+ integrity sha512-dTxcvPXqPvXBQpq5dUr6mEMJX4oIEFv6bwom3FDwKRDsuIjjJGANqhBuoAn9c1RQJIdAKav33ED65E2ys+87QQ==
+
http-cache-semantics@^4.1.0:
version "4.1.1"
resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a"
integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==
+http-errors@~2.0.0, http-errors@~2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.1.tgz#36d2f65bc909c8790018dd36fb4d93da6caae06b"
+ integrity sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==
+ dependencies:
+ depd "~2.0.0"
+ inherits "~2.0.4"
+ setprototypeof "~1.2.0"
+ statuses "~2.0.2"
+ toidentifier "~1.0.1"
+
+http-link-header@^1.1.1:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/http-link-header/-/http-link-header-1.1.4.tgz#9c0a6519e8b40c1aaab6f3eb4f2c679d3be2fad9"
+ integrity sha512-xT3GPW6/ZbGuw4UvwHqErSCEjNUlwbQJuZn9/q5U4WEKfp2kENVCAlousG1zLxHeaQ/ffOHUNpWamvkbBW0eNw==
+
http-parser-js@>=0.5.1:
version "0.5.5"
resolved "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.5.tgz#d7c30d5d3c90d865b4a2e870181f9d6f22ac7ac5"
@@ -4240,6 +6515,14 @@ http-proxy-agent@^4.0.0, http-proxy-agent@^4.0.1:
agent-base "6"
debug "4"
+http-proxy-agent@^7.0.0, http-proxy-agent@^7.0.1:
+ version "7.0.2"
+ resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz#9a8b1f246866c028509486585f62b8f2c18c270e"
+ integrity sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==
+ dependencies:
+ agent-base "^7.1.0"
+ debug "^4.3.4"
+
http-signature@~1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1"
@@ -4249,6 +6532,14 @@ http-signature@~1.2.0:
jsprim "^1.2.2"
sshpk "^1.7.0"
+http2-wrapper@^1.0.0-beta.5.2:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/http2-wrapper/-/http2-wrapper-1.0.3.tgz#b8f55e0c1f25d4ebd08b3b0c2c079f9590800b3d"
+ integrity sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==
+ dependencies:
+ quick-lru "^5.1.1"
+ resolve-alpn "^1.0.0"
+
https-proxy-agent@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz#e2a90542abb68a762e0a0850f6c9edadfd8506b2"
@@ -4257,6 +6548,14 @@ https-proxy-agent@^5.0.0:
agent-base "6"
debug "4"
+https-proxy-agent@^7.0.6:
+ version "7.0.6"
+ resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz#da8dfeac7da130b05c2ba4b59c9b6cd66611a6b9"
+ integrity sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==
+ dependencies:
+ agent-base "^7.1.2"
+ debug "4"
+
human-signals@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz#c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3"
@@ -4281,13 +6580,25 @@ iconv-lite@^0.6.2:
dependencies:
safer-buffer ">= 2.1.2 < 3.0.0"
-iconv-lite@~0.4.13:
+iconv-lite@^0.7.0:
+ version "0.7.3"
+ resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.7.3.tgz#84ee12f963e7de50bc01a13e160a078b3b0f415f"
+ integrity sha512-IKXpvIzjnC9XTAUbVBcMfGS0EPaIXtW6v+zr+RRp+hqULEpo0owZax6wyRwPOJbWbzjYspQwusTsfVr0ifh4uQ==
+ dependencies:
+ safer-buffer ">= 2.1.2 < 3.0.0"
+
+iconv-lite@~0.4.13, iconv-lite@~0.4.24:
version "0.4.24"
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b"
integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
dependencies:
safer-buffer ">= 2.1.2 < 3"
+ieee754@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352"
+ integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==
+
ignore-walk@^3.0.3:
version "3.0.4"
resolved "https://registry.yarnpkg.com/ignore-walk/-/ignore-walk-3.0.4.tgz#c9a09f69b7c7b479a5d74ac1a3c0d4236d2a6335"
@@ -4295,11 +6606,21 @@ ignore-walk@^3.0.3:
dependencies:
minimatch "^3.0.4"
+ignore@^5.1.4:
+ version "5.3.2"
+ resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.3.2.tgz#3cd40e729f3643fd87cb04e50bf0eb722bc596f5"
+ integrity sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==
+
ignore@^5.2.0:
version "5.2.0"
resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.0.tgz#6d3bac8fa7fe0d45d9f9be7bac2fc279577e345a"
integrity sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==
+image-ssim@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/image-ssim/-/image-ssim-0.2.0.tgz#83b42c7a2e6e4b85505477fe6917f5dbc56420e5"
+ integrity sha512-W7+sO6/yhxy83L0G7xR8YAc5Z5QFtYEXXRV6EaE8tuYBZJnA3gVgp3q7X7muhLZVodeb9UfvjSbwt9VJwjIYAg==
+
import-fresh@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz#d81355c15612d386c61f9ddd3922d4304822a546"
@@ -4323,6 +6644,16 @@ import-from@^3.0.0:
dependencies:
resolve-from "^5.0.0"
+import-in-the-middle@^1.14.2, import-in-the-middle@^1.8.1:
+ version "1.15.0"
+ resolved "https://registry.yarnpkg.com/import-in-the-middle/-/import-in-the-middle-1.15.0.tgz#9e20827a322bbadaeb5e3bac49ea8f6d4685fdd8"
+ integrity sha512-bpQy+CrsRmYmoPMAE/0G33iwRqwW4ouqdRg8jgbH3aKuCtOc8lxgmYXg2dMM92CRiGP660EtBcymH/eVUpCSaA==
+ dependencies:
+ acorn "^8.14.0"
+ acorn-import-attributes "^1.9.5"
+ cjs-module-lexer "^1.2.2"
+ module-details-from-path "^1.0.3"
+
imurmurhash@^0.1.4:
version "0.1.4"
resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea"
@@ -4358,11 +6689,16 @@ inflight@^1.0.4:
once "^1.3.0"
wrappy "1"
-inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.1, inherits@~2.0.3:
+inherits@2, inherits@^2.0.1, inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@~2.0.3, inherits@~2.0.4:
version "2.0.4"
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
+ini@4.1.2:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/ini/-/ini-4.1.2.tgz#7f646dbd9caea595e61f88ef60bfff8b01f8130a"
+ integrity sha512-AMB1mvwR1pyBFY/nSevUX6y8nJWS63/SzUKD3JyQn97s4xgIdgQPT75IRouIiBAN4yLQBUShNYVW0+UG25daCw==
+
ini@^1.3.4, ini@~1.3.0:
version "1.3.8"
resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c"
@@ -4395,11 +6731,30 @@ internal-slot@^1.0.3:
has "^1.0.3"
side-channel "^1.0.4"
+internal-slot@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.1.0.tgz#1eac91762947d2f7056bc838d93e13b2e9604961"
+ integrity sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==
+ dependencies:
+ es-errors "^1.3.0"
+ hasown "^2.0.2"
+ side-channel "^1.1.0"
+
interpret@~1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.1.0.tgz#7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614"
integrity sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=
+intl-messageformat@^10.5.3:
+ version "10.7.18"
+ resolved "https://registry.yarnpkg.com/intl-messageformat/-/intl-messageformat-10.7.18.tgz#51a6f387afbca9b0f881b2ec081566db8c540b0d"
+ integrity sha512-m3Ofv/X/tV8Y3tHXLohcuVuhWKo7BBq62cqY15etqmLxg2DZ34AGGgQDeR+SCta2+zICb1NX83af0GJmbQ1++g==
+ dependencies:
+ "@formatjs/ecma402-abstract" "2.3.6"
+ "@formatjs/fast-memoize" "2.2.7"
+ "@formatjs/icu-messageformat-parser" "2.11.4"
+ tslib "^2.8.0"
+
into-stream@^6.0.0:
version "6.0.0"
resolved "https://registry.yarnpkg.com/into-stream/-/into-stream-6.0.0.tgz#4bfc1244c0128224e18b8870e85b2de8e66c6702"
@@ -4408,6 +6763,11 @@ into-stream@^6.0.0:
from2 "^2.3.0"
p-is-promise "^3.0.0"
+ip-address@^10.1.1:
+ version "10.2.0"
+ resolved "https://registry.yarnpkg.com/ip-address/-/ip-address-10.2.0.tgz#805fc178b20c518bd4c8548b24fe30892d7f3206"
+ integrity sha512-/+S6j4E9AHvW9SWMSEY9Xfy66O5PWvVEJ08O0y5JGyEKQpojb0K0GKpz/v5HJ/G0vi3D2sjGK78119oXZeE0qA==
+
ip-regex@^4.1.0:
version "4.3.0"
resolved "https://registry.yarnpkg.com/ip-regex/-/ip-regex-4.3.0.tgz#687275ab0f57fa76978ff8f4dddc8a23d5990db5"
@@ -4418,6 +6778,11 @@ ip@^1.1.5:
resolved "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz#bdded70114290828c0a039e72ef25f5aaec4354a"
integrity sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=
+ipaddr.js@1.9.1:
+ version "1.9.1"
+ resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3"
+ integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==
+
is-absolute-url@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz#50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6"
@@ -4444,6 +6809,15 @@ is-alphanumerical@^1.0.0:
is-alphabetical "^1.0.0"
is-decimal "^1.0.0"
+is-array-buffer@^3.0.4, is-array-buffer@^3.0.5:
+ version "3.0.5"
+ resolved "https://registry.yarnpkg.com/is-array-buffer/-/is-array-buffer-3.0.5.tgz#65742e1e687bd2cc666253068fd8707fe4d44280"
+ integrity sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==
+ dependencies:
+ call-bind "^1.0.8"
+ call-bound "^1.0.3"
+ get-intrinsic "^1.2.6"
+
is-arrayish@^0.2.1:
version "0.2.1"
resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d"
@@ -4454,6 +6828,17 @@ is-arrayish@^0.3.1:
resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03"
integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==
+is-async-function@^2.0.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/is-async-function/-/is-async-function-2.1.1.tgz#3e69018c8e04e73b738793d020bfe884b9fd3523"
+ integrity sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==
+ dependencies:
+ async-function "^1.0.0"
+ call-bound "^1.0.3"
+ get-proto "^1.0.1"
+ has-tostringtag "^1.0.2"
+ safe-regex-test "^1.1.0"
+
is-bigint@^1.0.1:
version "1.0.4"
resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.0.4.tgz#08147a1875bc2b32005d41ccd8291dffc6691df3"
@@ -4461,6 +6846,13 @@ is-bigint@^1.0.1:
dependencies:
has-bigints "^1.0.1"
+is-bigint@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-bigint/-/is-bigint-1.1.0.tgz#dda7a3445df57a42583db4228682eba7c4170672"
+ integrity sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==
+ dependencies:
+ has-bigints "^1.0.2"
+
is-boolean-object@^1.1.0:
version "1.1.2"
resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.1.2.tgz#5c6dc200246dd9321ae4b885a114bb1f75f63719"
@@ -4469,6 +6861,14 @@ is-boolean-object@^1.1.0:
call-bind "^1.0.2"
has-tostringtag "^1.0.0"
+is-boolean-object@^1.2.1:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.2.2.tgz#7067f47709809a393c71ff5bb3e135d8a9215d9e"
+ integrity sha512-wa56o2/ElJMYqjCjGkXri7it5FbebW5usLw/nPmCMs5DeZ7eziSYZhSmPRn0txqeW4LnAmQQU7FgqLpsEFKM4A==
+ dependencies:
+ call-bound "^1.0.3"
+ has-tostringtag "^1.0.2"
+
is-buffer@^2.0.0:
version "2.0.5"
resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.5.tgz#ebc252e400d22ff8d77fa09888821a24a658c191"
@@ -4479,6 +6879,11 @@ is-callable@^1.1.4, is-callable@^1.2.4:
resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945"
integrity sha512-nsuwtxZfMX67Oryl9LCQ+upnC0Z0BgpwntpS89m1H/TLF0zNfzfLMV/9Wa/6MZsj0acpEjAO0KF1xT6ZdLl95w==
+is-callable@^1.2.7:
+ version "1.2.7"
+ resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.7.tgz#3bc2a85ea742d9e36205dcacdd72ca1fdc51b055"
+ integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==
+
is-cidr@^4.0.2:
version "4.0.2"
resolved "https://registry.yarnpkg.com/is-cidr/-/is-cidr-4.0.2.tgz#94c7585e4c6c77ceabf920f8cde51b8c0fda8814"
@@ -4498,6 +6903,13 @@ is-color-stop@^1.0.0:
rgb-regex "^1.0.1"
rgba-regex "^1.0.0"
+is-core-module@^2.16.1:
+ version "2.16.2"
+ resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.16.2.tgz#3e07450a8080ebce3fbf0cac494f4d2ab324e082"
+ integrity sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==
+ dependencies:
+ hasown "^2.0.3"
+
is-core-module@^2.5.0, is-core-module@^2.8.1:
version "2.8.1"
resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.8.1.tgz#f59fdfca701d5879d0a6b100a40aa1560ce27211"
@@ -4512,6 +6924,15 @@ is-core-module@^2.9.0:
dependencies:
has "^1.0.3"
+is-data-view@^1.0.1, is-data-view@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/is-data-view/-/is-data-view-1.0.2.tgz#bae0a41b9688986c2188dda6657e56b8f9e63b8e"
+ integrity sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==
+ dependencies:
+ call-bound "^1.0.2"
+ get-intrinsic "^1.2.6"
+ is-typed-array "^1.1.13"
+
is-date-object@^1.0.1:
version "1.0.5"
resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f"
@@ -4519,6 +6940,14 @@ is-date-object@^1.0.1:
dependencies:
has-tostringtag "^1.0.0"
+is-date-object@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.1.0.tgz#ad85541996fc7aa8b2729701d27b7319f95d82f7"
+ integrity sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==
+ dependencies:
+ call-bound "^1.0.2"
+ has-tostringtag "^1.0.2"
+
is-decimal@^1.0.0:
version "1.0.4"
resolved "https://registry.yarnpkg.com/is-decimal/-/is-decimal-1.0.4.tgz#65a3a5958a1c5b63a706e1b333d7cd9f630d3fa5"
@@ -4529,11 +6958,30 @@ is-directory@^0.3.1:
resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1"
integrity sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=
+is-docker@^2.0.0, is-docker@^2.1.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa"
+ integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==
+
+is-document.all@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-document.all/-/is-document.all-1.0.0.tgz#163a4bfb362c6ed7b118ce46cdecc4e37dee3195"
+ integrity sha512-+XSoyS05OdBbhFuELhgTCpFNHkpBOJqtsZfUFFpe5QTw+9Sjbh8zitxhQkYAo6wV7e1Vb8cAPvpCk9jGam/82g==
+ dependencies:
+ call-bound "^1.0.4"
+
is-extglob@^2.1.1:
version "2.1.1"
resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=
+is-finalizationregistry@^1.1.0:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/is-finalizationregistry/-/is-finalizationregistry-1.1.1.tgz#eefdcdc6c94ddd0674d9c85887bf93f944a97c90"
+ integrity sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==
+ dependencies:
+ call-bound "^1.0.3"
+
is-finite@^1.0.0, is-finite@^1.0.1:
version "1.1.0"
resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.1.0.tgz#904135c77fb42c0641d6aa1bcdbc4daa8da082f3"
@@ -4556,6 +7004,17 @@ is-fullwidth-code-point@^3.0.0:
resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
+is-generator-function@^1.0.10:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/is-generator-function/-/is-generator-function-1.1.2.tgz#ae3b61e3d5ea4e4839b90bad22b02335051a17d5"
+ integrity sha512-upqt1SkGkODW9tsGNG5mtXTXtECizwtS2kA161M+gJPc1xdb/Ax629af6YrTwcOeQHbewrPNlE5Dx7kzvXTizA==
+ dependencies:
+ call-bound "^1.0.4"
+ generator-function "^2.0.0"
+ get-proto "^1.0.1"
+ has-tostringtag "^1.0.2"
+ safe-regex-test "^1.1.0"
+
is-glob@^4.0.0, is-glob@^4.0.1, is-glob@^4.0.3:
version "4.0.3"
resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084"
@@ -4568,16 +7027,31 @@ is-hexadecimal@^1.0.0:
resolved "https://registry.yarnpkg.com/is-hexadecimal/-/is-hexadecimal-1.0.4.tgz#cc35c97588da4bd49a8eedd6bc4082d44dcb23a7"
integrity sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==
+is-interactive@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-interactive/-/is-interactive-1.0.0.tgz#cea6e6ae5c870a7b0a0004070b7b587e0252912e"
+ integrity sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==
+
is-lambda@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/is-lambda/-/is-lambda-1.0.1.tgz#3d9877899e6a53efc0160504cde15f82e6f061d5"
integrity sha1-PZh3iZ5qU+/AFgUEzeFfgubwYdU=
+is-map@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/is-map/-/is-map-2.0.3.tgz#ede96b7fe1e270b3c4465e3a465658764926d62e"
+ integrity sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==
+
is-negative-zero@^2.0.1, is-negative-zero@^2.0.2:
version "2.0.2"
resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.2.tgz#7bf6f03a28003b8b3965de3ac26f664d765f3150"
integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==
+is-negative-zero@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.3.tgz#ced903a027aca6381b777a5743069d7376a49747"
+ integrity sha512-5KoIu2Ngpyek75jXodFvnafB6DJgr3u8uuK0LEZJjrU19DrMD3EVERaR8sjz8CCGgpZvxPl9SuE1GMVPFHx1mw==
+
is-number-object@^1.0.4:
version "1.0.6"
resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.0.6.tgz#6a7aaf838c7f0686a50b4553f7e54a96494e89f0"
@@ -4585,6 +7059,14 @@ is-number-object@^1.0.4:
dependencies:
has-tostringtag "^1.0.0"
+is-number-object@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/is-number-object/-/is-number-object-1.1.1.tgz#144b21e95a1bc148205dcc2814a9134ec41b2541"
+ integrity sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==
+ dependencies:
+ call-bound "^1.0.3"
+ has-tostringtag "^1.0.2"
+
is-number@^7.0.0:
version "7.0.0"
resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b"
@@ -4640,6 +7122,16 @@ is-regex@^1.1.4:
call-bind "^1.0.2"
has-tostringtag "^1.0.0"
+is-regex@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.2.1.tgz#76d70a3ed10ef9be48eb577887d74205bf0cad22"
+ integrity sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==
+ dependencies:
+ call-bound "^1.0.2"
+ gopd "^1.2.0"
+ has-tostringtag "^1.0.2"
+ hasown "^2.0.2"
+
is-relative@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-1.0.0.tgz#a1bb6935ce8c5dba1e8b9754b9b2dcc020e2260d"
@@ -4652,6 +7144,11 @@ is-resolvable@^1.0.0:
resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88"
integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==
+is-set@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/is-set/-/is-set-2.0.3.tgz#8ab209ea424608141372ded6e0cb200ef1d9d01d"
+ integrity sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==
+
is-shared-array-buffer@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz#97b0c85fbdacb59c9c446fe653b82cf2b5b7cfe6"
@@ -4664,6 +7161,13 @@ is-shared-array-buffer@^1.0.2:
dependencies:
call-bind "^1.0.2"
+is-shared-array-buffer@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.4.tgz#9b67844bd9b7f246ba0708c3a93e34269c774f6f"
+ integrity sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==
+ dependencies:
+ call-bound "^1.0.3"
+
is-stream@^2.0.0:
version "2.0.1"
resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077"
@@ -4676,6 +7180,14 @@ is-string@^1.0.5, is-string@^1.0.7:
dependencies:
has-tostringtag "^1.0.0"
+is-string@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.1.1.tgz#92ea3f3d5c5b6e039ca8677e5ac8d07ea773cbb9"
+ integrity sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==
+ dependencies:
+ call-bound "^1.0.3"
+ has-tostringtag "^1.0.2"
+
is-symbol@^1.0.2, is-symbol@^1.0.3:
version "1.0.4"
resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.4.tgz#a6dac93b635b063ca6872236de88910a57af139c"
@@ -4683,6 +7195,15 @@ is-symbol@^1.0.2, is-symbol@^1.0.3:
dependencies:
has-symbols "^1.0.2"
+is-symbol@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.1.1.tgz#f47761279f532e2b05a7024a7506dbbedacd0634"
+ integrity sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==
+ dependencies:
+ call-bound "^1.0.2"
+ has-symbols "^1.1.0"
+ safe-regex-test "^1.1.0"
+
is-text-path@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/is-text-path/-/is-text-path-1.0.1.tgz#4e1aa0fb51bfbcb3e92688001397202c1775b66e"
@@ -4690,6 +7211,13 @@ is-text-path@^1.0.1:
dependencies:
text-extensions "^1.0.0"
+is-typed-array@^1.1.13, is-typed-array@^1.1.14, is-typed-array@^1.1.15:
+ version "1.1.15"
+ resolved "https://registry.yarnpkg.com/is-typed-array/-/is-typed-array-1.1.15.tgz#4bfb4a45b61cee83a5a46fba778e4e8d59c0ce0b"
+ integrity sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==
+ dependencies:
+ which-typed-array "^1.1.16"
+
is-typedarray@^1.0.0, is-typedarray@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
@@ -4702,11 +7230,21 @@ is-unc-path@^1.0.0:
dependencies:
unc-path-regex "^0.1.2"
+is-unsafe@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/is-unsafe/-/is-unsafe-2.0.0.tgz#c0dce4e06742662dde26360160e414ea487da2e9"
+ integrity sha512-2LdV822R+wmI86unXA93WCFpL6g+av8ynWk0nrHyJqGop5VoocYsSLFgN8jrfalT6iGeLNM4KXuVSsULP53kEA==
+
is-utf8@^0.2.0:
version "0.2.1"
resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72"
integrity sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=
+is-weakmap@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/is-weakmap/-/is-weakmap-2.0.2.tgz#bf72615d649dfe5f699079c54b83e47d1ae19cfd"
+ integrity sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==
+
is-weakref@^1.0.1, is-weakref@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.0.2.tgz#9529f383a9338205e89765e0392efc2f100f06f2"
@@ -4714,16 +7252,43 @@ is-weakref@^1.0.1, is-weakref@^1.0.2:
dependencies:
call-bind "^1.0.2"
+is-weakref@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/is-weakref/-/is-weakref-1.1.1.tgz#eea430182be8d64174bd96bffbc46f21bf3f9293"
+ integrity sha512-6i9mGWSlqzNMEqpCp93KwRS1uUOodk2OJ6b+sq7ZPDSy2WuI5NFIxp/254TytR8ftefexkWn5xNiHUNpPOfSew==
+ dependencies:
+ call-bound "^1.0.3"
+
+is-weakset@^2.0.3:
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/is-weakset/-/is-weakset-2.0.4.tgz#c9f5deb0bc1906c6d6f1027f284ddf459249daca"
+ integrity sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==
+ dependencies:
+ call-bound "^1.0.3"
+ get-intrinsic "^1.2.6"
+
is-windows@^1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d"
integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==
+is-wsl@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271"
+ integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==
+ dependencies:
+ is-docker "^2.0.0"
+
isarray@0.0.1:
version "0.0.1"
resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
integrity sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=
+isarray@^2.0.5:
+ version "2.0.5"
+ resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.5.tgz#8af1e4c1221244cc62459faf38940d4e644a5723"
+ integrity sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==
+
isarray@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11"
@@ -4739,6 +7304,23 @@ isobject@^3.0.0, isobject@^3.0.1:
resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df"
integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8=
+isomorphic-git@1.37.6:
+ version "1.37.6"
+ resolved "https://registry.yarnpkg.com/isomorphic-git/-/isomorphic-git-1.37.6.tgz#8982cd13d1609668149322834e411a7596df6178"
+ integrity sha512-qr1NFCPsVTZ6YGqTXw0CzamnsHyH9QQ1OTEfeXIweSljRUMzuHFCJdUn0wc6OcjtTDns6knxjPb7N6LmJeftOA==
+ dependencies:
+ async-lock "^1.4.1"
+ clean-git-ref "^2.0.1"
+ crc-32 "^1.2.0"
+ diff3 "0.0.3"
+ ignore "^5.1.4"
+ minimisted "^2.0.0"
+ pako "^1.0.10"
+ pify "^4.0.1"
+ readable-stream "^4.0.0"
+ sha.js "^2.4.12"
+ simple-get "^4.0.1"
+
isstream@~0.1.2:
version "0.1.2"
resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
@@ -4755,11 +7337,30 @@ issue-parser@^6.0.0:
lodash.isstring "^4.0.1"
lodash.uniqby "^4.7.0"
+jackspeak@^3.1.2:
+ version "3.4.3"
+ resolved "https://registry.yarnpkg.com/jackspeak/-/jackspeak-3.4.3.tgz#8833a9d89ab4acde6188942bd1c53b6390ed5a8a"
+ integrity sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==
+ dependencies:
+ "@isaacs/cliui" "^8.0.2"
+ optionalDependencies:
+ "@pkgjs/parseargs" "^0.11.0"
+
java-properties@^1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/java-properties/-/java-properties-1.0.2.tgz#ccd1fa73907438a5b5c38982269d0e771fe78211"
integrity sha512-qjdpeo2yKlYTH7nFdK0vbZWuTCesk4o63v5iVOlhMQPfuIZQfW/HI35SjfhA+4qpg36rnFSvUK5b1m+ckIblQQ==
+jpeg-js@^0.4.1, jpeg-js@^0.4.4:
+ version "0.4.4"
+ resolved "https://registry.yarnpkg.com/jpeg-js/-/jpeg-js-0.4.4.tgz#a9f1c6f1f9f0fa80cdb3484ed9635054d28936aa"
+ integrity sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg==
+
+js-library-detector@^6.7.0:
+ version "6.7.0"
+ resolved "https://registry.yarnpkg.com/js-library-detector/-/js-library-detector-6.7.0.tgz#5075c71fcf835b71133bca13363b91509a39235a"
+ integrity sha512-c80Qupofp43y4cJ7+8TTDN/AsDwLi5oOm/plBrWI+iQt485vKXCco+yVmOwEgdo9VOdsYTuV0UlTeetVPTriXA==
+
"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
@@ -4773,6 +7374,14 @@ js-yaml@^3.13.1, js-yaml@~3.14.0:
argparse "^1.0.7"
esprima "^4.0.0"
+js-yaml@^3.15.0:
+ version "3.15.0"
+ resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.15.0.tgz#586e5214eafe3e893756a41e979b50d89d3e4a67"
+ integrity sha512-ttBQIIQPDeLjpPOohtUdXuXUVoA2uIB6fEH9HyJ7234s5mBJ5wTx20njxplLZQgLaOfpmPQA7X2t5AX6tIPbog==
+ dependencies:
+ argparse "^1.0.7"
+ esprima "^4.0.0"
+
jsbn@~0.1.0:
version "0.1.1"
resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513"
@@ -4807,6 +7416,11 @@ jshint@~2.10.2:
shelljs "0.3.x"
strip-json-comments "1.0.x"
+json-buffer@3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.1.tgz#9338802a30d3b6605fbe0613e094008ca8c05a13"
+ integrity sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==
+
json-parse-better-errors@^1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9"
@@ -4822,6 +7436,11 @@ json-schema-traverse@^0.4.1:
resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660"
integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==
+json-schema-traverse@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2"
+ integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==
+
json-schema@0.4.0:
version "0.4.0"
resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.4.0.tgz#f7de4cf6efab838ebaeb3236474cbba5a1930ab5"
@@ -4849,6 +7468,11 @@ json5@^2.2.1:
resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c"
integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==
+jsonc-parser@3.3.1:
+ version "3.3.1"
+ resolved "https://registry.yarnpkg.com/jsonc-parser/-/jsonc-parser-3.3.1.tgz#f2a524b4f7fd11e3d791e559977ad60b98b798b4"
+ integrity sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==
+
jsonfile@^6.0.1:
version "6.1.0"
resolved "https://registry.yarnpkg.com/jsonfile/-/jsonfile-6.1.0.tgz#bc55b2634793c679ec6403094eb13698a6ec0aae"
@@ -4863,6 +7487,22 @@ jsonparse@^1.2.0, jsonparse@^1.3.1:
resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280"
integrity sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=
+jsonwebtoken@^9.0.2:
+ version "9.0.3"
+ resolved "https://registry.yarnpkg.com/jsonwebtoken/-/jsonwebtoken-9.0.3.tgz#6cd57ab01e9b0ac07cb847d53d3c9b6ee31f7ae2"
+ integrity sha512-MT/xP0CrubFRNLNKvxJ2BYfy53Zkm++5bX9dtuPbqAeQpTVe0MQTFhao8+Cp//EmJp244xt6Drw/GVEGCUj40g==
+ dependencies:
+ jws "^4.0.1"
+ lodash.includes "^4.3.0"
+ lodash.isboolean "^3.0.3"
+ lodash.isinteger "^4.0.4"
+ lodash.isnumber "^3.0.3"
+ lodash.isplainobject "^4.0.6"
+ lodash.isstring "^4.0.1"
+ lodash.once "^4.0.0"
+ ms "^2.1.1"
+ semver "^7.5.4"
+
jsprim@^1.2.2:
version "1.4.2"
resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.2.tgz#712c65533a15c878ba59e9ed5f0e26d5b77c5feb"
@@ -4891,6 +7531,30 @@ just-diff@^3.0.1:
resolved "https://registry.yarnpkg.com/just-diff/-/just-diff-3.1.1.tgz#d50c597c6fd4776495308c63bdee1b6839082647"
integrity sha512-sdMWKjRq8qWZEjDcVA6llnUT8RDEBIfOiGpYFPYa9u+2c39JCsejktSP7mj5eRid5EIvTzIpQ2kDOCw1Nq9BjQ==
+jwa@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/jwa/-/jwa-2.0.1.tgz#bf8176d1ad0cd72e0f3f58338595a13e110bc804"
+ integrity sha512-hRF04fqJIP8Abbkq5NKGN0Bbr3JxlQ+qhZufXVr0DvujKy93ZCbXZMHDL4EOtodSbCWxOqR8MS1tXA5hwqCXDg==
+ dependencies:
+ buffer-equal-constant-time "^1.0.1"
+ ecdsa-sig-formatter "1.0.11"
+ safe-buffer "^5.0.1"
+
+jws@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/jws/-/jws-4.0.1.tgz#07edc1be8fac20e677b283ece261498bd38f0690"
+ integrity sha512-EKI/M/yqPncGUUh44xz0PxSidXFr/+r0pA70+gIYhjv+et7yxM+s29Y+VGDkovRofQem0fs7Uvf4+YmAdyRduA==
+ dependencies:
+ jwa "^2.0.1"
+ safe-buffer "^5.0.1"
+
+keyv@^4.0.0:
+ version "4.5.4"
+ resolved "https://registry.yarnpkg.com/keyv/-/keyv-4.5.4.tgz#a879a99e29452f942439f2a405e3af8b31d4de93"
+ integrity sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==
+ dependencies:
+ json-buffer "3.0.1"
+
kind-of@^6.0.2, kind-of@^6.0.3:
version "6.0.3"
resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd"
@@ -4908,6 +7572,11 @@ language-tags@^1.0.5:
dependencies:
language-subtag-registry "~0.3.2"
+legacy-javascript@latest:
+ version "0.0.1"
+ resolved "https://registry.yarnpkg.com/legacy-javascript/-/legacy-javascript-0.0.1.tgz#6bf2ac6b70b4555d9e4bfe9e4fc81675fede88cf"
+ integrity sha512-lPyntS4/aS7jpuvOlitZDFifBCb4W8L/3QU0PLbUTUj+zYah8rfVjYic88yG7ZKTxhS5h9iz7duT8oUXKszLhg==
+
libnpmaccess@^4.0.2:
version "4.0.3"
resolved "https://registry.yarnpkg.com/libnpmaccess/-/libnpmaccess-4.0.3.tgz#dfb0e5b0a53c315a2610d300e46b4ddeb66e7eec"
@@ -5032,6 +7701,52 @@ liftup@~3.0.1:
rechoir "^0.7.0"
resolve "^1.19.0"
+lighthouse-logger@^2.0.1, lighthouse-logger@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/lighthouse-logger/-/lighthouse-logger-2.0.2.tgz#c0b39daee22035ce28551f3503c5935d0b5e1bf3"
+ integrity sha512-vWl2+u5jgOQuZR55Z1WM0XDdrJT6mzMP8zHUct7xTlWhuQs+eV0g+QL0RQdFjT54zVmbhLCP8vIVpy1wGn/gCg==
+ dependencies:
+ debug "^4.4.1"
+ marky "^1.2.2"
+
+lighthouse-stack-packs@1.12.2:
+ version "1.12.2"
+ resolved "https://registry.yarnpkg.com/lighthouse-stack-packs/-/lighthouse-stack-packs-1.12.2.tgz#dbe0ccdbc381784ef176f4f8c2367ac5b077d6ca"
+ integrity sha512-Ug8feS/A+92TMTCK6yHYLwaFMuelK/hAKRMdldYkMNwv+d9PtWxjXEg6rwKtsUXTADajhdrhXyuNCJ5/sfmPFw==
+
+lighthouse@^12.2.2:
+ version "12.8.2"
+ resolved "https://registry.yarnpkg.com/lighthouse/-/lighthouse-12.8.2.tgz#b55eb747148f807987f0e4c518f5fc4d97b7e230"
+ integrity sha512-+5SKYzVaTFj22MgoYDPNrP9tlD2/Ay7j3SxPSFD9FpPyVxGr4UtOQGKyrdZ7wCmcnBaFk0mCkPfARU3CsE0nvA==
+ dependencies:
+ "@paulirish/trace_engine" "0.0.59"
+ "@sentry/node" "^9.28.1"
+ axe-core "^4.10.3"
+ chrome-launcher "^1.2.0"
+ configstore "^7.0.0"
+ csp_evaluator "1.1.5"
+ devtools-protocol "0.0.1507524"
+ enquirer "^2.3.6"
+ http-link-header "^1.1.1"
+ intl-messageformat "^10.5.3"
+ jpeg-js "^0.4.4"
+ js-library-detector "^6.7.0"
+ lighthouse-logger "^2.0.2"
+ lighthouse-stack-packs "1.12.2"
+ lodash-es "^4.17.21"
+ lookup-closest-locale "6.2.0"
+ metaviewport-parser "0.3.0"
+ open "^8.4.0"
+ parse-cache-control "1.0.1"
+ puppeteer-core "^24.17.1"
+ robots-parser "^3.0.1"
+ speedline-core "^1.4.3"
+ third-party-web "^0.27.0"
+ tldts-icann "^7.0.12"
+ ws "^7.0.0"
+ yargs "^17.3.1"
+ yargs-parser "^21.0.0"
+
lines-and-columns@^1.1.6:
version "1.2.4"
resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632"
@@ -5078,6 +7793,11 @@ locate-path@^5.0.0:
dependencies:
p-locate "^4.1.0"
+lodash-es@^4.17.21:
+ version "4.18.1"
+ resolved "https://registry.yarnpkg.com/lodash-es/-/lodash-es-4.18.1.tgz#b962eeb80d9d983a900bf342961fb7418ca10b1d"
+ integrity sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==
+
lodash.capitalize@^4.2.1:
version "4.2.1"
resolved "https://registry.yarnpkg.com/lodash.capitalize/-/lodash.capitalize-4.2.1.tgz#f826c9b4e2a8511d84e3aca29db05e1a4f3b72a9"
@@ -5093,11 +7813,31 @@ lodash.escaperegexp@^4.1.2:
resolved "https://registry.yarnpkg.com/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz#64762c48618082518ac3df4ccf5d5886dae20347"
integrity sha1-ZHYsSGGAglGKw99Mz11YhtriA0c=
+lodash.includes@^4.3.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/lodash.includes/-/lodash.includes-4.3.0.tgz#60bb98a87cb923c68ca1e51325483314849f553f"
+ integrity sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==
+
+lodash.isboolean@^3.0.3:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz#6c2e171db2a257cd96802fd43b01b20d5f5870f6"
+ integrity sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==
+
+lodash.isinteger@^4.0.4:
+ version "4.0.4"
+ resolved "https://registry.yarnpkg.com/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz#619c0af3d03f8b04c31f5882840b77b11cd68343"
+ integrity sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==
+
lodash.ismatch@^4.4.0:
version "4.4.0"
resolved "https://registry.yarnpkg.com/lodash.ismatch/-/lodash.ismatch-4.4.0.tgz#756cb5150ca3ba6f11085a78849645f188f85f37"
integrity sha1-dWy1FQyjum8RCFp4hJZF8Yj4Xzc=
+lodash.isnumber@^3.0.3:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz#3ce76810c5928d03352301ac287317f11c0b1ffc"
+ integrity sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==
+
lodash.isplainobject@^4.0.6:
version "4.0.6"
resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb"
@@ -5113,6 +7853,11 @@ lodash.memoize@^4.1.2:
resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe"
integrity sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=
+lodash.once@^4.0.0:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/lodash.once/-/lodash.once-4.1.1.tgz#0dd3971213c7c56df880977d504c88fb471a97ac"
+ integrity sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==
+
lodash.uniq@^4.5.0:
version "4.5.0"
resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773"
@@ -5128,11 +7873,23 @@ lodash@^4.17.10, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.21, lodash@^4.17
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
+log-symbols@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/log-symbols/-/log-symbols-3.0.0.tgz#f3a08516a5dea893336a7dee14d18a1cfdab77c4"
+ integrity sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==
+ dependencies:
+ chalk "^2.4.2"
+
longest-streak@^2.0.0:
version "2.0.4"
resolved "https://registry.yarnpkg.com/longest-streak/-/longest-streak-2.0.4.tgz#b8599957da5b5dab64dee3fe316fa774597d90e4"
integrity sha512-vM6rUVCVUJJt33bnmHiZEvr7wPT78ztX7rojL+LW51bHtLh6HTjx84LA5W4+oa6aKEJA7jJu5LR6vQRBpA5DVg==
+lookup-closest-locale@6.2.0:
+ version "6.2.0"
+ resolved "https://registry.yarnpkg.com/lookup-closest-locale/-/lookup-closest-locale-6.2.0.tgz#57f665e604fd26f77142d48152015402b607bcf3"
+ integrity sha512-/c2kL+Vnp1jnV6K6RpDTHK3dgg0Tu2VVp+elEiJpjfS1UyY7AjOYHohRug6wT0OpoX2qFgNORndE9RqesfVxWQ==
+
loose-envify@^1.1.0, loose-envify@^1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf"
@@ -5155,6 +7912,16 @@ lower-case@^2.0.2:
dependencies:
tslib "^2.0.3"
+lowercase-keys@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479"
+ integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==
+
+lru-cache@^10.2.0:
+ version "10.4.3"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-10.4.3.tgz#410fc8a17b70e598013df257c2446b7f3383f119"
+ integrity sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==
+
lru-cache@^6.0.0:
version "6.0.0"
resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94"
@@ -5162,6 +7929,16 @@ lru-cache@^6.0.0:
dependencies:
yallist "^4.0.0"
+lru-cache@^7.14.1:
+ version "7.18.3"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-7.18.3.tgz#f793896e0fd0e954a59dfdd82f0773808df6aa89"
+ integrity sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==
+
+"lru-cache@npm:@wolfy1339/lru-cache@^11.0.2-patch.1":
+ version "11.0.2-patch.1"
+ resolved "https://registry.yarnpkg.com/@wolfy1339/lru-cache/-/lru-cache-11.0.2-patch.1.tgz#bb648b660478099c9022ee71a00b80603daf7294"
+ integrity sha512-BgYZfL2ADCXKOw2wJtkM3slhHotawWkgIRRxq4wEybnZQPjvAp71SPX35xepMykTw8gXlzWcWPTY31hlbnRsDA==
+
make-fetch-happen@^9.0.1, make-fetch-happen@^9.1.0:
version "9.1.0"
resolved "https://registry.yarnpkg.com/make-fetch-happen/-/make-fetch-happen-9.1.0.tgz#53085a09e7971433e6765f7971bf63f4e05cb968"
@@ -5230,6 +8007,16 @@ marked@^2.0.0:
resolved "https://registry.yarnpkg.com/marked/-/marked-2.1.3.tgz#bd017cef6431724fd4b27e0657f5ceb14bff3753"
integrity sha512-/Q+7MGzaETqifOMWYEA7HVMaZb4XbcRfaOzcSsHZEith83KGlvaSG33u0SKu89Mj5h+T8V2hM+8O45Qc5XTgwA==
+marky@^1.2.2:
+ version "1.3.0"
+ resolved "https://registry.yarnpkg.com/marky/-/marky-1.3.0.tgz#422b63b0baf65022f02eda61a238eccdbbc14997"
+ integrity sha512-ocnPZQLNpvbedwTy9kNrQEsknEfgvcLMvOtz3sFeWApDq1MXH1TqkCIx58xlpESsfwQOnuBO9beyQuNGzVvuhQ==
+
+math-intrinsics@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/math-intrinsics/-/math-intrinsics-1.1.0.tgz#a0dd74be81e2aa5c2f27e65ce283605ee4e2b7f9"
+ integrity sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==
+
maxmin@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/maxmin/-/maxmin-1.1.0.tgz#71365e84a99dd8f8b3f7d5fde2f00d1e7f73be61"
@@ -5329,6 +8116,16 @@ mdn-data@2.0.4:
resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.4.tgz#699b3c38ac6f1d728091a64650b65d388502fd5b"
integrity sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==
+media-typer@0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748"
+ integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==
+
+memorystream@^0.3.1:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/memorystream/-/memorystream-0.3.1.tgz#86d7090b30ce455d63fbae12dda51a47ddcaf9b2"
+ integrity sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==
+
meow@^3.1.0:
version "3.7.0"
resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb"
@@ -5362,6 +8159,11 @@ meow@^8.0.0:
type-fest "^0.18.0"
yargs-parser "^20.2.3"
+merge-descriptors@1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.3.tgz#d80319a65f3c7935351e5cfdac8f9318504dbed5"
+ integrity sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==
+
merge-stream@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60"
@@ -5372,6 +8174,16 @@ merge2@^1.3.0, merge2@^1.4.1:
resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae"
integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==
+metaviewport-parser@0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/metaviewport-parser/-/metaviewport-parser-0.3.0.tgz#6af1e99b5eaf250c049e0af1e84143a39750dea6"
+ integrity sha512-EoYJ8xfjQ6kpe9VbVHvZTZHiOl4HL1Z18CrZ+qahvLXT7ZO4YTC2JMyt5FaUp9JJp6J4Ybb/z7IsCXZt86/QkQ==
+
+methods@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee"
+ integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==
+
micromark-extension-gfm-autolink-literal@~0.5.0:
version "0.5.7"
resolved "https://registry.yarnpkg.com/micromark-extension-gfm-autolink-literal/-/micromark-extension-gfm-autolink-literal-0.5.7.tgz#53866c1f0c7ef940ae7ca1f72c6faef8fed9f204"
@@ -5446,23 +8258,43 @@ mime-db@1.52.0:
resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70"
integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==
-mime-types@^2.1.12, mime-types@~2.1.19:
+mime-types@^2.1.12, mime-types@~2.1.19, mime-types@~2.1.24, mime-types@~2.1.34:
version "2.1.35"
resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a"
integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==
dependencies:
mime-db "1.52.0"
+mime@1.6.0:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1"
+ integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
+
mime@^2.4.3:
version "2.6.0"
resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367"
integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==
+mime@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/mime/-/mime-3.0.0.tgz#b374550dca3a0c18443b0c950a6a58f1931cf7a7"
+ integrity sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==
+
mimic-fn@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==
+mimic-response@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b"
+ integrity sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==
+
+mimic-response@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9"
+ integrity sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==
+
min-indent@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/min-indent/-/min-indent-1.0.1.tgz#a63f681673b30571fbe8bc25686ae746eefa9869"
@@ -5475,6 +8307,13 @@ min-indent@^1.0.0:
dependencies:
brace-expansion "^1.1.7"
+minimatch@^9.0.0, minimatch@^9.0.4:
+ version "9.0.9"
+ resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-9.0.9.tgz#9b0cb9fcb78087f6fd7eababe2511c4d3d60574e"
+ integrity sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==
+ dependencies:
+ brace-expansion "^2.0.2"
+
minimatch@~3.0.2, minimatch@~3.0.4:
version "3.0.8"
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.8.tgz#5e6a59bd11e2ab0de1cfb843eb2d82e546c321c1"
@@ -5496,6 +8335,13 @@ minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6:
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.8.tgz#c1a464e7693302e082a075cee0c057741ac4772c"
integrity sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==
+minimisted@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/minimisted/-/minimisted-2.0.1.tgz#d059fb905beecf0774bc3b308468699709805cb1"
+ integrity sha512-1oPjfuLQa2caorJUM8HV8lGgWCc0qqAO1MNv/k05G4qslmsndV/5WdNZrqCiyqiz3wohia2Ij2B7w2Dr7/IyrA==
+ dependencies:
+ minimist "^1.2.5"
+
minipass-collect@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz#22b813bf745dc6edba2576b940022ad6edc8c617"
@@ -5550,6 +8396,11 @@ minipass@^3.0.0, minipass@^3.1.0, minipass@^3.1.1, minipass@^3.1.3:
dependencies:
yallist "^4.0.0"
+"minipass@^5.0.0 || ^6.0.2 || ^7.0.0", minipass@^7.1.2:
+ version "7.1.3"
+ resolved "https://registry.yarnpkg.com/minipass/-/minipass-7.1.3.tgz#79389b4eb1bb2d003a9bba87d492f2bd37bdc65b"
+ integrity sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A==
+
minizlib@^2.0.0, minizlib@^2.1.1:
version "2.1.2"
resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931"
@@ -5558,6 +8409,11 @@ minizlib@^2.0.0, minizlib@^2.1.1:
minipass "^3.0.0"
yallist "^4.0.0"
+mitt@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/mitt/-/mitt-3.0.1.tgz#ea36cf0cc30403601ae074c8f77b7092cdab36d1"
+ integrity sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==
+
mkdirp-infer-owner@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/mkdirp-infer-owner/-/mkdirp-infer-owner-2.0.0.tgz#55d3b368e7d89065c38f32fd38e638f0ab61d316"
@@ -5584,6 +8440,11 @@ modify-values@^1.0.0:
resolved "https://registry.yarnpkg.com/modify-values/-/modify-values-1.0.1.tgz#b3939fa605546474e3e3e3c63d64bd43b4ee6022"
integrity sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw==
+module-details-from-path@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/module-details-from-path/-/module-details-from-path-1.0.4.tgz#b662fdcd93f6c83d3f25289da0ce81c8d9685b94"
+ integrity sha512-EGWKgxALGMgzvxYF1UyGTy0HXX/2vHLkw6+NvDKW2jypWbHpjQuj4UMcqQWXHERJhVGKikolT06G3bcKe4fi7w==
+
ms@2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
@@ -5594,17 +8455,27 @@ ms@2.1.2:
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
-ms@^2.0.0, ms@^2.1.1, ms@^2.1.2:
+ms@2.1.3, ms@^2.0.0, ms@^2.1.1, ms@^2.1.2, ms@^2.1.3:
version "2.1.3"
resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2"
integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
-mute-stream@~0.0.4:
+mute-stream@0.0.8, mute-stream@~0.0.4:
version "0.0.8"
resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d"
integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==
-negotiator@^0.6.2:
+mute-stream@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-2.0.0.tgz#a5446fc0c512b71c83c44d908d5c7b7b4c493b2b"
+ integrity sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA==
+
+nan@^2.24.0:
+ version "2.28.0"
+ resolved "https://registry.yarnpkg.com/nan/-/nan-2.28.0.tgz#126717fd359d5a03d3edf7c44e6ce9b707fb57f5"
+ integrity sha512-fTsDz99OTq2sVePhGdp4qQhggZFtKr64ZNVyVajRKtMOkJxYekplBh577PiJB12v/D3s2E5cGtOI45LWp6rnLQ==
+
+negotiator@0.6.3, negotiator@^0.6.2:
version "0.6.3"
resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd"
integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==
@@ -5619,6 +8490,16 @@ nerf-dart@^1.0.0:
resolved "https://registry.yarnpkg.com/nerf-dart/-/nerf-dart-1.0.0.tgz#e6dab7febf5ad816ea81cf5c629c5a0ebde72c1a"
integrity sha1-5tq3/r9a2Bbqgc9cYpxaDr3nLBo=
+netmask@^2.0.2:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/netmask/-/netmask-2.1.1.tgz#80043d265b53aa521b3bd01e8fcdf353f9e1e81e"
+ integrity sha512-eonl3sLUha+S1GzTPxychyhnUzKyeQkZ7jLjKrBagJgPla13F+uQ71HgpFefyHgqrjEbCPkDArxYsjY8/+gLKA==
+
+nice-try@^1.0.4:
+ version "1.0.5"
+ resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366"
+ integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==
+
no-case@^3.0.4:
version "3.0.4"
resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d"
@@ -5719,7 +8600,7 @@ normalize-url@^3.0.0:
resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz#b2e1c4dc4f7c6d57743df733a4f5978d18650559"
integrity sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==
-normalize-url@^6.0.0:
+normalize-url@^6.0.0, normalize-url@^6.0.1:
version "6.1.0"
resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a"
integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==
@@ -5798,6 +8679,21 @@ npm-registry-fetch@^11.0.0:
minizlib "^2.0.0"
npm-package-arg "^8.0.0"
+npm-run-all@^4.1.5:
+ version "4.1.5"
+ resolved "https://registry.yarnpkg.com/npm-run-all/-/npm-run-all-4.1.5.tgz#04476202a15ee0e2e214080861bff12a51d98fba"
+ integrity sha512-Oo82gJDAVcaMdi3nuoKFavkIHBRVqQ1qvMb+9LHk/cF4P6B2m8aP04hGf7oL6wZ9BuGwX1onlLhpuoofSyoQDQ==
+ dependencies:
+ ansi-styles "^3.2.1"
+ chalk "^2.4.1"
+ cross-spawn "^6.0.5"
+ memorystream "^0.3.1"
+ minimatch "^3.0.4"
+ pidtree "^0.3.0"
+ read-pkg "^3.0.0"
+ shell-quote "^1.6.1"
+ string.prototype.padend "^3.0.0"
+
npm-run-path@^4.0.0, npm-run-path@^4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea"
@@ -5943,6 +8839,11 @@ object-inspect@^1.12.0:
resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.12.2.tgz#c0641f26394532f28ab8d796ab954e43c009a8ea"
integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==
+object-inspect@^1.13.3, object-inspect@^1.13.4:
+ version "1.13.4"
+ resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.13.4.tgz#8375265e21bc20d0fa582c22e1b13485d6e00213"
+ integrity sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==
+
object-keys@^1.0.12, object-keys@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e"
@@ -5968,6 +8869,18 @@ object.assign@^4.1.2:
has-symbols "^1.0.1"
object-keys "^1.1.1"
+object.assign@^4.1.7:
+ version "4.1.7"
+ resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.7.tgz#8c14ca1a424c6a561b0bb2a22f66f5049a945d3d"
+ integrity sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==
+ dependencies:
+ call-bind "^1.0.8"
+ call-bound "^1.0.3"
+ define-properties "^1.2.1"
+ es-object-atoms "^1.0.0"
+ has-symbols "^1.1.0"
+ object-keys "^1.1.1"
+
object.defaults@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/object.defaults/-/object.defaults-1.1.0.tgz#3a7f868334b407dea06da16d88d5cd29e435fecf"
@@ -6037,6 +8950,29 @@ object.values@^1.1.0, object.values@^1.1.5:
define-properties "^1.1.3"
es-abstract "^1.19.1"
+octokit@3.1.2:
+ version "3.1.2"
+ resolved "https://registry.yarnpkg.com/octokit/-/octokit-3.1.2.tgz#e574e4f2f5f8712e10412ce81fb56a74c93d4cfa"
+ integrity sha512-MG5qmrTL5y8KYwFgE1A4JWmgfQBaIETE/lOlfwNYx1QOtCQHGVxkRJmdUJltFc1HVn73d61TlMhMyNTOtMl+ng==
+ dependencies:
+ "@octokit/app" "^14.0.2"
+ "@octokit/core" "^5.0.0"
+ "@octokit/oauth-app" "^6.0.0"
+ "@octokit/plugin-paginate-graphql" "^4.0.0"
+ "@octokit/plugin-paginate-rest" "^9.0.0"
+ "@octokit/plugin-rest-endpoint-methods" "^10.0.0"
+ "@octokit/plugin-retry" "^6.0.0"
+ "@octokit/plugin-throttling" "^8.0.0"
+ "@octokit/request-error" "^5.0.0"
+ "@octokit/types" "^12.0.0"
+
+on-finished@~2.4.1:
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f"
+ integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==
+ dependencies:
+ ee-first "1.1.1"
+
once@^1.3.0, once@^1.3.1, once@^1.4.0:
version "1.4.0"
resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
@@ -6051,11 +8987,34 @@ onetime@^5.1.0, onetime@^5.1.2:
dependencies:
mimic-fn "^2.1.0"
+open@^8.4.0:
+ version "8.4.2"
+ resolved "https://registry.yarnpkg.com/open/-/open-8.4.2.tgz#5b5ffe2a8f793dcd2aad73e550cb87b59cb084f9"
+ 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.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598"
integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==
+ora@^4.0.2:
+ version "4.1.1"
+ resolved "https://registry.yarnpkg.com/ora/-/ora-4.1.1.tgz#566cc0348a15c36f5f0e979612842e02ba9dddbc"
+ integrity sha512-sjYP8QyVWBpBZWD6Vr1M/KwknSw6kJOz41tvGMlwWeClHBtYKTbHMki1PsLZnxKpXMPbTKv9b3pjQu3REib96A==
+ dependencies:
+ chalk "^3.0.0"
+ cli-cursor "^3.1.0"
+ cli-spinners "^2.2.0"
+ is-interactive "^1.0.0"
+ log-symbols "^3.0.0"
+ mute-stream "0.0.8"
+ strip-ansi "^6.0.0"
+ wcwidth "^1.0.1"
+
os-homedir@^1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3"
@@ -6074,6 +9033,21 @@ osenv@^0.1.4:
os-homedir "^1.0.0"
os-tmpdir "^1.0.0"
+own-keys@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/own-keys/-/own-keys-1.0.2.tgz#31448ec1f781ecb1447f6f6aa0d6534222af59de"
+ integrity sha512-19YVAg7T+WTrxggPukVq7DjTv6+PJ867TmhCvBsYwmbFCsZd344rq2Ld1p0wo8f8Qrrhgp82c6FJRqdXWtSEhg==
+ dependencies:
+ call-bound "^1.0.4"
+ get-intrinsic "^1.3.0"
+ object-keys "^1.1.1"
+ safe-push-apply "^1.0.0"
+
+p-cancelable@^2.0.0:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/p-cancelable/-/p-cancelable-2.1.1.tgz#aab7fbd416582fa32a3db49859c122487c5ed2cf"
+ integrity sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==
+
p-each-series@^2.1.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/p-each-series/-/p-each-series-2.2.0.tgz#105ab0357ce72b202a8a8b94933672657b5e2a9a"
@@ -6154,6 +9128,33 @@ p-try@^2.0.0:
resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6"
integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==
+pac-proxy-agent@^7.1.0:
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/pac-proxy-agent/-/pac-proxy-agent-7.2.0.tgz#9cfaf33ff25da36f6147a20844230ec92c06e5df"
+ integrity sha512-TEB8ESquiLMc0lV8vcd5Ql/JAKAoyzHFXaStwjkzpOpC5Yv+pIzLfHvjTSdf3vpa2bMiUQrg9i6276yn8666aA==
+ dependencies:
+ "@tootallnate/quickjs-emscripten" "^0.23.0"
+ agent-base "^7.1.2"
+ debug "^4.3.4"
+ get-uri "^6.0.1"
+ http-proxy-agent "^7.0.0"
+ https-proxy-agent "^7.0.6"
+ pac-resolver "^7.0.1"
+ socks-proxy-agent "^8.0.5"
+
+pac-resolver@^7.0.1:
+ version "7.0.1"
+ resolved "https://registry.yarnpkg.com/pac-resolver/-/pac-resolver-7.0.1.tgz#54675558ea368b64d210fd9c92a640b5f3b8abb6"
+ integrity sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==
+ dependencies:
+ degenerator "^5.0.0"
+ netmask "^2.0.2"
+
+package-json-from-dist@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz#4f1471a010827a86f94cfd9b0727e36d267de505"
+ integrity sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==
+
pacote@^11.1.11, pacote@^11.2.6, pacote@^11.3.0, pacote@^11.3.1, pacote@^11.3.5:
version "11.3.5"
resolved "https://registry.yarnpkg.com/pacote/-/pacote-11.3.5.tgz#73cf1fc3772b533f575e39efa96c50be8c3dc9d2"
@@ -6179,6 +9180,11 @@ pacote@^11.1.11, pacote@^11.2.6, pacote@^11.3.0, pacote@^11.3.1, pacote@^11.3.5:
ssri "^8.0.1"
tar "^6.1.0"
+pako@^1.0.10:
+ version "1.0.11"
+ resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz#6c9599d340d54dfd3946380252a35705a6b992bf"
+ integrity sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==
+
pako@~0.2.0:
version "0.2.9"
resolved "https://registry.yarnpkg.com/pako/-/pako-0.2.9.tgz#f3f7522f4ef782348da8161bad9ecfd51bf83a75"
@@ -6199,6 +9205,11 @@ parent-module@^1.0.0:
dependencies:
callsites "^3.0.0"
+parse-cache-control@1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/parse-cache-control/-/parse-cache-control-1.0.1.tgz#8eeab3e54fa56920fe16ba38f77fa21aacc2d74e"
+ integrity sha512-60zvsJReQPX5/QP0Kzfd/VrpjScIQ7SHBW6bFCYfEP+fp0Eppr1SHhIO5nd1PjZtvclzSzES9D/p5nFJurwfWg==
+
parse-conflict-json@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/parse-conflict-json/-/parse-conflict-json-1.1.1.tgz#54ec175bde0f2d70abf6be79e0e042290b86701b"
@@ -6264,6 +9275,11 @@ parse-passwd@^1.0.0:
resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6"
integrity sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=
+parseurl@~1.3.3:
+ version "1.3.3"
+ resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4"
+ integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==
+
pascal-case@^3.1.2:
version "3.1.2"
resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-3.1.2.tgz#b48e0ef2b98e205e7c1dae747d0b1508237660eb"
@@ -6297,11 +9313,21 @@ path-exists@^4.0.0:
resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3"
integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==
+path-expression-matcher@^1.6.2:
+ version "1.6.2"
+ resolved "https://registry.yarnpkg.com/path-expression-matcher/-/path-expression-matcher-1.6.2.tgz#567c73c07197e9dcef24e90edcdc571056599168"
+ integrity sha512-enSlaiat05iasnzmgNxRj8reFdj3puY2QpNgP1aPIaVfT6nn9ICuPoFlKHk8EN22HcwewshO+mN2DGbkCEOtqQ==
+
path-is-absolute@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18=
+path-key@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40"
+ integrity sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==
+
path-key@^3.0.0, path-key@^3.1.0:
version "3.1.1"
resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375"
@@ -6324,6 +9350,19 @@ path-root@^0.1.1:
dependencies:
path-root-regex "^0.1.0"
+path-scurry@^1.11.1:
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/path-scurry/-/path-scurry-1.11.1.tgz#7960a668888594a0720b12a911d1a742ab9f11d2"
+ integrity sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==
+ dependencies:
+ lru-cache "^10.2.0"
+ minipass "^5.0.0 || ^6.0.2 || ^7.0.0"
+
+path-to-regexp@~0.1.12:
+ version "0.1.13"
+ resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.13.tgz#9b22ec16bc3ab88d05a0c7e369869421401ab17d"
+ integrity sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA==
+
path-type@^1.0.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441"
@@ -6333,16 +9372,49 @@ path-type@^1.0.0:
pify "^2.0.0"
pinkie-promise "^2.0.0"
+path-type@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f"
+ integrity sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==
+ dependencies:
+ pify "^3.0.0"
+
path-type@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b"
integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==
+pend@~1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50"
+ integrity sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==
+
performance-now@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b"
integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==
+pg-int8@1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/pg-int8/-/pg-int8-1.0.1.tgz#943bd463bf5b71b4170115f80f8efc9a0c0eb78c"
+ integrity sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==
+
+pg-protocol@*:
+ version "1.15.0"
+ resolved "https://registry.yarnpkg.com/pg-protocol/-/pg-protocol-1.15.0.tgz#758f6c0679cc0bbf4938603b7597703f333180c0"
+ integrity sha512-cq9sECI5s0+uPUXjbz8ioyPJni6RzsRib0US67i5IoTZKw8fNeYlVE7u8F4dG7vEJJtc5wdD1K189lCCUwqWTQ==
+
+pg-types@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/pg-types/-/pg-types-2.2.0.tgz#2d0250d636454f7cfa3b6ae0382fdfa8063254a3"
+ integrity sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==
+ dependencies:
+ pg-int8 "1.0.1"
+ postgres-array "~2.0.0"
+ postgres-bytea "~1.0.0"
+ postgres-date "~1.0.4"
+ postgres-interval "^1.1.0"
+
picocolors@^0.2.1:
version "0.2.1"
resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-0.2.1.tgz#570670f793646851d1ba135996962abad587859f"
@@ -6358,6 +9430,11 @@ picomatch@^2.0.5, picomatch@^2.2.3:
resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42"
integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
+pidtree@^0.3.0:
+ version "0.3.1"
+ resolved "https://registry.yarnpkg.com/pidtree/-/pidtree-0.3.1.tgz#ef09ac2cc0533df1f3250ccf2c4d366b0d12114a"
+ integrity sha512-qQbW94hLHEqCg7nhby4yRC7G2+jYHY4Rguc2bjw7Uug4GIJuu1tvf2uHaZv5Q8zdt+WKJ6qK1FOI6amaWUo5FA==
+
pify@^2.0.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c"
@@ -6368,6 +9445,11 @@ pify@^3.0.0:
resolved "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz#e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176"
integrity sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=
+pify@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231"
+ integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==
+
pinkie-promise@^2.0.0:
version "2.0.1"
resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa"
@@ -6388,11 +9470,30 @@ pkg-conf@^2.1.0:
find-up "^2.0.0"
load-json-file "^4.0.0"
+playwright-core@1.61.1:
+ version "1.61.1"
+ resolved "https://registry.yarnpkg.com/playwright-core/-/playwright-core-1.61.1.tgz#3c99841307efbbabc9d724c41a88c914705d15fc"
+ integrity sha512-h7Qlt6m4REp25qvIdvbDtVmD4LqVXfpRxhORv9L0jzETM05p4fuPJ3dKyuSXQxDSbXnmS79HAgi9589lGSpLkg==
+
+playwright@1.61.1:
+ version "1.61.1"
+ resolved "https://registry.yarnpkg.com/playwright/-/playwright-1.61.1.tgz#d8c0c06eb93c28981afc747bace453bdbd5018bc"
+ integrity sha512-DWnY5o3YbLWK4GovuAVwpqL+1VwGNdUGrRr++8j8PtQQzvAVZUIMjKQ90fY689sEJZJBbZVw1rXaOKSTitkzPQ==
+ dependencies:
+ playwright-core "1.61.1"
+ optionalDependencies:
+ fsevents "2.3.2"
+
plur@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/plur/-/plur-1.0.0.tgz#db85c6814f5e5e5a3b49efc28d604fec62975156"
integrity sha1-24XGgU9eXlo7Se/CjWBP7GKXUVY=
+possible-typed-array-names@^1.0.0, possible-typed-array-names@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz#93e3582bc0e5426586d9d07b79ee40fc841de4ae"
+ integrity sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==
+
postcss-calc@^7.0.1:
version "7.0.5"
resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-7.0.5.tgz#f8a6e99f12e619c2ebc23cf6c486fdc15860933e"
@@ -6683,6 +9784,28 @@ postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.27, postcss@^7.0.32:
picocolors "^0.2.1"
source-map "^0.6.1"
+postgres-array@~2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/postgres-array/-/postgres-array-2.0.0.tgz#48f8fce054fbc69671999329b8834b772652d82e"
+ integrity sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==
+
+postgres-bytea@~1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/postgres-bytea/-/postgres-bytea-1.0.1.tgz#c40b3da0222c500ff1e51c5d7014b60b79697c7a"
+ integrity sha512-5+5HqXnsZPE65IJZSMkZtURARZelel2oXUEO8rH83VS/hxH5vv1uHquPg5wZs8yMAfdv971IU+kcPUczi7NVBQ==
+
+postgres-date@~1.0.4:
+ version "1.0.7"
+ resolved "https://registry.yarnpkg.com/postgres-date/-/postgres-date-1.0.7.tgz#51bc086006005e5061c591cee727f2531bf641a8"
+ integrity sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==
+
+postgres-interval@^1.1.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/postgres-interval/-/postgres-interval-1.2.0.tgz#b460c82cb1587507788819a06aa0fffdb3544695"
+ integrity sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==
+ dependencies:
+ xtend "^4.0.0"
+
prettier-linter-helpers@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz#d23d41fe1375646de2d0104d3454a3008802cf7b"
@@ -6717,6 +9840,16 @@ process-nextick-args@~2.0.0:
resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2"
integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==
+process@^0.11.10:
+ version "0.11.10"
+ resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
+ integrity sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==
+
+progress@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8"
+ integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==
+
promise-all-reject-late@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/promise-all-reject-late/-/promise-all-reject-late-1.0.1.tgz#f8ebf13483e5ca91ad809ccc2fcf25f26f8643c2"
@@ -6756,6 +9889,33 @@ prop-types@^15.8.1:
object-assign "^4.1.1"
react-is "^16.13.1"
+proxy-addr@~2.0.7:
+ version "2.0.7"
+ resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.7.tgz#f19fe69ceab311eeb94b42e70e8c2070f9ba1025"
+ integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==
+ dependencies:
+ forwarded "0.2.0"
+ ipaddr.js "1.9.1"
+
+proxy-agent@^6.5.0:
+ version "6.5.0"
+ resolved "https://registry.yarnpkg.com/proxy-agent/-/proxy-agent-6.5.0.tgz#9e49acba8e4ee234aacb539f89ed9c23d02f232d"
+ integrity sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==
+ dependencies:
+ agent-base "^7.1.2"
+ debug "^4.3.4"
+ http-proxy-agent "^7.0.1"
+ https-proxy-agent "^7.0.6"
+ lru-cache "^7.14.1"
+ pac-proxy-agent "^7.1.0"
+ proxy-from-env "^1.1.0"
+ socks-proxy-agent "^8.0.5"
+
+proxy-from-env@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2"
+ integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==
+
psl@^1.1.28:
version "1.8.0"
resolved "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz#9326f8bcfb013adcc005fdff056acce020e51c24"
@@ -6774,6 +9934,19 @@ punycode@^2.1.0, punycode@^2.1.1:
resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==
+puppeteer-core@^24.17.1:
+ version "24.43.1"
+ resolved "https://registry.yarnpkg.com/puppeteer-core/-/puppeteer-core-24.43.1.tgz#c10a5d398b69911c324e04c85ee2b236b9ec940e"
+ integrity sha512-T5ScUMAsmhdNbgDR41AGESYeS6V9MSgetkSnVhhW+gXvzC42VesKCn5ld87gAZDJ6vLHL9GkRvY9WtQWSnwFbw==
+ dependencies:
+ "@puppeteer/browsers" "2.13.2"
+ chromium-bidi "14.0.0"
+ debug "^4.4.3"
+ devtools-protocol "0.0.1608973"
+ typed-query-selector "^2.12.2"
+ webdriver-bidi-protocol "0.4.1"
+ ws "^8.20.0"
+
q@^1.1.2, q@^1.5.1:
version "1.5.1"
resolved "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz#7e32f75b41381291d04611f1bf14109ac00651d7"
@@ -6791,6 +9964,14 @@ qs@^6.4.0:
dependencies:
side-channel "^1.0.4"
+qs@~6.15.1:
+ version "6.15.3"
+ resolved "https://registry.yarnpkg.com/qs/-/qs-6.15.3.tgz#76852132a58ed5c7c0ef67e4441b9bb5d6061b3b"
+ integrity sha512-O9gl3zCl5h5blw1KGUzQKhA5oUXSl8rwUIM5o0S3nCXMliSvy5Dzx7/DJcI+SwgICv+IneSZwhBh1oSyEHA71A==
+ dependencies:
+ es-define-property "^1.0.1"
+ side-channel "^1.1.1"
+
qs@~6.5.2:
version "6.5.3"
resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.3.tgz#3aeeffc91967ef6e35c0e488ef46fb296ab76aad"
@@ -6806,6 +9987,16 @@ quick-lru@^4.0.1:
resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-4.0.1.tgz#5b8878f113a58217848c6482026c73e1ba57727f"
integrity sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==
+quick-lru@^5.1.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/quick-lru/-/quick-lru-5.1.1.tgz#366493e6b3e42a3a6885e2e99d18f80fb7a8c932"
+ integrity sha512-WuyALRjWPDGtt/wzJiadO5AXY+8hZ80hVpe6MyivgraREW751X3SbhRvG3eLKOYN+8VEvqLcf3wdnt44Z4S4SA==
+
+range-parser@~1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031"
+ integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==
+
raw-body@~1.1.0:
version "1.1.7"
resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-1.1.7.tgz#1d027c2bfa116acc6623bca8f00016572a87d425"
@@ -6814,6 +10005,16 @@ raw-body@~1.1.0:
bytes "1"
string_decoder "0.10"
+raw-body@~2.5.3:
+ version "2.5.3"
+ resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.3.tgz#11c6650ee770a7de1b494f197927de0c923822e2"
+ integrity sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==
+ dependencies:
+ bytes "~3.1.2"
+ http-errors "~2.0.1"
+ iconv-lite "~0.4.24"
+ unpipe "~1.0.0"
+
rc@^1.2.8:
version "1.2.8"
resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed"
@@ -6893,6 +10094,15 @@ read-pkg@^1.0.0:
normalize-package-data "^2.3.2"
path-type "^1.0.0"
+read-pkg@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-3.0.0.tgz#9cbc686978fee65d16c00e2b19c237fcf6e38389"
+ integrity sha512-BLq/cCO9two+lBgiTYNqD6GdtK8s4NpaWrl6/rCO9w0TUS8oJl7cmToOZfRYllKTISY6nt1U7jQ53brmKqY6BA==
+ dependencies:
+ load-json-file "^4.0.0"
+ normalize-package-data "^2.3.2"
+ path-type "^3.0.0"
+
read-pkg@^5.0.0, read-pkg@^5.2.0:
version "5.2.0"
resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz#7bf295438ca5a33e56cd30e053b34ee7250c93cc"
@@ -6942,6 +10152,17 @@ readable-stream@^2.0.0, readable-stream@^2.0.2, readable-stream@^2.0.6, readable
string_decoder "~1.1.1"
util-deprecate "~1.0.1"
+readable-stream@^4.0.0:
+ version "4.7.0"
+ resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-4.7.0.tgz#cedbd8a1146c13dfff8dab14068028d58c15ac91"
+ integrity sha512-oIGGmcpTLwPga8Bn6/Z75SVaH1z5dUut2ibSyAMVhmUggWpmDn2dapB0n7f8nwaSiRtepAsfJyfXIO5DCVAODg==
+ dependencies:
+ abort-controller "^3.0.0"
+ buffer "^6.0.3"
+ events "^3.3.0"
+ process "^0.11.10"
+ string_decoder "^1.3.0"
+
readdir-scoped-modules@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz#8d45407b4f870a0dcaebc0e28670d18e74514309"
@@ -6982,6 +10203,20 @@ redeyed@~2.1.0:
dependencies:
esprima "~4.0.0"
+reflect.getprototypeof@^1.0.10, reflect.getprototypeof@^1.0.9:
+ version "1.0.10"
+ resolved "https://registry.yarnpkg.com/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz#c629219e78a3316d8b604c765ef68996964e7bf9"
+ integrity sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==
+ dependencies:
+ call-bind "^1.0.8"
+ define-properties "^1.2.1"
+ es-abstract "^1.23.9"
+ es-errors "^1.3.0"
+ es-object-atoms "^1.0.0"
+ get-intrinsic "^1.2.7"
+ get-proto "^1.0.1"
+ which-builtin-type "^1.2.1"
+
regenerate-unicode-properties@^10.0.1:
version "10.0.1"
resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz#7f442732aa7934a3740c779bb9b3340dccc1fb56"
@@ -7015,6 +10250,18 @@ regexp.prototype.flags@^1.4.1, regexp.prototype.flags@^1.4.3:
define-properties "^1.1.3"
functions-have-names "^1.2.2"
+regexp.prototype.flags@^1.5.4:
+ version "1.5.4"
+ resolved "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.5.4.tgz#1ad6c62d44a259007e55b3970e00f746efbcaa19"
+ integrity sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==
+ dependencies:
+ call-bind "^1.0.8"
+ define-properties "^1.2.1"
+ es-errors "^1.3.0"
+ get-proto "^1.0.1"
+ gopd "^1.2.0"
+ set-function-name "^2.0.2"
+
regexpp@^3.2.0:
version "3.2.0"
resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2"
@@ -7125,11 +10372,30 @@ require-directory@^2.1.1:
resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42"
integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I=
+require-from-string@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909"
+ integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==
+
+require-in-the-middle@^7.1.1:
+ version "7.5.2"
+ resolved "https://registry.yarnpkg.com/require-in-the-middle/-/require-in-the-middle-7.5.2.tgz#dc25b148affad42e570cf0e41ba30dc00f1703ec"
+ integrity sha512-gAZ+kLqBdHarXB64XpAe2VCjB7rIRv+mU8tfRWziHRJ5umKsIHN2tLLv6EtMw7WCdP19S0ERVMldNvxYCHnhSQ==
+ dependencies:
+ debug "^4.3.5"
+ module-details-from-path "^1.0.3"
+ resolve "^1.22.8"
+
requireindex@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/requireindex/-/requireindex-1.2.0.tgz#3463cdb22ee151902635aa6c9535d4de9c2ef1ef"
integrity sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==
+resolve-alpn@^1.0.0:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/resolve-alpn/-/resolve-alpn-1.2.1.tgz#b7adbdac3546aaaec20b45e7d8265927072726f9"
+ integrity sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==
+
resolve-dir@^1.0.0, resolve-dir@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43"
@@ -7171,6 +10437,16 @@ resolve@^1.14.2, resolve@^1.20.0, resolve@^1.22.0:
path-parse "^1.0.7"
supports-preserve-symlinks-flag "^1.0.0"
+resolve@^1.22.8:
+ version "1.22.12"
+ resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.12.tgz#f5b2a680897c69c238a13cd16b15671f8b73549f"
+ integrity sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==
+ dependencies:
+ es-errors "^1.3.0"
+ is-core-module "^2.16.1"
+ path-parse "^1.0.7"
+ supports-preserve-symlinks-flag "^1.0.0"
+
resolve@^2.0.0-next.3:
version "2.0.0-next.4"
resolved "https://registry.yarnpkg.com/resolve/-/resolve-2.0.0-next.4.tgz#3d37a113d6429f496ec4752d2a2e58efb1fd4660"
@@ -7180,6 +10456,21 @@ resolve@^2.0.0-next.3:
path-parse "^1.0.7"
supports-preserve-symlinks-flag "^1.0.0"
+responselike@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/responselike/-/responselike-2.0.1.tgz#9a0bc8fdc252f3fb1cca68b016591059ba1422bc"
+ integrity sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==
+ dependencies:
+ lowercase-keys "^2.0.0"
+
+restore-cursor@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e"
+ integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==
+ dependencies:
+ onetime "^5.1.0"
+ signal-exit "^3.0.2"
+
retry@^0.12.0:
version "0.12.0"
resolved "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz#1b42a6266a21f07421d1b0b54b7dc167b01c013b"
@@ -7212,6 +10503,18 @@ rimraf@^3.0.0, rimraf@^3.0.2, rimraf@~3.0.2:
dependencies:
glob "^7.1.3"
+rimraf@^5.0.10:
+ version "5.0.10"
+ resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-5.0.10.tgz#23b9843d3dc92db71f96e1a2ce92e39fd2a8221c"
+ integrity sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==
+ dependencies:
+ glob "^10.3.7"
+
+robots-parser@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/robots-parser/-/robots-parser-3.0.1.tgz#3d8a3cdfa8ac240cbb062a4bd16fcc0e0fb9ed23"
+ integrity sha512-s+pyvQeIKIZ0dx5iJiQk1tPLJAWln39+MI5jtM8wnyws+G5azk+dMnMX0qfbqNetKKNgcWWOdi0sfm+FbQbgdQ==
+
run-parallel@^1.1.9:
version "1.2.0"
resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee"
@@ -7219,7 +10522,18 @@ run-parallel@^1.1.9:
dependencies:
queue-microtask "^1.2.2"
-safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0:
+safe-array-concat@^1.1.3:
+ version "1.1.4"
+ resolved "https://registry.yarnpkg.com/safe-array-concat/-/safe-array-concat-1.1.4.tgz#a54cc9b61a57f33b42abad3cbdda3a2b38cc5719"
+ integrity sha512-wtZlHyOje6OZTGqAoaDKxFkgRtkF9CnHAVnCHKfuj200wAgL+bSJhdsCD2l0Qx/2ekEXjPWcyKkfGb5CPboslg==
+ dependencies:
+ call-bind "^1.0.9"
+ call-bound "^1.0.4"
+ get-intrinsic "^1.3.0"
+ has-symbols "^1.1.0"
+ isarray "^2.0.5"
+
+safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.2, safe-buffer@^5.2.1, safe-buffer@~5.2.0:
version "5.2.1"
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
@@ -7234,11 +10548,33 @@ safe-json-parse@~1.0.1:
resolved "https://registry.yarnpkg.com/safe-json-parse/-/safe-json-parse-1.0.1.tgz#3e76723e38dfdda13c9b1d29a1e07ffee4b30b57"
integrity sha1-PnZyPjjf3aE8mx0poeB//uSzC1c=
+safe-push-apply@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/safe-push-apply/-/safe-push-apply-1.0.0.tgz#01850e981c1602d398c85081f360e4e6d03d27f5"
+ integrity sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==
+ dependencies:
+ es-errors "^1.3.0"
+ isarray "^2.0.5"
+
+safe-regex-test@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/safe-regex-test/-/safe-regex-test-1.1.0.tgz#7f87dfb67a3150782eaaf18583ff5d1711ac10c1"
+ integrity sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==
+ dependencies:
+ call-bound "^1.0.2"
+ es-errors "^1.3.0"
+ is-regex "^1.2.1"
+
"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0:
version "2.1.2"
resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
+sax@>=0.6.0:
+ version "1.6.0"
+ resolved "https://registry.yarnpkg.com/sax/-/sax-1.6.0.tgz#da59637629307b97e7c4cb28e080a7bc38560d5b"
+ integrity sha512-6R3J5M4AcbtLUdZmRv2SygeVaM7IhrLXu9BmnOGmmACak8fiUtOsYNWUS4uK7upbmHIBbLBeFeI//477BKLBzA==
+
sax@~1.2.4:
version "1.2.4"
resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
@@ -7317,6 +10653,11 @@ semver@7.0.0:
resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e"
integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==
+semver@^5.5.0:
+ version "5.7.2"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.2.tgz#48d55db737c3287cd4835e17fa13feace1c41ef8"
+ integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==
+
semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0:
version "6.3.0"
resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d"
@@ -7343,6 +10684,30 @@ semver@^7.3.8:
dependencies:
lru-cache "^6.0.0"
+semver@^7.5.2, semver@^7.5.4, semver@^7.7.4:
+ version "7.8.5"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-7.8.5.tgz#39b646037dd50c14fb451e7e4cac58ed8b863f69"
+ integrity sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA==
+
+send@~0.19.0, send@~0.19.1:
+ version "0.19.2"
+ resolved "https://registry.yarnpkg.com/send/-/send-0.19.2.tgz#59bc0da1b4ea7ad42736fd642b1c4294e114ff29"
+ integrity sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==
+ dependencies:
+ debug "2.6.9"
+ depd "2.0.0"
+ destroy "1.2.0"
+ encodeurl "~2.0.0"
+ escape-html "~1.0.3"
+ etag "~1.8.1"
+ fresh "~0.5.2"
+ http-errors "~2.0.1"
+ mime "1.6.0"
+ ms "2.1.3"
+ on-finished "~2.4.1"
+ range-parser "~1.2.1"
+ statuses "~2.0.2"
+
sentence-case@^3.0.4:
version "3.0.4"
resolved "https://registry.yarnpkg.com/sentence-case/-/sentence-case-3.0.4.tgz#3645a7b8c117c787fde8702056225bb62a45131f"
@@ -7352,11 +10717,73 @@ sentence-case@^3.0.4:
tslib "^2.0.3"
upper-case-first "^2.0.2"
+serve-static@~1.16.2:
+ version "1.16.3"
+ resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.16.3.tgz#a97b74d955778583f3862a4f0b841eb4d5d78cf9"
+ integrity sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==
+ dependencies:
+ encodeurl "~2.0.0"
+ escape-html "~1.0.3"
+ parseurl "~1.3.3"
+ send "~0.19.1"
+
set-blocking@^2.0.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 sha1-BF+XgtARrppoA93TgrJDkrPYkPc=
+set-function-length@^1.2.2:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/set-function-length/-/set-function-length-1.2.2.tgz#aac72314198eaed975cf77b2c3b6b880695e5449"
+ integrity sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==
+ dependencies:
+ define-data-property "^1.1.4"
+ es-errors "^1.3.0"
+ function-bind "^1.1.2"
+ get-intrinsic "^1.2.4"
+ gopd "^1.0.1"
+ has-property-descriptors "^1.0.2"
+
+set-function-name@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/set-function-name/-/set-function-name-2.0.2.tgz#16a705c5a0dc2f5e638ca96d8a8cd4e1c2b90985"
+ integrity sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==
+ dependencies:
+ define-data-property "^1.1.4"
+ es-errors "^1.3.0"
+ functions-have-names "^1.2.3"
+ has-property-descriptors "^1.0.2"
+
+set-proto@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/set-proto/-/set-proto-1.0.0.tgz#0760dbcff30b2d7e801fd6e19983e56da337565e"
+ integrity sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==
+ dependencies:
+ dunder-proto "^1.0.1"
+ es-errors "^1.3.0"
+ es-object-atoms "^1.0.0"
+
+setprototypeof@1.2.0, setprototypeof@~1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.2.0.tgz#66c9a24a73f9fc28cbe66b09fed3d33dcaf1b424"
+ integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==
+
+sha.js@2.4.12, sha.js@^2.4.12:
+ version "2.4.12"
+ resolved "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.12.tgz#eb8b568bf383dfd1867a32c3f2b74eb52bdbf23f"
+ integrity sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w==
+ dependencies:
+ inherits "^2.0.4"
+ safe-buffer "^5.2.1"
+ to-buffer "^1.2.0"
+
+shebang-command@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea"
+ integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==
+ dependencies:
+ shebang-regex "^1.0.0"
+
shebang-command@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea"
@@ -7364,16 +10791,60 @@ shebang-command@^2.0.0:
dependencies:
shebang-regex "^3.0.0"
+shebang-regex@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3"
+ integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==
+
shebang-regex@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172"
integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
+shell-quote@^1.6.1:
+ version "1.10.0"
+ resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.10.0.tgz#482033e192e4f5c07151521ffa03400ec71b1b0f"
+ integrity sha512-w1aiOKwKuRgtwAReIIj89puqg+I7GvX4IbLrvmhXbzQsj1+Zwi4VO3+fa6ZF91TWSjIxoEkKnMeHcLEODK5ZXA==
+
shelljs@0.3.x:
version "0.3.0"
resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.3.0.tgz#3596e6307a781544f591f37da618360f31db57b1"
integrity sha1-NZbmMHp4FUT1kfN9phg2DzHbV7E=
+shimmer@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/shimmer/-/shimmer-1.2.1.tgz#610859f7de327b587efebf501fb43117f9aff337"
+ integrity sha512-sQTKC1Re/rM6XyFM6fIAGHRPVGvyXfgzIDvzoq608vM+jeyVD0Tu1E6Np0Kc2zAIFWIj963V2800iF/9LPieQw==
+
+side-channel-list@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/side-channel-list/-/side-channel-list-1.0.1.tgz#c2e0b5a14a540aebee3bbc6c3f8666cc9b509127"
+ integrity sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==
+ dependencies:
+ es-errors "^1.3.0"
+ object-inspect "^1.13.4"
+
+side-channel-map@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/side-channel-map/-/side-channel-map-1.0.1.tgz#d6bb6b37902c6fef5174e5f533fab4c732a26f42"
+ integrity sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==
+ dependencies:
+ call-bound "^1.0.2"
+ es-errors "^1.3.0"
+ get-intrinsic "^1.2.5"
+ object-inspect "^1.13.3"
+
+side-channel-weakmap@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz#11dda19d5368e40ce9ec2bdc1fb0ecbc0790ecea"
+ integrity sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==
+ dependencies:
+ call-bound "^1.0.2"
+ es-errors "^1.3.0"
+ get-intrinsic "^1.2.5"
+ object-inspect "^1.13.3"
+ side-channel-map "^1.0.1"
+
side-channel@^1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf"
@@ -7383,11 +10854,27 @@ side-channel@^1.0.4:
get-intrinsic "^1.0.2"
object-inspect "^1.9.0"
+side-channel@^1.1.0, side-channel@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.1.1.tgz#ea02c62e05dc4bea67d4442f0fb71ee192f8e0ab"
+ integrity sha512-6x6dK6zJdpTzF4sQeNYxwtvBzf6Eg4GtlesS94HOvTudUeyK2WXAaIfmDgsyslYrRBeFIlsi54AYsFGUuhmvrQ==
+ dependencies:
+ es-errors "^1.3.0"
+ object-inspect "^1.13.4"
+ side-channel-list "^1.0.1"
+ side-channel-map "^1.0.1"
+ side-channel-weakmap "^1.0.2"
+
signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3:
version "3.0.6"
resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.6.tgz#24e630c4b0f03fea446a2bd299e62b4a6ca8d0af"
integrity sha512-sDl4qMFpijcGw22U5w63KmD3cZJfBuFlVNbVMKje2keoKML7X2UzWbc4XrmEbDwg0NXJc3yv4/ox7b+JWb57kQ==
+signal-exit@^4.0.1, signal-exit@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04"
+ integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==
+
signale@^1.2.1:
version "1.4.0"
resolved "https://registry.yarnpkg.com/signale/-/signale-1.4.0.tgz#c4be58302fb0262ac00fc3d886a7c113759042f1"
@@ -7397,6 +10884,31 @@ signale@^1.2.1:
figures "^2.0.0"
pkg-conf "^2.1.0"
+simple-concat@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/simple-concat/-/simple-concat-1.0.1.tgz#f46976082ba35c2263f1c8ab5edfe26c41c9552f"
+ integrity sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==
+
+simple-get@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-4.0.1.tgz#4a39db549287c979d352112fa03fd99fd6bc3543"
+ integrity sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==
+ dependencies:
+ decompress-response "^6.0.0"
+ once "^1.3.1"
+ simple-concat "^1.0.0"
+
+simple-git@^3.24.0:
+ version "3.36.0"
+ resolved "https://registry.yarnpkg.com/simple-git/-/simple-git-3.36.0.tgz#019b28c0a35847ee34299c6fb63770ab1b2dffb7"
+ integrity sha512-cGQjLjK8bxJw4QuYT7gxHw3/IouVESbhahSsHrX97MzCL1gu2u7oy38W6L2ZIGECEfIBG4BabsWDPjBxJENv9Q==
+ dependencies:
+ "@kwsites/file-exists" "^1.1.1"
+ "@kwsites/promise-deferred" "^1.1.1"
+ "@simple-git/args-pathspec" "^1.0.3"
+ "@simple-git/argv-parser" "^1.1.0"
+ debug "^4.4.0"
+
simple-swizzle@^0.2.2:
version "0.2.2"
resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a"
@@ -7422,7 +10934,7 @@ slash@^3.0.0:
resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634"
integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==
-smart-buffer@^4.1.0:
+smart-buffer@^4.1.0, smart-buffer@^4.2.0:
version "4.2.0"
resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae"
integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==
@@ -7444,6 +10956,15 @@ socks-proxy-agent@^6.0.0:
debug "^4.3.1"
socks "^2.6.1"
+socks-proxy-agent@^8.0.5:
+ version "8.0.5"
+ resolved "https://registry.yarnpkg.com/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz#b9cdb4e7e998509d7659d689ce7697ac21645bee"
+ integrity sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==
+ dependencies:
+ agent-base "^7.1.2"
+ debug "^4.3.4"
+ socks "^2.8.3"
+
socks@^2.6.1:
version "2.6.1"
resolved "https://registry.yarnpkg.com/socks/-/socks-2.6.1.tgz#989e6534a07cf337deb1b1c94aaa44296520d30e"
@@ -7452,6 +10973,14 @@ socks@^2.6.1:
ip "^1.1.5"
smart-buffer "^4.1.0"
+socks@^2.8.3:
+ version "2.8.9"
+ resolved "https://registry.yarnpkg.com/socks/-/socks-2.8.9.tgz#aa5f130ca0f88a43fa44faf4869c50d22aa27752"
+ integrity sha512-LJhUYUvItdQ0LkJTmPeaEObWXAqFyfmP85x0tch/ez9cahmhlBBLbIqDFnvBnUJGagb0JbIQrkBs1wJ+yRYpEw==
+ dependencies:
+ ip-address "^10.1.1"
+ smart-buffer "^4.2.0"
+
source-map@^0.6.1, source-map@~0.6.1:
version "0.6.1"
resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263"
@@ -7488,6 +11017,15 @@ spdx-license-ids@^3.0.0:
resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.11.tgz#50c0d8c40a14ec1bf449bae69a0ea4685a9d9f95"
integrity sha512-Ctl2BrFiM0X3MANYgj3CkygxhRmr9mi6xhejbdO960nF6EDJApTYpn0BQnDKlnNBULKiCN1n3w9EBkHK8ZWg+g==
+speedline-core@^1.4.3:
+ version "1.4.3"
+ resolved "https://registry.yarnpkg.com/speedline-core/-/speedline-core-1.4.3.tgz#4d6e7276e2063c2d36a375cb25a523ac73475319"
+ integrity sha512-DI7/OuAUD+GMpR6dmu8lliO2Wg5zfeh+/xsdyJZCzd8o5JgFUjCeLsBDuZjIQJdwXS3J0L/uZYrELKYqx+PXog==
+ dependencies:
+ "@types/node" "*"
+ image-ssim "^0.2.0"
+ jpeg-js "^0.4.1"
+
split2@^3.0.0:
version "3.2.2"
resolved "https://registry.yarnpkg.com/split2/-/split2-3.2.2.tgz#bf2cf2a37d838312c249c89206fd7a17dd12365f"
@@ -7546,6 +11084,19 @@ stable@^0.1.8:
resolved "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz#836eb3c8382fe2936feaf544631017ce7d47a3cf"
integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==
+statuses@~2.0.1, statuses@~2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.2.tgz#8f75eecef765b5e1cfcdc080da59409ed424e382"
+ integrity sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==
+
+stop-iteration-iterator@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/stop-iteration-iterator/-/stop-iteration-iterator-1.1.0.tgz#f481ff70a548f6124d0312c3aa14cbfa7aa542ad"
+ integrity sha512-eLoXW/DHyl62zxY4SCaIgnRhuMr6ri4juEYARS8E6sCEqzKpOiE521Ucofdx+KnDZl5xmvGYaaKCk5FEOxJCoQ==
+ dependencies:
+ es-errors "^1.3.0"
+ internal-slot "^1.1.0"
+
stream-combiner2@~1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/stream-combiner2/-/stream-combiner2-1.1.1.tgz#fb4d8a1420ea362764e21ad4780397bebcb41cbe"
@@ -7554,11 +11105,29 @@ stream-combiner2@~1.1.1:
duplexer2 "~0.1.0"
readable-stream "^2.0.2"
+streamx@^2.12.5, streamx@^2.15.0, streamx@^2.25.0:
+ version "2.28.0"
+ resolved "https://registry.yarnpkg.com/streamx/-/streamx-2.28.0.tgz#035ab56057b7ed2211b51d532e6973f0f99fbf11"
+ integrity sha512-1Yowhzjf0ivGMrTIkY9hav5TxobO9qIVqUE41fiCGMGgc3CLlf4MY+9AHmZqBWgDTue0fY9zWjYFVyf6Diuobw==
+ dependencies:
+ events-universal "^1.0.0"
+ fast-fifo "^1.3.2"
+ text-decoder "^1.1.0"
+
string-template@~0.2.1:
version "0.2.1"
resolved "https://registry.yarnpkg.com/string-template/-/string-template-0.2.1.tgz#42932e598a352d01fc22ec3367d9d84eec6c9add"
integrity sha1-QpMuWYo1LQH8IuwzZ9nYTuxsmt0=
+"string-width-cjs@npm:string-width@^4.2.0":
+ version "4.2.3"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
+ 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-width@^1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
@@ -7585,6 +11154,15 @@ string-width@^2.0.0:
is-fullwidth-code-point "^2.0.0"
strip-ansi "^4.0.0"
+string-width@^5.0.1, string-width@^5.1.2:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-5.1.2.tgz#14f8daec6d81e7221d2a357e668cab73bdbca794"
+ integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==
+ dependencies:
+ eastasianwidth "^0.2.0"
+ emoji-regex "^9.2.2"
+ strip-ansi "^7.0.1"
+
string.prototype.matchall@^4.0.7:
version "4.0.7"
resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.7.tgz#8e6ecb0d8a1fb1fda470d81acecb2dba057a481d"
@@ -7599,6 +11177,30 @@ string.prototype.matchall@^4.0.7:
regexp.prototype.flags "^1.4.1"
side-channel "^1.0.4"
+string.prototype.padend@^3.0.0:
+ version "3.1.6"
+ resolved "https://registry.yarnpkg.com/string.prototype.padend/-/string.prototype.padend-3.1.6.tgz#ba79cf8992609a91c872daa47c6bb144ee7f62a5"
+ integrity sha512-XZpspuSB7vJWhvJc9DLSlrXl1mcA2BdoY5jjnS135ydXqLoqhs96JjDtCkjJEQHvfqZIp9hBuBMgI589peyx9Q==
+ dependencies:
+ call-bind "^1.0.7"
+ define-properties "^1.2.1"
+ es-abstract "^1.23.2"
+ es-object-atoms "^1.0.0"
+
+string.prototype.trim@^1.2.10:
+ version "1.2.11"
+ resolved "https://registry.yarnpkg.com/string.prototype.trim/-/string.prototype.trim-1.2.11.tgz#e6bd19cda3985d05a42dda31f3ddf4d35d3430e3"
+ integrity sha512-PwvK7BU+CMTJGYQCTZb5RWXIML92lftJLhQz1tBzgKiqGxJaMlBAa48POXaNAC2s4y8jr3EFqrkF9+44neS46w==
+ dependencies:
+ call-bind "^1.0.9"
+ call-bound "^1.0.4"
+ define-data-property "^1.1.4"
+ define-properties "^1.2.1"
+ es-abstract "^1.24.2"
+ es-object-atoms "^1.1.2"
+ has-property-descriptors "^1.0.2"
+ safe-regex-test "^1.1.0"
+
string.prototype.trimend@^1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz#e75ae90c2942c63504686c18b287b4a0b1a45f80"
@@ -7616,6 +11218,16 @@ string.prototype.trimend@^1.0.5:
define-properties "^1.1.4"
es-abstract "^1.19.5"
+string.prototype.trimend@^1.0.9:
+ version "1.0.10"
+ resolved "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.10.tgz#be6bcf4f3fe0460bdeccdb2cf4f971b310f8346e"
+ integrity sha512-2+3aDAOmPTmuFwjDnmJG2ctEkQKVki7vOSqaxkv42Mowj1V6PnvuwFCRrR5lChUux1TBskPjfkeTOhqczDMxTw==
+ dependencies:
+ call-bind "^1.0.9"
+ call-bound "^1.0.4"
+ define-properties "^1.2.1"
+ es-object-atoms "^1.1.2"
+
string.prototype.trimstart@^1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz#b36399af4ab2999b4c9c648bd7a3fb2bb26feeed"
@@ -7633,12 +11245,21 @@ string.prototype.trimstart@^1.0.5:
define-properties "^1.1.4"
es-abstract "^1.19.5"
+string.prototype.trimstart@^1.0.8:
+ version "1.0.8"
+ resolved "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz#7ee834dda8c7c17eff3118472bb35bfedaa34dde"
+ integrity sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==
+ dependencies:
+ call-bind "^1.0.7"
+ define-properties "^1.2.1"
+ es-object-atoms "^1.0.0"
+
string_decoder@0.10, string_decoder@~0.10.x:
version "0.10.31"
resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
integrity sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=
-string_decoder@^1.1.1:
+string_decoder@^1.1.1, string_decoder@^1.3.0:
version "1.3.0"
resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e"
integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==
@@ -7657,6 +11278,13 @@ stringify-package@^1.0.1:
resolved "https://registry.yarnpkg.com/stringify-package/-/stringify-package-1.0.1.tgz#e5aa3643e7f74d0f28628b72f3dad5cecfc3ba85"
integrity sha512-sa4DUQsYciMP1xhKWGuFM04fB0LG/9DlluZoSVywUMRNvzid6XucHK0/90xGxRoHrAaROrcHK1aPKaijCtSrhg==
+"strip-ansi-cjs@npm:strip-ansi@^6.0.1":
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
+ integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
+ dependencies:
+ ansi-regex "^5.0.1"
+
strip-ansi@^3.0.0, strip-ansi@^3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
@@ -7678,6 +11306,13 @@ strip-ansi@^6.0.0, strip-ansi@^6.0.1:
dependencies:
ansi-regex "^5.0.1"
+strip-ansi@^7.0.1:
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-7.2.0.tgz#d22a269522836a627af8d04b5c3fd2c7fa3e32e3"
+ integrity sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==
+ dependencies:
+ ansi-regex "^6.2.2"
+
strip-bom@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e"
@@ -7719,6 +11354,25 @@ strip-json-comments@~2.0.1:
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo=
+strnum@^2.4.1:
+ version "2.4.1"
+ resolved "https://registry.yarnpkg.com/strnum/-/strnum-2.4.1.tgz#85417f683113badea0fe7e17227676f889ff7e58"
+ integrity sha512-M9eUSMT2dCB2cTNPG7UYj6KuK7RJR2SN2+yCV/fTW3xzTCS6EaGZ5pSMgDIjB7r8zSfTGk+dvvn9rTjpVS9Mwg==
+ dependencies:
+ anynum "^1.0.1"
+
+stubborn-fs@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/stubborn-fs/-/stubborn-fs-2.0.0.tgz#628750f81c51c44c04ef50fc70ed4d1caea4f1e9"
+ integrity sha512-Y0AvSwDw8y+nlSNFXMm2g6L51rBGdAQT20J3YSOqxC53Lo3bjWRtr2BKcfYoAf352WYpsZSTURrA0tqhfgudPA==
+ dependencies:
+ stubborn-utils "^1.0.1"
+
+stubborn-utils@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/stubborn-utils/-/stubborn-utils-1.0.2.tgz#0d9c58ab550f40936235056c7ea6febd925c4d41"
+ integrity sha512-zOh9jPYI+xrNOyisSelgym4tolKTJCQd5GBhK0+0xJvcYDcwlOoxF/rnFKQ2KRZknXSG9jWAp66fwP6AxN9STg==
+
stylehacks@^4.0.0:
version "4.0.3"
resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-4.0.3.tgz#6718fcaf4d1e07d8a1318690881e8d96726a71d5"
@@ -7779,6 +11433,27 @@ svgo@^1.0.0:
unquote "~1.1.1"
util.promisify "~1.0.0"
+tar-fs@^3.1.1:
+ version "3.1.3"
+ resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-3.1.3.tgz#05668cc68a30741c3813f9c16593b8dec7dcbcd1"
+ integrity sha512-/hU4AXnIdZu+Gvl1pk0oI5f5HxWsCJRtY2aFaJdk9VvyL48DWU6iU5WAIPG+wIi1YvWA6eTJvIviP/tMAZZNwQ==
+ dependencies:
+ pump "^3.0.0"
+ tar-stream "^3.1.5"
+ optionalDependencies:
+ bare-fs "^4.0.1"
+ bare-path "^3.0.0"
+
+tar-stream@^3.1.5:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-3.2.0.tgz#0d0064d9b67ea3c9f5abde155e35faab0df37591"
+ integrity sha512-ojzvCvVaNp6aOTFmG7jaRD0meowIAuPc3cMMhSgKiVWws1GyHbGd/xvnyuRKcKlMpt3qvxx6r0hreCNITP9hIg==
+ dependencies:
+ b4a "^1.6.4"
+ bare-fs "^4.5.5"
+ fast-fifo "^1.2.0"
+ streamx "^2.15.0"
+
tar@^6.0.2, tar@^6.1.0, tar@^6.1.11:
version "6.1.11"
resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.11.tgz#6760a38f003afa1b2ffd0ffe9e9abbd0eab3d621"
@@ -7791,6 +11466,13 @@ tar@^6.0.2, tar@^6.1.0, tar@^6.1.11:
mkdirp "^1.0.3"
yallist "^4.0.0"
+teex@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/teex/-/teex-1.0.1.tgz#b8fa7245ef8e8effa8078281946c85ab780a0b12"
+ integrity sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==
+ dependencies:
+ streamx "^2.12.5"
+
temp-dir@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-2.0.0.tgz#bde92b05bdfeb1516e804c9c00ad45177f31321e"
@@ -7807,6 +11489,13 @@ tempy@^1.0.0:
type-fest "^0.16.0"
unique-string "^2.0.0"
+text-decoder@^1.1.0:
+ version "1.2.7"
+ resolved "https://registry.yarnpkg.com/text-decoder/-/text-decoder-1.2.7.tgz#5d073a9a74b9c0a9d28dfadcab96b604af57d8ba"
+ integrity sha512-vlLytXkeP4xvEq2otHeJfSQIRyWxo/oZGEbXrtEEF9Hnmrdly59sUbzZ/QgyWuLYHctCHxFF4tRQZNQ9k60ExQ==
+ dependencies:
+ b4a "^1.6.4"
+
text-extensions@^1.0.0:
version "1.9.0"
resolved "https://registry.yarnpkg.com/text-extensions/-/text-extensions-1.9.0.tgz#1853e45fee39c945ce6f6c36b2d659b5aabc2a26"
@@ -7817,6 +11506,16 @@ text-table@^0.2.0, text-table@~0.2.0:
resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4"
integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==
+third-party-web@^0.27.0:
+ version "0.27.0"
+ resolved "https://registry.yarnpkg.com/third-party-web/-/third-party-web-0.27.0.tgz#258cdc357b13c5fdf97a34f9b147f4be31855304"
+ integrity sha512-h0JYX+dO2Zr3abCQpS6/uFjujaOjA1DyDzGQ41+oFn9VW/ARiq9g5ln7qEP9+BTzDpOMyIfsfj4OvfgXAsMUSA==
+
+third-party-web@latest:
+ version "0.29.2"
+ resolved "https://registry.yarnpkg.com/third-party-web/-/third-party-web-0.29.2.tgz#ce49d6aaf2228b0e73e02054ecb2c7702f8dd7a0"
+ integrity sha512-fegtha91tq2DHphyoiBXVHjVi2YG9zFaRnboT9C28tO1en9Y3wJsfspuy40F+u5wl3hHVbw7cnd1b67kEGHb8g==
+
through2@^4.0.0:
version "4.0.2"
resolved "https://registry.yarnpkg.com/through2/-/through2-4.0.2.tgz#a7ce3ac2a7a8b0b966c80e7c49f0484c3b239764"
@@ -7877,6 +11576,39 @@ tiny-relative-date@^1.3.0:
resolved "https://registry.yarnpkg.com/tiny-relative-date/-/tiny-relative-date-1.3.0.tgz#fa08aad501ed730f31cc043181d995c39a935e07"
integrity sha512-MOQHpzllWxDCHHaDno30hhLfbouoYlOI8YlMNtvKe1zXbjEVhbcEovQxvZrPvtiYW630GQDoMMarCnjfyfHA+A==
+tldts-core@^7.4.9:
+ version "7.4.9"
+ resolved "https://registry.yarnpkg.com/tldts-core/-/tldts-core-7.4.9.tgz#8c3e6fc36123b6001290860d2abda6546466980b"
+ integrity sha512-DxKfPBI52p2msTEu7MPhdpdDTBhhVQg1a/8PjQckeyAvO13eMYElX545grIp6nnTGIMZlRvFZPvFhvI/WIz2Vg==
+
+tldts-icann@^7.0.12:
+ version "7.4.9"
+ resolved "https://registry.yarnpkg.com/tldts-icann/-/tldts-icann-7.4.9.tgz#62f2266d2df66d41177db710d518bd152660e13d"
+ integrity sha512-q6gyxCkcFPu5OZd2hi2quysxCG3ejIi53EACesbCEZHhH7FO3HnliqwO5zUs0TV6dA54SxhCrTGAc4ugl7rTiw==
+ dependencies:
+ tldts-core "^7.4.9"
+
+tmp-promise@3.0.3:
+ version "3.0.3"
+ resolved "https://registry.yarnpkg.com/tmp-promise/-/tmp-promise-3.0.3.tgz#60a1a1cc98c988674fcbfd23b6e3367bdeac4ce7"
+ integrity sha512-RwM7MoPojPxsOBYnyd2hy0bxtIlVrihNs9pj5SUvY8Zz1sQcQG2tG1hSr8PDxfgEB8RNKDhqbIlroIarSNDNsQ==
+ dependencies:
+ tmp "^0.2.0"
+
+tmp@^0.2.0:
+ version "0.2.7"
+ resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.7.tgz#26f4db11d1601ce8012dcb8a798ece1c06a99059"
+ integrity sha512-e0votIpp4Uo2AJYSzVHV6xCcawuiez3DzqDAbrTc3YxBkplN6e+dM13ZeIcZnDg/QpSuU2zfZ3rzwY8ukEnaXw==
+
+to-buffer@^1.2.0:
+ version "1.2.2"
+ resolved "https://registry.yarnpkg.com/to-buffer/-/to-buffer-1.2.2.tgz#ffe59ef7522ada0a2d1cb5dfe03bb8abc3cdc133"
+ integrity sha512-db0E3UJjcFhpDhAF4tLo03oli3pwl3dbnzXOUIlRKrp+ldk/VUxzpWYZENsw2SZiuBjHAk7DfB0VU7NKdpb6sw==
+ dependencies:
+ isarray "^2.0.5"
+ safe-buffer "^5.2.1"
+ typed-array-buffer "^1.0.3"
+
to-fast-properties@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e"
@@ -7889,6 +11621,11 @@ to-regex-range@^5.0.1:
dependencies:
is-number "^7.0.0"
+toidentifier@~1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35"
+ integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==
+
tough-cookie@~2.5.0:
version "2.5.0"
resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz#cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2"
@@ -7942,6 +11679,11 @@ tslib@^1.8.1:
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00"
integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==
+tslib@^2.0.1, tslib@^2.8.0:
+ version "2.8.1"
+ resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f"
+ integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==
+
tslib@^2.0.3:
version "2.4.0"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3"
@@ -7996,6 +11738,69 @@ type-fest@^0.8.1:
resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d"
integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==
+type-fest@^4.18.2:
+ version "4.41.0"
+ resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-4.41.0.tgz#6ae1c8e5731273c2bf1f58ad39cbae2c91a46c58"
+ integrity sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==
+
+type-is@~1.6.18:
+ version "1.6.18"
+ resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131"
+ integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==
+ dependencies:
+ media-typer "0.3.0"
+ mime-types "~2.1.24"
+
+typed-array-buffer@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz#a72395450a4869ec033fd549371b47af3a2ee536"
+ integrity sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==
+ dependencies:
+ call-bound "^1.0.3"
+ es-errors "^1.3.0"
+ is-typed-array "^1.1.14"
+
+typed-array-byte-length@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/typed-array-byte-length/-/typed-array-byte-length-1.0.3.tgz#8407a04f7d78684f3d252aa1a143d2b77b4160ce"
+ integrity sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==
+ dependencies:
+ call-bind "^1.0.8"
+ for-each "^0.3.3"
+ gopd "^1.2.0"
+ has-proto "^1.2.0"
+ is-typed-array "^1.1.14"
+
+typed-array-byte-offset@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.yarnpkg.com/typed-array-byte-offset/-/typed-array-byte-offset-1.0.4.tgz#ae3698b8ec91a8ab945016108aef00d5bff12355"
+ integrity sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==
+ dependencies:
+ available-typed-arrays "^1.0.7"
+ call-bind "^1.0.8"
+ for-each "^0.3.3"
+ gopd "^1.2.0"
+ has-proto "^1.2.0"
+ is-typed-array "^1.1.15"
+ reflect.getprototypeof "^1.0.9"
+
+typed-array-length@^1.0.7:
+ version "1.0.8"
+ resolved "https://registry.yarnpkg.com/typed-array-length/-/typed-array-length-1.0.8.tgz#0b70e982c9e9dafe2def6d6458ff4b3f2d2b6d70"
+ integrity sha512-phPGCwqr2+Qo0fwniCE8e4pKnGu/yFb5nD5Y8bf0EEeiI5GklnACYA9GFy/DrAeRrKHXvHn+1SUsOWgJp6RO+g==
+ dependencies:
+ call-bind "^1.0.9"
+ for-each "^0.3.5"
+ gopd "^1.2.0"
+ is-typed-array "^1.1.15"
+ possible-typed-array-names "^1.1.0"
+ reflect.getprototypeof "^1.0.10"
+
+typed-query-selector@^2.12.2:
+ version "2.12.2"
+ resolved "https://registry.yarnpkg.com/typed-query-selector/-/typed-query-selector-2.12.2.tgz#65e2462ac6b0aecfae1bfac1a4f3027070dbabaa"
+ integrity sha512-EOPFbyIub4ngnEdqi2yOcNeDLaX/0jcE1JoAXQDDMIthap7FoN795lc/SHfIq2d416VufXpM8z/lD+WRm2gfOQ==
+
typedarray-to-buffer@^3.1.5:
version "3.1.5"
resolved "https://registry.yarnpkg.com/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz#a97ee7a9ff42691b9f783ff1bc5112fe3fca9080"
@@ -8041,6 +11846,16 @@ unbox-primitive@^1.0.2:
has-symbols "^1.0.3"
which-boxed-primitive "^1.0.2"
+unbox-primitive@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.yarnpkg.com/unbox-primitive/-/unbox-primitive-1.1.0.tgz#8d9d2c9edeea8460c7f35033a88867944934d1e2"
+ integrity sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==
+ dependencies:
+ call-bound "^1.0.3"
+ has-bigints "^1.0.2"
+ has-symbols "^1.1.0"
+ which-boxed-primitive "^1.1.1"
+
unc-path-regex@^0.1.2:
version "0.1.2"
resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa"
@@ -8054,6 +11869,11 @@ underscore.string@~3.3.5:
sprintf-js "^1.1.1"
util-deprecate "^1.0.2"
+undici-types@~8.3.0:
+ version "8.3.0"
+ resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-8.3.0.tgz#44e9fc9f3244648cdea35e4f9bb2d681e9410809"
+ integrity sha512-j375ScV60dom+YkPFIfTLcOiPxkN/buHz5GobjLhixFuANaNs3C9l4GmrWqejgXWJ7BbJcFYpTEUkS1Ge8bpZQ==
+
unicode-canonical-property-names-ecmascript@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz#301acdc525631670d39f6146e0e77ff6bbdebddc"
@@ -8156,6 +11976,14 @@ unist-util-visit@^2.0.3:
unist-util-is "^4.0.0"
unist-util-visit-parents "^3.0.0"
+universal-github-app-jwt@^1.1.2:
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/universal-github-app-jwt/-/universal-github-app-jwt-1.2.0.tgz#1314cf2b2aff69d7ae998e8bff90d55a651d2949"
+ integrity sha512-dncpMpnsKBk0eetwfN8D8OUHGfiDhhJ+mtsbMl+7PfW7mYjiH8LIcqRmYMtzYLgSh47HjfdBtrBwIQ/gizKR3g==
+ dependencies:
+ "@types/jsonwebtoken" "^9.0.0"
+ jsonwebtoken "^9.0.2"
+
universal-user-agent@^6.0.0:
version "6.0.0"
resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-6.0.0.tgz#3381f8503b251c0d9cd21bc1de939ec9df5480ee"
@@ -8166,6 +11994,11 @@ universalify@^2.0.0:
resolved "https://registry.yarnpkg.com/universalify/-/universalify-2.0.0.tgz#75a4984efedc4b08975c5aeb73f530d02df25717"
integrity sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==
+unpipe@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec"
+ integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==
+
unquote@~1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544"
@@ -8225,6 +12058,11 @@ util.promisify@~1.0.0:
has-symbols "^1.0.1"
object.getownpropertydescriptors "^2.1.0"
+utils-merge@1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713"
+ integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==
+
uuid@^3.3.2:
version "3.4.0"
resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee"
@@ -8252,6 +12090,11 @@ validate-npm-package-name@^3.0.0, validate-npm-package-name@~3.0.0:
dependencies:
builtins "^1.0.3"
+vary@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
+ integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==
+
vendors@^1.0.0:
version "1.0.4"
resolved "https://registry.yarnpkg.com/vendors/-/vendors-1.0.4.tgz#e2b800a53e7a29b93506c3cf41100d16c4c4ad8e"
@@ -8289,13 +12132,28 @@ walk-up-path@^1.0.0:
resolved "https://registry.yarnpkg.com/walk-up-path/-/walk-up-path-1.0.0.tgz#d4745e893dd5fd0dbb58dd0a4c6a33d9c9fec53e"
integrity sha512-hwj/qMDUEjCU5h0xr90KGCf0tg0/LgJbmOWgrWKYlcJZM7XvquvUJZ0G/HMGr7F7OQMOUuPHWP9JpriinkAlkg==
-wcwidth@^1.0.0:
+wasm-feature-detect@1.8.0:
+ version "1.8.0"
+ resolved "https://registry.yarnpkg.com/wasm-feature-detect/-/wasm-feature-detect-1.8.0.tgz#4e9f55b0a64d801f372fbb0324ed11ad3abd0c78"
+ integrity sha512-zksaLKM2fVlnB5jQQDqKXXwYHLQUVH9es+5TOOHwGOVJOCeRBCiPjwSg+3tN2AdTCzjgli4jijCH290kXb/zWQ==
+
+wcwidth@^1.0.0, wcwidth@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8"
- integrity sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=
+ integrity sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==
dependencies:
defaults "^1.0.3"
+web-vitals@^4.2.1:
+ version "4.2.4"
+ resolved "https://registry.yarnpkg.com/web-vitals/-/web-vitals-4.2.4.tgz#1d20bc8590a37769bd0902b289550936069184b7"
+ integrity sha512-r4DIlprAGwJ7YM11VZp4R884m0Vmgr6EAKe3P+kO0PPj3Unqyvv59rczf6UiGcb9Z8QxZVcqKNwv/g0WNdWwsw==
+
+webdriver-bidi-protocol@0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/webdriver-bidi-protocol/-/webdriver-bidi-protocol-0.4.1.tgz#d411e7b8e158408d83bb166b0b4f1054fa3f077e"
+ integrity sha512-ARrjNjtWRRs2w4Tk7nqrf2gBI0QXWuOmMCx2hU+1jUt6d00MjMxURrhxhGbrsoiZKJrhTSTzbIrc554iKI10qw==
+
webidl-conversions@^3.0.0:
version "3.0.1"
resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871"
@@ -8323,6 +12181,11 @@ whatwg-url@^5.0.0:
tr46 "~0.0.3"
webidl-conversions "^3.0.0"
+when-exit@^2.1.4:
+ version "2.1.5"
+ resolved "https://registry.yarnpkg.com/when-exit/-/when-exit-2.1.5.tgz#53fa4ffa2ba4c792213fb6617eb7d08f0dcb1a9f"
+ integrity sha512-VGkKJ564kzt6Ms1dbgPP/yuIoQCrsFAnRbptpC5wOEsDaNsbCB2bnfnaA8i/vRs5tjUSEOtIuvl9/MyVsvQZCg==
+
which-boxed-primitive@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz#13757bc89b209b049fe5d86430e21cf40a89a8e6"
@@ -8334,7 +12197,60 @@ which-boxed-primitive@^1.0.2:
is-string "^1.0.5"
is-symbol "^1.0.3"
-which@^1.2.14:
+which-boxed-primitive@^1.1.0, which-boxed-primitive@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/which-boxed-primitive/-/which-boxed-primitive-1.1.1.tgz#d76ec27df7fa165f18d5808374a5fe23c29b176e"
+ integrity sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==
+ dependencies:
+ is-bigint "^1.1.0"
+ is-boolean-object "^1.2.1"
+ is-number-object "^1.1.1"
+ is-string "^1.1.1"
+ is-symbol "^1.1.1"
+
+which-builtin-type@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.yarnpkg.com/which-builtin-type/-/which-builtin-type-1.2.1.tgz#89183da1b4907ab089a6b02029cc5d8d6574270e"
+ integrity sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==
+ dependencies:
+ call-bound "^1.0.2"
+ function.prototype.name "^1.1.6"
+ has-tostringtag "^1.0.2"
+ is-async-function "^2.0.0"
+ is-date-object "^1.1.0"
+ is-finalizationregistry "^1.1.0"
+ is-generator-function "^1.0.10"
+ is-regex "^1.2.1"
+ is-weakref "^1.0.2"
+ isarray "^2.0.5"
+ which-boxed-primitive "^1.1.0"
+ which-collection "^1.0.2"
+ which-typed-array "^1.1.16"
+
+which-collection@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/which-collection/-/which-collection-1.0.2.tgz#627ef76243920a107e7ce8e96191debe4b16c2a0"
+ integrity sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==
+ dependencies:
+ is-map "^2.0.3"
+ is-set "^2.0.3"
+ is-weakmap "^2.0.2"
+ is-weakset "^2.0.3"
+
+which-typed-array@^1.1.16, which-typed-array@^1.1.19:
+ version "1.1.22"
+ resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.22.tgz#8f3cc78aefb40b437346dd40a1dbfa5d1da43fe9"
+ integrity sha512-fvO4ExWMFsqyhG3AiPAObMuY1lxaqgYcxbc49CNdWDDECOJNgQyvsOWVwbZc+qf3rzRtxojBK+CMEv0Ld5CYpw==
+ dependencies:
+ available-typed-arrays "^1.0.7"
+ call-bind "^1.0.9"
+ call-bound "^1.0.4"
+ for-each "^0.3.5"
+ get-proto "^1.0.1"
+ gopd "^1.2.0"
+ has-tostringtag "^1.0.2"
+
+which@^1.2.14, which@^1.2.9:
version "1.3.1"
resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a"
integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==
@@ -8360,6 +12276,24 @@ wordwrap@^1.0.0:
resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb"
integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=
+"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0":
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
+ integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
+ dependencies:
+ ansi-styles "^4.0.0"
+ string-width "^4.1.0"
+ strip-ansi "^6.0.0"
+
+wrap-ansi@^6.2.0:
+ version "6.2.0"
+ resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53"
+ integrity sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==
+ dependencies:
+ ansi-styles "^4.0.0"
+ string-width "^4.1.0"
+ strip-ansi "^6.0.0"
+
wrap-ansi@^7.0.0:
version "7.0.0"
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
@@ -8369,6 +12303,15 @@ wrap-ansi@^7.0.0:
string-width "^4.1.0"
strip-ansi "^6.0.0"
+wrap-ansi@^8.1.0:
+ version "8.1.0"
+ resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214"
+ integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==
+ dependencies:
+ ansi-styles "^6.1.0"
+ string-width "^5.0.1"
+ strip-ansi "^7.0.1"
+
wrappy@1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
@@ -8384,7 +12327,45 @@ write-file-atomic@^3.0.3:
signal-exit "^3.0.2"
typedarray-to-buffer "^3.1.5"
-xtend@~4.0.1:
+ws@8.21.0:
+ version "8.21.0"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-8.21.0.tgz#012e413fc07429945121b0c153158c4343086951"
+ integrity sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==
+
+ws@^7.0.0:
+ version "7.5.13"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.13.tgz#12aa507eaca76c295c278b1aebf4698ab2c1845f"
+ integrity sha512-rsKI6xDBFVf4r/x8XyChGK04QR/XHroxs/jUcoWvtEZM8TPU/X/uIY9B1CsSzYws9ZJb/6bbBu7dPhFW00CAoA==
+
+ws@^8.20.0:
+ version "8.21.1"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-8.21.1.tgz#045650cd4b1207809e7547146223c3814a9af586"
+ integrity sha512-+0NTnW77fFN/DjQi6k/Sq/Yvk4Sgajw7urW8V+asjXnRgDs9gyGkdb7EzgfhA4goXsRIZKE28fzIXBHEzhuiWw==
+
+xdg-basedir@^5.1.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-5.1.0.tgz#1efba19425e73be1bc6f2a6ceb52a3d2c884c0c9"
+ integrity sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==
+
+xml-naming@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/xml-naming/-/xml-naming-0.3.0.tgz#46c1e18bfe2858479982dd2accf34d16e749eda2"
+ integrity sha512-ghig2TBE/H11aOVgmahA3MhimvkBr6JIYknH/Dhdk10nXwdbIqBJsbfMxpvFPG8bAw77gN29aQWvKpmVoPlvPQ==
+
+xml2js@0.6.2:
+ version "0.6.2"
+ resolved "https://registry.yarnpkg.com/xml2js/-/xml2js-0.6.2.tgz#dd0b630083aa09c161e25a4d0901e2b2a929b499"
+ integrity sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==
+ dependencies:
+ sax ">=0.6.0"
+ xmlbuilder "~11.0.0"
+
+xmlbuilder@~11.0.0:
+ version "11.0.1"
+ resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-11.0.1.tgz#be9bae1c8a046e76b31127726347d0ad7002beb3"
+ integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==
+
+xtend@^4.0.0, xtend@~4.0.1:
version "4.0.2"
resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54"
integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==
@@ -8404,6 +12385,11 @@ yaml@^1.10.0:
resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b"
integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==
+yaml@^2.2.2:
+ version "2.9.0"
+ resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.9.0.tgz#78274afd93598a1dfdd6130df6a566defcbf9aa4"
+ integrity sha512-2AvhNX3mb8zd6Zy7INTtSpl1F15HW6Wnqj0srWlkKLcpYl/gMIMJiyuGq2KeI2YFxUPjdlB+3Lc10seMLtL4cA==
+
yargs-parser@^20.2.2, yargs-parser@^20.2.3:
version "20.2.9"
resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee"
@@ -8414,6 +12400,24 @@ yargs-parser@^21.0.0:
resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.0.0.tgz#a485d3966be4317426dd56bdb6a30131b281dc55"
integrity sha512-z9kApYUOCwoeZ78rfRYYWdiU/iNL6mwwYlkkZfJoyMR1xps+NEBX5X7XmRpxkZHhXJ6+Ey00IwKxBBSW9FIjyA==
+yargs-parser@^21.1.1:
+ version "21.1.1"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35"
+ integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==
+
+yargs@17.7.2:
+ version "17.7.2"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269"
+ 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"
+
yargs@^16.2.0:
version "16.2.0"
resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66"
@@ -8440,6 +12444,42 @@ yargs@^17.2.1:
y18n "^5.0.5"
yargs-parser "^21.0.0"
+yargs@^17.3.0, yargs@^17.3.1, yargs@^17.7.2:
+ version "17.7.3"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.3.tgz#779dffe6bcafec596a7172e983289a588647faaa"
+ integrity sha512-GZtjxm/J/4TSxuL3FNYjCmLktBTnIw/rVmKSIyKeYAZpmJB2ig9VauCC5xsa82GNKVKDAqpOn3KVzNt0zmrU0g==
+ 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.yarnpkg.com/yauzl/-/yauzl-2.10.0.tgz#c7eb17c93e112cb1086fa6d8e51fb0667b79a5f9"
+ integrity sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==
+ dependencies:
+ buffer-crc32 "~0.2.3"
+ fd-slicer "~1.1.0"
+
+yoctocolors-cjs@^2.1.3:
+ version "2.1.3"
+ resolved "https://registry.yarnpkg.com/yoctocolors-cjs/-/yoctocolors-cjs-2.1.3.tgz#7e4964ea8ec422b7a40ac917d3a344cfd2304baa"
+ integrity sha512-U/PBtDf35ff0D8X8D0jfdzHYEPFxAI7jJlxZXwCSez5M3190m+QobIfh+sWDWSHMCWWJN2AWamkegn6vr6YBTw==
+
+zod@^3.24.1:
+ version "3.25.76"
+ resolved "https://registry.yarnpkg.com/zod/-/zod-3.25.76.tgz#26841c3f6fd22a6a2760e7ccb719179768471e34"
+ integrity sha512-gzUt/qt81nXsFGKIFcC3YnfEAx5NkunCfnDlvuBSSFS02bcXu4Lmea0AFIUwbLWxWPx3d9p8S5QoaujKcNQxcQ==
+
+zstddec@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/zstddec/-/zstddec-0.2.0.tgz#91c8cde8f351ef5fe0bdfca66bb14a5fa0d16d71"
+ integrity sha512-oyPnDa1X5c13+Y7mA/FDMNJrn4S8UNBe0KCqtDmor40Re7ALrPN6npFwyYVRRh+PqozZQdeg23QtbcamZnG5rA==
+
zwitch@^1.0.0:
version "1.0.5"
resolved "https://registry.yarnpkg.com/zwitch/-/zwitch-1.0.5.tgz#d11d7381ffed16b742f6af7b3f223d5cd9fe9920"
From 0aede9e2f9391fa7ba044bcd36f766e5a1302763 Mon Sep 17 00:00:00 2001
From: Alexia Soare <108459992+Alexia-Soare@users.noreply.github.com>
Date: Tue, 28 Jul 2026 16:19:07 +0300
Subject: [PATCH 16/22] fix: satisfy PHPStan on the page-state additions
wp_insert_post() without the wp_error flag returns an int, so the
instanceof WP_Error guard was dead code; the page-state helpers also
document their void return now.
Co-Authored-By: Claude Fable 5
---
includes/classes/wp-maintenance-mode-admin.php | 2 +-
includes/functions/helpers.php | 2 ++
2 files changed, 3 insertions(+), 1 deletion(-)
diff --git a/includes/classes/wp-maintenance-mode-admin.php b/includes/classes/wp-maintenance-mode-admin.php
index f455401..6577552 100644
--- a/includes/classes/wp-maintenance-mode-admin.php
+++ b/includes/classes/wp-maintenance-mode-admin.php
@@ -776,7 +776,7 @@ public function insert_template() {
$post_arr['post_title'] = __( 'Maintenance Page', 'wp-maintenance-mode' );
$page_id = wp_insert_post( $post_arr );
- if ( $page_id && ! $page_id instanceof WP_Error ) {
+ if ( $page_id ) {
update_post_meta( $page_id, '_wpmm_generated', 1 );
}
}
diff --git a/includes/functions/helpers.php b/includes/functions/helpers.php
index ed663a4..7352a5d 100644
--- a/includes/functions/helpers.php
+++ b/includes/functions/helpers.php
@@ -523,6 +523,7 @@ function sanitize_hex_color( $color ) {
*
* @since 2.6.23
* @param int $page_id page ID
+ * @return void
*/
function wpmm_record_page_state( $page_id ) {
$status = get_post_status( $page_id );
@@ -548,6 +549,7 @@ function wpmm_record_page_state( $page_id ) {
*
* @since 2.6.23
* @param int $page_id page ID
+ * @return void
*/
function wpmm_restore_page_state( $page_id ) {
$original_status = get_post_meta( $page_id, '_wpmm_original_status', true );
From dab296ca476777f58440163cebf804f0799e1881 Mon Sep 17 00:00:00 2001
From: Alexia Soare <108459992+Alexia-Soare@users.noreply.github.com>
Date: Tue, 28 Jul 2026 16:45:26 +0300
Subject: [PATCH 17/22] fix: never override user status changes and keep the
state record atomic
Addresses the follow-up Copilot review on #524:
- the plugin marks the publish it applies to a private page, and restore
only reverts the status while the page still carries that plugin-made
publish; a draft/private/trash the user chose in the meantime wins
- the original state lives in a single first-write-wins meta value, so a
racing request can neither poison the record nor observe half of it
- a maintenance template carried over from an old release is recorded as
no template, so restore removes it instead of making it permanent
Co-Authored-By: Claude Fable 5
---
includes/classes/wp-maintenance-mode.php | 4 +
includes/functions/helpers.php | 42 ++++++----
tests/page-state-test.php | 98 ++++++++++++++++--------
3 files changed, 98 insertions(+), 46 deletions(-)
diff --git a/includes/classes/wp-maintenance-mode.php b/includes/classes/wp-maintenance-mode.php
index 0d4dd34..3a79962 100644
--- a/includes/classes/wp-maintenance-mode.php
+++ b/includes/classes/wp-maintenance-mode.php
@@ -113,6 +113,10 @@ private function __construct() {
wp_functionality_constants();
}
wp_publish_post( $this->plugin_settings['design']['page_id'] );
+
+ // mark the publish as plugin-made, so restore can tell it apart
+ // from a status the user chose deliberately
+ update_post_meta( $this->plugin_settings['design']['page_id'], '_wpmm_applied_status', 'publish' );
}
}
diff --git a/includes/functions/helpers.php b/includes/functions/helpers.php
index 7352a5d..c174b05 100644
--- a/includes/functions/helpers.php
+++ b/includes/functions/helpers.php
@@ -534,33 +534,49 @@ function wpmm_record_page_state( $page_id ) {
$template = get_post_meta( $page_id, '_wp_page_template', true );
- // the unique flag makes the status key a first-write-wins claim on the
- // record, so a racing request cannot save the plugin-modified state
- if ( ! add_post_meta( $page_id, '_wpmm_original_status', $status, true ) ) {
- return;
+ // a selection carried over from an old release already wears the plugin's
+ // template; recording that would make the takeover permanent
+ if ( $template === 'templates/wpmm-page-template.php' ) {
+ $template = '';
}
- update_post_meta( $page_id, '_wpmm_original_template', $template );
+ // a single first-write-wins meta keeps the record atomic: a racing request
+ // can neither save the plugin-modified state nor observe half a record
+ add_post_meta(
+ $page_id,
+ '_wpmm_original_state',
+ array(
+ 'status' => $status,
+ 'template' => $template,
+ ),
+ true
+ );
}
/**
* Restore the selected maintenance page to its recorded original state.
* Pages without a recorded state are left untouched.
*
+ * The status is only put back while the page still carries the status the
+ * plugin applied: any other status — trash included — was the user's own
+ * doing and expresses intent the record predates.
+ *
* @since 2.6.23
* @param int $page_id page ID
* @return void
*/
function wpmm_restore_page_state( $page_id ) {
- $original_status = get_post_meta( $page_id, '_wpmm_original_status', true );
+ $state = get_post_meta( $page_id, '_wpmm_original_state', true );
- if ( empty( $original_status ) || ! get_post( $page_id ) ) {
+ if ( empty( $state ) || ! is_array( $state ) || ! get_post( $page_id ) ) {
return;
}
- // a trashed page reflects user intent; the plugin never trashes, so keep the
- // status but still hand back the template and clear the record below
- if ( get_post_status( $page_id ) !== 'trash' && get_post_status( $page_id ) !== $original_status ) {
+ $original_status = isset( $state['status'] ) ? $state['status'] : '';
+ $applied_status = get_post_meta( $page_id, '_wpmm_applied_status', true );
+ $current_status = get_post_status( $page_id );
+
+ if ( $original_status && $applied_status && $current_status === $applied_status && $current_status !== $original_status ) {
wp_update_post(
array(
'ID' => $page_id,
@@ -569,7 +585,7 @@ function wpmm_restore_page_state( $page_id ) {
);
}
- $original_template = get_post_meta( $page_id, '_wpmm_original_template', true );
+ $original_template = isset( $state['template'] ) ? $state['template'] : '';
if ( empty( $original_template ) ) {
delete_post_meta( $page_id, '_wp_page_template' );
@@ -578,8 +594,8 @@ function wpmm_restore_page_state( $page_id ) {
}
// clear the record so the next take-over captures the page's state afresh
- delete_post_meta( $page_id, '_wpmm_original_status' );
- delete_post_meta( $page_id, '_wpmm_original_template' );
+ delete_post_meta( $page_id, '_wpmm_original_state' );
+ delete_post_meta( $page_id, '_wpmm_applied_status' );
}
/**
diff --git a/tests/page-state-test.php b/tests/page-state-test.php
index a3b78ac..00f6303 100644
--- a/tests/page-state-test.php
+++ b/tests/page-state-test.php
@@ -245,7 +245,7 @@ public function test_changing_selection_restores_the_previously_selected_page()
// The first page is handed back with its own template, and its record is cleared.
$this->assertSame( 'custom-template.php', get_post_meta( $first_page_id, '_wp_page_template', true ) );
- $this->assertFalse( metadata_exists( 'post', $first_page_id, '_wpmm_original_status' ) );
+ $this->assertFalse( metadata_exists( 'post', $first_page_id, '_wpmm_original_state' ) );
$settings = get_option( 'wpmm_settings' );
$this->assertSame( $second_page_id, (int) $settings['design']['page_id'] );
@@ -261,13 +261,59 @@ public function test_clearing_selection_restores_the_previously_selected_page()
$this->select_page( $this->make_settings( 0, 0 ), $page_id );
- // Simulate the state an active maintenance mode leaves the page in.
- wp_publish_post( $page_id );
+ // Maintenance mode takes the page over and publishes it.
+ $this->boot_plugin( $this->make_settings( 1, $page_id ) );
$this->select_page( $this->make_settings( 0, $page_id ), 0 );
$this->assertSame( 'private', get_post_status( $page_id ) );
- $this->assertFalse( metadata_exists( 'post', $page_id, '_wpmm_original_status' ) );
+ $this->assertFalse( metadata_exists( 'post', $page_id, '_wpmm_original_state' ) );
+ }
+
+ public function test_status_change_made_by_the_user_survives_disable() {
+ $page_id = self::factory()->post->create(
+ array(
+ 'post_type' => 'page',
+ 'post_status' => 'publish',
+ )
+ );
+
+ // The user selects the page and enables maintenance mode...
+ $this->select_page( $this->make_settings( 0, 0 ), $page_id );
+ $this->boot_plugin( $this->make_settings( 1, $page_id ) );
+
+ // ...then deliberately unpublishes the page while the mode is active.
+ wp_update_post(
+ array(
+ 'ID' => $page_id,
+ 'post_status' => 'draft',
+ )
+ );
+
+ $this->boot_plugin( $this->make_settings( 0, $page_id ) );
+ do_action( 'init' );
+
+ // The draft is the user's latest intent; disabling must not republish it.
+ $this->assertSame( 'draft', get_post_status( $page_id ) );
+ }
+
+ public function test_template_installed_by_an_old_release_is_not_recorded_as_original() {
+ $page_id = self::factory()->post->create(
+ array(
+ 'post_type' => 'page',
+ 'post_status' => 'publish',
+ )
+ );
+ // A selection carried over from an old plugin release already wears
+ // the maintenance template; it must not be mistaken for user state.
+ update_post_meta( $page_id, '_wp_page_template', 'templates/wpmm-page-template.php' );
+
+ $this->boot_plugin( $this->make_settings( 1, $page_id ) );
+
+ $this->boot_plugin( $this->make_settings( 0, $page_id ) );
+ do_action( 'init' );
+
+ $this->assertSame( '', get_post_meta( $page_id, '_wp_page_template', true ) );
}
public function test_restoring_a_trashed_page_keeps_trash_but_clears_template_and_record() {
@@ -289,8 +335,8 @@ public function test_restoring_a_trashed_page_keeps_trash_but_clears_template_an
// The status is untouched, but the page no longer carries plugin state.
$this->assertSame( 'trash', get_post_status( $page_id ) );
$this->assertSame( 'custom-template.php', get_post_meta( $page_id, '_wp_page_template', true ) );
- $this->assertFalse( metadata_exists( 'post', $page_id, '_wpmm_original_status' ) );
- $this->assertFalse( metadata_exists( 'post', $page_id, '_wpmm_original_template' ) );
+ $this->assertFalse( metadata_exists( 'post', $page_id, '_wpmm_original_state' ) );
+ $this->assertFalse( metadata_exists( 'post', $page_id, '_wpmm_applied_status' ) );
}
public function test_applying_template_to_user_page_creates_new_page_instead_of_overwriting() {
@@ -365,7 +411,7 @@ public function test_enabled_mode_with_deleted_page_writes_nothing() {
$this->boot_plugin( $this->make_settings( 1, $page_id ) );
$this->assertFalse( metadata_exists( 'post', $page_id, '_wp_page_template' ) );
- $this->assertFalse( metadata_exists( 'post', $page_id, '_wpmm_original_status' ) );
+ $this->assertFalse( metadata_exists( 'post', $page_id, '_wpmm_original_state' ) );
}
public function test_trashed_page_is_not_resurrected_on_disable() {
@@ -398,35 +444,27 @@ public function test_enabled_mode_with_trashed_page_records_nothing() {
$this->boot_plugin( $this->make_settings( 1, $page_id ) );
- $this->assertFalse( metadata_exists( 'post', $page_id, '_wpmm_original_status' ) );
+ $this->assertFalse( metadata_exists( 'post', $page_id, '_wpmm_original_state' ) );
}
public function test_recording_twice_does_not_poison_the_original_state() {
$page_id = self::factory()->post->create(
array(
'post_type' => 'page',
- 'post_status' => 'publish',
+ 'post_status' => 'private',
)
);
update_post_meta( $page_id, '_wp_page_template', 'custom-template.php' );
- wpmm_record_page_state( $page_id );
-
- // The plugin takes the page over...
- wp_update_post(
- array(
- 'ID' => $page_id,
- 'post_status' => 'private',
- )
- );
- update_post_meta( $page_id, '_wp_page_template', 'templates/wpmm-page-template.php' );
+ // The plugin takes the page over: applies its template and publishes.
+ $this->boot_plugin( $this->make_settings( 1, $page_id ) );
- // ...and the user re-selects the same page while it is in that state.
+ // The user re-selects the same page while it is in that state.
wpmm_record_page_state( $page_id );
wpmm_restore_page_state( $page_id );
- $this->assertSame( 'publish', get_post_status( $page_id ) );
+ $this->assertSame( 'private', get_post_status( $page_id ) );
$this->assertSame( 'custom-template.php', get_post_meta( $page_id, '_wp_page_template', true ) );
}
@@ -457,23 +495,17 @@ public function test_plugin_deactivation_restores_selected_page() {
$page_id = self::factory()->post->create(
array(
'post_type' => 'page',
- 'post_status' => 'publish',
- )
- );
-
- update_option( 'wpmm_settings', $this->make_settings( 0, $page_id ) );
- wpmm_record_page_state( $page_id );
-
- // Simulate the state a broken site is in: selected page left private.
- wp_update_post(
- array(
- 'ID' => $page_id,
'post_status' => 'private',
)
);
+ // Maintenance mode is active: the page is taken over and published.
+ $this->boot_plugin( $this->make_settings( 1, $page_id ) );
+ $this->assertSame( 'publish', get_post_status( $page_id ) );
+
+ // Deactivating the plugin hands the page back, private again.
WP_Maintenance_Mode::single_deactivate();
- $this->assertSame( 'publish', get_post_status( $page_id ) );
+ $this->assertSame( 'private', get_post_status( $page_id ) );
}
}
From 97d3836df0a987640cefee6da3f5a3e0624f2963 Mon Sep 17 00:00:00 2001
From: Alexia Soare <108459992+Alexia-Soare@users.noreply.github.com>
Date: Wed, 29 Jul 2026 12:05:00 +0300
Subject: [PATCH 18/22] fix: keep a private status the user chooses while
maintenance is active
The active-mode constructor used to publish the selected page on every
request it found it private, silently undoing a deliberate user change
and mislabeling that publish as the original takeover. Publishing is now
gated on the recorded original status being private and on the plugin
not having published already, so it happens exactly once per takeover.
Co-Authored-By: Claude Fable 5
---
includes/classes/wp-maintenance-mode.php | 22 +++++----
tests/page-state-test.php | 58 ++++++++++++++++++++++++
2 files changed, 72 insertions(+), 8 deletions(-)
diff --git a/includes/classes/wp-maintenance-mode.php b/includes/classes/wp-maintenance-mode.php
index 3a79962..6c1d908 100644
--- a/includes/classes/wp-maintenance-mode.php
+++ b/includes/classes/wp-maintenance-mode.php
@@ -108,15 +108,21 @@ private function __construct() {
}
if ( get_post_status( $this->plugin_settings['design']['page_id'] ) === 'private' ) {
- add_filter( 'wpo_purge_all_cache_on_update', '__return_true' );
- if ( function_exists( 'wp_functionality_constants' ) ) {
- wp_functionality_constants();
- }
- wp_publish_post( $this->plugin_settings['design']['page_id'] );
+ $original_state = get_post_meta( $this->plugin_settings['design']['page_id'], '_wpmm_original_state', true );
+
+ // only publish the page that was private when first taken over, and
+ // only once: a private status the user chose afterwards is theirs to keep
+ if ( is_array( $original_state ) && isset( $original_state['status'] ) && $original_state['status'] === 'private' && ! get_post_meta( $this->plugin_settings['design']['page_id'], '_wpmm_applied_status', true ) ) {
+ add_filter( 'wpo_purge_all_cache_on_update', '__return_true' );
+ if ( function_exists( 'wp_functionality_constants' ) ) {
+ wp_functionality_constants();
+ }
+ wp_publish_post( $this->plugin_settings['design']['page_id'] );
- // mark the publish as plugin-made, so restore can tell it apart
- // from a status the user chose deliberately
- update_post_meta( $this->plugin_settings['design']['page_id'], '_wpmm_applied_status', 'publish' );
+ // mark the publish as plugin-made, so restore can tell it apart
+ // from a status the user chose deliberately
+ update_post_meta( $this->plugin_settings['design']['page_id'], '_wpmm_applied_status', 'publish' );
+ }
}
}
diff --git a/tests/page-state-test.php b/tests/page-state-test.php
index 00f6303..2676b5e 100644
--- a/tests/page-state-test.php
+++ b/tests/page-state-test.php
@@ -270,6 +270,64 @@ public function test_clearing_selection_restores_the_previously_selected_page()
$this->assertFalse( metadata_exists( 'post', $page_id, '_wpmm_original_state' ) );
}
+ public function test_private_status_chosen_during_active_mode_is_preserved() {
+ $page_id = self::factory()->post->create(
+ array(
+ 'post_type' => 'page',
+ 'post_status' => 'publish',
+ )
+ );
+
+ $this->select_page( $this->make_settings( 0, 0 ), $page_id );
+ $this->boot_plugin( $this->make_settings( 1, $page_id ) );
+
+ // The user makes the page private while maintenance mode is active.
+ wp_update_post(
+ array(
+ 'ID' => $page_id,
+ 'post_status' => 'private',
+ )
+ );
+
+ // Any later request while the mode is still active must not republish it.
+ $this->boot_plugin( $this->make_settings( 1, $page_id ) );
+ $this->assertSame( 'private', get_post_status( $page_id ) );
+
+ // And disabling the mode must not resurrect the pre-private status either.
+ $this->boot_plugin( $this->make_settings( 0, $page_id ) );
+ do_action( 'init' );
+ $this->assertSame( 'private', get_post_status( $page_id ) );
+ }
+
+ public function test_replugin_published_page_reprivated_by_user_stays_private() {
+ $page_id = self::factory()->post->create(
+ array(
+ 'post_type' => 'page',
+ 'post_status' => 'private',
+ )
+ );
+
+ // The plugin legitimately publishes the originally private page once.
+ $this->boot_plugin( $this->make_settings( 1, $page_id ) );
+ $this->assertSame( 'publish', get_post_status( $page_id ) );
+
+ // The user puts it back to private while the mode is still active.
+ wp_update_post(
+ array(
+ 'ID' => $page_id,
+ 'post_status' => 'private',
+ )
+ );
+
+ // The plugin already used its one publish; the user's choice stays.
+ $this->boot_plugin( $this->make_settings( 1, $page_id ) );
+ $this->assertSame( 'private', get_post_status( $page_id ) );
+
+ $this->boot_plugin( $this->make_settings( 0, $page_id ) );
+ do_action( 'init' );
+ $this->assertSame( 'private', get_post_status( $page_id ) );
+ }
+
public function test_status_change_made_by_the_user_survives_disable() {
$page_id = self::factory()->post->create(
array(
From 68873ca743b7b30e2b8f239ed7c8052ad41f37bb Mon Sep 17 00:00:00 2001
From: Alexia Soare <108459992+Alexia-Soare@users.noreply.github.com>
Date: Wed, 29 Jul 2026 12:27:29 +0300
Subject: [PATCH 19/22] fix: keep the page status when overwriting a generated
page with a template
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
The import reused the creation post_arr, whose private status unpublished
a generated page maintenance mode had already made public — and since the
plugin's publish is one-shot now, nothing ever republished it, leaving
visitors on a 404 instead of the maintenance screen.
Co-Authored-By: Claude Fable 5
---
.../classes/wp-maintenance-mode-admin.php | 6 ++++-
tests/page-state-test.php | 24 +++++++++++++++++++
2 files changed, 29 insertions(+), 1 deletion(-)
diff --git a/includes/classes/wp-maintenance-mode-admin.php b/includes/classes/wp-maintenance-mode-admin.php
index 6577552..a1787f2 100644
--- a/includes/classes/wp-maintenance-mode-admin.php
+++ b/includes/classes/wp-maintenance-mode-admin.php
@@ -764,7 +764,11 @@ public function insert_template() {
$page_exists = $selected_page_id && get_post_status( $selected_page_id ) && get_post_status( $selected_page_id ) !== 'trash';
if ( $page_exists && get_post_meta( $selected_page_id, '_wpmm_generated', true ) ) {
- // only pages created by the plugin may be overwritten
+ // only pages created by the plugin may be overwritten; the private
+ // status is for new pages only — overwriting must not unpublish a
+ // page maintenance mode already made public
+ unset( $post_arr['post_status'] );
+
$post_arr['ID'] = $selected_page_id;
$page_id = wp_update_post( $post_arr );
} else {
diff --git a/tests/page-state-test.php b/tests/page-state-test.php
index 2676b5e..f2085ac 100644
--- a/tests/page-state-test.php
+++ b/tests/page-state-test.php
@@ -428,6 +428,30 @@ public function test_applying_template_to_user_page_creates_new_page_instead_of_
$this->assertNotEmpty( get_post( $new_page_id )->post_content );
}
+ public function test_importing_template_into_published_generated_page_keeps_it_public() {
+ $page_id = self::factory()->post->create(
+ array(
+ 'post_type' => 'page',
+ 'post_status' => 'private',
+ )
+ );
+ update_post_meta( $page_id, '_wpmm_generated', 1 );
+
+ // Maintenance mode takes the generated page over and publishes it.
+ $this->boot_plugin( $this->make_settings( 1, $page_id ) );
+ $this->assertSame( 'publish', get_post_status( $page_id ) );
+
+ // The user imports another template into the same page while the mode is active.
+ $this->apply_template( $this->make_settings( 1, $page_id ) );
+
+ // The maintenance page must stay publicly visible; the plugin's one
+ // publish is spent, so nothing would ever republish it.
+ $this->assertSame( 'publish', get_post_status( $page_id ) );
+
+ $this->boot_plugin( $this->make_settings( 1, $page_id ) );
+ $this->assertSame( 'publish', get_post_status( $page_id ) );
+ }
+
public function test_applying_template_to_generated_page_updates_it_in_place() {
$page_id = self::factory()->post->create(
array(
From 418148ec3cddc00b0679ae048e916cf067136212 Mon Sep 17 00:00:00 2001
From: Alexia Soare <108459992+Alexia-Soare@users.noreply.github.com>
Date: Wed, 29 Jul 2026 12:44:08 +0300
Subject: [PATCH 20/22] fix: route every selection change through one take-over
lifecycle
The Design form posts page_id too, so a plain (non-AJAX) save could
switch the selection without restoring the old page or recording the
new one. Both writers now share switch_selected_page(). The template
import also hands back a trashed selection now, instead of orphaning
its record and maintenance template.
Co-Authored-By: Claude Fable 5
---
.../classes/wp-maintenance-mode-admin.php | 31 ++++-
tests/page-state-test.php | 108 ++++++++++++++++++
2 files changed, 133 insertions(+), 6 deletions(-)
diff --git a/includes/classes/wp-maintenance-mode-admin.php b/includes/classes/wp-maintenance-mode-admin.php
index a1787f2..6da4d03 100644
--- a/includes/classes/wp-maintenance-mode-admin.php
+++ b/includes/classes/wp-maintenance-mode-admin.php
@@ -498,6 +498,11 @@ public function save_plugin_settings() {
// Other
$_POST['options']['design']['other_custom_css'] = sanitize_textarea_field( $_POST['options']['design']['other_custom_css'] );
+ // Selected page: the form is a second writer besides the AJAX
+ // select, so route it through the same take-over lifecycle
+ $_POST['options']['design']['page_id'] = isset( $_POST['options']['design']['page_id'] ) ? absint( $_POST['options']['design']['page_id'] ) : 0;
+ $this->switch_selected_page( $_POST['options']['design']['page_id'] );
+
// Delete cache when is activated
if ( ! empty( $this->plugin_settings['general']['status'] ) && $this->plugin_settings['general']['status'] === 1 ) {
wpmm_delete_cache();
@@ -688,6 +693,23 @@ public function select_page() {
$page_id = isset( $_POST['page_id'] ) ? absint( $_POST['page_id'] ) : 0;
+ $this->switch_selected_page( $page_id );
+
+ update_option( 'wpmm_settings', $this->plugin_settings );
+
+ wp_send_json_success();
+ }
+
+ /**
+ * Switch the selected maintenance page, handing the previous page back
+ * and taking the new one over. Every path that changes the selection
+ * (AJAX select, settings form) must go through here.
+ *
+ * @since 2.6.23
+ * @param int $page_id The newly selected page ID; 0 clears the selection.
+ * @return void
+ */
+ private function switch_selected_page( $page_id ) {
$previous_page_id = isset( $this->plugin_settings['design']['page_id'] ) ? absint( $this->plugin_settings['design']['page_id'] ) : 0;
if ( $previous_page_id && $previous_page_id !== $page_id ) {
@@ -709,10 +731,6 @@ public function select_page() {
)
);
}
-
- update_option( 'wpmm_settings', $this->plugin_settings );
-
- wp_send_json_success();
}
/**
@@ -772,8 +790,9 @@ public function insert_template() {
$post_arr['ID'] = $selected_page_id;
$page_id = wp_update_post( $post_arr );
} else {
- if ( $page_exists ) {
- // hand the user's page back before switching to a generated one
+ if ( $selected_page_id && get_post_status( $selected_page_id ) ) {
+ // hand the user's page back before switching to a generated one —
+ // trashed pages included, or their record and template are orphaned
wpmm_restore_page_state( $selected_page_id );
}
diff --git a/tests/page-state-test.php b/tests/page-state-test.php
index f2085ac..06f4224 100644
--- a/tests/page-state-test.php
+++ b/tests/page-state-test.php
@@ -194,6 +194,114 @@ private function select_page( $settings, $page_id ) {
$_POST = array();
}
+ /**
+ * Simulate a plain (non-AJAX) Design tab form submission.
+ *
+ * @param array $settings Value for the wpmm_settings option.
+ * @param array $design Posted options[design] values.
+ * @return void
+ */
+ private function save_design_settings( $settings, $design ) {
+ $this->boot_plugin( $settings );
+
+ if ( ! class_exists( 'WP_Maintenance_Mode_Admin' ) ) {
+ require_once WPMM_CLASSES_PATH . 'wp-maintenance-mode-admin.php';
+ }
+
+ $instance = new ReflectionProperty( 'WP_Maintenance_Mode_Admin', 'instance' );
+ $instance->setAccessible( true );
+ $instance->setValue( null, null );
+
+ $admin = WP_Maintenance_Mode_Admin::get_instance();
+ $admin->load_default_settings();
+
+ wp_set_current_user( self::factory()->user->create( array( 'role' => 'administrator' ) ) );
+
+ $_POST = array(
+ '_wpnonce' => wp_create_nonce( 'tab-design' ),
+ 'tab' => 'design',
+ 'options' => array( 'design' => $design ),
+ );
+
+ $redirect_catcher = function () {
+ // save_plugin_settings() ends with wp_safe_redirect() + exit;
+ // escaping on the redirect filter keeps the test process alive
+ throw new WPDieException( 'redirected' );
+ };
+ add_filter( 'wp_redirect', $redirect_catcher );
+
+ try {
+ $admin->save_plugin_settings();
+ } catch ( WPDieException $e ) {
+ // expected
+ }
+
+ remove_filter( 'wp_redirect', $redirect_catcher );
+ $_POST = array();
+ wp_set_current_user( 0 );
+ }
+
+ public function test_design_form_save_switches_selection_through_the_same_lifecycle() {
+ $first_page_id = self::factory()->post->create(
+ array(
+ 'post_type' => 'page',
+ 'post_status' => 'publish',
+ )
+ );
+ update_post_meta( $first_page_id, '_wp_page_template', 'custom-template.php' );
+
+ $second_page_id = self::factory()->post->create(
+ array(
+ 'post_type' => 'page',
+ 'post_status' => 'publish',
+ )
+ );
+
+ $this->select_page( $this->make_settings( 0, 0 ), $first_page_id );
+
+ // The user switches the dropdown and submits the form without the AJAX call.
+ $design = WP_Maintenance_Mode::get_instance()->default_settings()['design'];
+ $design['page_id'] = (string) $second_page_id;
+ $this->save_design_settings( $this->make_settings( 0, $first_page_id ), $design );
+
+ // The first page is handed back...
+ $this->assertSame( 'custom-template.php', get_post_meta( $first_page_id, '_wp_page_template', true ) );
+ $this->assertFalse( metadata_exists( 'post', $first_page_id, '_wpmm_original_state' ) );
+
+ // ...and the second is taken over, exactly as the AJAX path does it.
+ $this->assertSame( 'templates/wpmm-page-template.php', get_post_meta( $second_page_id, '_wp_page_template', true ) );
+ $this->assertTrue( metadata_exists( 'post', $second_page_id, '_wpmm_original_state' ) );
+
+ $settings = get_option( 'wpmm_settings' );
+ $this->assertSame( $second_page_id, (int) $settings['design']['page_id'] );
+ }
+
+ public function test_importing_template_over_a_trashed_selection_cleans_it_up() {
+ $page_id = self::factory()->post->create(
+ array(
+ 'post_type' => 'page',
+ 'post_status' => 'publish',
+ )
+ );
+ update_post_meta( $page_id, '_wp_page_template', 'custom-template.php' );
+
+ // The page is taken over, then the user trashes it while it is selected.
+ wpmm_record_page_state( $page_id );
+ update_post_meta( $page_id, '_wp_page_template', 'templates/wpmm-page-template.php' );
+ wp_trash_post( $page_id );
+
+ $this->apply_template( $this->make_settings( 0, $page_id ) );
+
+ // The trashed page keeps its status but sheds all plugin state.
+ $this->assertSame( 'trash', get_post_status( $page_id ) );
+ $this->assertSame( 'custom-template.php', get_post_meta( $page_id, '_wp_page_template', true ) );
+ $this->assertFalse( metadata_exists( 'post', $page_id, '_wpmm_original_state' ) );
+
+ // The template landed on a fresh generated page.
+ $settings = get_option( 'wpmm_settings' );
+ $this->assertNotSame( $page_id, (int) $settings['design']['page_id'] );
+ }
+
public function test_select_page_workflow_leaves_selected_homepage_public() {
$page_id = self::factory()->post->create(
array(
From 66f5f3d273e15c75cf51563814c60b09656f682d Mon Sep 17 00:00:00 2001
From: Alexia Soare <108459992+Alexia-Soare@users.noreply.github.com>
Date: Wed, 29 Jul 2026 13:18:32 +0300
Subject: [PATCH 21/22] fix: hand the selected page back when the design tab is
reset
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Resetting design replaced the whole tab with defaults, dropping page_id
without restoring the page — the last selection writer outside the
take-over lifecycle.
Co-Authored-By: Claude Fable 5
---
.../classes/wp-maintenance-mode-admin.php | 5 ++
tests/page-state-test.php | 47 +++++++++++++++++++
2 files changed, 52 insertions(+)
diff --git a/includes/classes/wp-maintenance-mode-admin.php b/includes/classes/wp-maintenance-mode-admin.php
index 6da4d03..3a0dc12 100644
--- a/includes/classes/wp-maintenance-mode-admin.php
+++ b/includes/classes/wp-maintenance-mode-admin.php
@@ -665,6 +665,11 @@ public function reset_plugin_settings() {
throw new Exception( __( 'The tab slug must exist.', 'wp-maintenance-mode' ) );
}
+ // resetting design drops the selection, so hand the page back first
+ if ( 'design' === $tab ) {
+ $this->switch_selected_page( 0 );
+ }
+
// update options using the default values
$this->plugin_settings[ $tab ] = $this->plugin_default_settings[ $tab ];
update_option( 'wpmm_settings', $this->plugin_settings );
diff --git a/tests/page-state-test.php b/tests/page-state-test.php
index 06f4224..a7adf55 100644
--- a/tests/page-state-test.php
+++ b/tests/page-state-test.php
@@ -276,6 +276,53 @@ public function test_design_form_save_switches_selection_through_the_same_lifecy
$this->assertSame( $second_page_id, (int) $settings['design']['page_id'] );
}
+ public function test_resetting_the_design_tab_restores_the_selected_page() {
+ $page_id = self::factory()->post->create(
+ array(
+ 'post_type' => 'page',
+ 'post_status' => 'publish',
+ )
+ );
+ update_post_meta( $page_id, '_wp_page_template', 'custom-template.php' );
+
+ $this->select_page( $this->make_settings( 0, 0 ), $page_id );
+
+ // The user resets the Design tab while the page is selected.
+ $admin = WP_Maintenance_Mode_Admin::get_instance();
+ wp_set_current_user( self::factory()->user->create( array( 'role' => 'administrator' ) ) );
+
+ $_POST = array(
+ '_wpnonce' => wp_create_nonce( 'tab-design' ),
+ 'tab' => 'design',
+ );
+
+ $die_handler = function () {
+ return function () {
+ throw new WPDieException( 'json response sent' );
+ };
+ };
+ add_filter( 'wp_doing_ajax', '__return_true' );
+ add_filter( 'wp_die_ajax_handler', $die_handler );
+
+ try {
+ $admin->reset_plugin_settings();
+ } catch ( WPDieException $e ) {
+ // wp_send_json_*() ends the request with wp_die(); expected.
+ }
+
+ remove_filter( 'wp_doing_ajax', '__return_true' );
+ remove_filter( 'wp_die_ajax_handler', $die_handler );
+ $_POST = array();
+ wp_set_current_user( 0 );
+
+ // The page is handed back, not orphaned with plugin state.
+ $this->assertSame( 'custom-template.php', get_post_meta( $page_id, '_wp_page_template', true ) );
+ $this->assertFalse( metadata_exists( 'post', $page_id, '_wpmm_original_state' ) );
+
+ $settings = get_option( 'wpmm_settings' );
+ $this->assertTrue( empty( $settings['design']['page_id'] ) );
+ }
+
public function test_importing_template_over_a_trashed_selection_cleans_it_up() {
$page_id = self::factory()->post->create(
array(
From ac50c64d52340f0e1e37539048db49d0ca7abd83 Mon Sep 17 00:00:00 2001
From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com>
Date: Wed, 29 Jul 2026 12:10:43 +0000
Subject: [PATCH 22/22] ci: set least-privilege token permissions in PHP tests
workflow
---
.github/workflows/test-php.yml | 2 ++
1 file changed, 2 insertions(+)
diff --git a/.github/workflows/test-php.yml b/.github/workflows/test-php.yml
index 4ae17fa..eb20a58 100644
--- a/.github/workflows/test-php.yml
+++ b/.github/workflows/test-php.yml
@@ -7,6 +7,8 @@ on:
concurrency:
group: ${{ github.workflow }}-${{ github.event_name == 'pull_request' && github.head_ref || github.ref }}
cancel-in-progress: true
+permissions:
+ contents: read
jobs:
phplint:
name: PHP Lint