From 750f743c639c31d91cbb73e8d25f24ca3c35f230 Mon Sep 17 00:00:00 2001 From: Sergey Biryukov Date: Sat, 7 Dec 2024 22:06:56 +0000 Subject: [PATCH 001/117] Coding Standards: Use strict comparison in `media_upload_form_handler()`. Follow-up to [10390]. Props deepakrohilla, iflairwebtechnologies, mukesh27, dingguodong, aristath. Fixes #62009. git-svn-id: https://develop.svn.wordpress.org/trunk@59497 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-admin/includes/media.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wp-admin/includes/media.php b/src/wp-admin/includes/media.php index df63128a16f4d..82187fd62e50d 100644 --- a/src/wp-admin/includes/media.php +++ b/src/wp-admin/includes/media.php @@ -773,7 +773,7 @@ function media_upload_form_handler() { $post['menu_order'] = $attachment['menu_order']; } - if ( isset( $send_id ) && $attachment_id == $send_id ) { + if ( isset( $send_id ) && $attachment_id === $send_id ) { if ( isset( $attachment['post_parent'] ) ) { $post['post_parent'] = $attachment['post_parent']; } From faff3a2085bda2413547813172e5902c93389830 Mon Sep 17 00:00:00 2001 From: Sergey Biryukov Date: Sun, 8 Dec 2024 23:42:00 +0000 Subject: [PATCH 002/117] Coding Standards: Use strict comparison in `wp-includes/comment-template.php`. Follow-up to [162], [2685], [4494], [8878], [8961], [55660]. Props aristath, poena, afercia, SergeyBiryukov. See #62279. git-svn-id: https://develop.svn.wordpress.org/trunk@59498 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/comment-template.php | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/wp-includes/comment-template.php b/src/wp-includes/comment-template.php index ee7ca216e17a1..bcca00bc23a0d 100644 --- a/src/wp-includes/comment-template.php +++ b/src/wp-includes/comment-template.php @@ -961,7 +961,7 @@ function comments_number( $zero = false, $one = false, $more = false, $post = 0 * @return string Language string for the number of comments a post has. */ function get_comments_number_text( $zero = false, $one = false, $more = false, $post = 0 ) { - $comments_number = get_comments_number( $post ); + $comments_number = (int) get_comments_number( $post ); if ( $comments_number > 1 ) { if ( false === $more ) { @@ -996,7 +996,7 @@ function get_comments_number_text( $zero = false, $one = false, $more = false, $ $comments_number_text = str_replace( '%', number_format_i18n( $comments_number ), $more ); } - } elseif ( 0 == $comments_number ) { + } elseif ( 0 === $comments_number ) { $comments_number_text = ( false === $zero ) ? __( 'No Comments' ) : $zero; } else { // Must be one. $comments_number_text = ( false === $one ) ? __( '1 Comment' ) : $one; @@ -1648,7 +1648,7 @@ function comments_template( $file = '/comments.php', $separate_comments = false function comments_popup_link( $zero = false, $one = false, $more = false, $css_class = '', $none = false ) { $post_id = get_the_ID(); $post_title = get_the_title(); - $comments_number = get_comments_number( $post_id ); + $comments_number = (int) get_comments_number( $post_id ); if ( false === $zero ) { /* translators: %s: Post title. */ @@ -1675,7 +1675,7 @@ function comments_popup_link( $zero = false, $one = false, $more = false, $css_c $none = sprintf( __( 'Comments Off on %s' ), $post_title ); } - if ( 0 == $comments_number && ! comments_open() && ! pings_open() ) { + if ( 0 === $comments_number && ! comments_open() && ! pings_open() ) { printf( '%2$s', ! empty( $css_class ) ? ' class="' . esc_attr( $css_class ) . '"' : '', @@ -1689,7 +1689,7 @@ function comments_popup_link( $zero = false, $one = false, $more = false, $css_c return; } - if ( 0 == $comments_number ) { + if ( 0 === $comments_number ) { $respond_link = get_permalink() . '#respond'; /** * Filters the respond link when a post has no comments. @@ -1773,7 +1773,10 @@ function get_comment_reply_link( $args = array(), $comment = null, $post = null $args = wp_parse_args( $args, $defaults ); - if ( 0 == $args['depth'] || $args['max_depth'] <= $args['depth'] ) { + $args['max_depth'] = (int) $args['max_depth']; + $args['depth'] = (int) $args['depth']; + + if ( 0 === $args['depth'] || $args['max_depth'] <= $args['depth'] ) { return; } From a1079b698133d1763504d81fb102a8f0caa1e145 Mon Sep 17 00:00:00 2001 From: Isabel Brison Date: Mon, 9 Dec 2024 02:53:35 +0000 Subject: [PATCH 003/117] =?UTF-8?q?Editor:=20Update=20docblocks=20for?= =?UTF-8?q?=C2=A0`wp=5Fget=5Fglobal=5Fstylesheet`=C2=A0and=C2=A0`WP=5FThem?= =?UTF-8?q?e=5FJSON::get=5Fstylesheet`.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Updates docblocks to account for new use of the `custom-css` string in their `$types` parameters and adds information to deprecation of `wp_get_global_styles_custom_css`. Props justlevine, isabel_brison, ramonopoly. Fixes #62665. git-svn-id: https://develop.svn.wordpress.org/trunk@59499 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/class-wp-theme-json.php | 2 ++ src/wp-includes/deprecated.php | 2 +- src/wp-includes/global-styles-and-settings.php | 2 +- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/wp-includes/class-wp-theme-json.php b/src/wp-includes/class-wp-theme-json.php index cb48672c438bb..7d1216a4515d3 100644 --- a/src/wp-includes/class-wp-theme-json.php +++ b/src/wp-includes/class-wp-theme-json.php @@ -1317,6 +1317,8 @@ public function get_settings() { * - `variables`: only the CSS Custom Properties for presets & custom ones. * - `styles`: only the styles section in theme.json. * - `presets`: only the classes for the presets. + * - `base-layout-styles`: only the base layout styles. + * - `custom-css`: only the custom CSS. * @param string[] $origins A list of origins to include. By default it includes VALID_ORIGINS. * @param array $options { * Optional. An array of options for now used for internal purposes only (may change without notice). diff --git a/src/wp-includes/deprecated.php b/src/wp-includes/deprecated.php index 348267b6a5b80..09d7867156b3f 100644 --- a/src/wp-includes/deprecated.php +++ b/src/wp-includes/deprecated.php @@ -6316,7 +6316,7 @@ function wp_interactivity_process_directives_of_interactive_blocks( array $parse * Gets the global styles custom CSS from theme.json. * * @since 6.2.0 - * @deprecated 6.7.0 Use {@see 'wp_get_global_stylesheet'} instead. + * @deprecated 6.7.0 Use {@see 'wp_get_global_stylesheet'} instead for top-level custom CSS, or {@see 'WP_Theme_JSON::get_styles_for_block'} for block-level custom CSS. * * @return string The global styles custom CSS. */ diff --git a/src/wp-includes/global-styles-and-settings.php b/src/wp-includes/global-styles-and-settings.php index 34fc28694be64..b75dd79ea68c5 100644 --- a/src/wp-includes/global-styles-and-settings.php +++ b/src/wp-includes/global-styles-and-settings.php @@ -142,7 +142,7 @@ function wp_get_global_styles( $path = array(), $context = array() ) { * @since 6.6.0 Resolves relative paths in theme.json styles to theme absolute paths. * * @param array $types Optional. Types of styles to load. - * It accepts as values 'variables', 'presets', 'styles', 'base-layout-styles'. + * See {@see 'WP_Theme_JSON::get_stylesheet'} for all valid types. * If empty, it'll load the following: * - for themes without theme.json: 'variables', 'presets', 'base-layout-styles'. * - for themes with theme.json: 'variables', 'presets', 'styles'. From 0d428194d1e6d6f1285d45cafd84b18f514070c1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Greg=20Zi=C3=83=C2=B3=C3=85=E2=80=9Akowski?= Date: Mon, 9 Dec 2024 12:42:42 +0000 Subject: [PATCH 004/117] HTML API: Step past closing HTML, BODY tags The HTML specification does not close HTML or BODY tags (pop them off the stack of open elements) when their tag closers are encountered. The HTML processor correctly handled this behavior, however it incorrectly "paused" by returning true from the step functions. Props jonsurrell, dmsnell, gziolo. Fixes #62583. git-svn-id: https://develop.svn.wordpress.org/trunk@59500 602fd350-edb4-49c9-b593-d223f7449a82 --- .../html-api/class-wp-html-processor.php | 27 ++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/src/wp-includes/html-api/class-wp-html-processor.php b/src/wp-includes/html-api/class-wp-html-processor.php index e88757ec7b4c2..7b156d8a605fa 100644 --- a/src/wp-includes/html-api/class-wp-html-processor.php +++ b/src/wp-includes/html-api/class-wp-html-processor.php @@ -2318,7 +2318,14 @@ private function step_in_body(): bool { */ $this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_AFTER_BODY; - return true; + /* + * The BODY element is not removed from the stack of open elements. + * Only internal state has changed, this does not qualify as a "step" + * in terms of advancing through the document to another token. + * Nothing has been pushed or popped. + * Proceed to parse the next item. + */ + return $this->step(); /* * > An end tag whose tag name is "html" @@ -4391,7 +4398,14 @@ private function step_after_body(): bool { } $this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_AFTER_AFTER_BODY; - return true; + /* + * The HTML element is not removed from the stack of open elements. + * Only internal state has changed, this does not qualify as a "step" + * in terms of advancing through the document to another token. + * Nothing has been pushed or popped. + * Proceed to parse the next item. + */ + return $this->step(); } /* @@ -4586,7 +4600,14 @@ private function step_after_frameset(): bool { */ case '-HTML': $this->state->insertion_mode = WP_HTML_Processor_State::INSERTION_MODE_AFTER_AFTER_FRAMESET; - return true; + /* + * The HTML element is not removed from the stack of open elements. + * Only internal state has changed, this does not qualify as a "step" + * in terms of advancing through the document to another token. + * Nothing has been pushed or popped. + * Proceed to parse the next item. + */ + return $this->step(); /* * > A start tag whose tag name is "noframes" From 6106332617128820c0ee5132c34ff1cf6f785d1a Mon Sep 17 00:00:00 2001 From: Sergey Biryukov Date: Mon, 9 Dec 2024 22:43:20 +0000 Subject: [PATCH 005/117] REST API: Correct description for the `humanized_updated` block directory property. Follow-up to [48242], [51676]. Props mujuonly, mukesh27. Fixes #62667. git-svn-id: https://develop.svn.wordpress.org/trunk@59501 602fd350-edb4-49c9-b593-d223f7449a82 --- .../endpoints/class-wp-rest-block-directory-controller.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wp-includes/rest-api/endpoints/class-wp-rest-block-directory-controller.php b/src/wp-includes/rest-api/endpoints/class-wp-rest-block-directory-controller.php index cfcb0dbc5c7bc..8a34c78d33c0b 100644 --- a/src/wp-includes/rest-api/endpoints/class-wp-rest-block-directory-controller.php +++ b/src/wp-includes/rest-api/endpoints/class-wp-rest-block-directory-controller.php @@ -285,7 +285,7 @@ public function get_item_schema() { 'context' => array( 'view' ), ), 'humanized_updated' => array( - 'description' => __( 'The date when the block was last updated, in fuzzy human readable format.' ), + 'description' => __( 'The date when the block was last updated, in human readable format.' ), 'type' => 'string', 'context' => array( 'view' ), ), From 146775070985b4a26def7eef563e97bd1e741228 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Greg=20Zi=C3=83=C2=B3=C3=85=E2=80=9Akowski?= Date: Tue, 10 Dec 2024 09:11:35 +0000 Subject: [PATCH 006/117] HTML API: Prevent bookmarks from being set on virtual tokens Fixes the issue when an HTML_Processor bookmark was set at a virtual token (a node in the resulting document that does not correspond to an HTML token present in the input string), seek behavior was unreliable. Props jonsurrell, gziolo. Fixes #62521. git-svn-id: https://develop.svn.wordpress.org/trunk@59502 602fd350-edb4-49c9-b593-d223f7449a82 --- .../html-api/class-wp-html-processor.php | 17 ++++++++++++++++- .../tests/html-api/wpHtmlProcessor-bookmark.php | 13 +++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/src/wp-includes/html-api/class-wp-html-processor.php b/src/wp-includes/html-api/class-wp-html-processor.php index 7b156d8a605fa..8d2a476769efe 100644 --- a/src/wp-includes/html-api/class-wp-html-processor.php +++ b/src/wp-includes/html-api/class-wp-html-processor.php @@ -303,7 +303,9 @@ public static function create_fragment( $html, $context = '', $encoding = } while ( $context_processor->next_tag() ) { - $context_processor->set_bookmark( 'final_node' ); + if ( ! $context_processor->is_virtual() ) { + $context_processor->set_bookmark( 'final_node' ); + } } if ( @@ -5673,12 +5675,25 @@ public function seek( $bookmark_name ): bool { * reaching for it, as inappropriate use could lead to broken * HTML structure or unwanted processing overhead. * + * Bookmarks cannot be set on tokens that do no appear in the original + * HTML text. For example, the HTML ` diff --git a/src/wp-admin/setup-config.php b/src/wp-admin/setup-config.php index 2d1ff715d3d23..d2fa4ae8ea7ee 100644 --- a/src/wp-admin/setup-config.php +++ b/src/wp-admin/setup-config.php @@ -227,7 +227,7 @@ function setup_config_display_header( $body_classes = array() ) {
` stops at tags `TABLE`, + * `TBODY`, `TR`, and `TD`. The `TBODY` and `TR` tags do not appear in + * the original HTML and cannot be used as bookmarks. + * * @since 6.4.0 * * @param string $bookmark_name Identifies this particular bookmark. * @return bool Whether the bookmark was successfully created. */ public function set_bookmark( $bookmark_name ): bool { + if ( $this->is_virtual() ) { + _doing_it_wrong( + __METHOD__, + __( 'Cannot set bookmarks on tokens that do no appear in the original HTML text.' ), + '6.8.0' + ); + return false; + } return parent::set_bookmark( "_{$bookmark_name}" ); } diff --git a/tests/phpunit/tests/html-api/wpHtmlProcessor-bookmark.php b/tests/phpunit/tests/html-api/wpHtmlProcessor-bookmark.php index 91cc17898f77d..094fea367878a 100644 --- a/tests/phpunit/tests/html-api/wpHtmlProcessor-bookmark.php +++ b/tests/phpunit/tests/html-api/wpHtmlProcessor-bookmark.php @@ -157,4 +157,17 @@ public static function data_processor_constructors(): array { 'Fragment parser' => array( array( WP_HTML_Processor::class, 'create_fragment' ) ), ); } + + /** + * @ticket 62521 + * + * @expectedIncorrectUsage WP_HTML_Processor::set_bookmark + */ + public function test_bookmarks_not_allowed_on_virtual_nodes() { + $processor = WP_HTML_Processor::create_full_parser( 'text' ); + $this->assertTrue( $processor->next_tag( 'BODY' ) ); + $this->assertFalse( $processor->set_bookmark( 'mark' ) ); + $this->assertTrue( $processor->next_token() ); + $this->assertTrue( $processor->set_bookmark( 'mark' ) ); + } } From 2b49715077de18a798453d73a1d1edc8280fd980 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Greg=20Zi=C3=83=C2=B3=C3=85=E2=80=9Akowski?= Date: Tue, 10 Dec 2024 11:39:06 +0000 Subject: [PATCH 007/117] HTML API: Remove nullable from get_breadcrumbs return type Follow-up [58713] Props jonsurrell, westonruter, gziolo. Fixes #62674. git-svn-id: https://develop.svn.wordpress.org/trunk@59503 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/html-api/class-wp-html-processor.php | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/src/wp-includes/html-api/class-wp-html-processor.php b/src/wp-includes/html-api/class-wp-html-processor.php index 8d2a476769efe..2bc38b305a9f2 100644 --- a/src/wp-includes/html-api/class-wp-html-processor.php +++ b/src/wp-includes/html-api/class-wp-html-processor.php @@ -1143,11 +1143,7 @@ public function step( $node_to_process = self::PROCESS_NEXT_NODE ): bool { * Breadcrumbs start at the outermost parent and descend toward the matched element. * They always include the entire path from the root HTML node to the matched element. * - * @todo It could be more efficient to expose a generator-based version of this function - * to avoid creating the array copy on tag iteration. If this is done, it would likely - * be more useful to walk up the stack when yielding instead of starting at the top. - * - * Example + * Example: * * $processor = WP_HTML_Processor::create_fragment( '

' ); * $processor->next_tag( 'IMG' ); @@ -1155,9 +1151,9 @@ public function step( $node_to_process = self::PROCESS_NEXT_NODE ): bool { * * @since 6.4.0 * - * @return string[]|null Array of tag names representing path to matched node, if matched, otherwise NULL. + * @return string[] Array of tag names representing path to matched node. */ - public function get_breadcrumbs(): ?array { + public function get_breadcrumbs(): array { return $this->breadcrumbs; } From 32880ec4e910837cd267e1685733867b243e22fa Mon Sep 17 00:00:00 2001 From: Sergey Biryukov Date: Tue, 10 Dec 2024 23:20:21 +0000 Subject: [PATCH 008/117] Twenty Twenty-Two: Fix PHPCS issues in `functions.php`. * Inline comments must end in full stops, exclamation marks, or question marks. * There must be exactly one blank line after the file comment. Follow-up to [52081]. Props pitamdey, mukesh27. Fixes #62648. git-svn-id: https://develop.svn.wordpress.org/trunk@59504 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-content/themes/twentytwentytwo/functions.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/wp-content/themes/twentytwentytwo/functions.php b/src/wp-content/themes/twentytwentytwo/functions.php index cd994beec743f..8f93dcfc5f53c 100644 --- a/src/wp-content/themes/twentytwentytwo/functions.php +++ b/src/wp-content/themes/twentytwentytwo/functions.php @@ -9,7 +9,6 @@ * @since Twenty Twenty-Two 1.0 */ - if ( ! function_exists( 'twentytwentytwo_support' ) ) : /** @@ -61,5 +60,5 @@ function twentytwentytwo_styles() { add_action( 'wp_enqueue_scripts', 'twentytwentytwo_styles' ); -// Add block patterns +// Add block patterns. require get_template_directory() . '/inc/block-patterns.php'; From 9104190b6d36c2959f652e0b65bf5bb7af42ffcc Mon Sep 17 00:00:00 2001 From: Sergey Biryukov Date: Wed, 11 Dec 2024 15:18:43 +0000 Subject: [PATCH 009/117] Docs: Correct formatting for script module data filter documentation examples. Follow-up to [58579]. Props jonsurrell. See #62281. git-svn-id: https://develop.svn.wordpress.org/trunk@59505 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/class-wp-script-modules.php | 37 +++++++++++---------- 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/src/wp-includes/class-wp-script-modules.php b/src/wp-includes/class-wp-script-modules.php index 384bf9ef2f59b..dbfa038f8cbe2 100644 --- a/src/wp-includes/class-wp-script-modules.php +++ b/src/wp-includes/class-wp-script-modules.php @@ -407,14 +407,15 @@ public function print_script_module_data(): void { * initialization or immediately on page load. It does not replace the REST API or * fetching data from the client. * - * @example - * add_filter( - * 'script_module_data_MyScriptModuleID', - * function ( array $data ): array { - * $data['script-needs-this-data'] = 'ok'; - * return $data; - * } - * ); + * Example: + * + * add_filter( + * 'script_module_data_MyScriptModuleID', + * function ( array $data ): array { + * $data['dataForClient'] = 'ok'; + * return $data; + * } + * ); * * If the filter returns no data (an empty array), nothing will be embedded in the page. * @@ -423,15 +424,17 @@ public function print_script_module_data(): void { * * The data can be read on the client with a pattern like this: * - * @example - * const dataContainer = document.getElementById( 'wp-script-module-data-MyScriptModuleID' ); - * let data = {}; - * if ( dataContainer ) { - * try { - * data = JSON.parse( dataContainer.textContent ); - * } catch {} - * } - * initMyScriptModuleWithData( data ); + * Example: + * + * const dataContainer = document.getElementById( 'wp-script-module-data-MyScriptModuleID' ); + * let data = {}; + * if ( dataContainer ) { + * try { + * data = JSON.parse( dataContainer.textContent ); + * } catch {} + * } + * // data.dataForClient === 'ok'; + * initMyScriptModuleWithData( data ); * * @since 6.7.0 * From e2b0bfdc06b2f652ff7b3865b496325b87521d26 Mon Sep 17 00:00:00 2001 From: Sergey Biryukov Date: Thu, 12 Dec 2024 22:21:21 +0000 Subject: [PATCH 010/117] Filesystem API: Check `PHP_OS_FAMILY` instead of `php_uname()` in PclZip. The `php_uname()` function can be disabled on some hosts, in which case the call fails. The `PHP_OS_FAMILY` constant indicates the operating system family PHP was built for, and is available as of PHP 7.2.0. Reference: [https://www.php.net/manual/en/reserved.constants.php#constant.php-os-family PHP Manual: Predefined Constants: PHP_OS_FAMILY]. Follow-up to [6779], [57985], [58678], [58684]. Props daymobrew, costdev, desrosj. Fixes #57711. git-svn-id: https://develop.svn.wordpress.org/trunk@59506 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-admin/includes/class-pclzip.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wp-admin/includes/class-pclzip.php b/src/wp-admin/includes/class-pclzip.php index 658fda5f22495..f1128d900c9e6 100644 --- a/src/wp-admin/includes/class-pclzip.php +++ b/src/wp-admin/includes/class-pclzip.php @@ -5714,7 +5714,7 @@ function PclZipUtilOptionText($p_option) // -------------------------------------------------------------------------------- function PclZipUtilTranslateWinPath($p_path, $p_remove_disk_letter=true) { - if (stristr(php_uname(), 'windows')) { + if (PHP_OS_FAMILY == 'Windows') { // ----- Look for potential disk letter if (($p_remove_disk_letter) && (($v_position = strpos($p_path, ':')) != false)) { $p_path = substr($p_path, $v_position+1); From b4969d4c5236049793ce74fed388cee18b892b21 Mon Sep 17 00:00:00 2001 From: Jonathan Desrosiers Date: Fri, 13 Dec 2024 14:57:56 +0000 Subject: [PATCH 011/117] Build/Test Tools: Remove repository specific logic from callable workflows. Because reusable workflows could be called from any other repository in a variety of contexts, repository specific `if` conditions should not be present. Instead, this logic should be included in the calling workflows only. Props johnbillion. See #62221. git-svn-id: https://develop.svn.wordpress.org/trunk@59507 602fd350-edb4-49c9-b593-d223f7449a82 --- .github/workflows/performance.yml | 2 +- .github/workflows/reusable-performance.yml | 2 +- .github/workflows/reusable-phpunit-tests-v3.yml | 4 ++-- .github/workflows/reusable-support-json-reader-v1.yml | 3 --- 4 files changed, 4 insertions(+), 7 deletions(-) diff --git a/.github/workflows/performance.yml b/.github/workflows/performance.yml index e4929763afa83..dba6091a5547a 100644 --- a/.github/workflows/performance.yml +++ b/.github/workflows/performance.yml @@ -36,7 +36,7 @@ jobs: uses: WordPress/wordpress-develop/.github/workflows/reusable-performance.yml@trunk permissions: contents: read - if: ${{ ( github.repository == 'WordPress/wordpress-develop' || github.event_name == 'pull_request' ) && ! contains( github.event.before, '00000000' ) }} + if: ${{ ( github.repository == 'WordPress/wordpress-develop' || github.event_name == 'pull_request' ) }} strategy: fail-fast: false matrix: diff --git a/.github/workflows/reusable-performance.yml b/.github/workflows/reusable-performance.yml index 68f4503d97259..0ca7d5be0a30a 100644 --- a/.github/workflows/reusable-performance.yml +++ b/.github/workflows/reusable-performance.yml @@ -102,7 +102,7 @@ jobs: runs-on: ubuntu-latest permissions: contents: read - if: ${{ ( github.repository == 'WordPress/wordpress-develop' || github.event_name == 'pull_request' ) && ! contains( github.event.before, '00000000' ) }} + if: ${{ ! contains( github.event.before, '00000000' ) }} steps: - name: Configure environment variables diff --git a/.github/workflows/reusable-phpunit-tests-v3.yml b/.github/workflows/reusable-phpunit-tests-v3.yml index fd21b3a9b48f5..4310be48e0d33 100644 --- a/.github/workflows/reusable-phpunit-tests-v3.yml +++ b/.github/workflows/reusable-phpunit-tests-v3.yml @@ -226,7 +226,7 @@ jobs: run: git diff --exit-code - name: Checkout the WordPress Test Reporter - if: ${{ github.repository == 'WordPress/wordpress-develop' && github.ref == 'refs/heads/trunk' && inputs.report }} + if: ${{ github.ref == 'refs/heads/trunk' && inputs.report }} uses: actions/checkout@b4ffde65f46336ab88eb53be808477a3936bae11 # v4.1.1 with: repository: 'WordPress/phpunit-test-runner' @@ -234,7 +234,7 @@ jobs: show-progress: ${{ runner.debug == '1' && 'true' || 'false' }} - name: Submit test results to the WordPress.org host test results - if: ${{ github.repository == 'WordPress/wordpress-develop' && github.ref == 'refs/heads/trunk' && inputs.report }} + if: ${{ github.ref == 'refs/heads/trunk' && inputs.report }} env: WPT_REPORT_API_KEY: "${{ secrets.WPT_REPORT_API_KEY }}" run: docker compose run --rm -e WPT_REPORT_API_KEY -e WPT_PREPARE_DIR=/var/www -e WPT_TEST_DIR=/var/www php php test-runner/report.php diff --git a/.github/workflows/reusable-support-json-reader-v1.yml b/.github/workflows/reusable-support-json-reader-v1.yml index ce574e4b2c3b7..f351b716fadb6 100644 --- a/.github/workflows/reusable-support-json-reader-v1.yml +++ b/.github/workflows/reusable-support-json-reader-v1.yml @@ -37,7 +37,6 @@ jobs: major-wp-version: name: Determine major WordPress version runs-on: ubuntu-latest - if: ${{ github.repository == 'WordPress/wordpress-develop' || github.event_name == 'pull_request' }} timeout-minutes: 5 outputs: version: ${{ steps.major-wp-version.outputs.version }} @@ -69,7 +68,6 @@ jobs: php-versions: name: Determine PHP versions runs-on: ubuntu-latest - if: ${{ github.repository == 'WordPress/wordpress-develop' || github.event_name == 'pull_request' }} needs: [ major-wp-version ] timeout-minutes: 5 outputs: @@ -102,7 +100,6 @@ jobs: mysql-versions: name: Determine MySQL versions runs-on: ubuntu-latest - if: ${{ github.repository == 'WordPress/wordpress-develop' || github.event_name == 'pull_request' }} needs: [ major-wp-version ] timeout-minutes: 5 outputs: From ff5850ee31956c9f79bb0fc6b0e9f6d02afc3bb7 Mon Sep 17 00:00:00 2001 From: Jonathan Desrosiers Date: Fri, 13 Dec 2024 15:32:55 +0000 Subject: [PATCH 012/117] Build/Test Tools: Trim down the upgrade testing matrix. The upgrade testing workflow is currently at ~978 jobs spawned from the strategy matrix. While it's great to test all possible combinations, GitHub's UI cannot keep up with tracking that number of jobs, often taking 30-45 minutes to accurately report the outcome even though the jobs themselves all complete in under 5 minutes. This is 2x the total number of concurrent jobs allowed for the entire organization (which creates a backlog and slows everything down even more). This trims down the number of combinations included in the testing matrices to be a bit more thoughtful following the following methodology: - The last two releases of WordPress are tested against all PHP and MySQL LTS version combinations and the most recent innovation release. - The next 6 oldest versions of WordPress are tested against both the oldest and newest releases of PHP currently supported for both PHP 7 & 8 along with the oldest and newest MySQL LTS versions currently supported (no innovation releases). - For the remaining versions of WordPress receiving security updates, they are only included if the database version was different that the previous major release. - The oldest version of WordPress receiving security updates should always be tested against the same full list of combinations as the last two releases. When choosing which MySQL versions to test against: - Only the most recent innovation release should be included in testing. - Even though MySQL >= 5.5.5 is currently supported, there are no 5.5.x Docker containers available that work on modern architectures. - 5.6.x Docker containers are available and work, but 5.6 only accounts for ~2.3% of installs as of 12/6/2024.defaults: - 5.7.x accounts for ~20% of installs, so this is used below instead. With these changes, the total number of jobs is reduced by ~58%. Props johnbillion, mukesh27. See #62221. git-svn-id: https://develop.svn.wordpress.org/trunk@59508 602fd350-edb4-49c9-b593-d223f7449a82 --- .github/workflows/upgrade-testing.yml | 123 ++++++++++++++++++++------ 1 file changed, 97 insertions(+), 26 deletions(-) diff --git a/.github/workflows/upgrade-testing.yml b/.github/workflows/upgrade-testing.yml index 8ea2c16bfb36a..bfa94f3874e08 100644 --- a/.github/workflows/upgrade-testing.yml +++ b/.github/workflows/upgrade-testing.yml @@ -1,3 +1,6 @@ +# Confirms that updating WordPress using WP-CLI works successfully. +# +# This workflow is not meant to test wordpress-develop checkouts, but rather tagged versions officially available on WordPress.org. name: Upgrade Tests on: @@ -31,9 +34,28 @@ concurrency: # Any needed permissions should be configured at the job level. permissions: {} +# Because the number of jobs spawned can quickly balloon out of control, the following methodology is applied when +# building out the matrix below: +# +# - The last two releases of WordPress are tested against all PHP/MySQL LTS version combinations and the most recent +# innovation release. +# - The next 6 oldest versions of WordPress are tested against both the oldest and newest releases of PHP currently +# supported for both PHP 7 & 8 along with the oldest and newest MySQL LTS versions currently supported (no innovation +# releases). At the current 3 releases per year pace, this accounts for 2 additional years worth of releases. +# - Of the remaining versions of WordPress still receiving security updates, only test the ones where the database +# version was updated since the previous major release. +# - The oldest version of WordPress receiving security updates should always be tested against the same combinations as +# detailed for the last two releases. + +# Notes about chosen MySQL versions: +# - Only the most recent innovation release should be included in testing. +# - Even though MySQL >= 5.5.5 is currently supported, there are no 5.5.x Docker containers available that work on +# modern architectures. +# - 5.6.x Docker containers are available and work, but 5.6 only accounts for ~2.3% of installs as of 12/6/2024.defaults: +# - 5.7.x accounts for ~20% of installs, so this is used below instead. jobs: - # Spawns upgrade testing from WordPress 6.x versions on PHP 8.x with MySQL. - upgrade-tests-wp-6x-php-8x-mysql: + # Tests the full list of PHP/MySQL combinations for the last two versions of WordPress. + upgrade-tests-last-two-releases: name: ${{ matrix.wp }} to ${{ inputs.new-version && inputs.new-version || 'latest' }} uses: WordPress/wordpress-develop/.github/workflows/reusable-upgrade-testing.yml@trunk if: ${{ github.repository == 'WordPress/wordpress-develop' || github.event_name == 'pull_request' }} @@ -43,12 +65,22 @@ jobs: fail-fast: false matrix: os: [ 'ubuntu-latest' ] - php: [ '8.0', '8.1', '8.2', '8.3', '8.4' ] + php: [ '7.2', '7.3', '7.4', '8.0', '8.1', '8.2', '8.3', '8.4' ] db-type: [ 'mysql' ] - db-version: [ '5.7', '8.0', '8.4' ] - wp: [ '6.0', '6.1', '6.2', '6.3', '6.4', '6.5', '6.6', '6.7' ] + db-version: [ '5.7', '8.0', '8.4', '9.1' ] + wp: [ '6.6', '6.7' ] multisite: [ false, true ] + exclude: + - php: '7.2' + db-version: '8.4' + - php: '7.3' + db-version: '8.4' + # MySQL 9.0+ will not work on PHP 7.2 & 7.3 + - php: '7.2' + db-version: '9.1' + - php: '7.3' + db-version: '9.1' with: os: ${{ matrix.os }} php: ${{ matrix.php }} @@ -58,8 +90,8 @@ jobs: new-version: ${{ inputs.new-version && inputs.new-version || 'latest' }} multisite: ${{ matrix.multisite }} - # Spawns upgrade testing from WordPress 6.x versions on PHP 7.x with MySQL. - upgrade-tests-wp-6x-php-7x-mysql: + # Tests the remaining 6.x releases on the oldest and newest supported versions of PHP 7 & 8. + upgrade-tests-wp-6x-mysql: name: ${{ matrix.wp }} to ${{ inputs.new-version && inputs.new-version || 'latest' }} uses: WordPress/wordpress-develop/.github/workflows/reusable-upgrade-testing.yml@trunk if: ${{ github.repository == 'WordPress/wordpress-develop' || github.event_name == 'pull_request' }} @@ -69,10 +101,10 @@ jobs: fail-fast: false matrix: os: [ 'ubuntu-latest' ] - php: [ '7.2', '7.3', '7.4' ] + php: [ '7.2', '7.4', '8.0', '8.4' ] db-type: [ 'mysql' ] - db-version: [ '5.7', '8.0', '8.4' ] - wp: [ '6.0', '6.1', '6.2', '6.3', '6.4', '6.5', '6.6', '6.7' ] + db-version: [ '5.7', '8.4' ] + wp: [ '6.0', '6.1', '6.2', '6.3', '6.4', '6.5' ] multisite: [ false, true ] exclude: @@ -89,7 +121,7 @@ jobs: new-version: ${{ inputs.new-version && inputs.new-version || 'latest' }} multisite: ${{ matrix.multisite }} - # Spawns upgrade testing from WordPress 5.x versions on PHP 7.x with MySQL. + # Tests 5.x releases where the WordPress database version changed on the oldest and newest supported versions of PHP 7. upgrade-tests-wp-5x-php-7x-mysql: name: ${{ matrix.wp }} to ${{ inputs.new-version && inputs.new-version || 'latest' }} uses: WordPress/wordpress-develop/.github/workflows/reusable-upgrade-testing.yml@trunk @@ -98,10 +130,10 @@ jobs: fail-fast: false matrix: os: [ 'ubuntu-latest' ] - php: [ '7.2', '7.3', '7.4' ] + php: [ '7.2', '7.4' ] db-type: [ 'mysql' ] - db-version: [ '5.7', '8.0', '8.4' ] - wp: [ '5.0', '5.1', '5.2', '5.3', '5.4', '5.5', '5.6', '5.7', '5.8', '5.9' ] + db-version: [ '5.7', '8.4' ] + wp: [ '5.0', '5.1', '5.3', '5.4', '5.5', '5.6', '5.9' ] multisite: [ false, true ] exclude: @@ -118,7 +150,7 @@ jobs: new-version: ${{ inputs.new-version && inputs.new-version || 'latest' }} multisite: ${{ matrix.multisite }} - # Spawns upgrade testing from WordPress 5.x versions on PHP 8.x with MySQL. + # Tests 5.x releases where the WordPress database version changed on the oldest and newest supported versions of PHP 8. # # WordPress 5.0-5.2 are excluded from PHP 8+ testing because of the following fatal errors: # - Use of __autoload(). @@ -131,10 +163,10 @@ jobs: fail-fast: false matrix: os: [ 'ubuntu-latest' ] - php: [ '8.0', '8.1', '8.2', '8.3', '8.4' ] + php: [ '8.0', '8.4' ] db-type: [ 'mysql' ] - db-version: [ '5.7', '8.0', '8.4' ] - wp: [ '5.3', '5.4', '5.5', '5.6', '5.7', '5.8', '5.9' ] + db-version: [ '5.7', '8.4' ] + wp: [ '5.3', '5.4', '5.5', '5.6', '5.9' ] multisite: [ false, true ] with: os: ${{ matrix.os }} @@ -145,7 +177,9 @@ jobs: new-version: ${{ inputs.new-version && inputs.new-version || 'latest' }} multisite: ${{ matrix.multisite }} - # Spawns upgrade testing from WordPress 4.x versions on PHP 7.x with MySQL. + # Tests 4.x releases where the WordPress database version changed on the oldest and newest supported versions of PHP 7. + # + # The oldest version of WordPress receiving security updates should always be tested. upgrade-tests-wp-4x-php-7x-mysql: name: ${{ matrix.wp }} to ${{ inputs.new-version && inputs.new-version || 'latest' }} uses: WordPress/wordpress-develop/.github/workflows/reusable-upgrade-testing.yml@trunk @@ -154,10 +188,10 @@ jobs: fail-fast: false matrix: os: [ 'ubuntu-latest' ] - php: [ '7.2', '7.3', '7.4' ] + php: [ '7.2', '7.4' ] db-type: [ 'mysql' ] - db-version: [ '5.7', '8.0', '8.4' ] - wp: [ '4.1', '4.2', '4.3', '4.4', '4.5', '4.6', '4.7', '4.8', '4.9' ] + db-version: [ '5.7', '8.4' ] + wp: [ '4.1', '4.2', '4.3', '4.4', '4.5', '4.6', '4.7' ] multisite: [ false, true ] exclude: @@ -174,7 +208,9 @@ jobs: new-version: ${{ inputs.new-version && inputs.new-version || 'latest' }} multisite: ${{ matrix.multisite }} - # Spawns upgrade testing from WordPress 4.x versions on PHP 8.x with MySQL. + # Tests 4.x releases where the WordPress database version changed on the oldest and newest supported versions of PHP 8. + # + # The oldest version of WordPress receiving security updates should always be tested. # # WordPress 4.6-4.9 are excluded from PHP 8+ testing because of the following fatal errors: # - Use of __autoload(). @@ -187,9 +223,9 @@ jobs: fail-fast: false matrix: os: [ 'ubuntu-latest' ] - php: [ '8.0', '8.1', '8.2', '8.3', '8.4' ] + php: [ '8.0', '8.4' ] db-type: [ 'mysql' ] - db-version: [ '5.7', '8.0', '8.4' ] + db-version: [ '5.7', '8.4' ] wp: [ '4.1', '4.2', '4.3', '4.4', '4.5' ] multisite: [ false, true ] with: @@ -201,13 +237,48 @@ jobs: new-version: ${{ inputs.new-version && inputs.new-version || 'latest' }} multisite: ${{ matrix.multisite }} + # The oldest version of WordPress receiving security updates should always be tested against + # the full list of PHP/MySQL combinations. + upgrade-tests-oldest-wp-mysql: + name: ${{ matrix.wp }} to ${{ inputs.new-version && inputs.new-version || 'latest' }} + uses: WordPress/wordpress-develop/.github/workflows/reusable-upgrade-testing.yml@trunk + if: ${{ github.repository == 'WordPress/wordpress-develop' || github.event_name == 'pull_request' }} + strategy: + fail-fast: false + matrix: + os: [ 'ubuntu-latest' ] + php: [ '7.2', '7.3', '7.4', '8.0', '8.1', '8.2', '8.3', '8.4' ] + db-type: [ 'mysql' ] + db-version: [ '5.7', '8.0', '8.4', '9.1' ] + wp: [ '4.1' ] + multisite: [ false, true ] + + exclude: + - php: '7.2' + db-version: '8.4' + - php: '7.3' + db-version: '8.4' + # MySQL 9.0+ will not work on PHP 7.2 & 7.3 + - php: '7.2' + db-version: '9.1' + - php: '7.3' + db-version: '9.1' + with: + os: ${{ matrix.os }} + php: ${{ matrix.php }} + db-type: ${{ matrix.db-type }} + db-version: ${{ matrix.db-version }} + wp: ${{ matrix.wp }} + new-version: ${{ inputs.new-version && inputs.new-version || 'latest' }} + multisite: ${{ matrix.multisite }} + slack-notifications: name: Slack Notifications uses: WordPress/wordpress-develop/.github/workflows/slack-notifications.yml@trunk permissions: actions: read contents: read - needs: [ upgrade-tests-wp-6x-php-8x-mysql, upgrade-tests-wp-6x-php-7x-mysql, upgrade-tests-wp-5x-php-7x-mysql, upgrade-tests-wp-5x-php-8x-mysql, upgrade-tests-wp-4x-php-7x-mysql, upgrade-tests-wp-4x-php-8x-mysql ] + needs: [ upgrade-tests-last-two-releases, upgrade-tests-wp-6x-mysql, upgrade-tests-wp-5x-php-7x-mysql, upgrade-tests-wp-5x-php-8x-mysql, upgrade-tests-wp-4x-php-7x-mysql, upgrade-tests-wp-4x-php-8x-mysql, upgrade-tests-oldest-wp-mysql ] if: ${{ github.repository == 'WordPress/wordpress-develop' && github.event_name != 'pull_request' && always() }} with: calling_status: ${{ contains( needs.*.result, 'cancelled' ) && 'cancelled' || contains( needs.*.result, 'failure' ) && 'failure' || 'success' }} From 28f4e37dfc7ea14f89d16a2f6d672a8772d2e187 Mon Sep 17 00:00:00 2001 From: Jonathan Desrosiers Date: Fri, 13 Dec 2024 19:04:57 +0000 Subject: [PATCH 013/117] Build/Test Tools: Update `devDependencies`. This updates the following `devDependencies`: - `dotenv` from `16.4.5` to `16.4.7` - `dotenv-expand` from `11.0.6` to `12.0.1` - `postcss` from `8.4.47` to `8.4.49` - `qunit` from `2.22.0` to `2.23.1` - `sass` from `1.79.4` to `1.79.6` - `terser-webpack-plugin` from `5.3.10` to `5.3.11` - `uglify-js` from `3.17.4` to `3.19.3` - `uuid` from `9.0.1` to `11.0.3` - `webpack` from `5.90.2` to `5.97.1` Additionally, `npm audit fix` has been run. Follow up to [58585]. See #62220. git-svn-id: https://develop.svn.wordpress.org/trunk@59509 602fd350-edb4-49c9-b593-d223f7449a82 --- package-lock.json | 1012 +++++++++++++---- package.json | 18 +- .../assets/script-loader-packages.min.php | 2 +- .../assets/script-modules-packages.min.php | 2 +- 4 files changed, 801 insertions(+), 233 deletions(-) diff --git a/package-lock.json b/package-lock.json index 162040e719015..ed9e1b4410f35 100644 --- a/package-lock.json +++ b/package-lock.json @@ -116,8 +116,8 @@ "check-node-version": "4.2.1", "copy-webpack-plugin": "12.0.2", "cssnano": "7.0.6", - "dotenv": "16.4.5", - "dotenv-expand": "11.0.6", + "dotenv": "16.4.7", + "dotenv-expand": "12.0.1", "grunt": "1.6.1", "grunt-banner": "^0.6.0", "grunt-contrib-clean": "~2.0.1", @@ -140,19 +140,19 @@ "ink-docstrap": "1.3.2", "install-changed": "1.1.0", "matchdep": "~2.0.0", - "postcss": "8.4.47", + "postcss": "8.4.49", "prettier": "npm:wp-prettier@2.6.2", - "qunit": "~2.22.0", + "qunit": "~2.23.1", "react-refresh": "0.14.0", - "sass": "1.79.4", + "sass": "1.79.6", "sinon": "16.1.3", "sinon-test": "~3.1.6", "source-map-loader": "5.0.0", - "terser-webpack-plugin": "5.3.10", - "uglify-js": "^3.17.4", - "uuid": "9.0.1", + "terser-webpack-plugin": "5.3.11", + "uglify-js": "^3.19.3", + "uuid": "11.0.3", "wait-on": "8.0.1", - "webpack": "5.90.2", + "webpack": "5.97.1", "webpack-livereload-plugin": "3.0.2" }, "engines": { @@ -3589,19 +3589,20 @@ } }, "node_modules/@jridgewell/source-map": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", - "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", "dev": true, + "license": "MIT", "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" } }, "node_modules/@jridgewell/source-map/node_modules/@jridgewell/gen-mapping": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", - "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", "dev": true, "license": "MIT", "dependencies": { @@ -3719,6 +3720,378 @@ "node": ">= 8" } }, + "node_modules/@parcel/watcher": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.0.tgz", + "integrity": "sha512-i0GV1yJnm2n3Yq1qw6QrUrd/LI9bE8WEBOTtOkpCXHHdyN3TAGgqAK/DAT05z4fq2x04cARXt2pDmjWjL92iTQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "dependencies": { + "detect-libc": "^1.0.3", + "is-glob": "^4.0.3", + "micromatch": "^4.0.5", + "node-addon-api": "^7.0.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.5.0", + "@parcel/watcher-darwin-arm64": "2.5.0", + "@parcel/watcher-darwin-x64": "2.5.0", + "@parcel/watcher-freebsd-x64": "2.5.0", + "@parcel/watcher-linux-arm-glibc": "2.5.0", + "@parcel/watcher-linux-arm-musl": "2.5.0", + "@parcel/watcher-linux-arm64-glibc": "2.5.0", + "@parcel/watcher-linux-arm64-musl": "2.5.0", + "@parcel/watcher-linux-x64-glibc": "2.5.0", + "@parcel/watcher-linux-x64-musl": "2.5.0", + "@parcel/watcher-win32-arm64": "2.5.0", + "@parcel/watcher-win32-ia32": "2.5.0", + "@parcel/watcher-win32-x64": "2.5.0" + } + }, + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.0.tgz", + "integrity": "sha512-qlX4eS28bUcQCdribHkg/herLe+0A9RyYC+mm2PXpncit8z5b3nSqGVzMNR3CmtAOgRutiZ02eIJJgP/b1iEFQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.0.tgz", + "integrity": "sha512-hyZ3TANnzGfLpRA2s/4U1kbw2ZI4qGxaRJbBH2DCSREFfubMswheh8TeiC1sGZ3z2jUf3s37P0BBlrD3sjVTUw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-x64": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.0.tgz", + "integrity": "sha512-9rhlwd78saKf18fT869/poydQK8YqlU26TMiNg7AIu7eBp9adqbJZqmdFOsbZ5cnLp5XvRo9wcFmNHgHdWaGYA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.0.tgz", + "integrity": "sha512-syvfhZzyM8kErg3VF0xpV8dixJ+RzbUaaGaeb7uDuz0D3FK97/mZ5AJQ3XNnDsXX7KkFNtyQyFrXZzQIcN49Tw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.0.tgz", + "integrity": "sha512-0VQY1K35DQET3dVYWpOaPFecqOT9dbuCfzjxoQyif1Wc574t3kOSkKevULddcR9znz1TcklCE7Ht6NIxjvTqLA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-musl": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.0.tgz", + "integrity": "sha512-6uHywSIzz8+vi2lAzFeltnYbdHsDm3iIB57d4g5oaB9vKwjb6N6dRIgZMujw4nm5r6v9/BQH0noq6DzHrqr2pA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.0.tgz", + "integrity": "sha512-BfNjXwZKxBy4WibDb/LDCriWSKLz+jJRL3cM/DllnHH5QUyoiUNEp3GmL80ZqxeumoADfCCP19+qiYiC8gUBjA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.0.tgz", + "integrity": "sha512-S1qARKOphxfiBEkwLUbHjCY9BWPdWnW9j7f7Hb2jPplu8UZ3nes7zpPOW9bkLbHRvWM0WDTsjdOTUgW0xLBN1Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.0.tgz", + "integrity": "sha512-d9AOkusyXARkFD66S6zlGXyzx5RvY+chTP9Jp0ypSTC9d4lzyRs9ovGf/80VCxjKddcUvnsGwCHWuF2EoPgWjw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.0.tgz", + "integrity": "sha512-iqOC+GoTDoFyk/VYSFHwjHhYrk8bljW6zOhPuhi5t9ulqiYq1togGJB5e3PwYVFFfeVgc6pbz3JdQyDoBszVaA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.0.tgz", + "integrity": "sha512-twtft1d+JRNkM5YbmexfcH/N4znDtjgysFaV9zvZmmJezQsKpkfLYJ+JFV3uygugK6AtIM2oADPkB2AdhBrNig==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-ia32": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.0.tgz", + "integrity": "sha512-+rgpsNRKwo8A53elqbbHXdOMtY/tAtTzManTWShB5Kk54N8Q9mzNWV7tV+IbGueCbcj826MfWGU3mprWtuf1TA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.0.tgz", + "integrity": "sha512-lPrxve92zEHdgeff3aiu4gDOIt4u7sJYha6wbdEZDCDUhtjTsOMiaJzG5lMY4GkWH8p0fMmO2Ppq5G5XXG+DQw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher/node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@parcel/watcher/node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/@parcel/watcher/node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/@parcel/watcher/node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/@parcel/watcher/node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, "node_modules/@pkgr/core": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", @@ -5392,30 +5765,33 @@ } }, "node_modules/@types/eslint": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.21.0.tgz", - "integrity": "sha512-35EhHNOXgxnUgh4XCJsGhE7zdlDhYDN/aMG6UbkByCFFNgQ7b3U+uVoqBpicFydR8JEfgdjCF7SJ7MiJfzuiTA==", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", + "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", "dev": true, + "license": "MIT", "dependencies": { "@types/estree": "*", "@types/json-schema": "*" } }, "node_modules/@types/eslint-scope": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", - "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", "dev": true, + "license": "MIT", "dependencies": { "@types/eslint": "*", "@types/estree": "*" } }, "node_modules/@types/estree": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", - "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", - "dev": true + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "dev": true, + "license": "MIT" }, "node_modules/@types/express": { "version": "4.17.21", @@ -6064,148 +6440,163 @@ } }, "node_modules/@webassemblyjs/ast": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", - "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", "dev": true, + "license": "MIT", "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" } }, "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", - "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", - "dev": true + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", + "dev": true, + "license": "MIT" }, "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", - "dev": true + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", + "dev": true, + "license": "MIT" }, "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", - "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", - "dev": true + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", + "dev": true, + "license": "MIT" }, "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", - "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", "dev": true, + "license": "MIT", "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", - "dev": true + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "dev": true, + "license": "MIT" }, "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", - "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", "dev": true, + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" } }, "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", - "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", "dev": true, + "license": "MIT", "dependencies": { "@xtuc/ieee754": "^1.2.0" } }, "node_modules/@webassemblyjs/leb128": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", - "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/utf8": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", - "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", - "dev": true + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", + "dev": true, + "license": "MIT" }, "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", - "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", "dev": true, + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-opt": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6", - "@webassemblyjs/wast-printer": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" } }, "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", - "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", "dev": true, + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" } }, "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", - "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", "dev": true, + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" } }, "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", - "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", "dev": true, + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" } }, "node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", - "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", "dev": true, + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/ast": "1.14.1", "@xtuc/long": "4.2.2" } }, @@ -6289,6 +6680,19 @@ "react": "^18.0.0" } }, + "node_modules/@wordpress/annotations/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/@wordpress/api-fetch": { "version": "7.8.2", "resolved": "https://registry.npmjs.org/@wordpress/api-fetch/-/api-fetch-7.8.2.tgz", @@ -6525,6 +6929,19 @@ "react-dom": "^18.0.0" } }, + "node_modules/@wordpress/block-library/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/@wordpress/block-serialization-default-parser": { "version": "5.8.1", "resolved": "https://registry.npmjs.org/@wordpress/block-serialization-default-parser/-/block-serialization-default-parser-5.8.1.tgz", @@ -6580,6 +6997,19 @@ "react": "^18.0.0" } }, + "node_modules/@wordpress/blocks/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/@wordpress/browserslist-config": { "version": "6.8.1", "resolved": "https://registry.npmjs.org/@wordpress/browserslist-config/-/browserslist-config-6.8.1.tgz", @@ -6677,6 +7107,19 @@ "react-dom": "^18.0.0" } }, + "node_modules/@wordpress/components/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/@wordpress/compose": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@wordpress/compose/-/compose-7.8.3.tgz", @@ -6773,6 +7216,19 @@ "react-dom": "^18.0.0" } }, + "node_modules/@wordpress/core-data/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/@wordpress/customize-widgets": { "version": "5.8.16", "resolved": "https://registry.npmjs.org/@wordpress/customize-widgets/-/customize-widgets-5.8.16.tgz", @@ -7276,6 +7732,19 @@ "react-dom": "^18.0.0" } }, + "node_modules/@wordpress/editor/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/@wordpress/element": { "version": "6.8.1", "resolved": "https://registry.npmjs.org/@wordpress/element/-/element-6.8.1.tgz", @@ -9293,13 +9762,15 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/@xtuc/long": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true + "dev": true, + "license": "Apache-2.0" }, "node_modules/abab": { "version": "2.0.6", @@ -9327,10 +9798,11 @@ } }, "node_modules/acorn": { - "version": "8.10.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", - "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", "dev": true, + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -9348,15 +9820,6 @@ "acorn-walk": "^8.0.2" } }, - "node_modules/acorn-import-assertions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", - "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", - "dev": true, - "peerDependencies": { - "acorn": "^8" - } - }, "node_modules/acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", @@ -12243,10 +12706,11 @@ "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" }, "node_modules/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -13456,10 +13920,11 @@ } }, "node_modules/default-gateway/node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, + "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -13734,6 +14199,19 @@ "node": ">=0.10.0" } }, + "node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "dev": true, + "license": "Apache-2.0", + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, "node_modules/detect-newline": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", @@ -13923,10 +14401,11 @@ } }, "node_modules/dotenv": { - "version": "16.4.5", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.5.tgz", - "integrity": "sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==", + "version": "16.4.7", + "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz", + "integrity": "sha512-47qPchRCykZC03FhkYAhrvwU4xDBFIj1QPqaarj6mdM/hgUzfPHcpkHJOn3mJAufFeeAxAzeGsr5X0M4k6fLZQ==", "dev": true, + "license": "BSD-2-Clause", "engines": { "node": ">=12" }, @@ -13935,12 +14414,13 @@ } }, "node_modules/dotenv-expand": { - "version": "11.0.6", - "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-11.0.6.tgz", - "integrity": "sha512-8NHi73otpWsZGBSZwwknTXS5pqMOrk9+Ssrna8xCaxkzEpU9OTf9R5ArQGVw03//Zmk9MOwLPng9WwndvpAJ5g==", + "version": "12.0.1", + "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-12.0.1.tgz", + "integrity": "sha512-LaKRbou8gt0RNID/9RoI+J2rvXsBRPMV7p+ElHlPhcSARbCPDYcYG2s1TIzAfWv4YSgyY5taidWzzs31lNV3yQ==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { - "dotenv": "^16.4.4" + "dotenv": "^16.4.5" }, "engines": { "node": ">=12" @@ -14117,10 +14597,11 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", - "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", + "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", "dev": true, + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -15098,10 +15579,11 @@ "dev": true }, "node_modules/eslint/node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, + "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -15563,10 +16045,11 @@ } }, "node_modules/execa/node_modules/cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz", + "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==", "dev": true, + "license": "MIT", "optional": true, "dependencies": { "nice-try": "^1.0.4", @@ -15730,9 +16213,9 @@ "dev": true }, "node_modules/express": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.0.tgz", - "integrity": "sha512-VqcNGcj/Id5ZT1LZ/cfihi3ttTn+NJmkli2eZADigjq29qTlWi/hAQ43t/VLPq8+UX06FCEx3ByOYet6ZFblng==", + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", "dev": true, "license": "MIT", "dependencies": { @@ -15741,7 +16224,7 @@ "body-parser": "1.20.3", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.6.0", + "cookie": "0.7.1", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", @@ -15755,7 +16238,7 @@ "methods": "~1.1.2", "on-finished": "2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.10", + "path-to-regexp": "0.1.12", "proxy-addr": "~2.0.7", "qs": "6.13.0", "range-parser": "~1.2.1", @@ -15770,6 +16253,10 @@ }, "engines": { "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/express/node_modules/debug": { @@ -15788,9 +16275,9 @@ "dev": true }, "node_modules/express/node_modules/path-to-regexp": { - "version": "0.1.10", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz", - "integrity": "sha512-7lf7qcQidTku0Gu3YDPc8DJ1q7OOucfa/BSsIwjuh56VU7katFvuM8hULfkwB3Fns/rsVF7PwPKVw1sl5KQS9w==", + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", "dev": true, "license": "MIT" }, @@ -18189,10 +18676,11 @@ } }, "node_modules/grunt-jsdoc/node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, + "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -19158,10 +19646,11 @@ } }, "node_modules/http-proxy-middleware": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", - "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.7.tgz", + "integrity": "sha512-fgVY8AV7qU7z/MmXJ/rxwbrtQH4jBQ9m7kp3llF0liB7glmFeVZFBepQb32T3y8n8k2+AEYuMPCpinYW+/CuRA==", "dev": true, + "license": "MIT", "dependencies": { "@types/http-proxy": "^1.17.8", "http-proxy": "^1.18.1", @@ -19601,10 +20090,11 @@ "integrity": "sha512-jQ5Ql18hdCQ4qS+RCrbLfz1n+Pags27q5TwMKvZyhp5hh2UULUYZUy1keqj6k6SYsdqIYjnmz7xyyEY0V67B8Q==" }, "node_modules/immutable": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.2.2.tgz", - "integrity": "sha512-fTMKDwtbvO5tldky9QZ2fMX7slR0mYpY5nbnFWYp0fOzDhHqhgIw9KoYgxLWsoNTS9ZHGauHj18DTyEw6BK3Og==", - "dev": true + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.7.tgz", + "integrity": "sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==", + "dev": true, + "license": "MIT" }, "node_modules/import-fresh": { "version": "3.3.0", @@ -20861,10 +21351,11 @@ } }, "node_modules/jest-changed-files/node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, + "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -25602,15 +26093,16 @@ "dev": true }, "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", "funding": [ { "type": "github", "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -25732,6 +26224,13 @@ "tslib": "^2.0.3" } }, + "node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "dev": true, + "license": "MIT" + }, "node_modules/node-domexception": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/node-domexception/-/node-domexception-1.0.0.tgz", @@ -27226,9 +27725,10 @@ "dev": true }, "node_modules/picocolors": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", - "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" }, "node_modules/picomatch": { "version": "2.3.1", @@ -27444,9 +27944,9 @@ } }, "node_modules/postcss": { - "version": "8.4.47", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.47.tgz", - "integrity": "sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==", + "version": "8.4.49", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", + "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", "funding": [ { "type": "opencollective", @@ -27464,7 +27964,7 @@ "license": "MIT", "dependencies": { "nanoid": "^3.3.7", - "picocolors": "^1.1.0", + "picocolors": "^1.1.1", "source-map-js": "^1.2.1" }, "engines": { @@ -29053,9 +29553,9 @@ } }, "node_modules/qunit": { - "version": "2.22.0", - "resolved": "https://registry.npmjs.org/qunit/-/qunit-2.22.0.tgz", - "integrity": "sha512-wPYvAvpjTL3zlUeyCX75T8gfZfdVXZa8y1EVkGe/XZNORIsCH/WI2X8R2KlemT921X9EKSZUL6CLGSPC7Ks08g==", + "version": "2.23.1", + "resolved": "https://registry.npmjs.org/qunit/-/qunit-2.23.1.tgz", + "integrity": "sha512-CGrsGy7NhkQmfiyOixBpbexh2PT7ekIb35uWiBi/hBNdTJF1W98UonyACFJJs8UmcP96lH+YJlX99dYZi5rZkg==", "dev": true, "license": "MIT", "dependencies": { @@ -30410,12 +30910,13 @@ } }, "node_modules/sass": { - "version": "1.79.4", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.79.4.tgz", - "integrity": "sha512-K0QDSNPXgyqO4GZq2HO5Q70TLxTH6cIT59RdoCHMivrC8rqzaTw5ab9prjz9KUN1El4FLXrBXJhik61JR4HcGg==", + "version": "1.79.6", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.79.6.tgz", + "integrity": "sha512-PVVjeeiUGx6Nj4PtEE/ecwu8ltwfPKzHxbbVmmLj4l1FYHhOyfA0scuVF8sVaa+b+VY4z7BVKjKq0cPUQdUU3g==", "dev": true, "license": "MIT", "dependencies": { + "@parcel/watcher": "^2.4.1", "chokidar": "^4.0.0", "immutable": "^4.0.0", "source-map-js": ">=0.6.2 <2.0.0" @@ -32911,6 +33412,7 @@ "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -32976,10 +33478,11 @@ } }, "node_modules/terser": { - "version": "5.27.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.27.0.tgz", - "integrity": "sha512-bi1HRwVRskAjheeYl291n3JC4GgO/Ty4z1nVs5AAsmonJulGxpSektecnNedrwK9C7vpvVtcX3cw00VSLt7U2A==", + "version": "5.37.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.37.0.tgz", + "integrity": "sha512-B8wRRkmre4ERucLM/uXx4MOV5cbnOlVAqUst+1+iLKPI0dOgFO28f84ptoQt9HEI537PMzfYa/d+GEPKTRXmYA==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.8.2", @@ -32994,16 +33497,17 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.3.10", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz", - "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==", + "version": "5.3.11", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.11.tgz", + "integrity": "sha512-RVCsMfuD0+cTt3EwX8hSl2Ks56EbFHWmhluwcqoPKtBnfjiT6olaq7PRIRfhyU8nnC2MrnDrBLfrD/RGE+cVXQ==", "dev": true, + "license": "MIT", "dependencies": { - "@jridgewell/trace-mapping": "^0.3.20", + "@jridgewell/trace-mapping": "^0.3.25", "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.1", - "terser": "^5.26.0" + "schema-utils": "^4.3.0", + "serialize-javascript": "^6.0.2", + "terser": "^5.31.1" }, "engines": { "node": ">= 10.13.0" @@ -33027,11 +33531,69 @@ } } }, + "node_modules/terser-webpack-plugin/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/terser-webpack-plugin/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz", + "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, "node_modules/terser/node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -33041,6 +33603,7 @@ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dev": true, + "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -33525,10 +34088,11 @@ "dev": true }, "node_modules/uglify-js": { - "version": "3.17.4", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz", - "integrity": "sha512-T9q82TJI9e/C1TAxYvfb16xO120tMVFZrGA3f9/P4424DNu6ypK103y0GPFVa17yotwSyZW5iYXgjYHkGrJW/g==", + "version": "3.19.3", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", + "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", "dev": true, + "license": "BSD-2-Clause", "bin": { "uglifyjs": "bin/uglifyjs" }, @@ -33980,16 +34544,17 @@ } }, "node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "version": "11.0.3", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.0.3.tgz", + "integrity": "sha512-d0z310fCWv5dJwnX1Y/MncBAqGMKEzlBb1AOf7z9K8ALnd0utBX/msg/fA0+sbyN1ihbMsLhrBlnl1ak7Wa0rg==", + "dev": true, "funding": [ "https://github.com/sponsors/broofa", "https://github.com/sponsors/ctavan" ], "license": "MIT", "bin": { - "uuid": "dist/bin/uuid" + "uuid": "dist/esm/bin/uuid" } }, "node_modules/v8-to-istanbul": { @@ -34114,10 +34679,11 @@ } }, "node_modules/watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", + "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", "dev": true, + "license": "MIT", "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -34130,7 +34696,8 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true + "dev": true, + "license": "BSD-2-Clause" }, "node_modules/wbuf": { "version": "1.7.3", @@ -34163,26 +34730,26 @@ "license": "BSD-2-Clause" }, "node_modules/webpack": { - "version": "5.90.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.90.2.tgz", - "integrity": "sha512-ziXu8ABGr0InCMEYFnHrYweinHK2PWrMqnwdHk2oK3rRhv/1B+2FnfwYv5oD+RrknK/Pp/Hmyvu+eAsaMYhzCw==", - "dev": true, - "dependencies": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^1.0.5", - "@webassemblyjs/ast": "^1.11.5", - "@webassemblyjs/wasm-edit": "^1.11.5", - "@webassemblyjs/wasm-parser": "^1.11.5", - "acorn": "^8.7.1", - "acorn-import-assertions": "^1.9.0", - "browserslist": "^4.21.10", + "version": "5.97.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.97.1.tgz", + "integrity": "sha512-EksG6gFY3L1eFMROS/7Wzgrii5mBAFe4rIr3r2BTfo7bcc+DWwFZ4OJ/miOuHJO/A85HwyI4eQ0F6IKXesO7Fg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.6", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", + "acorn": "^8.14.0", + "browserslist": "^4.24.0", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.15.0", + "enhanced-resolve": "^5.17.1", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", + "graceful-fs": "^4.2.11", "json-parse-even-better-errors": "^2.3.1", "loader-runner": "^4.2.0", "mime-types": "^2.1.27", @@ -34190,7 +34757,7 @@ "schema-utils": "^3.2.0", "tapable": "^2.1.1", "terser-webpack-plugin": "^5.3.10", - "watchpack": "^2.4.0", + "watchpack": "^2.4.1", "webpack-sources": "^3.2.3" }, "bin": { @@ -34312,10 +34879,11 @@ } }, "node_modules/webpack-cli/node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, + "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", diff --git a/package.json b/package.json index 9720bc105bceb..fe2afcf572122 100644 --- a/package.json +++ b/package.json @@ -38,8 +38,8 @@ "check-node-version": "4.2.1", "copy-webpack-plugin": "12.0.2", "cssnano": "7.0.6", - "dotenv": "16.4.5", - "dotenv-expand": "11.0.6", + "dotenv": "16.4.7", + "dotenv-expand": "12.0.1", "grunt": "1.6.1", "grunt-banner": "^0.6.0", "grunt-contrib-clean": "~2.0.1", @@ -62,19 +62,19 @@ "ink-docstrap": "1.3.2", "install-changed": "1.1.0", "matchdep": "~2.0.0", - "postcss": "8.4.47", + "postcss": "8.4.49", "prettier": "npm:wp-prettier@2.6.2", - "qunit": "~2.22.0", + "qunit": "~2.23.1", "react-refresh": "0.14.0", - "sass": "1.79.4", + "sass": "1.79.6", "sinon": "16.1.3", "sinon-test": "~3.1.6", "source-map-loader": "5.0.0", - "terser-webpack-plugin": "5.3.10", - "uglify-js": "^3.17.4", - "uuid": "9.0.1", + "terser-webpack-plugin": "5.3.11", + "uglify-js": "^3.19.3", + "uuid": "11.0.3", "wait-on": "8.0.1", - "webpack": "5.90.2", + "webpack": "5.97.1", "webpack-livereload-plugin": "3.0.2" }, "dependencies": { diff --git a/src/wp-includes/assets/script-loader-packages.min.php b/src/wp-includes/assets/script-loader-packages.min.php index 6b302c3846cfb..9575fa64e4936 100644 --- a/src/wp-includes/assets/script-loader-packages.min.php +++ b/src/wp-includes/assets/script-loader-packages.min.php @@ -1 +1 @@ - array('dependencies' => array('wp-dom-ready', 'wp-i18n'), 'version' => '3156534cc54473497e14'), 'annotations.min.js' => array('dependencies' => array('wp-data', 'wp-hooks', 'wp-i18n', 'wp-rich-text'), 'version' => '238360e96c76d37a2468'), 'api-fetch.min.js' => array('dependencies' => array('wp-i18n', 'wp-url'), 'version' => 'd387b816bc1ed2042e28'), 'autop.min.js' => array('dependencies' => array(), 'version' => '9fb50649848277dd318d'), 'blob.min.js' => array('dependencies' => array('wp-polyfill'), 'version' => '9113eed771d446f4a556'), 'block-directory.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-a11y', 'wp-api-fetch', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-editor', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-notices', 'wp-plugins', 'wp-primitives', 'wp-url'), 'version' => '1e2dcb064ecd5905fe6b'), 'block-editor.min.js' => array('dependencies' => array('react', 'react-dom', 'react-jsx-runtime', 'wp-a11y', 'wp-api-fetch', 'wp-blob', 'wp-block-serialization-default-parser', 'wp-blocks', 'wp-commands', 'wp-components', 'wp-compose', 'wp-data', 'wp-date', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-is-shallow-equal', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-notices', 'wp-polyfill', 'wp-preferences', 'wp-primitives', 'wp-private-apis', 'wp-rich-text', 'wp-style-engine', 'wp-token-list', 'wp-url', 'wp-warning', 'wp-wordcount'), 'version' => '28fb4f612c7c613fdd55'), 'block-library.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-a11y', 'wp-api-fetch', 'wp-autop', 'wp-blob', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-date', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-escape-html', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-notices', 'wp-patterns', 'wp-polyfill', 'wp-primitives', 'wp-private-apis', 'wp-rich-text', 'wp-server-side-render', 'wp-url', 'wp-wordcount'), 'version' => 'ccc402e50b786e799ae9'), 'block-serialization-default-parser.min.js' => array('dependencies' => array(), 'version' => '14d44daebf663d05d330'), 'blocks.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-autop', 'wp-blob', 'wp-block-serialization-default-parser', 'wp-data', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-is-shallow-equal', 'wp-polyfill', 'wp-private-apis', 'wp-rich-text', 'wp-shortcode', 'wp-warning'), 'version' => '8474af4b6260126fa879'), 'commands.min.js' => array('dependencies' => array('react', 'react-dom', 'react-jsx-runtime', 'wp-components', 'wp-data', 'wp-element', 'wp-i18n', 'wp-keyboard-shortcuts', 'wp-primitives', 'wp-private-apis'), 'version' => '33b90579e9a6d83ac03b'), 'components.min.js' => array('dependencies' => array('react', 'react-dom', 'react-jsx-runtime', 'wp-a11y', 'wp-compose', 'wp-date', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-escape-html', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-is-shallow-equal', 'wp-keycodes', 'wp-primitives', 'wp-private-apis', 'wp-rich-text', 'wp-warning'), 'version' => '130172abbae720694b1f'), 'compose.min.js' => array('dependencies' => array('react', 'react-jsx-runtime', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-is-shallow-equal', 'wp-keycodes', 'wp-priority-queue'), 'version' => '85f0708cd2e6b26addeb'), 'core-commands.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-commands', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-element', 'wp-html-entities', 'wp-i18n', 'wp-notices', 'wp-primitives', 'wp-private-apis', 'wp-router', 'wp-url'), 'version' => 'e398c3f43e502a9c4a8f'), 'core-data.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-api-fetch', 'wp-block-editor', 'wp-blocks', 'wp-compose', 'wp-data', 'wp-deprecated', 'wp-element', 'wp-html-entities', 'wp-i18n', 'wp-is-shallow-equal', 'wp-private-apis', 'wp-rich-text', 'wp-url', 'wp-warning'), 'version' => '8224153d27ea1b378c5a'), 'customize-widgets.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-block-editor', 'wp-block-library', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-dom', 'wp-element', 'wp-hooks', 'wp-i18n', 'wp-is-shallow-equal', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-media-utils', 'wp-preferences', 'wp-primitives', 'wp-private-apis', 'wp-widgets'), 'version' => '6cc7ebe73bf2bd031694'), 'data.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-compose', 'wp-deprecated', 'wp-element', 'wp-is-shallow-equal', 'wp-priority-queue', 'wp-private-apis', 'wp-redux-routine'), 'version' => '7c62e39de0308c73d50c'), 'data-controls.min.js' => array('dependencies' => array('wp-api-fetch', 'wp-data', 'wp-deprecated'), 'version' => '49f5587e8b90f9e7cc7e'), 'date.min.js' => array('dependencies' => array('moment', 'wp-deprecated'), 'version' => 'aaca6387d1cf924acc51'), 'deprecated.min.js' => array('dependencies' => array('wp-hooks'), 'version' => 'e1f84915c5e8ae38964c'), 'dom.min.js' => array('dependencies' => array('wp-deprecated'), 'version' => '93117dfee2692b04b770'), 'dom-ready.min.js' => array('dependencies' => array(), 'version' => 'f77871ff7694fffea381'), 'edit-post.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-api-fetch', 'wp-block-editor', 'wp-block-library', 'wp-blocks', 'wp-commands', 'wp-components', 'wp-compose', 'wp-core-commands', 'wp-core-data', 'wp-data', 'wp-deprecated', 'wp-editor', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-notices', 'wp-plugins', 'wp-preferences', 'wp-primitives', 'wp-private-apis', 'wp-url', 'wp-widgets'), 'version' => 'f56f4976c416ccebe712'), 'edit-site.min.js' => array('dependencies' => array('react', 'react-dom', 'react-jsx-runtime', 'wp-a11y', 'wp-api-fetch', 'wp-blob', 'wp-block-editor', 'wp-block-library', 'wp-blocks', 'wp-commands', 'wp-components', 'wp-compose', 'wp-core-commands', 'wp-core-data', 'wp-data', 'wp-date', 'wp-deprecated', 'wp-dom', 'wp-editor', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-notices', 'wp-patterns', 'wp-plugins', 'wp-polyfill', 'wp-preferences', 'wp-primitives', 'wp-priority-queue', 'wp-private-apis', 'wp-router', 'wp-url', 'wp-warning', 'wp-widgets'), 'version' => '79e90f0c7638bb507b37'), 'edit-widgets.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-api-fetch', 'wp-block-editor', 'wp-block-library', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-hooks', 'wp-i18n', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-media-utils', 'wp-notices', 'wp-patterns', 'wp-plugins', 'wp-preferences', 'wp-primitives', 'wp-private-apis', 'wp-url', 'wp-viewport', 'wp-widgets'), 'version' => '1efdc3b9daf491cf8991'), 'editor.min.js' => array('dependencies' => array('react', 'react-jsx-runtime', 'wp-a11y', 'wp-api-fetch', 'wp-blob', 'wp-block-editor', 'wp-blocks', 'wp-commands', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-date', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-media-utils', 'wp-notices', 'wp-patterns', 'wp-plugins', 'wp-polyfill', 'wp-preferences', 'wp-primitives', 'wp-private-apis', 'wp-rich-text', 'wp-server-side-render', 'wp-url', 'wp-viewport', 'wp-warning', 'wp-wordcount'), 'version' => 'd362bb0f0c3fd99674fe'), 'element.min.js' => array('dependencies' => array('react', 'react-dom', 'wp-escape-html'), 'version' => 'cb762d190aebbec25b27'), 'escape-html.min.js' => array('dependencies' => array(), 'version' => '6561a406d2d232a6fbd2'), 'fields.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-blob', 'wp-components', 'wp-core-data', 'wp-data', 'wp-element', 'wp-html-entities', 'wp-i18n', 'wp-notices', 'wp-patterns', 'wp-primitives', 'wp-private-apis', 'wp-url'), 'version' => 'c8dc1e4d8421380ff34a'), 'format-library.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-a11y', 'wp-block-editor', 'wp-components', 'wp-data', 'wp-element', 'wp-html-entities', 'wp-i18n', 'wp-primitives', 'wp-private-apis', 'wp-rich-text', 'wp-url'), 'version' => '81b8a9364113f57b6a37'), 'hooks.min.js' => array('dependencies' => array(), 'version' => '4d63a3d491d11ffd8ac6'), 'html-entities.min.js' => array('dependencies' => array(), 'version' => '2cd3358363e0675638fb'), 'i18n.min.js' => array('dependencies' => array('wp-hooks'), 'version' => '5e580eb46a90c2b997e6'), 'is-shallow-equal.min.js' => array('dependencies' => array(), 'version' => 'e0f9f1d78d83f5196979'), 'keyboard-shortcuts.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-data', 'wp-element', 'wp-keycodes'), 'version' => '32686e58e84193ce808b'), 'keycodes.min.js' => array('dependencies' => array('wp-i18n'), 'version' => '034ff647a54b018581d3'), 'list-reusable-blocks.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-api-fetch', 'wp-blob', 'wp-components', 'wp-compose', 'wp-element', 'wp-i18n'), 'version' => 'aa3dd59fcb0ede2ee0da'), 'media-utils.min.js' => array('dependencies' => array('wp-api-fetch', 'wp-blob', 'wp-element', 'wp-i18n'), 'version' => 'e10cc6bfcff4fe474479'), 'notices.min.js' => array('dependencies' => array('wp-data'), 'version' => '673a68a7ac2f556ed50b'), 'nux.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-components', 'wp-compose', 'wp-data', 'wp-deprecated', 'wp-element', 'wp-i18n', 'wp-primitives'), 'version' => '9a0dc535fe222ae46a48'), 'patterns.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-a11y', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-element', 'wp-html-entities', 'wp-i18n', 'wp-notices', 'wp-primitives', 'wp-private-apis', 'wp-url'), 'version' => 'b4c7e00c3ec65ecfeaed'), 'plugins.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-compose', 'wp-element', 'wp-hooks', 'wp-is-shallow-equal', 'wp-primitives'), 'version' => 'ef6da4a9b2747b62c09c'), 'preferences.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-a11y', 'wp-components', 'wp-compose', 'wp-data', 'wp-deprecated', 'wp-element', 'wp-i18n', 'wp-primitives', 'wp-private-apis'), 'version' => '945c6cbfe821b3070047'), 'preferences-persistence.min.js' => array('dependencies' => array('wp-api-fetch'), 'version' => '9307a8c9e3254140a223'), 'primitives.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-element'), 'version' => 'aef2543ab60c8c9bb609'), 'priority-queue.min.js' => array('dependencies' => array(), 'version' => '9c21c957c7e50ffdbf48'), 'private-apis.min.js' => array('dependencies' => array(), 'version' => '4b858962c15c2c7a135f'), 'redux-routine.min.js' => array('dependencies' => array(), 'version' => 'a0a172871afaeb261566'), 'reusable-blocks.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-core-data', 'wp-data', 'wp-element', 'wp-i18n', 'wp-notices', 'wp-primitives', 'wp-url'), 'version' => '73735a77e4e5095733da'), 'rich-text.min.js' => array('dependencies' => array('wp-a11y', 'wp-compose', 'wp-data', 'wp-deprecated', 'wp-element', 'wp-escape-html', 'wp-i18n', 'wp-keycodes'), 'version' => '4021b9e4e9ef4d3cd868'), 'router.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-element', 'wp-polyfill', 'wp-private-apis', 'wp-url'), 'version' => 'e4887fecc16ef03e908f'), 'server-side-render.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-api-fetch', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-data', 'wp-element', 'wp-i18n', 'wp-url'), 'version' => '1e0f25c205ebeb30bcd2'), 'shortcode.min.js' => array('dependencies' => array(), 'version' => 'b7747eee0efafd2f0c3b'), 'style-engine.min.js' => array('dependencies' => array(), 'version' => '08cc10e9532531e22456'), 'token-list.min.js' => array('dependencies' => array(), 'version' => '3b5f5dcfde830ecef24f'), 'undo-manager.min.js' => array('dependencies' => array('wp-is-shallow-equal'), 'version' => 'f0698003cb0f0a7bd794'), 'url.min.js' => array('dependencies' => array('wp-polyfill'), 'version' => 'e87eb76272a3a08402d2'), 'viewport.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-compose', 'wp-data'), 'version' => '829c9a30d366e1e5054c'), 'warning.min.js' => array('dependencies' => array(), 'version' => 'ed7c8b0940914f4fe44b'), 'widgets.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-api-fetch', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-element', 'wp-i18n', 'wp-notices', 'wp-polyfill', 'wp-primitives'), 'version' => 'e4801fc4b16effe444d8'), 'wordcount.min.js' => array('dependencies' => array(), 'version' => '55d8c2bf3dc99e7ea5ec')); + array('dependencies' => array('wp-dom-ready', 'wp-i18n'), 'version' => '3156534cc54473497e14'), 'annotations.min.js' => array('dependencies' => array('wp-data', 'wp-hooks', 'wp-i18n', 'wp-rich-text'), 'version' => '238360e96c76d37a2468'), 'api-fetch.min.js' => array('dependencies' => array('wp-i18n', 'wp-url'), 'version' => 'd387b816bc1ed2042e28'), 'autop.min.js' => array('dependencies' => array(), 'version' => '9fb50649848277dd318d'), 'blob.min.js' => array('dependencies' => array('wp-polyfill'), 'version' => '9113eed771d446f4a556'), 'block-directory.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-a11y', 'wp-api-fetch', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-editor', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-notices', 'wp-plugins', 'wp-primitives', 'wp-url'), 'version' => '39151ef09cafcf3bcb90'), 'block-editor.min.js' => array('dependencies' => array('react', 'react-dom', 'react-jsx-runtime', 'wp-a11y', 'wp-api-fetch', 'wp-blob', 'wp-block-serialization-default-parser', 'wp-blocks', 'wp-commands', 'wp-components', 'wp-compose', 'wp-data', 'wp-date', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-is-shallow-equal', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-notices', 'wp-polyfill', 'wp-preferences', 'wp-primitives', 'wp-private-apis', 'wp-rich-text', 'wp-style-engine', 'wp-token-list', 'wp-url', 'wp-warning', 'wp-wordcount'), 'version' => '1bc1536e843749059e17'), 'block-library.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-a11y', 'wp-api-fetch', 'wp-autop', 'wp-blob', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-date', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-escape-html', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-notices', 'wp-patterns', 'wp-polyfill', 'wp-primitives', 'wp-private-apis', 'wp-rich-text', 'wp-server-side-render', 'wp-url', 'wp-wordcount'), 'version' => '7a4a3cb731837c04e244'), 'block-serialization-default-parser.min.js' => array('dependencies' => array(), 'version' => '14d44daebf663d05d330'), 'blocks.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-autop', 'wp-blob', 'wp-block-serialization-default-parser', 'wp-data', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-is-shallow-equal', 'wp-polyfill', 'wp-private-apis', 'wp-rich-text', 'wp-shortcode', 'wp-warning'), 'version' => 'cb271b6aaf12433d00f9'), 'commands.min.js' => array('dependencies' => array('react', 'react-dom', 'react-jsx-runtime', 'wp-components', 'wp-data', 'wp-element', 'wp-i18n', 'wp-keyboard-shortcuts', 'wp-primitives', 'wp-private-apis'), 'version' => 'dd13db18ea4531d4fd4f'), 'components.min.js' => array('dependencies' => array('react', 'react-dom', 'react-jsx-runtime', 'wp-a11y', 'wp-compose', 'wp-date', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-escape-html', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-is-shallow-equal', 'wp-keycodes', 'wp-primitives', 'wp-private-apis', 'wp-rich-text', 'wp-warning'), 'version' => '9d6405d1df52523cdb7c'), 'compose.min.js' => array('dependencies' => array('react', 'react-jsx-runtime', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-is-shallow-equal', 'wp-keycodes', 'wp-priority-queue'), 'version' => '85dec7c8cc97a2154328'), 'core-commands.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-commands', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-element', 'wp-html-entities', 'wp-i18n', 'wp-notices', 'wp-primitives', 'wp-private-apis', 'wp-router', 'wp-url'), 'version' => 'e398c3f43e502a9c4a8f'), 'core-data.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-api-fetch', 'wp-block-editor', 'wp-blocks', 'wp-compose', 'wp-data', 'wp-deprecated', 'wp-element', 'wp-html-entities', 'wp-i18n', 'wp-is-shallow-equal', 'wp-private-apis', 'wp-rich-text', 'wp-url', 'wp-warning'), 'version' => 'd2e4efaae0db8468d384'), 'customize-widgets.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-block-editor', 'wp-block-library', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-dom', 'wp-element', 'wp-hooks', 'wp-i18n', 'wp-is-shallow-equal', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-media-utils', 'wp-preferences', 'wp-primitives', 'wp-private-apis', 'wp-widgets'), 'version' => '37501962aef2167588ae'), 'data.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-compose', 'wp-deprecated', 'wp-element', 'wp-is-shallow-equal', 'wp-priority-queue', 'wp-private-apis', 'wp-redux-routine'), 'version' => 'fcf175d67ec974dde948'), 'data-controls.min.js' => array('dependencies' => array('wp-api-fetch', 'wp-data', 'wp-deprecated'), 'version' => '49f5587e8b90f9e7cc7e'), 'date.min.js' => array('dependencies' => array('moment', 'wp-deprecated'), 'version' => 'b2f083170ed22ebef396'), 'deprecated.min.js' => array('dependencies' => array('wp-hooks'), 'version' => 'e1f84915c5e8ae38964c'), 'dom.min.js' => array('dependencies' => array('wp-deprecated'), 'version' => '93117dfee2692b04b770'), 'dom-ready.min.js' => array('dependencies' => array(), 'version' => 'f77871ff7694fffea381'), 'edit-post.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-api-fetch', 'wp-block-editor', 'wp-block-library', 'wp-blocks', 'wp-commands', 'wp-components', 'wp-compose', 'wp-core-commands', 'wp-core-data', 'wp-data', 'wp-deprecated', 'wp-editor', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-notices', 'wp-plugins', 'wp-preferences', 'wp-primitives', 'wp-private-apis', 'wp-url', 'wp-widgets'), 'version' => '7afeea389faaa086488e'), 'edit-site.min.js' => array('dependencies' => array('react', 'react-dom', 'react-jsx-runtime', 'wp-a11y', 'wp-api-fetch', 'wp-blob', 'wp-block-editor', 'wp-block-library', 'wp-blocks', 'wp-commands', 'wp-components', 'wp-compose', 'wp-core-commands', 'wp-core-data', 'wp-data', 'wp-date', 'wp-deprecated', 'wp-dom', 'wp-editor', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-notices', 'wp-patterns', 'wp-plugins', 'wp-polyfill', 'wp-preferences', 'wp-primitives', 'wp-priority-queue', 'wp-private-apis', 'wp-router', 'wp-url', 'wp-warning', 'wp-widgets'), 'version' => '65ffcc054ba0879fe4a8'), 'edit-widgets.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-api-fetch', 'wp-block-editor', 'wp-block-library', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-hooks', 'wp-i18n', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-media-utils', 'wp-notices', 'wp-patterns', 'wp-plugins', 'wp-preferences', 'wp-primitives', 'wp-private-apis', 'wp-url', 'wp-viewport', 'wp-widgets'), 'version' => '0837e3a0f72404eceec8'), 'editor.min.js' => array('dependencies' => array('react', 'react-jsx-runtime', 'wp-a11y', 'wp-api-fetch', 'wp-blob', 'wp-block-editor', 'wp-blocks', 'wp-commands', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-date', 'wp-deprecated', 'wp-dom', 'wp-element', 'wp-hooks', 'wp-html-entities', 'wp-i18n', 'wp-keyboard-shortcuts', 'wp-keycodes', 'wp-media-utils', 'wp-notices', 'wp-patterns', 'wp-plugins', 'wp-polyfill', 'wp-preferences', 'wp-primitives', 'wp-private-apis', 'wp-rich-text', 'wp-server-side-render', 'wp-url', 'wp-viewport', 'wp-warning', 'wp-wordcount'), 'version' => 'b248ed022e6a138978b3'), 'element.min.js' => array('dependencies' => array('react', 'react-dom', 'wp-escape-html'), 'version' => 'a4eeeadd23c0d7ab1d2d'), 'escape-html.min.js' => array('dependencies' => array(), 'version' => '6561a406d2d232a6fbd2'), 'fields.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-blob', 'wp-components', 'wp-core-data', 'wp-data', 'wp-element', 'wp-html-entities', 'wp-i18n', 'wp-notices', 'wp-patterns', 'wp-primitives', 'wp-private-apis', 'wp-url'), 'version' => '464fc3ce3c9ae20da608'), 'format-library.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-a11y', 'wp-block-editor', 'wp-components', 'wp-data', 'wp-element', 'wp-html-entities', 'wp-i18n', 'wp-primitives', 'wp-private-apis', 'wp-rich-text', 'wp-url'), 'version' => '86d7a5d57cc8dd223bba'), 'hooks.min.js' => array('dependencies' => array(), 'version' => '4d63a3d491d11ffd8ac6'), 'html-entities.min.js' => array('dependencies' => array(), 'version' => '2cd3358363e0675638fb'), 'i18n.min.js' => array('dependencies' => array('wp-hooks'), 'version' => '5e580eb46a90c2b997e6'), 'is-shallow-equal.min.js' => array('dependencies' => array(), 'version' => 'e0f9f1d78d83f5196979'), 'keyboard-shortcuts.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-data', 'wp-element', 'wp-keycodes'), 'version' => '32686e58e84193ce808b'), 'keycodes.min.js' => array('dependencies' => array('wp-i18n'), 'version' => '034ff647a54b018581d3'), 'list-reusable-blocks.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-api-fetch', 'wp-blob', 'wp-components', 'wp-compose', 'wp-element', 'wp-i18n'), 'version' => 'ece12b3c74315b4175ef'), 'media-utils.min.js' => array('dependencies' => array('wp-api-fetch', 'wp-blob', 'wp-element', 'wp-i18n'), 'version' => 'e10cc6bfcff4fe474479'), 'notices.min.js' => array('dependencies' => array('wp-data'), 'version' => '673a68a7ac2f556ed50b'), 'nux.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-components', 'wp-compose', 'wp-data', 'wp-deprecated', 'wp-element', 'wp-i18n', 'wp-primitives'), 'version' => '9a0dc535fe222ae46a48'), 'patterns.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-a11y', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-element', 'wp-html-entities', 'wp-i18n', 'wp-notices', 'wp-primitives', 'wp-private-apis', 'wp-url'), 'version' => '712ca62469c7d6090da8'), 'plugins.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-compose', 'wp-element', 'wp-hooks', 'wp-is-shallow-equal', 'wp-primitives'), 'version' => 'ef6da4a9b2747b62c09c'), 'preferences.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-a11y', 'wp-components', 'wp-compose', 'wp-data', 'wp-deprecated', 'wp-element', 'wp-i18n', 'wp-primitives', 'wp-private-apis'), 'version' => '859dd2db2fdba6f5c726'), 'preferences-persistence.min.js' => array('dependencies' => array('wp-api-fetch'), 'version' => '9307a8c9e3254140a223'), 'primitives.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-element'), 'version' => 'aef2543ab60c8c9bb609'), 'priority-queue.min.js' => array('dependencies' => array(), 'version' => '9c21c957c7e50ffdbf48'), 'private-apis.min.js' => array('dependencies' => array(), 'version' => '4b858962c15c2c7a135f'), 'redux-routine.min.js' => array('dependencies' => array(), 'version' => '71b945a4f0f8ce5a037d'), 'reusable-blocks.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-core-data', 'wp-data', 'wp-element', 'wp-i18n', 'wp-notices', 'wp-primitives', 'wp-url'), 'version' => '73735a77e4e5095733da'), 'rich-text.min.js' => array('dependencies' => array('wp-a11y', 'wp-compose', 'wp-data', 'wp-deprecated', 'wp-element', 'wp-escape-html', 'wp-i18n', 'wp-keycodes'), 'version' => '4021b9e4e9ef4d3cd868'), 'router.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-element', 'wp-polyfill', 'wp-private-apis', 'wp-url'), 'version' => 'e4887fecc16ef03e908f'), 'server-side-render.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-api-fetch', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-data', 'wp-element', 'wp-i18n', 'wp-url'), 'version' => '345a014347e34be995f0'), 'shortcode.min.js' => array('dependencies' => array(), 'version' => 'b7747eee0efafd2f0c3b'), 'style-engine.min.js' => array('dependencies' => array(), 'version' => '08cc10e9532531e22456'), 'token-list.min.js' => array('dependencies' => array(), 'version' => '3b5f5dcfde830ecef24f'), 'undo-manager.min.js' => array('dependencies' => array('wp-is-shallow-equal'), 'version' => '531015dcaa7cee31c780'), 'url.min.js' => array('dependencies' => array('wp-polyfill'), 'version' => 'e87eb76272a3a08402d2'), 'viewport.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-compose', 'wp-data'), 'version' => '829c9a30d366e1e5054c'), 'warning.min.js' => array('dependencies' => array(), 'version' => 'ed7c8b0940914f4fe44b'), 'widgets.min.js' => array('dependencies' => array('react-jsx-runtime', 'wp-api-fetch', 'wp-block-editor', 'wp-blocks', 'wp-components', 'wp-compose', 'wp-core-data', 'wp-data', 'wp-element', 'wp-i18n', 'wp-notices', 'wp-polyfill', 'wp-primitives'), 'version' => '45d6328bc40634dbcd7b'), 'wordcount.min.js' => array('dependencies' => array(), 'version' => '55d8c2bf3dc99e7ea5ec')); diff --git a/src/wp-includes/assets/script-modules-packages.min.php b/src/wp-includes/assets/script-modules-packages.min.php index 9bb1ec6efdab9..d781885650e5a 100644 --- a/src/wp-includes/assets/script-modules-packages.min.php +++ b/src/wp-includes/assets/script-modules-packages.min.php @@ -1 +1 @@ - array('dependencies' => array(), 'version' => '06b8f695ef48ab2d9277', 'type' => 'module'), 'interactivity/debug.min.js' => array('dependencies' => array(), 'version' => 'c77e5317ad566e76e750', 'type' => 'module'), 'interactivity-router/index.min.js' => array('dependencies' => array('@wordpress/interactivity', array('id' => '@wordpress/a11y', 'import' => 'dynamic')), 'version' => 'f01b88335afcef3dfc5d', 'type' => 'module'), 'a11y/index.min.js' => array('dependencies' => array(), 'version' => 'b7d06936b8bc23cff2ad', 'type' => 'module'), 'block-library/file/view.min.js' => array('dependencies' => array('@wordpress/interactivity'), 'version' => 'fdc2f6842e015af83140', 'type' => 'module'), 'block-library/image/view.min.js' => array('dependencies' => array('@wordpress/interactivity'), 'version' => 'acfec7b3c0be4a859b31', 'type' => 'module'), 'block-library/navigation/view.min.js' => array('dependencies' => array('@wordpress/interactivity'), 'version' => '8ff192874fc8910a284c', 'type' => 'module'), 'block-library/query/view.min.js' => array('dependencies' => array('@wordpress/interactivity', array('id' => '@wordpress/interactivity-router', 'import' => 'dynamic')), 'version' => 'f4c91c89fa5271f3dad9', 'type' => 'module'), 'block-library/search/view.min.js' => array('dependencies' => array('@wordpress/interactivity'), 'version' => '2a73400a693958f604de', 'type' => 'module')); + array('dependencies' => array(), 'version' => '04d9948c85e9600ec2a5', 'type' => 'module'), 'interactivity/debug.min.js' => array('dependencies' => array(), 'version' => '03be8c2fdc10a676f363', 'type' => 'module'), 'interactivity-router/index.min.js' => array('dependencies' => array('@wordpress/interactivity', array('id' => '@wordpress/a11y', 'import' => 'dynamic')), 'version' => '2a2ef420d37f6e7e08a0', 'type' => 'module'), 'a11y/index.min.js' => array('dependencies' => array(), 'version' => 'b7d06936b8bc23cff2ad', 'type' => 'module'), 'block-library/file/view.min.js' => array('dependencies' => array('@wordpress/interactivity'), 'version' => 'fdc2f6842e015af83140', 'type' => 'module'), 'block-library/image/view.min.js' => array('dependencies' => array('@wordpress/interactivity'), 'version' => 'acfec7b3c0be4a859b31', 'type' => 'module'), 'block-library/navigation/view.min.js' => array('dependencies' => array('@wordpress/interactivity'), 'version' => '8ff192874fc8910a284c', 'type' => 'module'), 'block-library/query/view.min.js' => array('dependencies' => array('@wordpress/interactivity', array('id' => '@wordpress/interactivity-router', 'import' => 'dynamic')), 'version' => '0661ecffc048a34462c0', 'type' => 'module'), 'block-library/search/view.min.js' => array('dependencies' => array('@wordpress/interactivity'), 'version' => '2a73400a693958f604de', 'type' => 'module')); From 20982b75d2817a4c3c38091ee1584a108244c4f5 Mon Sep 17 00:00:00 2001 From: Joe Dolson Date: Fri, 13 Dec 2024 21:08:36 +0000 Subject: [PATCH 014/117] Customize: Remove unnecessary `height: 100%` on accordion button. Remove CSS that could occasionally trigger the accordion buttons to be 100% the height of the accordion container. Props dhewercorus, im3dabasia1, sabernhardt, rvoigt, ghinamt, vishy-moghan, frankbiganski, redkite. Fixes #62491. git-svn-id: https://develop.svn.wordpress.org/trunk@59510 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-admin/css/customize-controls.css | 1 - 1 file changed, 1 deletion(-) diff --git a/src/wp-admin/css/customize-controls.css b/src/wp-admin/css/customize-controls.css index 8149c28d138d6..1805790eb2d3e 100644 --- a/src/wp-admin/css/customize-controls.css +++ b/src/wp-admin/css/customize-controls.css @@ -561,7 +561,6 @@ body.trashing #publish-settings { .accordion-section-title button.accordion-trigger { all: unset; width: 100%; - height: 100%; padding: 10px 30px 11px 14px; display: flex; align-items: center; From ab51fc38f448784644f66321ae13231ec3f2cacc Mon Sep 17 00:00:00 2001 From: Joe Dolson Date: Fri, 13 Dec 2024 21:51:41 +0000 Subject: [PATCH 015/117] Editor: Hide 'Skip to Editor' if editor not supported. Wrap the classic editor 'Skip to Editor' link in a conditional to prevent it from rendering on post types that do not have editor support. Props wildworks, parthvataliya, narenin, sainathpoojary, ankitkumarshah, parthvataliya, im3dabasia1. Fixes #62623. git-svn-id: https://develop.svn.wordpress.org/trunk@59511 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-admin/edit-form-advanced.php | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/wp-admin/edit-form-advanced.php b/src/wp-admin/edit-form-advanced.php index f20fafb3493cd..b21b50f4ae4df 100644 --- a/src/wp-admin/edit-form-advanced.php +++ b/src/wp-admin/edit-form-advanced.php @@ -546,7 +546,13 @@ ?> - + + + Date: Fri, 13 Dec 2024 23:15:08 +0000 Subject: [PATCH 016/117] Coding Standards: Use strict comparison in `get_blog_id_from_url()`. Follow-up to [https://mu.trac.wordpress.org/changeset/1538 mu:1538]. Props debarghyabanerjee. See #62283. git-svn-id: https://develop.svn.wordpress.org/trunk@59512 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/ms-functions.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wp-includes/ms-functions.php b/src/wp-includes/ms-functions.php index 6f9ba85006f59..fa8df6d10875b 100644 --- a/src/wp-includes/ms-functions.php +++ b/src/wp-includes/ms-functions.php @@ -341,7 +341,7 @@ function get_blog_id_from_url( $domain, $path = '/' ) { $path = strtolower( $path ); $id = wp_cache_get( md5( $domain . $path ), 'blog-id-cache' ); - if ( -1 == $id ) { // Blog does not exist. + if ( -1 === $id ) { // Blog does not exist. return 0; } elseif ( $id ) { return (int) $id; From 1cc1af2d6b413e171c5ee1f90af0bd38fdbbba2e Mon Sep 17 00:00:00 2001 From: Jb Audras Date: Fri, 13 Dec 2024 23:51:14 +0000 Subject: [PATCH 017/117] Themes: Replace "Active" wording with "Installed" in the theme install checks page. When reinstalling a theme by uploading a ZIP file, the wording used in some strings referred to the "active" theme even though it's not the currrently active theme. This changeset replaces these strings to refer to the "installed" theme, which is more accurate. Follow-up to [52610], [52580]. Props afercia, ankitkumarshah, abcd95, yogeshbhutkar, parthvataliya, sainathpoojary, virgar, gaellebesson, nuryko, guillaumeturpin, maximemeganck, sabrineg. Fixes #62603. See #54831, #54770 git-svn-id: https://develop.svn.wordpress.org/trunk@59513 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-admin/includes/class-theme-installer-skin.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/wp-admin/includes/class-theme-installer-skin.php b/src/wp-admin/includes/class-theme-installer-skin.php index 035e26f608a9f..2f1fa344c9a5b 100644 --- a/src/wp-admin/includes/class-theme-installer-skin.php +++ b/src/wp-admin/includes/class-theme-installer-skin.php @@ -251,7 +251,7 @@ private function do_overwrite() { ); $table = ''; - $table .= ''; + $table .= ''; $is_same_theme = true; // Let's consider only these rows. @@ -333,7 +333,7 @@ private function do_overwrite() { if ( $this->is_downgrading ) { $warning = sprintf( /* translators: %s: Documentation URL. */ - __( 'You are uploading an older version of the active theme. You can continue to install the older version, but be sure to back up your database and files first.' ), + __( 'You are uploading an older version of the installed theme. You can continue to install the older version, but be sure to back up your database and files first.' ), __( 'https://developer.wordpress.org/advanced-administration/security/backup/' ) ); } else { @@ -351,7 +351,7 @@ private function do_overwrite() { $install_actions['overwrite_theme'] = sprintf( '%s', wp_nonce_url( add_query_arg( 'overwrite', $overwrite, $this->url ), 'theme-upload' ), - _x( 'Replace active with uploaded', 'theme' ) + _x( 'Replace installed with uploaded', 'theme' ) ); } else { echo $blocked_message; From b03c9f531d017aa5e15eceeb2534097851e30707 Mon Sep 17 00:00:00 2001 From: Joe Dolson Date: Sat, 14 Dec 2024 01:30:07 +0000 Subject: [PATCH 018/117] Comments: Avoid reverting comment reply when context menu is open. Fix a bug where a comment reply would be discarded if `esc` was pressed to dismiss the context menu in Safari or Firefox. Checks whether the contextmenu is open and ignores the `esc` key if it is. Props yellowafterlife, yogeshbhutkar, joedolson. Fixes #62346. git-svn-id: https://develop.svn.wordpress.org/trunk@59514 602fd350-edb4-49c9-b593-d223f7449a82 --- src/js/_enqueues/admin/edit-comments.js | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/js/_enqueues/admin/edit-comments.js b/src/js/_enqueues/admin/edit-comments.js index e007edf465c6f..9a3d81a751bd8 100644 --- a/src/js/_enqueues/admin/edit-comments.js +++ b/src/js/_enqueues/admin/edit-comments.js @@ -1020,7 +1020,8 @@ window.commentReply = { setTimeout(function() { var rtop, rbottom, scrollTop, vp, scrollBottom, - isComposing = false; + isComposing = false, + isContextMenuOpen = false; rtop = $('#replyrow').offset().top; rbottom = rtop + $('#replyrow').height(); @@ -1035,9 +1036,20 @@ window.commentReply = { $( '#replycontent' ) .trigger( 'focus' ) + .on( 'contextmenu keydown', function ( e ) { + // Check if the context menu is open and set state. + if ( e.type === 'contextmenu' ) { + isContextMenuOpen = true; + } + + // Update the context menu state if the Escape key is pressed. + if ( e.type === 'keydown' && e.which === 27 && isContextMenuOpen ) { + isContextMenuOpen = false; + } + } ) .on( 'keyup', function( e ) { - // Close on Escape except when Input Method Editors (IMEs) are in use. - if ( e.which === 27 && ! isComposing ) { + // Close on Escape unless Input Method Editors (IMEs) are in use or the context menu is open. + if ( e.which === 27 && ! isComposing && ! isContextMenuOpen ) { commentReply.revert(); } } ) From c3c319ed58fdaddb46190194368b8ffe668902a4 Mon Sep 17 00:00:00 2001 From: Sergey Biryukov Date: Sat, 14 Dec 2024 23:51:09 +0000 Subject: [PATCH 019/117] Formatting: Check the result of `preg_split()` in `convert_smilies()`. This aims to avoid a fatal error from `count()` when `preg_split()` fails on large input. Includes: * Optimizing the regular expression used to split the input by tags to avoid unlimited backtracking for better performance. * Adjusting the function logic for better readability. Follow-up to [340], [4380], [26191]. Props podpirate, nathkrill, rajinsharwar, dmsnell, bjorsch, q0rban, audrasjb, rupw, Ov3rfly, jorbin, nhrrob, chaion07, mcqueen22, azaozz, narenin, roybellingan, SergeyBiryukov. See #51019. git-svn-id: https://develop.svn.wordpress.org/trunk@59515 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/formatting.php | 61 +++++++++++-------- .../tests/formatting/convertSmilies.php | 12 ++++ 2 files changed, 47 insertions(+), 26 deletions(-) diff --git a/src/wp-includes/formatting.php b/src/wp-includes/formatting.php index b579bcd324299..3ecc352528fec 100644 --- a/src/wp-includes/formatting.php +++ b/src/wp-includes/formatting.php @@ -3473,40 +3473,49 @@ function translate_smiley( $matches ) { */ function convert_smilies( $text ) { global $wp_smiliessearch; - $output = ''; - if ( get_option( 'use_smilies' ) && ! empty( $wp_smiliessearch ) ) { - // HTML loop taken from texturize function, could possible be consolidated. - $textarr = preg_split( '/(<.*>)/U', $text, -1, PREG_SPLIT_DELIM_CAPTURE ); // Capture the tags as well as in between. - $stop = count( $textarr ); // Loop stuff. - // Ignore processing of specific tags. - $tags_to_ignore = 'code|pre|style|script|textarea'; - $ignore_block_element = ''; + if ( ! get_option( 'use_smilies' ) || empty( $wp_smiliessearch ) ) { + // Return default text. + return $text; + } - for ( $i = 0; $i < $stop; $i++ ) { - $content = $textarr[ $i ]; + // HTML loop taken from texturize function, could possible be consolidated. + $textarr = preg_split( '/(<[^>]*>)/U', $text, -1, PREG_SPLIT_DELIM_CAPTURE ); // Capture the tags as well as in between. - // If we're in an ignore block, wait until we find its closing tag. - if ( '' === $ignore_block_element && preg_match( '/^<(' . $tags_to_ignore . ')[^>]*>/', $content, $matches ) ) { - $ignore_block_element = $matches[1]; - } + if ( false === $textarr ) { + // Return default text. + return $text; + } - // If it's not a tag and not in ignore block. - if ( '' === $ignore_block_element && strlen( $content ) > 0 && '<' !== $content[0] ) { - $content = preg_replace_callback( $wp_smiliessearch, 'translate_smiley', $content ); - } + // Loop stuff. + $stop = count( $textarr ); + $output = ''; - // Did we exit ignore block? - if ( '' !== $ignore_block_element && '' === $content ) { - $ignore_block_element = ''; - } + // Ignore processing of specific tags. + $tags_to_ignore = 'code|pre|style|script|textarea'; + $ignore_block_element = ''; + + for ( $i = 0; $i < $stop; $i++ ) { + $content = $textarr[ $i ]; - $output .= $content; + // If we're in an ignore block, wait until we find its closing tag. + if ( '' === $ignore_block_element && preg_match( '/^<(' . $tags_to_ignore . ')[^>]*>/', $content, $matches ) ) { + $ignore_block_element = $matches[1]; } - } else { - // Return default text. - $output = $text; + + // If it's not a tag and not in ignore block. + if ( '' === $ignore_block_element && strlen( $content ) > 0 && '<' !== $content[0] ) { + $content = preg_replace_callback( $wp_smiliessearch, 'translate_smiley', $content ); + } + + // Did we exit ignore block? + if ( '' !== $ignore_block_element && '' === $content ) { + $ignore_block_element = ''; + } + + $output .= $content; } + return $output; } diff --git a/tests/phpunit/tests/formatting/convertSmilies.php b/tests/phpunit/tests/formatting/convertSmilies.php index 6a6cfffdeb990..c31386c3decb5 100644 --- a/tests/phpunit/tests/formatting/convertSmilies.php +++ b/tests/phpunit/tests/formatting/convertSmilies.php @@ -393,4 +393,16 @@ public function _filter_add_smilies( $wpsmiliestrans ) { $wpsmiliestrans['<3'] = '\xe2\x9d\xa4'; return $wpsmiliestrans; } + + + /** + * Tests that the function does not throw a fatal error from count() + * when preg_split() fails on large input. + * + * @ticket 51019 + */ + public function test_smilies_with_large_text_input() { + $text = '

:)'; + $this->assertStringContainsString( "\xf0\x9f\x99\x82", convert_smilies( $text ) ); + } } From cdc2f255acce57372b849d6278c4156e1056c749 Mon Sep 17 00:00:00 2001 From: Sergey Biryukov Date: Sun, 15 Dec 2024 23:22:22 +0000 Subject: [PATCH 020/117] Tests: Clean up `convert_smilies()` tests. Includes: * Removing redundant `use_smilies` option switches, as it is set to 1 by default. * Restoring the `$wpsmiliestrans` array before performing assertions, not after. * Moving most of the `smilies_init()` calls to a `set_up()` method. Follow-up to [409/tests], [26191], [28717]. See #62278. git-svn-id: https://develop.svn.wordpress.org/trunk@59516 602fd350-edb4-49c9-b593-d223f7449a82 --- .../tests/formatting/convertSmilies.php | 60 +++++-------------- 1 file changed, 14 insertions(+), 46 deletions(-) diff --git a/tests/phpunit/tests/formatting/convertSmilies.php b/tests/phpunit/tests/formatting/convertSmilies.php index c31386c3decb5..24c2a8087a93f 100644 --- a/tests/phpunit/tests/formatting/convertSmilies.php +++ b/tests/phpunit/tests/formatting/convertSmilies.php @@ -8,6 +8,12 @@ */ class Tests_Formatting_ConvertSmilies extends WP_UnitTestCase { + public function set_up() { + parent::set_up(); + + smilies_init(); + } + /** * Basic validation test to confirm that smilies are converted to image * when use_smilies = 1 and not when use_smilies = 0. @@ -15,14 +21,9 @@ class Tests_Formatting_ConvertSmilies extends WP_UnitTestCase { * @dataProvider data_convert_standard_smilies */ public function test_convert_standard_smilies( $input, $converted ) { - // Standard smilies, use_smilies: ON. - update_option( 'use_smilies', 1 ); - - smilies_init(); - $this->assertSame( $converted, convert_smilies( $input ) ); - // Standard smilies, use_smilies: OFF. + // Disable smilies. update_option( 'use_smilies', 0 ); $this->assertSame( $input, convert_smilies( $input ) ); @@ -77,13 +78,6 @@ public function data_convert_standard_smilies() { public function test_convert_custom_smilies( $input, $converted ) { global $wpsmiliestrans; - // Custom smilies, use_smilies: ON. - update_option( 'use_smilies', 1 ); - - if ( ! isset( $wpsmiliestrans ) ) { - smilies_init(); - } - $trans_orig = $wpsmiliestrans; // Save original translations array. $wpsmiliestrans = array( @@ -97,12 +91,12 @@ public function test_convert_custom_smilies( $input, $converted ) { $this->assertSame( $converted, convert_smilies( $input ) ); - // Standard smilies, use_smilies: OFF. + // Disable smilies. update_option( 'use_smilies', 0 ); - $this->assertSame( $input, convert_smilies( $input ) ); - $wpsmiliestrans = $trans_orig; // Reset original translations array. + + $this->assertSame( $input, convert_smilies( $input ) ); } /** @@ -147,14 +141,7 @@ public function test_ignore_smilies_in_tags( $element ) { $input = 'Do we ignore smilies ;-) in ' . $element . ' tags <' . $element . ' class="foo">My Content Here :?: '; $expected = "Do we ignore smilies \xf0\x9f\x98\x89 in $element tags <$element class=\"foo\">My Content Here :?: "; - // Standard smilies, use_smilies: ON. - update_option( 'use_smilies', 1 ); - smilies_init(); - $this->assertSame( $expected, convert_smilies( $input ) ); - - // Standard smilies, use_smilies: OFF. - update_option( 'use_smilies', 0 ); } /** @@ -184,13 +171,9 @@ public function data_ignore_smilies_in_tags() { * @dataProvider data_smilies_combinations */ public function test_smilies_combinations( $input, $converted ) { - // Custom smilies, use_smilies: ON. - update_option( 'use_smilies', 1 ); - smilies_init(); - $this->assertSame( $converted, convert_smilies( $input ) ); - // Custom smilies, use_smilies: OFF. + // Disable smilies. update_option( 'use_smilies', 0 ); $this->assertSame( $input, convert_smilies( $input ) ); @@ -247,13 +230,6 @@ public function data_smilies_combinations() { public function test_single_smilies_in_wpsmiliestrans( $input, $converted ) { global $wpsmiliestrans; - // Standard smilies, use_smilies: ON. - update_option( 'use_smilies', 1 ); - - if ( ! isset( $wpsmiliestrans ) ) { - smilies_init(); - } - $orig_trans = $wpsmiliestrans; // Save original translations array. $wpsmiliestrans = array( @@ -264,12 +240,12 @@ public function test_single_smilies_in_wpsmiliestrans( $input, $converted ) { $this->assertSame( $converted, convert_smilies( $input ) ); - // Standard smilies, use_smilies: OFF. + // Disable smilies. update_option( 'use_smilies', 0 ); - $this->assertSame( $input, convert_smilies( $input ) ); - $wpsmiliestrans = $orig_trans; // Reset original translations array. + + $this->assertSame( $input, convert_smilies( $input ) ); } /** @@ -312,15 +288,7 @@ public function data_single_smilies_in_wpsmiliestrans() { * @dataProvider data_spaces_around_smilies */ public function test_spaces_around_smilies( $input, $converted ) { - // Standard smilies, use_smilies: ON. - update_option( 'use_smilies', 1 ); - - smilies_init(); - $this->assertSame( $converted, convert_smilies( $input ) ); - - // Standard smilies, use_smilies: OFF. - update_option( 'use_smilies', 0 ); } /** From 0530261e7d93ca8cdbfab1e6eb3d6c474af51c56 Mon Sep 17 00:00:00 2001 From: Felix Arntz Date: Mon, 16 Dec 2024 14:06:05 +0000 Subject: [PATCH 021/117] Site Health: Remove use of deprecated function from `wp_is_https_supported()`. Follow up to [56664]. Props peter8nss, debarghyabanerjee, sebastienserre, geekofshire, swissspidy, desrosj. Fixes #62252. See #58494. git-svn-id: https://develop.svn.wordpress.org/trunk@59517 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/https-detection.php | 22 ++++++++++--------- tests/phpunit/tests/https-detection.php | 29 ++++++++++++++++++++----- 2 files changed, 35 insertions(+), 16 deletions(-) diff --git a/src/wp-includes/https-detection.php b/src/wp-includes/https-detection.php index f34d6a3a11082..87fd4ad626dab 100644 --- a/src/wp-includes/https-detection.php +++ b/src/wp-includes/https-detection.php @@ -63,31 +63,33 @@ function wp_is_site_url_using_https() { /** * Checks whether HTTPS is supported for the server and domain. * + * This function makes an HTTP request through `wp_get_https_detection_errors()` + * to check for HTTPS support. As this process can be resource-intensive, + * it should be used cautiously, especially in performance-sensitive environments, + * to avoid potential latency issues. + * * @since 5.7.0 * * @return bool True if HTTPS is supported, false otherwise. */ function wp_is_https_supported() { - $https_detection_errors = get_option( 'https_detection_errors' ); - - // If option has never been set by the Cron hook before, run it on-the-fly as fallback. - if ( false === $https_detection_errors ) { - wp_update_https_detection_errors(); + $https_detection_errors = wp_get_https_detection_errors(); - $https_detection_errors = get_option( 'https_detection_errors' ); - } - - // If there are no detection errors, HTTPS is supported. + // If there are errors, HTTPS is not supported. return empty( $https_detection_errors ); } /** * Runs a remote HTTPS request to detect whether HTTPS supported, and stores potential errors. * - * This internal function is called by a regular Cron hook to ensure HTTPS support is detected and maintained. + * This function checks for HTTPS support by making an HTTP request. As this process can be resource-intensive, + * it should be used cautiously, especially in performance-sensitive environments. + * It is called when HTTPS support needs to be validated. * * @since 6.4.0 * @access private + * + * @return array An array containing potential detection errors related to HTTPS, or an empty array if no errors are found. */ function wp_get_https_detection_errors() { /** diff --git a/tests/phpunit/tests/https-detection.php b/tests/phpunit/tests/https-detection.php index da2fdc2d8a7d2..a425878ab114f 100644 --- a/tests/phpunit/tests/https-detection.php +++ b/tests/phpunit/tests/https-detection.php @@ -41,17 +41,34 @@ public function test_wp_is_using_https() { * @ticket 47577 */ public function test_wp_is_https_supported() { - // The function works with cached errors, so only test that here. - $wp_error = new WP_Error(); + // Simulate that HTTPS is supported by returning an empty error array. + add_filter( + 'pre_wp_get_https_detection_errors', + function () { + return new WP_Error(); // No errors means HTTPS is supported. + } + ); // No errors, so HTTPS is supported. - update_option( 'https_detection_errors', $wp_error->errors ); $this->assertTrue( wp_is_https_supported() ); - // Errors, so HTTPS is not supported. - $wp_error->add( 'ssl_verification_failed', 'SSL verification failed.' ); - update_option( 'https_detection_errors', $wp_error->errors ); + // Now we simulate that HTTPS is not supported by returning errors. + $support_errors = new WP_Error(); + $support_errors->add( 'ssl_verification_failed', 'SSL verification failed.' ); + + // Short-circuit the detection logic to return our simulated errors. + add_filter( + 'pre_wp_get_https_detection_errors', + function () use ( $support_errors ) { + return $support_errors; + } + ); + + // Test that HTTPS is not supported due to the simulated errors. $this->assertFalse( wp_is_https_supported() ); + + // Remove the filter to avoid affecting other tests. + remove_filter( 'pre_wp_get_https_detection_errors', '__return_null' ); } /** From b670db9b44f4cf48383425180afd23bcd8be12fa Mon Sep 17 00:00:00 2001 From: Jonathan Desrosiers Date: Mon, 16 Dec 2024 19:27:59 +0000 Subject: [PATCH 022/117] Build/Test Tools: Update `slackapi/slack-github-action`. This makes the necessary changes to update the Slack GitHub Action to the latest version, currently `2.0.0`. Most notably this update provides more control over how attempts re retried when rate limiting is encountered. Reverts [59209]. See #61701, #62221. git-svn-id: https://develop.svn.wordpress.org/trunk@59519 602fd350-edb4-49c9-b593-d223f7449a82 --- .github/workflows/slack-notifications.yml | 36 ++++++++++------------- 1 file changed, 16 insertions(+), 20 deletions(-) diff --git a/.github/workflows/slack-notifications.yml b/.github/workflows/slack-notifications.yml index 2f125aef7a0f4..cbd1e94427ba8 100644 --- a/.github/workflows/slack-notifications.yml +++ b/.github/workflows/slack-notifications.yml @@ -161,66 +161,62 @@ jobs: failure: name: Failure notifications runs-on: ubuntu-latest - continue-on-error: true - timeout-minutes: 5 + timeout-minutes: 10 needs: [ prepare ] if: ${{ needs.prepare.outputs.previous_conclusion != 'first-failure' && inputs.calling_status == 'failure' || failure() }} steps: - name: Post failure notifications to Slack - uses: slackapi/slack-github-action@37ebaef184d7626c5f204ab8d3baff4262dd30f0 # v1.27.0 + uses: slackapi/slack-github-action@485a9d42d3a73031f12ec201c457e2162c45d02d # v2.0.0 with: + webhook-type: webhook-trigger + webhook: ${{ secrets.SLACK_GHA_FAILURE_WEBHOOK }} payload: ${{ needs.prepare.outputs.payload }} - env: - SLACK_WEBHOOK_URL: ${{ secrets.SLACK_GHA_FAILURE_WEBHOOK }} # Posts notifications the first time a workflow run succeeds after previously failing. fixed: name: Fixed notifications runs-on: ubuntu-latest - continue-on-error: true - timeout-minutes: 5 + timeout-minutes: 10 needs: [ prepare ] if: ${{ contains( fromJson( '["failure", "cancelled", "none"]' ), needs.prepare.outputs.previous_conclusion ) && inputs.calling_status == 'success' && success() }} steps: - name: Post failure notifications to Slack - uses: slackapi/slack-github-action@37ebaef184d7626c5f204ab8d3baff4262dd30f0 # v1.27.0 + uses: slackapi/slack-github-action@485a9d42d3a73031f12ec201c457e2162c45d02d # v2.0.0 with: + webhook-type: webhook-trigger + webhook: ${{ secrets.SLACK_GHA_FIXED_WEBHOOK }} payload: ${{ needs.prepare.outputs.payload }} - env: - SLACK_WEBHOOK_URL: ${{ secrets.SLACK_GHA_FIXED_WEBHOOK }} # Posts notifications when a workflow is successful. success: name: Success notifications runs-on: ubuntu-latest - continue-on-error: true - timeout-minutes: 5 + timeout-minutes: 10 needs: [ prepare ] if: ${{ inputs.calling_status == 'success' && success() }} steps: - name: Post success notifications to Slack - uses: slackapi/slack-github-action@37ebaef184d7626c5f204ab8d3baff4262dd30f0 # v1.27.0 + uses: slackapi/slack-github-action@485a9d42d3a73031f12ec201c457e2162c45d02d # v2.0.0 with: + webhook-type: webhook-trigger + webhook: ${{ secrets.SLACK_GHA_SUCCESS_WEBHOOK }} payload: ${{ needs.prepare.outputs.payload }} - env: - SLACK_WEBHOOK_URL: ${{ secrets.SLACK_GHA_SUCCESS_WEBHOOK }} # Posts notifications when a workflow is cancelled. cancelled: name: Cancelled notifications runs-on: ubuntu-latest - continue-on-error: true - timeout-minutes: 5 + timeout-minutes: 10 needs: [ prepare ] if: ${{ inputs.calling_status == 'cancelled' || cancelled() }} steps: - name: Post cancelled notifications to Slack - uses: slackapi/slack-github-action@37ebaef184d7626c5f204ab8d3baff4262dd30f0 # v1.27.0 + uses: slackapi/slack-github-action@485a9d42d3a73031f12ec201c457e2162c45d02d # v2.0.0 with: + webhook-type: webhook-trigger + webhook: ${{ secrets.SLACK_GHA_CANCELLED_WEBHOOK }} payload: ${{ needs.prepare.outputs.payload }} - env: - SLACK_WEBHOOK_URL: ${{ secrets.SLACK_GHA_CANCELLED_WEBHOOK }} From 716e9300d6793e63c3a824b327b0ce1a6dd4a271 Mon Sep 17 00:00:00 2001 From: Jonathan Desrosiers Date: Mon, 16 Dec 2024 19:38:03 +0000 Subject: [PATCH 023/117] Build/Test Tools: Support manual runs for the test old branch workflow. This is the only workflow that does not currently support manually running. See #62221. git-svn-id: https://develop.svn.wordpress.org/trunk@59520 602fd350-edb4-49c9-b593-d223f7449a82 --- .github/workflows/test-old-branches.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/test-old-branches.yml b/.github/workflows/test-old-branches.yml index be554bdc149dc..649b7190955fc 100644 --- a/.github/workflows/test-old-branches.yml +++ b/.github/workflows/test-old-branches.yml @@ -12,6 +12,7 @@ on: schedule: - cron: '0 0 1 * *' - cron: '0 0 15 * *' + workflow_dispatch: # Disable permissions for all available scopes by default. # Any needed permissions should be configured at the job level. From 8eaaf53f61de9bb7612fdf03d68ef6689aaca0e2 Mon Sep 17 00:00:00 2001 From: Jonathan Desrosiers Date: Mon, 16 Dec 2024 20:04:52 +0000 Subject: [PATCH 024/117] Build/Test Tools: Update the Codecov GitHub Action. This updates the `codecov/codecov-action` to from version `4.6.0` to `5.1.1`. See #62221. git-svn-id: https://develop.svn.wordpress.org/trunk@59521 602fd350-edb4-49c9-b593-d223f7449a82 --- .github/workflows/reusable-phpunit-tests-v3.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/reusable-phpunit-tests-v3.yml b/.github/workflows/reusable-phpunit-tests-v3.yml index 4310be48e0d33..03ec815460f55 100644 --- a/.github/workflows/reusable-phpunit-tests-v3.yml +++ b/.github/workflows/reusable-phpunit-tests-v3.yml @@ -207,7 +207,7 @@ jobs: - name: Upload test coverage report to Codecov if: ${{ inputs.coverage-report }} - uses: codecov/codecov-action@b9fd7d16f6d7d1b5d2bec1a2887e65ceed900238 # v4.6.0 + uses: codecov/codecov-action@7f8b4b4bde536c465e797be725718b88c5d95e0e # v5.1.1 with: token: ${{ secrets.CODECOV_TOKEN }} file: wp-code-coverage${{ inputs.multisite && '-multisite' || '-single' }}-${{ github.sha }}.xml From f6fb194a0755d82037247916305b51ae70b995d0 Mon Sep 17 00:00:00 2001 From: Sergey Biryukov Date: Mon, 16 Dec 2024 23:49:11 +0000 Subject: [PATCH 025/117] Editor: Check `get_user_count()` instead of `get_users()` for the locked post notice. This aims to avoid slowing down the post editing by using a cached value instead of calling `get_users()`, which can be slow when plugins add various filters to all `get_users()` calls, especially with meta value comparisons on large `user_meta` tables. Follow-up to [24304], [24543], [41829], [53011], [53018]. Props berislav.grgicak, bor0, costdev. See #55958. git-svn-id: https://develop.svn.wordpress.org/trunk@59522 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-admin/edit-form-advanced.php | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/src/wp-admin/edit-form-advanced.php b/src/wp-admin/edit-form-advanced.php index b21b50f4ae4df..319a534fd2791 100644 --- a/src/wp-admin/edit-form-advanced.php +++ b/src/wp-admin/edit-form-advanced.php @@ -25,14 +25,7 @@ if ( is_multisite() ) { add_action( 'admin_footer', '_admin_notice_post_locked' ); } else { - $check_users = get_users( - array( - 'fields' => 'ID', - 'number' => 2, - ) - ); - - if ( count( $check_users ) > 1 ) { + if ( get_user_count() > 1 ) { add_action( 'admin_footer', '_admin_notice_post_locked' ); } From dab286ee785c0c229f0ad7925d15f01fe5bcf6e0 Mon Sep 17 00:00:00 2001 From: bernhard-reiter Date: Tue, 17 Dec 2024 10:35:17 +0000 Subject: [PATCH 026/117] Block Hooks: Enable for post content. Block Hooks were previously only applied to layout elements such as templates, template parts, patterns, and navigation menus -- things that are edited in the Site Editor. This changeset enables Block Hooks in post content. The parity between frontend and editor is preserved: Blocks inserted by Block Hooks are visible both on the frontend and in the editor, and any customizations made by the user are respected on the frontend. This is possible thanks to setting the `metadata.ignoredHookedBlocks` attribute on anchor blocks (a technique first introduced in [57594]). For first child and last child insertion into a Post Content block, the corresponding post object's `_wp_ignored_hooked_blocks` post meta is set. Props bernhard-reiter, gziolo, jonsurrell, karolmanijak, leewillis77. Fixes #61074. git-svn-id: https://develop.svn.wordpress.org/trunk@59523 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/blocks.php | 86 +++++++++++++------ src/wp-includes/default-filters.php | 7 +- .../tests/blocks/applyBlockHooksToContent.php | 20 +++++ 3 files changed, 88 insertions(+), 25 deletions(-) diff --git a/src/wp-includes/blocks.php b/src/wp-includes/blocks.php index 94c4dfa43afb6..6a4ab4636c803 100644 --- a/src/wp-includes/blocks.php +++ b/src/wp-includes/blocks.php @@ -912,7 +912,7 @@ function insert_hooked_blocks( &$parsed_anchor_block, $relative_position, $hooke * @param string $relative_position The relative position of the hooked blocks. * Can be one of 'before', 'after', 'first_child', or 'last_child'. * @param string $anchor_block_type The anchor block type. - * @param WP_Block_Template|WP_Post|array $context The block template, template part, `wp_navigation` post type, + * @param WP_Block_Template|WP_Post|array $context The block template, template part, post object, * or pattern that the anchor block belongs to. */ $hooked_block_types = apply_filters( 'hooked_block_types', $hooked_block_types, $relative_position, $anchor_block_type, $context ); @@ -935,7 +935,7 @@ function insert_hooked_blocks( &$parsed_anchor_block, $relative_position, $hooke * @param string $hooked_block_type The hooked block type name. * @param string $relative_position The relative position of the hooked block. * @param array $parsed_anchor_block The anchor block, in parsed block array format. - * @param WP_Block_Template|WP_Post|array $context The block template, template part, `wp_navigation` post type, + * @param WP_Block_Template|WP_Post|array $context The block template, template part, post object, * or pattern that the anchor block belongs to. */ $parsed_hooked_block = apply_filters( 'hooked_block', $parsed_hooked_block, $hooked_block_type, $relative_position, $parsed_anchor_block, $context ); @@ -951,7 +951,7 @@ function insert_hooked_blocks( &$parsed_anchor_block, $relative_position, $hooke * @param string $hooked_block_type The hooked block type name. * @param string $relative_position The relative position of the hooked block. * @param array $parsed_anchor_block The anchor block, in parsed block array format. - * @param WP_Block_Template|WP_Post|array $context The block template, template part, `wp_navigation` post type, + * @param WP_Block_Template|WP_Post|array $context The block template, template part, post object, * or pattern that the anchor block belongs to. */ $parsed_hooked_block = apply_filters( "hooked_block_{$hooked_block_type}", $parsed_hooked_block, $hooked_block_type, $relative_position, $parsed_anchor_block, $context ); @@ -1039,17 +1039,25 @@ function set_ignored_hooked_blocks_metadata( &$parsed_anchor_block, $relative_po * * @since 6.6.0 * @since 6.7.0 Injects the `theme` attribute into Template Part blocks, even if no hooked blocks are registered. + * @since 6.8.0 Have the `$context` parameter default to `null`, in which case `get_post()` will be called to use the current post as context. * @access private * - * @param string $content Serialized content. - * @param WP_Block_Template|WP_Post|array $context A block template, template part, `wp_navigation` post object, - * or pattern that the blocks belong to. - * @param callable $callback A function that will be called for each block to generate - * the markup for a given list of blocks that are hooked to it. - * Default: 'insert_hooked_blocks'. + * @param string $content Serialized content. + * @param WP_Block_Template|WP_Post|array|null $context A block template, template part, post object, or pattern + * that the blocks belong to. If set to `null`, `get_post()` + * will be called to use the current post as context. + * Default: `null`. + * @param callable $callback A function that will be called for each block to generate + * the markup for a given list of blocks that are hooked to it. + * Default: 'insert_hooked_blocks'. * @return string The serialized markup. */ -function apply_block_hooks_to_content( $content, $context, $callback = 'insert_hooked_blocks' ) { +function apply_block_hooks_to_content( $content, $context = null, $callback = 'insert_hooked_blocks' ) { + // Default to the current post if no context is provided. + if ( null === $context ) { + $context = get_post(); + } + $hooked_blocks = get_hooked_blocks(); $before_block_visitor = '_inject_theme_attribute_in_template_part_block'; @@ -1165,10 +1173,11 @@ function extract_serialized_parent_block( $serialized_block ) { } /** - * Updates the wp_postmeta with the list of ignored hooked blocks where the inner blocks are stored as post content. - * Currently only supports `wp_navigation` post types. + * Updates the wp_postmeta with the list of ignored hooked blocks + * where the inner blocks are stored as post content. * * @since 6.6.0 + * @since 6.8.0 Support non-`wp_navigation` post types. * @access private * * @param stdClass $post Post object. @@ -1176,7 +1185,7 @@ function extract_serialized_parent_block( $serialized_block ) { */ function update_ignored_hooked_blocks_postmeta( $post ) { /* - * In this scenario the user has likely tried to create a navigation via the REST API. + * In this scenario the user has likely tried to create a new post object via the REST API. * In which case we won't have a post ID to work with and store meta against. */ if ( empty( $post->ID ) ) { @@ -1184,7 +1193,7 @@ function update_ignored_hooked_blocks_postmeta( $post ) { } /* - * Skip meta generation when consumers intentionally update specific Navigation fields + * Skip meta generation when consumers intentionally update specific fields * and omit the content update. */ if ( ! isset( $post->post_content ) ) { @@ -1192,9 +1201,9 @@ function update_ignored_hooked_blocks_postmeta( $post ) { } /* - * Skip meta generation when the post content is not a navigation block. + * Skip meta generation if post type is not set. */ - if ( ! isset( $post->post_type ) || 'wp_navigation' !== $post->post_type ) { + if ( ! isset( $post->post_type ) ) { return $post; } @@ -1208,8 +1217,14 @@ function update_ignored_hooked_blocks_postmeta( $post ) { ); } + if ( 'wp_navigation' === $post->post_type ) { + $wrapper_block_type = 'core/navigation'; + } else { + $wrapper_block_type = 'core/post-content'; + } + $markup = get_comment_delimited_block_content( - 'core/navigation', + $wrapper_block_type, $attributes, $post->post_content ); @@ -1266,16 +1281,17 @@ function insert_hooked_blocks_and_set_ignored_hooked_blocks_metadata( &$parsed_a } /** - * Hooks into the REST API response for the core/navigation block and adds the first and last inner blocks. + * Hooks into the REST API response for the Posts endpoint and adds the first and last inner blocks. * * @since 6.6.0 + * @since 6.8.0 Support non-`wp_navigation` post types. * * @param WP_REST_Response $response The response object. * @param WP_Post $post Post object. * @return WP_REST_Response The response object. */ function insert_hooked_blocks_into_rest_response( $response, $post ) { - if ( ! isset( $response->data['content']['raw'] ) || ! isset( $response->data['content']['rendered'] ) ) { + if ( empty( $response->data['content']['raw'] ) || empty( $response->data['content']['rendered'] ) ) { return $response; } @@ -1287,22 +1303,44 @@ function insert_hooked_blocks_into_rest_response( $response, $post ) { 'ignoredHookedBlocks' => $ignored_hooked_blocks, ); } + + if ( 'wp_navigation' === $post->post_type ) { + $wrapper_block_type = 'core/navigation'; + } else { + $wrapper_block_type = 'core/post-content'; + } + $content = get_comment_delimited_block_content( - 'core/navigation', + $wrapper_block_type, $attributes, $response->data['content']['raw'] ); - $content = apply_block_hooks_to_content( $content, $post ); + $content = apply_block_hooks_to_content( + $content, + $post, + 'insert_hooked_blocks_and_set_ignored_hooked_blocks_metadata' + ); - // Remove mock Navigation block wrapper. + // Remove mock block wrapper. $content = remove_serialized_parent_block( $content ); $response->data['content']['raw'] = $content; + // `apply_block_hooks_to_content` is called above. Ensure it is not called again as a filter. + $priority = has_filter( 'the_content', 'apply_block_hooks_to_content' ); + if ( false !== $priority ) { + remove_filter( 'the_content', 'apply_block_hooks_to_content', $priority ); + } + /** This filter is documented in wp-includes/post-template.php */ $response->data['content']['rendered'] = apply_filters( 'the_content', $content ); + // Restore the filter if it was set initially. + if ( false !== $priority ) { + add_filter( 'the_content', 'apply_block_hooks_to_content', $priority ); + } + return $response; } @@ -1320,7 +1358,7 @@ function insert_hooked_blocks_into_rest_response( $response, $post ) { * @access private * * @param array $hooked_blocks An array of blocks hooked to another given block. - * @param WP_Block_Template|WP_Post|array $context A block template, template part, `wp_navigation` post object, + * @param WP_Block_Template|WP_Post|array $context A block template, template part, post object, * or pattern that the blocks belong to. * @param callable $callback A function that will be called for each block to generate * the markup for a given list of blocks that are hooked to it. @@ -1377,7 +1415,7 @@ function make_before_block_visitor( $hooked_blocks, $context, $callback = 'inser * @access private * * @param array $hooked_blocks An array of blocks hooked to another block. - * @param WP_Block_Template|WP_Post|array $context A block template, template part, `wp_navigation` post object, + * @param WP_Block_Template|WP_Post|array $context A block template, template part, post object, * or pattern that the blocks belong to. * @param callable $callback A function that will be called for each block to generate * the markup for a given list of blocks that are hooked to it. diff --git a/src/wp-includes/default-filters.php b/src/wp-includes/default-filters.php index ae654605e8f4b..18ef8517edce2 100644 --- a/src/wp-includes/default-filters.php +++ b/src/wp-includes/default-filters.php @@ -192,6 +192,7 @@ add_filter( 'the_title', 'convert_chars' ); add_filter( 'the_title', 'trim' ); +add_filter( 'the_content', 'apply_block_hooks_to_content', 8 ); // BEFORE do_blocks(). add_filter( 'the_content', 'do_blocks', 9 ); add_filter( 'the_content', 'wptexturize' ); add_filter( 'the_content', 'convert_smilies', 20 ); @@ -760,9 +761,13 @@ add_filter( 'rest_pre_insert_wp_template_part', 'inject_ignored_hooked_blocks_metadata_attributes' ); // Update ignoredHookedBlocks postmeta for wp_navigation post type. +add_filter( 'rest_pre_insert_page', 'update_ignored_hooked_blocks_postmeta' ); +add_filter( 'rest_pre_insert_post', 'update_ignored_hooked_blocks_postmeta' ); add_filter( 'rest_pre_insert_wp_navigation', 'update_ignored_hooked_blocks_postmeta' ); -// Inject hooked blocks into the wp_navigation post type REST response. +// Inject hooked blocks into the Posts endpoint REST response for some given post types. +add_filter( 'rest_prepare_page', 'insert_hooked_blocks_into_rest_response', 10, 2 ); +add_filter( 'rest_prepare_post', 'insert_hooked_blocks_into_rest_response', 10, 2 ); add_filter( 'rest_prepare_wp_navigation', 'insert_hooked_blocks_into_rest_response', 10, 2 ); unset( $filter, $action ); diff --git a/tests/phpunit/tests/blocks/applyBlockHooksToContent.php b/tests/phpunit/tests/blocks/applyBlockHooksToContent.php index f238ef6ff5266..22e3c6e8dffb5 100644 --- a/tests/phpunit/tests/blocks/applyBlockHooksToContent.php +++ b/tests/phpunit/tests/blocks/applyBlockHooksToContent.php @@ -91,6 +91,26 @@ public function test_apply_block_hooks_to_content_inserts_hooked_block() { ); } + /** + * @ticket 61074 + */ + public function test_apply_block_hooks_to_content_with_context_set_to_null() { + $content = ''; + + /* + * apply_block_hooks_to_content() will fall back to the global $post object (via get_post()) + * if the $context parameter is null. However, we'd also like to ensure that the function + * works as expected even when get_post() returns null. + */ + $this->assertNull( get_post() ); + + $actual = apply_block_hooks_to_content( $content, null, 'insert_hooked_blocks' ); + $this->assertSame( + '', + $actual + ); + } + /** * @ticket 61902 */ From 8b4425ad9c3e805a603cf60429c3dba88c7ff0ef Mon Sep 17 00:00:00 2001 From: Pascal Birchler Date: Tue, 17 Dec 2024 12:09:55 +0000 Subject: [PATCH 027/117] Build/Test Tools: Add Twenty Twenty-Five to the Performance Tests. Updates the baseline used for the performance tests to 6.7, so that the theme is available in those test runs. Props joemcgill, flixos90, desrosj, swissspidy. Fixes #62148. git-svn-id: https://develop.svn.wordpress.org/trunk@59524 602fd350-edb4-49c9-b593-d223f7449a82 --- .github/workflows/reusable-performance.yml | 2 +- tests/performance/specs/home.test.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/reusable-performance.yml b/.github/workflows/reusable-performance.yml index 0ca7d5be0a30a..ec8e49b0394d3 100644 --- a/.github/workflows/reusable-performance.yml +++ b/.github/workflows/reusable-performance.yml @@ -15,7 +15,7 @@ on: description: 'The version being used for baseline measurements.' required: false type: 'string' - default: '6.1.1' + default: '6.7' php-version: description: 'The PHP version to use.' required: false diff --git a/tests/performance/specs/home.test.js b/tests/performance/specs/home.test.js index b88b6adb9f362..004c8f03debd4 100644 --- a/tests/performance/specs/home.test.js +++ b/tests/performance/specs/home.test.js @@ -14,7 +14,7 @@ const results = { lcpMinusTtfb: [], }; -const themes = [ 'twentytwentyone', 'twentytwentythree', 'twentytwentyfour' ]; +const themes = [ 'twentytwentyone', 'twentytwentythree', 'twentytwentyfour', 'twentytwentyfive' ]; const locales = [ 'en_US', 'de_DE' ]; From e58bef6fdc10bbbbba02e58a34dbca022e956543 Mon Sep 17 00:00:00 2001 From: Pascal Birchler Date: Tue, 17 Dec 2024 12:45:50 +0000 Subject: [PATCH 028/117] Build/Test Tools: Use correct tag name for the baseline version. The tagged version on GitHub requires the trailing `.0`. See #62148. git-svn-id: https://develop.svn.wordpress.org/trunk@59525 602fd350-edb4-49c9-b593-d223f7449a82 --- .github/workflows/reusable-performance.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/reusable-performance.yml b/.github/workflows/reusable-performance.yml index ec8e49b0394d3..deb156897f066 100644 --- a/.github/workflows/reusable-performance.yml +++ b/.github/workflows/reusable-performance.yml @@ -15,7 +15,7 @@ on: description: 'The version being used for baseline measurements.' required: false type: 'string' - default: '6.7' + default: '6.7.0' php-version: description: 'The PHP version to use.' required: false From 20c0327117378f37f96eb59a1d22e1bee86492d4 Mon Sep 17 00:00:00 2001 From: Pascal Birchler Date: Tue, 17 Dec 2024 13:26:04 +0000 Subject: [PATCH 029/117] Build/Test Tools: Fix version number when downgrading WP in performance tests. The tagged version on GitHub requires the trailing `.0`, but `wp core update` doesn't accept a trailing zero. Follow-up to [59525]. See #62148. git-svn-id: https://develop.svn.wordpress.org/trunk@59526 602fd350-edb4-49c9-b593-d223f7449a82 --- .github/workflows/reusable-performance.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.github/workflows/reusable-performance.yml b/.github/workflows/reusable-performance.yml index deb156897f066..e5c29aa0b1849 100644 --- a/.github/workflows/reusable-performance.yml +++ b/.github/workflows/reusable-performance.yml @@ -263,7 +263,9 @@ jobs: - name: Set the environment to the baseline version if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/trunk' }} run: | - npm run env:cli -- core update --version=${{ env.BASE_TAG }} --force --path=/var/www/${{ env.LOCAL_DIR }} + VERSION="${{ env.BASE_TAG }}" + VERSION="${VERSION%.0}" + npm run env:cli -- core update --version=$VERSION --force --path=/var/www/${{ env.LOCAL_DIR }} npm run env:cli -- core version --path=/var/www/${{ env.LOCAL_DIR }} - name: Run any database upgrades From ffceac51dab7878c1401c2a1cc7737409fcff7a9 Mon Sep 17 00:00:00 2001 From: Jonathan Desrosiers Date: Tue, 17 Dec 2024 14:43:43 +0000 Subject: [PATCH 030/117] Build/Test Tools: Use MySQL 8.4 as the default. MySQL 8.4 is the latest LTS. See #62221. git-svn-id: https://develop.svn.wordpress.org/trunk@59527 602fd350-edb4-49c9-b593-d223f7449a82 --- .env.example | 2 +- .github/workflows/reusable-phpunit-tests-v3.yml | 2 +- .github/workflows/reusable-test-local-docker-environment-v1.yml | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/.env.example b/.env.example index 70cd4153b3757..55f78229c03af 100644 --- a/.env.example +++ b/.env.example @@ -51,7 +51,7 @@ LOCAL_DB_TYPE=mysql # When using `mysql`, see https://hub.docker.com/_/mysql for valid versions. # When using `mariadb`, see https://hub.docker.com/_/mariadb for valid versions. ## -LOCAL_DB_VERSION=8.0 +LOCAL_DB_VERSION=8.4 # Whether or not to enable multisite. LOCAL_MULTISITE=false diff --git a/.github/workflows/reusable-phpunit-tests-v3.yml b/.github/workflows/reusable-phpunit-tests-v3.yml index 03ec815460f55..a12dcdf17d58e 100644 --- a/.github/workflows/reusable-phpunit-tests-v3.yml +++ b/.github/workflows/reusable-phpunit-tests-v3.yml @@ -26,7 +26,7 @@ on: description: 'Database version' required: false type: 'string' - default: '8.0' + default: '8.4' multisite: description: 'Whether to run tests as multisite' required: false diff --git a/.github/workflows/reusable-test-local-docker-environment-v1.yml b/.github/workflows/reusable-test-local-docker-environment-v1.yml index 4dccd7ef3dccd..6e521de70dfa6 100644 --- a/.github/workflows/reusable-test-local-docker-environment-v1.yml +++ b/.github/workflows/reusable-test-local-docker-environment-v1.yml @@ -27,7 +27,7 @@ on: description: 'Database version' required: false type: 'string' - default: '8.0' + default: '8.4' memcached: description: 'Whether to enable memcached' required: false From 1458de74b6a887a1a9846cf6b85edfe0d9c6f8ee Mon Sep 17 00:00:00 2001 From: Jonathan Desrosiers Date: Tue, 17 Dec 2024 16:38:07 +0000 Subject: [PATCH 031/117] Build/Test Tools: Regularly run the `html-api-html5lib-tests`. In [58010], the external test suite from `html5lib` was imported to validate the tree-construction steps in the HTML Processor to ensure that they are behaving according to the HTML specification. The test group was excluded by default because there are a high number of skipped tests. The number of skipped tests has come down, but the group does not need to be run on every job. This introduces a new job in the PHPUnit workflow for regularly running these tests on their own using the changes in [59251[. Props desrosj, jonsurrell, jorbin, dmsnell, costdev, chaion07, engahmeds3ed. Fixes #61209. git-svn-id: https://develop.svn.wordpress.org/trunk@59528 602fd350-edb4-49c9-b593-d223f7449a82 --- .github/workflows/phpunit-tests.yml | 25 ++++++++++++++++++- .../workflows/reusable-phpunit-tests-v3.yml | 2 +- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/.github/workflows/phpunit-tests.yml b/.github/workflows/phpunit-tests.yml index 62a7aa50f7718..d5aa3fa3de5cd 100644 --- a/.github/workflows/phpunit-tests.yml +++ b/.github/workflows/phpunit-tests.yml @@ -154,13 +154,36 @@ jobs: phpunit-config: ${{ matrix.multisite && 'tests/phpunit/multisite.xml' || 'phpunit.xml.dist' }} report: ${{ matrix.report || false }} + # + # Runs specific individual test groups. + # + specific-test-groups: + name: ${{ matrix.phpunit-test-groups }} + uses: WordPress/wordpress-develop/.github/workflows/reusable-phpunit-tests-v3.yml@trunk + permissions: + contents: read + secrets: inherit + if: ${{ github.repository == 'WordPress/wordpress-develop' || github.event_name == 'pull_request' }} + strategy: + fail-fast: false + matrix: + php: [ '7.2', '7.4', '8.0', '8.4' ] + db-type: [ 'mysql' ] + db-version: [ '8.4' ] + phpunit-test-groups: [ 'html-api-html5lib-tests' ] + with: + php: ${{ matrix.php }} + db-type: ${{ matrix.db-type }} + db-version: ${{ matrix.db-version }} + phpunit-test-groups: ${{ matrix.phpunit-test-groups }} + slack-notifications: name: Slack Notifications uses: WordPress/wordpress-develop/.github/workflows/slack-notifications.yml@trunk permissions: actions: read contents: read - needs: [ test-with-mysql, test-with-mariadb ] + needs: [ test-with-mysql, test-with-mariadb, specific-test-groups ] if: ${{ github.repository == 'WordPress/wordpress-develop' && github.event_name != 'pull_request' && always() }} with: calling_status: ${{ contains( needs.*.result, 'cancelled' ) && 'cancelled' || contains( needs.*.result, 'failure' ) && 'failure' || 'success' }} diff --git a/.github/workflows/reusable-phpunit-tests-v3.yml b/.github/workflows/reusable-phpunit-tests-v3.yml index a12dcdf17d58e..cac3015af383a 100644 --- a/.github/workflows/reusable-phpunit-tests-v3.yml +++ b/.github/workflows/reusable-phpunit-tests-v3.yml @@ -105,7 +105,7 @@ jobs: # - Checks out the WordPress Test reporter repository. # - Submit the test results to the WordPress.org host test results. phpunit-tests: - name: PHP ${{ inputs.php }} ${{ ! inputs.coverage-report && '/ ' || 'with ' }}${{ 'mariadb' == inputs.db-type && 'MariaDB' || 'MySQL' }} ${{ inputs.db-version }}${{ inputs.multisite && ' multisite' || '' }}${{ inputs.phpunit-test-groups && format( ' ({0})', inputs.phpunit-test-groups ) || '' }}${{ inputs.memcached && ' with memcached' || '' }}${{ inputs.report && ' (test reporting enabled)' || '' }} ${{ 'example.org' != inputs.tests-domain && inputs.tests-domain || '' }} + name: ${{ inputs.phpunit-test-groups && format( '{0} / ', inputs.phpunit-test-groups ) || '' }}PHP ${{ inputs.php }} ${{ ! inputs.phpunit-test-groups && ! inputs.coverage-report && '/ ' || 'with ' }}${{ 'mariadb' == inputs.db-type && 'MariaDB' || 'MySQL' }} ${{ inputs.db-version }}${{ inputs.multisite && ' multisite' || '' }}${{ inputs.memcached && ' with memcached' || '' }}${{ inputs.report && ' (test reporting enabled)' || '' }} ${{ 'example.org' != inputs.tests-domain && inputs.tests-domain || '' }} runs-on: ${{ inputs.os }} timeout-minutes: ${{ inputs.coverage-report && 120 || 20 }} From f08e51f6b1dbcade2c580fcd5ff8eb50d594917c Mon Sep 17 00:00:00 2001 From: Jonathan Desrosiers Date: Tue, 17 Dec 2024 16:49:52 +0000 Subject: [PATCH 032/117] Build/Test Tools: Allow more control when testing older branches. This adds an input to the Test Old Branches workflow that allows a specific branch to be specified or `all` to run all old branches. The default behavior is to only test the currently supported version of WordPress as defined in the `CURRENTLY_SUPPORTED_BRANCH` environment variable. Follow up to [59520]. See #62221. git-svn-id: https://develop.svn.wordpress.org/trunk@59529 602fd350-edb4-49c9-b593-d223f7449a82 --- .github/workflows/test-old-branches.yml | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/.github/workflows/test-old-branches.yml b/.github/workflows/test-old-branches.yml index 649b7190955fc..85a7000bcfc8f 100644 --- a/.github/workflows/test-old-branches.yml +++ b/.github/workflows/test-old-branches.yml @@ -13,6 +13,12 @@ on: - cron: '0 0 1 * *' - cron: '0 0 15 * *' workflow_dispatch: + inputs: + strategy: + description: 'The branches to test. Accepts X.Y branch names, or "all". Defaults to only the currently supported branch.' + required: false + type: string + default: '' # Disable permissions for all available scopes by default. # Any needed permissions should be configured at the job level. @@ -112,7 +118,7 @@ jobs: steps: - name: Dispatch workflow run uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 - if: ${{ github.event_name == 'push' || github.event.schedule == '0 0 15 * *' || matrix.branch == env.CURRENTLY_SUPPORTED_BRANCH }} + if: ${{ github.event_name == 'push' || ( github.event_name == 'workflow_dispatch' && matrix.branch == inputs.strategy || inputs.strategy == 'all' ) || github.event.schedule == '0 0 15 * *' || matrix.branch == env.CURRENTLY_SUPPORTED_BRANCH }} with: retries: 2 retry-exempt-status-codes: 418 From 8ed4caec8d1a7c8de3944703b0b15724d09aec29 Mon Sep 17 00:00:00 2001 From: Jonathan Desrosiers Date: Tue, 17 Dec 2024 16:58:04 +0000 Subject: [PATCH 033/117] Build/Test Tools: Update Default Theme `devDependencies`. The `devDependencies` for all default themes with `package.json` files (Twenty Nineteen, Twenty Twenty, and Twenty Twenty-One) are now updated to their latest versions with a few exceptions in Twenty Twenty-One: - Upgrading `stylelint`/`@wordpress/stylelint-config` requires some work to address rule deprecations. - `@wordpress/eslint-plugin` does not yet support `eslint` 9.x. Additionally, `npm audit fix` has been run for each theme. See #62220. git-svn-id: https://develop.svn.wordpress.org/trunk@59530 602fd350-edb4-49c9-b593-d223f7449a82 --- .../themes/twentynineteen/package-lock.json | 488 +- .../themes/twentynineteen/package.json | 10 +- .../themes/twentytwenty/package-lock.json | 6438 +++++++++-------- .../themes/twentytwenty/package.json | 16 +- .../themes/twentytwentyone/package-lock.json | 1548 +++- .../themes/twentytwentyone/package.json | 24 +- 6 files changed, 4653 insertions(+), 3871 deletions(-) diff --git a/src/wp-content/themes/twentynineteen/package-lock.json b/src/wp-content/themes/twentynineteen/package-lock.json index 8afb314c8c707..c360a78221de8 100644 --- a/src/wp-content/themes/twentynineteen/package-lock.json +++ b/src/wp-content/themes/twentynineteen/package-lock.json @@ -8,15 +8,15 @@ "name": "twentynineteen", "version": "3.0.0", "devDependencies": { - "@wordpress/browserslist-config": "^6.1.0", - "autoprefixer": "^10.4.19", + "@wordpress/browserslist-config": "^6.14.0", + "autoprefixer": "^10.4.20", "chokidar-cli": "^3.0.0", "node-sass": "^9.0.0", "npm-run-all": "^4.1.5", - "postcss": "^8.4.38", + "postcss": "^8.4.49", "postcss-cli": "^11.0.0", - "postcss-focus-within": "^8.0.1", - "rtlcss": "^4.1.1" + "postcss-focus-within": "^9.0.1", + "rtlcss": "^4.3.0" }, "engines": { "node": ">=20.10.0", @@ -187,10 +187,11 @@ "dev": true }, "node_modules/@wordpress/browserslist-config": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@wordpress/browserslist-config/-/browserslist-config-6.1.0.tgz", - "integrity": "sha512-cf5iwPq6JetQjiaRwlvzW5eX0S3OphVmy1YTxHQdrVqp79rOGvamVftxqvmf3C/GSRaNyI4eZV+nNwNRN0DkrQ==", + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@wordpress/browserslist-config/-/browserslist-config-6.14.0.tgz", + "integrity": "sha512-a26hxY8R/A7FH/Z8oZsYS31ZC/Xy9QSBTi5w84MKSeYdWlck7t1QdCwUNF1u621wbuP7beiiu9FkYY4hI3Bk9A==", "dev": true, + "license": "GPL-2.0-or-later", "engines": { "node": ">=18.12.0", "npm": ">=8.19.2" @@ -313,9 +314,9 @@ } }, "node_modules/autoprefixer": { - "version": "10.4.19", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.19.tgz", - "integrity": "sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==", + "version": "10.4.20", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz", + "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==", "dev": true, "funding": [ { @@ -331,12 +332,13 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "browserslist": "^4.23.0", - "caniuse-lite": "^1.0.30001599", + "browserslist": "^4.23.3", + "caniuse-lite": "^1.0.30001646", "fraction.js": "^4.3.7", "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", + "picocolors": "^1.0.1", "postcss-value-parser": "^4.2.0" }, "bin": { @@ -387,9 +389,9 @@ } }, "node_modules/browserslist": { - "version": "4.23.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.1.tgz", - "integrity": "sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==", + "version": "4.24.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.3.tgz", + "integrity": "sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA==", "dev": true, "funding": [ { @@ -405,11 +407,12 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001629", - "electron-to-chromium": "^1.4.796", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.16" + "caniuse-lite": "^1.0.30001688", + "electron-to-chromium": "^1.5.73", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.1" }, "bin": { "browserslist": "cli.js" @@ -514,9 +517,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001636", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001636.tgz", - "integrity": "sha512-bMg2vmr8XBsbL6Lr0UHXy/21m84FTxDLWn2FSqMd5PrlbMxwJlQnC2YWYxVgp66PZE+BBNF2jYQUBKCo1FDeZg==", + "version": "1.0.30001688", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001688.tgz", + "integrity": "sha512-Nmqpru91cuABu/DTCXbM2NSRHzM2uVHfPnhJ/1zEAJx/ILBRVmz3pzH4N7DZqbdG0gWClsCC05Oj0mJ/1AWMbA==", "dev": true, "funding": [ { @@ -531,7 +534,8 @@ "type": "github", "url": "https://github.com/sponsors/ai" } - ] + ], + "license": "CC-BY-4.0" }, "node_modules/chalk": { "version": "2.4.2", @@ -592,66 +596,6 @@ "node": ">= 8.10.0" } }, - "node_modules/chokidar-cli/node_modules/anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/chokidar-cli/node_modules/chokidar": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", - "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", - "dev": true, - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chokidar-cli/node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/chokidar-cli/node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, "node_modules/chownr": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", @@ -738,10 +682,11 @@ "dev": true }, "node_modules/cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz", + "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==", "dev": true, + "license": "MIT", "dependencies": { "nice-try": "^1.0.4", "path-key": "^2.0.1", @@ -758,6 +703,7 @@ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", "dev": true, + "license": "MIT", "bin": { "cssesc": "bin/cssesc" }, @@ -853,10 +799,11 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.810", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.810.tgz", - "integrity": "sha512-Kaxhu4T7SJGpRQx99tq216gCq2nMxJo+uuT6uzz9l8TVN2stL7M06MIIXAtr9jsrLs2Glflgf2vMQRepxawOdQ==", - "dev": true + "version": "1.5.73", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.73.tgz", + "integrity": "sha512-8wGNxG9tAG5KhGd3eeA0o6ixhiNdgr0DcHWm85XPCphwZgD1lIEoi6t3VERayWao7SF7AAZTw6oARGJeVjH8Kg==", + "dev": true, + "license": "ISC" }, "node_modules/emoji-regex": { "version": "7.0.3", @@ -930,10 +877,11 @@ } }, "node_modules/escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -1390,11 +1338,19 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, - "node_modules/ip": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.1.tgz", - "integrity": "sha512-lJUL9imLTNi1ZfXT+DU6rBBdbiKGBuay9B6xGSPVjUeQwaH1RIGqef8RZkUtHioLmSNpPR5M4HVKJGm1j8FWVQ==", - "dev": true + "node_modules/ip-address": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", + "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", + "dev": true, + "license": "MIT", + "dependencies": { + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" + }, + "engines": { + "node": ">= 12" + } }, "node_modules/is-arrayish": { "version": "0.2.1", @@ -1546,6 +1502,13 @@ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true }, + "node_modules/jsbn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", + "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", + "dev": true, + "license": "MIT" + }, "node_modules/json-parse-better-errors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", @@ -1781,12 +1744,13 @@ } }, "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, + "license": "MIT", "dependencies": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" }, "engines": { @@ -1943,9 +1907,9 @@ "dev": true }, "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", "dev": true, "funding": [ { @@ -1953,6 +1917,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -2212,10 +2177,11 @@ } }, "node_modules/node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", - "dev": true + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "dev": true, + "license": "MIT" }, "node_modules/node-sass": { "version": "9.0.0", @@ -2296,10 +2262,11 @@ "dev": true }, "node_modules/node-sass/node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, + "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -2662,10 +2629,11 @@ } }, "node_modules/picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", - "dev": true + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" }, "node_modules/picomatch": { "version": "2.3.1", @@ -2701,9 +2669,9 @@ } }, "node_modules/postcss": { - "version": "8.4.38", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", - "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", + "version": "8.4.49", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", + "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", "dev": true, "funding": [ { @@ -2719,10 +2687,11 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { "nanoid": "^3.3.7", - "picocolors": "^1.0.0", - "source-map-js": "^1.2.0" + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" }, "engines": { "node": "^10 || ^12 || >=14" @@ -2891,9 +2860,9 @@ } }, "node_modules/postcss-focus-within": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-8.0.1.tgz", - "integrity": "sha512-NFU3xcY/xwNaapVb+1uJ4n23XImoC86JNwkY/uduytSl2s9Ekc2EpzmRR63+ExitnW3Mab3Fba/wRPCT5oDILA==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-9.0.1.tgz", + "integrity": "sha512-fzNUyS1yOYa7mOjpci/bR+u+ESvdar6hk8XNK/TRR0fiGTp2QT5N+ducP0n3rfH/m9I7H/EQU6lsa2BrgxkEjw==", "dev": true, "funding": [ { @@ -2905,11 +2874,12 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT-0", "dependencies": { - "postcss-selector-parser": "^6.0.13" + "postcss-selector-parser": "^7.0.0" }, "engines": { - "node": "^14 || ^16 || >=18" + "node": ">=18" }, "peerDependencies": { "postcss": "^8.4" @@ -2971,10 +2941,11 @@ } }, "node_modules/postcss-selector-parser": { - "version": "6.0.13", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", - "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", + "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", "dev": true, + "license": "MIT", "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -3255,10 +3226,11 @@ } }, "node_modules/rtlcss": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-4.1.1.tgz", - "integrity": "sha512-/oVHgBtnPNcggP2aVXQjSy6N1mMAfHg4GSag0QtZBlD5bdDgAHwr4pydqJGd+SUCu9260+Pjqbjwtvu7EMH1KQ==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-4.3.0.tgz", + "integrity": "sha512-FI+pHEn7Wc4NqKXMXFM+VAYKEj/mRIcW4h24YVwVtyjI+EqGrLc2Hx/Ny0lrZ21cBWU2goLy36eqMcNj3AQJig==", "dev": true, + "license": "MIT", "dependencies": { "escalade": "^3.1.1", "picocolors": "^1.0.0", @@ -3542,16 +3514,17 @@ } }, "node_modules/socks": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", - "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", + "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", "dev": true, + "license": "MIT", "dependencies": { - "ip": "^2.0.0", + "ip-address": "^9.0.5", "smart-buffer": "^4.2.0" }, "engines": { - "node": ">= 10.13.0", + "node": ">= 10.0.0", "npm": ">= 3.0.0" } }, @@ -3579,10 +3552,11 @@ } }, "node_modules/source-map-js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", - "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -3619,6 +3593,13 @@ "integrity": "sha512-7j8LYJLeY/Yb6ACbQ7F76qy5jHkp0U6jgBfJsk97bwWlVUnUWsAgpyaCvo17h0/RQGnQ036tVDomiwoI4pDkQA==", "dev": true }, + "node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "dev": true, + "license": "BSD-3-Clause" + }, "node_modules/ssri": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", @@ -3908,9 +3889,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz", - "integrity": "sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", + "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", "dev": true, "funding": [ { @@ -3926,9 +3907,10 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "escalade": "^3.1.2", - "picocolors": "^1.0.1" + "escalade": "^3.2.0", + "picocolors": "^1.1.0" }, "bin": { "update-browserslist-db": "cli.js" @@ -4202,9 +4184,9 @@ "dev": true }, "@wordpress/browserslist-config": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@wordpress/browserslist-config/-/browserslist-config-6.1.0.tgz", - "integrity": "sha512-cf5iwPq6JetQjiaRwlvzW5eX0S3OphVmy1YTxHQdrVqp79rOGvamVftxqvmf3C/GSRaNyI4eZV+nNwNRN0DkrQ==", + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@wordpress/browserslist-config/-/browserslist-config-6.14.0.tgz", + "integrity": "sha512-a26hxY8R/A7FH/Z8oZsYS31ZC/Xy9QSBTi5w84MKSeYdWlck7t1QdCwUNF1u621wbuP7beiiu9FkYY4hI3Bk9A==", "dev": true }, "abbrev": { @@ -4297,16 +4279,16 @@ "dev": true }, "autoprefixer": { - "version": "10.4.19", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.19.tgz", - "integrity": "sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==", + "version": "10.4.20", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz", + "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==", "dev": true, "requires": { - "browserslist": "^4.23.0", - "caniuse-lite": "^1.0.30001599", + "browserslist": "^4.23.3", + "caniuse-lite": "^1.0.30001646", "fraction.js": "^4.3.7", "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", + "picocolors": "^1.0.1", "postcss-value-parser": "^4.2.0" } }, @@ -4342,15 +4324,15 @@ } }, "browserslist": { - "version": "4.23.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.1.tgz", - "integrity": "sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==", + "version": "4.24.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.3.tgz", + "integrity": "sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001629", - "electron-to-chromium": "^1.4.796", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.16" + "caniuse-lite": "^1.0.30001688", + "electron-to-chromium": "^1.5.73", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.1" } }, "cacache": { @@ -4430,9 +4412,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001636", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001636.tgz", - "integrity": "sha512-bMg2vmr8XBsbL6Lr0UHXy/21m84FTxDLWn2FSqMd5PrlbMxwJlQnC2YWYxVgp66PZE+BBNF2jYQUBKCo1FDeZg==", + "version": "1.0.30001688", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001688.tgz", + "integrity": "sha512-Nmqpru91cuABu/DTCXbM2NSRHzM2uVHfPnhJ/1zEAJx/ILBRVmz3pzH4N7DZqbdG0gWClsCC05Oj0mJ/1AWMbA==", "dev": true }, "chalk": { @@ -4472,50 +4454,6 @@ "lodash.debounce": "^4.0.8", "lodash.throttle": "^4.1.1", "yargs": "^13.3.0" - }, - "dependencies": { - "anymatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", - "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, - "requires": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - } - }, - "chokidar": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.2.tgz", - "integrity": "sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ==", - "dev": true, - "requires": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "fsevents": "~2.3.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - } - }, - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, - "readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "requires": { - "picomatch": "^2.2.1" - } - } } }, "chownr": { @@ -4594,9 +4532,9 @@ "dev": true }, "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz", + "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==", "dev": true, "requires": { "nice-try": "^1.0.4", @@ -4673,9 +4611,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.4.810", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.810.tgz", - "integrity": "sha512-Kaxhu4T7SJGpRQx99tq216gCq2nMxJo+uuT6uzz9l8TVN2stL7M06MIIXAtr9jsrLs2Glflgf2vMQRepxawOdQ==", + "version": "1.5.73", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.73.tgz", + "integrity": "sha512-8wGNxG9tAG5KhGd3eeA0o6ixhiNdgr0DcHWm85XPCphwZgD1lIEoi6t3VERayWao7SF7AAZTw6oARGJeVjH8Kg==", "dev": true }, "emoji-regex": { @@ -4741,9 +4679,9 @@ } }, "escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true }, "escape-string-regexp": { @@ -5097,11 +5035,15 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, - "ip": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.1.tgz", - "integrity": "sha512-lJUL9imLTNi1ZfXT+DU6rBBdbiKGBuay9B6xGSPVjUeQwaH1RIGqef8RZkUtHioLmSNpPR5M4HVKJGm1j8FWVQ==", - "dev": true + "ip-address": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", + "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", + "dev": true, + "requires": { + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" + } }, "is-arrayish": { "version": "0.2.1", @@ -5220,6 +5162,12 @@ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true }, + "jsbn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", + "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", + "dev": true + }, "json-parse-better-errors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", @@ -5404,12 +5352,12 @@ "dev": true }, "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, "requires": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" } }, @@ -5525,9 +5473,9 @@ "dev": true }, "nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", "dev": true }, "negotiator": { @@ -5733,9 +5681,9 @@ } }, "node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", "dev": true }, "node-sass": { @@ -5795,9 +5743,9 @@ "dev": true }, "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, "requires": { "path-key": "^3.1.0", @@ -6061,9 +6009,9 @@ "dev": true }, "picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", "dev": true }, "picomatch": { @@ -6085,14 +6033,14 @@ "dev": true }, "postcss": { - "version": "8.4.38", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", - "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", + "version": "8.4.49", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", + "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", "dev": true, "requires": { "nanoid": "^3.3.7", - "picocolors": "^1.0.0", - "source-map-js": "^1.2.0" + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" } }, "postcss-cli": { @@ -6212,12 +6160,12 @@ } }, "postcss-focus-within": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-8.0.1.tgz", - "integrity": "sha512-NFU3xcY/xwNaapVb+1uJ4n23XImoC86JNwkY/uduytSl2s9Ekc2EpzmRR63+ExitnW3Mab3Fba/wRPCT5oDILA==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-9.0.1.tgz", + "integrity": "sha512-fzNUyS1yOYa7mOjpci/bR+u+ESvdar6hk8XNK/TRR0fiGTp2QT5N+ducP0n3rfH/m9I7H/EQU6lsa2BrgxkEjw==", "dev": true, "requires": { - "postcss-selector-parser": "^6.0.13" + "postcss-selector-parser": "^7.0.0" } }, "postcss-load-config": { @@ -6241,9 +6189,9 @@ } }, "postcss-selector-parser": { - "version": "6.0.13", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", - "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", + "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", "dev": true, "requires": { "cssesc": "^3.0.0", @@ -6451,9 +6399,9 @@ } }, "rtlcss": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-4.1.1.tgz", - "integrity": "sha512-/oVHgBtnPNcggP2aVXQjSy6N1mMAfHg4GSag0QtZBlD5bdDgAHwr4pydqJGd+SUCu9260+Pjqbjwtvu7EMH1KQ==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-4.3.0.tgz", + "integrity": "sha512-FI+pHEn7Wc4NqKXMXFM+VAYKEj/mRIcW4h24YVwVtyjI+EqGrLc2Hx/Ny0lrZ21cBWU2goLy36eqMcNj3AQJig==", "dev": true, "requires": { "escalade": "^3.1.1", @@ -6648,12 +6596,12 @@ "dev": true }, "socks": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", - "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", + "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", "dev": true, "requires": { - "ip": "^2.0.0", + "ip-address": "^9.0.5", "smart-buffer": "^4.2.0" } }, @@ -6675,9 +6623,9 @@ "dev": true }, "source-map-js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", - "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "dev": true }, "spdx-correct": { @@ -6712,6 +6660,12 @@ "integrity": "sha512-7j8LYJLeY/Yb6ACbQ7F76qy5jHkp0U6jgBfJsk97bwWlVUnUWsAgpyaCvo17h0/RQGnQ036tVDomiwoI4pDkQA==", "dev": true }, + "sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "dev": true + }, "ssri": { "version": "9.0.1", "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", @@ -6941,13 +6895,13 @@ "dev": true }, "update-browserslist-db": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz", - "integrity": "sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", + "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", "dev": true, "requires": { - "escalade": "^3.1.2", - "picocolors": "^1.0.1" + "escalade": "^3.2.0", + "picocolors": "^1.1.0" } }, "util-deprecate": { diff --git a/src/wp-content/themes/twentynineteen/package.json b/src/wp-content/themes/twentynineteen/package.json index 584dcd66ff328..1069b4c4f9b7b 100644 --- a/src/wp-content/themes/twentynineteen/package.json +++ b/src/wp-content/themes/twentynineteen/package.json @@ -11,15 +11,15 @@ "npm": ">=10.2.3" }, "devDependencies": { - "@wordpress/browserslist-config": "^6.1.0", - "autoprefixer": "^10.4.19", + "@wordpress/browserslist-config": "^6.14.0", + "autoprefixer": "^10.4.20", "chokidar-cli": "^3.0.0", "node-sass": "^9.0.0", "npm-run-all": "^4.1.5", - "postcss": "^8.4.38", + "postcss": "^8.4.49", "postcss-cli": "^11.0.0", - "postcss-focus-within": "^8.0.1", - "rtlcss": "^4.1.1" + "postcss-focus-within": "^9.0.1", + "rtlcss": "^4.3.0" }, "rtlcssConfig": { "options": { diff --git a/src/wp-content/themes/twentytwenty/package-lock.json b/src/wp-content/themes/twentytwenty/package-lock.json index 5fbbe97a2a9a9..c2670d461215d 100644 --- a/src/wp-content/themes/twentytwenty/package-lock.json +++ b/src/wp-content/themes/twentytwenty/package-lock.json @@ -9,13 +9,13 @@ "version": "2.8.0", "license": "GPL-2.0-or-later", "devDependencies": { - "@wordpress/browserslist-config": "^6.1.0", - "@wordpress/scripts": "^28.1.0", - "autoprefixer": "^10.4.19", - "concurrently": "^8.2.2", - "postcss": "^8.4.38", + "@wordpress/browserslist-config": "^6.14.0", + "@wordpress/scripts": "^30.7.0", + "autoprefixer": "^10.4.20", + "concurrently": "^9.1.0", + "postcss": "^8.4.49", "postcss-cli": "^11.0.0", - "rtlcss": "^4.1.1", + "rtlcss": "^4.3.0", "stylelint-a11y": "^1.2.3" }, "engines": { @@ -37,12 +37,14 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", - "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/highlight": "^7.24.7", + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", "picocolors": "^1.0.0" }, "engines": { @@ -50,30 +52,32 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", - "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.3.tgz", + "integrity": "sha512-nHIxvKPniQXpmQLb0vhY3VaFb3S0YrTAwpOWJZh1wn3oJPjJk9Asva204PsBdmAE8vpzfHudT8DB0scYvy9q0g==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.6.tgz", - "integrity": "sha512-FxpRyGjrMJXh7X3wGLGhNDCRiwpWEF74sKjTLDJSG5Kyvow3QZaG0Adbqzi9ZrVjTWpsX+2cxWXD71NMg93kdw==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.7.tgz", + "integrity": "sha512-yJ474Zv3cwiSOO9nXJuqzvwEeM+chDuQ8GJirw+pZ91sCGCyOZ3dJkVE09fTV0VEVzXyLWhh3G/AolYTPX7Mow==", "dev": true, + "license": "MIT", "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.23.6", - "@babel/parser": "^7.23.6", - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.6", - "@babel/types": "^7.23.6", + "@babel/code-frame": "^7.25.7", + "@babel/generator": "^7.25.7", + "@babel/helper-compilation-targets": "^7.25.7", + "@babel/helper-module-transforms": "^7.25.7", + "@babel/helpers": "^7.25.7", + "@babel/parser": "^7.25.7", + "@babel/template": "^7.25.7", + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -107,15 +111,17 @@ } }, "node_modules/@babel/generator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.7.tgz", - "integrity": "sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==", + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.3.tgz", + "integrity": "sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/types": "^7.24.7", + "@babel/parser": "^7.26.3", + "@babel/types": "^7.26.3", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^2.5.1" + "jsesc": "^3.0.2" }, "engines": { "node": ">=6.9.0" @@ -146,14 +152,15 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", - "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz", + "integrity": "sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-validator-option": "^7.23.5", - "browserslist": "^4.22.2", + "@babel/compat-data": "^7.25.9", + "@babel/helper-validator-option": "^7.25.9", + "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" }, @@ -267,29 +274,29 @@ } }, "node_modules/@babel/helper-module-imports": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", - "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", + "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", - "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", + "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -390,28 +397,31 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.7.tgz", - "integrity": "sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", - "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", - "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", + "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -431,86 +441,28 @@ } }, "node_modules/@babel/helpers": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.6.tgz", - "integrity": "sha512-wCfsbN4nBidDRhpDhvcKlzHWCTlgJYUUdSJfzXb2NuBssDSIjc3xcb+znA7l+zYsFljAcGM0aFkN40cR3lXiGA==", - "dev": true, - "dependencies": { - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.6", - "@babel/types": "^7.23.6" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", - "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz", + "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.24.7", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" + "@babel/template": "^7.25.9", + "@babel/types": "^7.26.0" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "node_modules/@babel/parser": { + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.3.tgz", + "integrity": "sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==", "dev": true, + "license": "MIT", "dependencies": { - "has-flag": "^3.0.0" + "@babel/types": "^7.26.3" }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/parser": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.7.tgz", - "integrity": "sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==", - "dev": true, "bin": { "parser": "bin/babel-parser.js" }, @@ -1953,33 +1905,32 @@ } }, "node_modules/@babel/template": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz", - "integrity": "sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz", + "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/parser": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/code-frame": "^7.25.9", + "@babel/parser": "^7.25.9", + "@babel/types": "^7.25.9" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.7.tgz", - "integrity": "sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.24.7", - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-function-name": "^7.24.7", - "@babel/helper-hoist-variables": "^7.24.7", - "@babel/helper-split-export-declaration": "^7.24.7", - "@babel/parser": "^7.24.7", - "@babel/types": "^7.24.7", + "version": "7.26.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.4.tgz", + "integrity": "sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.3", + "@babel/parser": "^7.26.3", + "@babel/template": "^7.25.9", + "@babel/types": "^7.26.3", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -1988,14 +1939,14 @@ } }, "node_modules/@babel/types": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.7.tgz", - "integrity": "sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==", + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.3.tgz", + "integrity": "sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==", "dev": true, + "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.24.7", - "@babel/helper-validator-identifier": "^7.24.7", - "to-fast-properties": "^2.0.0" + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -2007,21 +1958,94 @@ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true }, - "node_modules/@csstools/selector-specificity": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.1.1.tgz", - "integrity": "sha512-jwx+WCqszn53YHOfvFMJJRd/B2GqkCBt+1MJSG6o5/s8+ytHMvDZXsJgUEWLk12UnLd7HYKac4BYU5i/Ron1Cw==", + "node_modules/@csstools/css-parser-algorithms": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.4.tgz", + "integrity": "sha512-Up7rBoV77rv29d3uKHUIVubz1BTcgyUK72IvCQAbfbMv584xHcGKCKbWh7i8hPrRJ7qU4Y8IO3IY9m+iTB7P3A==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", "engines": { - "node": "^14 || ^16 || >=18" + "node": ">=18" }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/csstools" + "peerDependencies": { + "@csstools/css-tokenizer": "^3.0.3" + } + }, + "node_modules/@csstools/css-tokenizer": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.3.tgz", + "integrity": "sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + } + }, + "node_modules/@csstools/media-query-list-parser": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.2.tgz", + "integrity": "sha512-EUos465uvVvMJehckATTlNqGj4UJWkTmdWuDMjqvSUkjGpmOyFZBVwb4knxCm/k2GMTXY+c/5RkdndzFYWeX5A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" + } + }, + "node_modules/@csstools/selector-specificity": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", + "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": ">=18" }, "peerDependencies": { - "postcss": "^8.4", - "postcss-selector-parser": "^6.0.10" + "postcss-selector-parser": "^7.0.0" } }, "node_modules/@discoveryjs/json-ext": { @@ -2033,6 +2057,17 @@ "node": ">=10.0.0" } }, + "node_modules/@dual-bundle/import-meta-resolve": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@dual-bundle/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz", + "integrity": "sha512-+nxncfwHM5SgAtrVzgpzJOI1ol0PkumhVo469KCf9lUi21IGcY90G98VuHm9VRrUypmAzawAHO9bs6hqeADaVg==", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/@es-joy/jsdoccomment": { "version": "0.41.0", "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.41.0.tgz", @@ -2139,17 +2174,75 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/@formatjs/ecma402-abstract": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-2.3.1.tgz", + "integrity": "sha512-Ip9uV+/MpLXWRk03U/GzeJMuPeOXpJBSB5V1tjA6kJhvqssye5J5LoYLc7Z5IAHb7nR62sRoguzrFiVCP/hnzw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@formatjs/fast-memoize": "2.2.5", + "@formatjs/intl-localematcher": "0.5.9", + "decimal.js": "10", + "tslib": "2" + } + }, + "node_modules/@formatjs/fast-memoize": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/@formatjs/fast-memoize/-/fast-memoize-2.2.5.tgz", + "integrity": "sha512-6PoewUMrrcqxSoBXAOJDiW1m+AmkrAj0RiXnOMD59GRaswjXhm3MDhgepXPBgonc09oSirAJTsAggzAGQf6A6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "2" + } + }, + "node_modules/@formatjs/icu-messageformat-parser": { + "version": "2.9.7", + "resolved": "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.9.7.tgz", + "integrity": "sha512-cuEHyRM5VqLQobANOjtjlgU7+qmk9Q3fDQuBiRRJ3+Wp3ZoZhpUPtUfuimZXsir6SaI2TaAJ+SLo9vLnV5QcbA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@formatjs/ecma402-abstract": "2.3.1", + "@formatjs/icu-skeleton-parser": "1.8.11", + "tslib": "2" + } + }, + "node_modules/@formatjs/icu-skeleton-parser": { + "version": "1.8.11", + "resolved": "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.8.11.tgz", + "integrity": "sha512-8LlHHE/yL/zVJZHAX3pbKaCjZKmBIO6aJY1mkVh4RMSEu/2WRZ4Ysvv3kKXJ9M8RJLBHdnk1/dUQFdod1Dt7Dw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@formatjs/ecma402-abstract": "2.3.1", + "tslib": "2" + } + }, + "node_modules/@formatjs/intl-localematcher": { + "version": "0.5.9", + "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.5.9.tgz", + "integrity": "sha512-8zkGu/sv5euxbjfZ/xmklqLyDGQSxsLqg8XOq88JW3cmJtzhCP8EtSJXlaKZnVO4beEaoiT9wj4eIoCQ9smwxA==", + "dev": true, + "license": "MIT", + "dependencies": { + "tslib": "2" + } + }, "node_modules/@hapi/hoek": { "version": "9.3.0", "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==", - "dev": true + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/@hapi/topo": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/@hapi/topo/-/topo-5.1.0.tgz", "integrity": "sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "@hapi/hoek": "^9.0.0" } @@ -2672,13 +2765,14 @@ } }, "node_modules/@jridgewell/source-map": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", - "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", "dev": true, + "license": "MIT", "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" } }, "node_modules/@jridgewell/sourcemap-codec": { @@ -2747,6 +2841,16 @@ "node": ">= 8" } }, + "node_modules/@paulirish/trace_engine": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@paulirish/trace_engine/-/trace_engine-0.0.39.tgz", + "integrity": "sha512-2Y/ejHX5DDi5bjfWY/0c/BLVSfQ61Jw1Hy60Hnh0hfEO632D3FVctkzT4Q/lVAdvIPR0bUaok9JDTr1pu/OziA==", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "third-party-web": "latest" + } + }, "node_modules/@pkgr/core": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", @@ -2815,224 +2919,119 @@ "integrity": "sha512-2LuNTFBIO0m7kKIQvvPHN6UE63VjpmL9rnEEaOOaiSPbZK+zUOYIzBAWcED+3XYzhYsd/0mD57VdxAEqqV52CQ==", "dev": true }, - "node_modules/@puppeteer/browsers": { - "version": "1.4.6", - "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-1.4.6.tgz", - "integrity": "sha512-x4BEjr2SjOPowNeiguzjozQbsc6h437ovD/wu+JpaenxVLm3jkgzHY2xOslMTp50HoTvQreMjiexiGQw1sqZlQ==", + "node_modules/@sentry-internal/tracing": { + "version": "7.120.2", + "resolved": "https://registry.npmjs.org/@sentry-internal/tracing/-/tracing-7.120.2.tgz", + "integrity": "sha512-eo2F8cP6X+vr54Mp6vu+NoQEDz0M5O24Tz8jPY0T1CpiWdwCmHb7Sln+oLXeQ3/LlWdVQihBfKDBZfBdUfsBTg==", "dev": true, + "license": "MIT", "dependencies": { - "debug": "4.3.4", - "extract-zip": "2.0.1", - "progress": "2.0.3", - "proxy-agent": "6.3.0", - "tar-fs": "3.0.4", - "unbzip2-stream": "1.4.3", - "yargs": "17.7.1" - }, - "bin": { - "browsers": "lib/cjs/main-cli.js" + "@sentry/core": "7.120.2", + "@sentry/types": "7.120.2", + "@sentry/utils": "7.120.2" }, "engines": { - "node": ">=16.3.0" - }, - "peerDependencies": { - "typescript": ">= 4.7.4" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } + "node": ">=8" } }, - "node_modules/@puppeteer/browsers/node_modules/tar-fs": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.4.tgz", - "integrity": "sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==", + "node_modules/@sentry/core": { + "version": "7.120.2", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.120.2.tgz", + "integrity": "sha512-eurLBFQJC7WWWYoEna25Z9I/GJjqAmH339tv52XP8sqXV7B5hRcHDcfrsT/UGHpU316M24p3lWhj0eimtCZ0SQ==", "dev": true, + "license": "MIT", "dependencies": { - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^3.1.5" + "@sentry/types": "7.120.2", + "@sentry/utils": "7.120.2" + }, + "engines": { + "node": ">=8" } }, - "node_modules/@puppeteer/browsers/node_modules/tar-stream": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", - "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", + "node_modules/@sentry/integrations": { + "version": "7.120.2", + "resolved": "https://registry.npmjs.org/@sentry/integrations/-/integrations-7.120.2.tgz", + "integrity": "sha512-bMvL2fD3TGLM5YAUoQ2Qz6bYeVU8f7YRFNSjKNxK4EbvFgAU9j1FD6EKg0V0RNOJYnJjGIZYMmcWTXBbVTJL6w==", "dev": true, + "license": "MIT", "dependencies": { - "b4a": "^1.6.4", - "fast-fifo": "^1.2.0", - "streamx": "^2.15.0" + "@sentry/core": "7.120.2", + "@sentry/types": "7.120.2", + "@sentry/utils": "7.120.2", + "localforage": "^1.8.1" + }, + "engines": { + "node": ">=8" } }, - "node_modules/@puppeteer/browsers/node_modules/yargs": { - "version": "17.7.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", - "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", + "node_modules/@sentry/node": { + "version": "7.120.2", + "resolved": "https://registry.npmjs.org/@sentry/node/-/node-7.120.2.tgz", + "integrity": "sha512-ZnW9gpIGaoU+vYZyVZca9dObfmWYiXEWIMUM/JXaFb8AhP1OXvYweNiU0Pe/gNrz4oGAogU8scJc70ar7Vj0ww==", "dev": true, + "license": "MIT", "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" + "@sentry-internal/tracing": "7.120.2", + "@sentry/core": "7.120.2", + "@sentry/integrations": "7.120.2", + "@sentry/types": "7.120.2", + "@sentry/utils": "7.120.2" }, "engines": { - "node": ">=12" + "node": ">=8" } }, - "node_modules/@puppeteer/browsers/node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "node_modules/@sentry/types": { + "version": "7.120.2", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.120.2.tgz", + "integrity": "sha512-FWVoiblHQJ892GaOqdXx/5/n5XDLF28z81vJ0lCY49PMh8waz8LJ0b9RSmt9tasSDl0OQ7eUlPl1xu1jTrv1NA==", "dev": true, + "license": "MIT", "engines": { - "node": ">=12" + "node": ">=8" } }, - "node_modules/@sentry/core": { - "version": "6.19.7", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-6.19.7.tgz", - "integrity": "sha512-tOfZ/umqB2AcHPGbIrsFLcvApdTm9ggpi/kQZFkej7kMphjT+SGBiQfYtjyg9jcRW+ilAR4JXC9BGKsdEQ+8Vw==", + "node_modules/@sentry/utils": { + "version": "7.120.2", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.120.2.tgz", + "integrity": "sha512-jgnQlw11mRfQrQRAXbq4zEd+tbYwHel5eqeS/oU6EImXRjmHNtS79nB8MHvJeQu1FMCpFs1Ymrrs5FICwS6VeQ==", "dev": true, + "license": "MIT", "dependencies": { - "@sentry/hub": "6.19.7", - "@sentry/minimal": "6.19.7", - "@sentry/types": "6.19.7", - "@sentry/utils": "6.19.7", - "tslib": "^1.9.3" + "@sentry/types": "7.120.2" }, "engines": { - "node": ">=6" + "node": ">=8" } }, - "node_modules/@sentry/core/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "node_modules/@sentry/hub": { - "version": "6.19.7", - "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-6.19.7.tgz", - "integrity": "sha512-y3OtbYFAqKHCWezF0EGGr5lcyI2KbaXW2Ik7Xp8Mu9TxbSTuwTe4rTntwg8ngPjUQU3SUHzgjqVB8qjiGqFXCA==", + "node_modules/@sideway/address": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz", + "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "@sentry/types": "6.19.7", - "@sentry/utils": "6.19.7", - "tslib": "^1.9.3" - }, - "engines": { - "node": ">=6" + "@hapi/hoek": "^9.0.0" } }, - "node_modules/@sentry/hub/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true + "node_modules/@sideway/formula": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", + "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==", + "dev": true, + "license": "BSD-3-Clause" }, - "node_modules/@sentry/minimal": { - "version": "6.19.7", - "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-6.19.7.tgz", - "integrity": "sha512-wcYmSJOdvk6VAPx8IcmZgN08XTXRwRtB1aOLZm+MVHjIZIhHoBGZJYTVQS/BWjldsamj2cX3YGbGXNunaCfYJQ==", + "node_modules/@sideway/pinpoint": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", + "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", "dev": true, - "dependencies": { - "@sentry/hub": "6.19.7", - "@sentry/types": "6.19.7", - "tslib": "^1.9.3" - }, - "engines": { - "node": ">=6" - } + "license": "BSD-3-Clause" }, - "node_modules/@sentry/minimal/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "node_modules/@sentry/node": { - "version": "6.19.7", - "resolved": "https://registry.npmjs.org/@sentry/node/-/node-6.19.7.tgz", - "integrity": "sha512-gtmRC4dAXKODMpHXKfrkfvyBL3cI8y64vEi3fDD046uqYcrWdgoQsffuBbxMAizc6Ez1ia+f0Flue6p15Qaltg==", - "dev": true, - "dependencies": { - "@sentry/core": "6.19.7", - "@sentry/hub": "6.19.7", - "@sentry/types": "6.19.7", - "@sentry/utils": "6.19.7", - "cookie": "^0.4.1", - "https-proxy-agent": "^5.0.0", - "lru_map": "^0.3.3", - "tslib": "^1.9.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@sentry/node/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "node_modules/@sentry/types": { - "version": "6.19.7", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-6.19.7.tgz", - "integrity": "sha512-jH84pDYE+hHIbVnab3Hr+ZXr1v8QABfhx39KknxqKWr2l0oEItzepV0URvbEhB446lk/S/59230dlUUIBGsXbg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/@sentry/utils": { - "version": "6.19.7", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-6.19.7.tgz", - "integrity": "sha512-z95ECmE3i9pbWoXQrD/7PgkBAzJYR+iXtPuTkpBjDKs86O3mT+PXOT3BAn79w2wkn7/i3vOGD2xVr1uiMl26dA==", - "dev": true, - "dependencies": { - "@sentry/types": "6.19.7", - "tslib": "^1.9.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/@sentry/utils/node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "node_modules/@sideway/address": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz", - "integrity": "sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==", - "dev": true, - "dependencies": { - "@hapi/hoek": "^9.0.0" - } - }, - "node_modules/@sideway/formula": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sideway/formula/-/formula-3.0.1.tgz", - "integrity": "sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==", - "dev": true - }, - "node_modules/@sideway/pinpoint": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@sideway/pinpoint/-/pinpoint-2.0.0.tgz", - "integrity": "sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==", - "dev": true - }, - "node_modules/@sinclair/typebox": { - "version": "0.27.8", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", - "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.27.8.tgz", + "integrity": "sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==", "dev": true }, "node_modules/@sindresorhus/merge-streams": { @@ -3410,37 +3409,6 @@ "url": "https://github.com/sponsors/gregberge" } }, - "node_modules/@tannin/compile": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@tannin/compile/-/compile-1.1.0.tgz", - "integrity": "sha512-n8m9eNDfoNZoxdvWiTfW/hSPhehzLJ3zW7f8E7oT6mCROoMNWCB4TYtv041+2FMAxweiE0j7i1jubQU4MEC/Gg==", - "dev": true, - "dependencies": { - "@tannin/evaluate": "^1.2.0", - "@tannin/postfix": "^1.1.0" - } - }, - "node_modules/@tannin/evaluate": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@tannin/evaluate/-/evaluate-1.2.0.tgz", - "integrity": "sha512-3ioXvNowbO/wSrxsDG5DKIMxC81P0QrQTYai8zFNY+umuoHWRPbQ/TuuDEOju9E+jQDXmj6yI5GyejNuh8I+eg==", - "dev": true - }, - "node_modules/@tannin/plural-forms": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@tannin/plural-forms/-/plural-forms-1.1.0.tgz", - "integrity": "sha512-xl9R2mDZO/qiHam1AgMnAES6IKIg7OBhcXqy6eDsRCdXuxAFPcjrej9HMjyCLE0DJ/8cHf0i5OQTstuBRhpbHw==", - "dev": true, - "dependencies": { - "@tannin/compile": "^1.1.0" - } - }, - "node_modules/@tannin/postfix": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@tannin/postfix/-/postfix-1.1.0.tgz", - "integrity": "sha512-oocsqY7g0cR+Gur5jRQLSrX2OtpMLMse1I10JQBm8CdGMrDkh1Mg2gjsiquMHRtBs4Qwu5wgEp5GgIYHk4SNPw==", - "dev": true - }, "node_modules/@tootallnate/once": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", @@ -3545,30 +3513,33 @@ } }, "node_modules/@types/eslint": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.21.0.tgz", - "integrity": "sha512-35EhHNOXgxnUgh4XCJsGhE7zdlDhYDN/aMG6UbkByCFFNgQ7b3U+uVoqBpicFydR8JEfgdjCF7SJ7MiJfzuiTA==", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", + "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", "dev": true, + "license": "MIT", "dependencies": { "@types/estree": "*", "@types/json-schema": "*" } }, "node_modules/@types/eslint-scope": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", - "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", "dev": true, + "license": "MIT", "dependencies": { "@types/eslint": "*", "@types/estree": "*" } }, "node_modules/@types/estree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", - "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", - "dev": true + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", + "dev": true, + "license": "MIT" }, "node_modules/@types/express": { "version": "4.17.21", @@ -4165,148 +4136,163 @@ } }, "node_modules/@webassemblyjs/ast": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", - "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", "dev": true, + "license": "MIT", "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" } }, "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", - "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", - "dev": true + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", + "dev": true, + "license": "MIT" }, "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", - "dev": true + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", + "dev": true, + "license": "MIT" }, "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", - "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", - "dev": true + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", + "dev": true, + "license": "MIT" }, "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", - "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", "dev": true, + "license": "MIT", "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", - "dev": true + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "dev": true, + "license": "MIT" }, "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", - "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", "dev": true, + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" } }, "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", - "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", "dev": true, + "license": "MIT", "dependencies": { "@xtuc/ieee754": "^1.2.0" } }, "node_modules/@webassemblyjs/leb128": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", - "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/utf8": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", - "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", - "dev": true + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", + "dev": true, + "license": "MIT" }, "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", - "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", "dev": true, + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-opt": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6", - "@webassemblyjs/wast-printer": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" } }, "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", - "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", "dev": true, + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" } }, "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", - "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", "dev": true, + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" } }, "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", - "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", "dev": true, + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" } }, "node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", - "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", "dev": true, + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/ast": "1.14.1", "@xtuc/long": "4.2.2" } }, @@ -4354,21 +4340,6 @@ } } }, - "node_modules/@wordpress/api-fetch": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@wordpress/api-fetch/-/api-fetch-7.1.0.tgz", - "integrity": "sha512-mtEJi9IBPCRtNxyhP1VAwcLmncpQzt7CQX8rxhC4eAMnicamCG/fwZ3pFEKGXk3MUul3Bl1Q7y/UhdMtCGktGg==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.16.0", - "@wordpress/i18n": "^5.1.0", - "@wordpress/url": "^4.1.0" - }, - "engines": { - "node": ">=18.12.0", - "npm": ">=8.19.2" - } - }, "node_modules/@wordpress/babel-preset-default": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/@wordpress/babel-preset-default/-/babel-preset-default-8.1.0.tgz", @@ -4403,10 +4374,11 @@ } }, "node_modules/@wordpress/browserslist-config": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@wordpress/browserslist-config/-/browserslist-config-6.1.0.tgz", - "integrity": "sha512-cf5iwPq6JetQjiaRwlvzW5eX0S3OphVmy1YTxHQdrVqp79rOGvamVftxqvmf3C/GSRaNyI4eZV+nNwNRN0DkrQ==", + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@wordpress/browserslist-config/-/browserslist-config-6.14.0.tgz", + "integrity": "sha512-a26hxY8R/A7FH/Z8oZsYS31ZC/Xy9QSBTi5w84MKSeYdWlck7t1QdCwUNF1u621wbuP7beiiu9FkYY4hI3Bk9A==", "dev": true, + "license": "GPL-2.0-or-later", "engines": { "node": ">=18.12.0", "npm": ">=8.19.2" @@ -4429,20 +4401,18 @@ } }, "node_modules/@wordpress/e2e-test-utils-playwright": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@wordpress/e2e-test-utils-playwright/-/e2e-test-utils-playwright-1.1.0.tgz", - "integrity": "sha512-lGA7/6S1Rsa9Zf7qnAs1nOWn8lPpg8vBOwUWHPBqV1a79r7nsD2KQqsrqsKy8wIJ763fIt5LljjD9VSca0UtIQ==", + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/@wordpress/e2e-test-utils-playwright/-/e2e-test-utils-playwright-1.14.0.tgz", + "integrity": "sha512-G9r3ZysgzAmUbR4bjGAEEP6P2RCIAG8uMU7yyzxOAHegINSbF3shEZKvVNBeKxNwHKAVa9koh/niGN3U4Kr6Rw==", "dev": true, + "license": "GPL-2.0-or-later", "dependencies": { - "@wordpress/api-fetch": "^7.1.0", - "@wordpress/keycodes": "^4.1.0", - "@wordpress/url": "^4.1.0", "change-case": "^4.1.2", "form-data": "^4.0.0", "get-port": "^5.1.1", - "lighthouse": "^10.4.0", + "lighthouse": "^12.2.2", "mime": "^3.0.0", - "web-vitals": "^3.5.0" + "web-vitals": "^4.2.1" }, "engines": { "node": ">=18.12.0", @@ -4510,40 +4480,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/@wordpress/hooks": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@wordpress/hooks/-/hooks-4.1.0.tgz", - "integrity": "sha512-uJ2zyLLs6AwWuEdLGv/P7oSXJuX27Ym6JglzWGBavxAKNXpTCCjiJwgxlZJbSjT3BzhRsRGl3bUMmzt3eh50Pg==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.16.0" - }, - "engines": { - "node": ">=18.12.0", - "npm": ">=8.19.2" - } - }, - "node_modules/@wordpress/i18n": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@wordpress/i18n/-/i18n-5.1.0.tgz", - "integrity": "sha512-zNJiudByLnpIVhIS45hr92r53t+wRYp9a6XOJ585xNYeUmoUpymY5GTdLSrExmQaytMhV5cSXSn3qMMDBMjUsg==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.16.0", - "@wordpress/hooks": "^4.1.0", - "gettext-parser": "^1.3.1", - "memize": "^2.1.0", - "sprintf-js": "^1.1.1", - "tannin": "^1.2.0" - }, - "bin": { - "pot-to-php": "tools/pot-to-php.js" - }, - "engines": { - "node": ">=18.12.0", - "npm": ">=8.19.2" - } - }, "node_modules/@wordpress/jest-console": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/@wordpress/jest-console/-/jest-console-8.1.0.tgz", @@ -4579,20 +4515,6 @@ "jest": ">=29" } }, - "node_modules/@wordpress/keycodes": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@wordpress/keycodes/-/keycodes-4.1.0.tgz", - "integrity": "sha512-ibAR7qg4q7082s9kOPnZ0Hqb6KM/zjAZBjEH2Yrc2jwLJ83QDGKDWCSx6dNYkN7m9jGpH52w8j4nz1wcbFZSiw==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.16.0", - "@wordpress/i18n": "^5.1.0" - }, - "engines": { - "node": ">=18.12.0", - "npm": ">=8.19.2" - } - }, "node_modules/@wordpress/npm-package-json-lint-config": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/@wordpress/npm-package-json-lint-config/-/npm-package-json-lint-config-5.1.0.tgz", @@ -4637,33 +4559,34 @@ } }, "node_modules/@wordpress/scripts": { - "version": "28.1.0", - "resolved": "https://registry.npmjs.org/@wordpress/scripts/-/scripts-28.1.0.tgz", - "integrity": "sha512-BWmYA0fqOhfMcl20ppcJA/nw/zixt0FP6KPV+IiI560qpSHx6ZZieU354oX/5Vdaoe4O3ahPlGdUr9fWcprApQ==", + "version": "30.7.0", + "resolved": "https://registry.npmjs.org/@wordpress/scripts/-/scripts-30.7.0.tgz", + "integrity": "sha512-vwrf6Xo1GXV2ug4xdYMgZ2CVpNNfArOEJyX6w9CafIRmLOm8GkVGSza0VlEoOh1BTqQPv/awq6uiOKVMbVNB5Q==", "dev": true, + "license": "GPL-2.0-or-later", "dependencies": { - "@babel/core": "^7.16.0", + "@babel/core": "7.25.7", "@pmmmwh/react-refresh-webpack-plugin": "^0.5.11", "@svgr/webpack": "^8.0.1", - "@wordpress/babel-preset-default": "^8.1.0", - "@wordpress/browserslist-config": "^6.1.0", - "@wordpress/dependency-extraction-webpack-plugin": "^6.1.0", - "@wordpress/e2e-test-utils-playwright": "^1.1.0", - "@wordpress/eslint-plugin": "^19.1.0", - "@wordpress/jest-preset-default": "^12.1.0", - "@wordpress/npm-package-json-lint-config": "^5.1.0", - "@wordpress/postcss-plugins-preset": "^5.1.0", - "@wordpress/prettier-config": "^4.1.0", - "@wordpress/stylelint-config": "^22.1.0", + "@wordpress/babel-preset-default": "*", + "@wordpress/browserslist-config": "*", + "@wordpress/dependency-extraction-webpack-plugin": "*", + "@wordpress/e2e-test-utils-playwright": "*", + "@wordpress/eslint-plugin": "*", + "@wordpress/jest-preset-default": "*", + "@wordpress/npm-package-json-lint-config": "*", + "@wordpress/postcss-plugins-preset": "*", + "@wordpress/prettier-config": "*", + "@wordpress/stylelint-config": "*", "adm-zip": "^0.5.9", - "babel-jest": "^29.6.2", - "babel-loader": "^8.2.3", + "babel-jest": "29.7.0", + "babel-loader": "9.2.1", "browserslist": "^4.21.10", "chalk": "^4.0.0", "check-node-version": "^4.1.0", "clean-webpack-plugin": "^3.0.0", "copy-webpack-plugin": "^10.2.0", - "cross-spawn": "^5.1.0", + "cross-spawn": "^7.0.6", "css-loader": "^6.2.0", "cssnano": "^6.0.1", "cwd": "^0.10.0", @@ -4673,30 +4596,32 @@ "fast-glob": "^3.2.7", "filenamify": "^4.2.0", "jest": "^29.6.2", - "jest-dev-server": "^9.0.1", + "jest-dev-server": "^10.1.4", "jest-environment-jsdom": "^29.6.2", "jest-environment-node": "^29.6.2", + "json2php": "^0.0.9", "markdownlint-cli": "^0.31.1", "merge-deep": "^3.0.3", - "mini-css-extract-plugin": "^2.5.1", + "mini-css-extract-plugin": "^2.9.2", "minimist": "^1.2.0", "npm-package-json-lint": "^6.4.0", "npm-packlist": "^3.0.0", "postcss": "^8.4.5", "postcss-loader": "^6.2.1", "prettier": "npm:wp-prettier@3.0.3", - "puppeteer-core": "^13.2.0", + "puppeteer-core": "^23.10.1", "react-refresh": "^0.14.0", "read-pkg-up": "^7.0.1", "resolve-bin": "^0.4.0", "rtlcss-webpack-plugin": "^4.0.7", - "sass": "^1.35.2", - "sass-loader": "^12.1.0", + "sass": "^1.50.1", + "sass-loader": "^16.0.3", + "schema-utils": "^4.2.0", "source-map-loader": "^3.0.0", - "stylelint": "^14.2.0", - "terser-webpack-plugin": "^5.3.9", + "stylelint": "^16.8.2", + "terser-webpack-plugin": "^5.3.10", "url-loader": "^4.1.1", - "webpack": "^5.88.2", + "webpack": "^5.97.0", "webpack-bundle-analyzer": "^4.9.1", "webpack-cli": "^5.1.4", "webpack-dev-server": "^4.15.1" @@ -4709,11 +4634,75 @@ "npm": ">=8.19.2" }, "peerDependencies": { - "@playwright/test": "^1.43.0", + "@playwright/test": "^1.48.1", "react": "^18.0.0", "react-dom": "^18.0.0" } }, + "node_modules/@wordpress/scripts/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@wordpress/scripts/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/@wordpress/scripts/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/@wordpress/scripts/node_modules/json2php": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/json2php/-/json2php-0.0.9.tgz", + "integrity": "sha512-fQMYwvPsQt8hxRnCGyg1r2JVi6yL8Um0DIIawiKiMK9yhAAkcRNj5UsBWoaFvFzPpcWbgw9L6wzj+UMYA702Mw==", + "dev": true, + "license": "BSD" + }, + "node_modules/@wordpress/scripts/node_modules/schema-utils": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz", + "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, "node_modules/@wordpress/stylelint-config": { "version": "22.1.0", "resolved": "https://registry.npmjs.org/@wordpress/stylelint-config/-/stylelint-config-22.1.0.tgz", @@ -4731,20 +4720,6 @@ "stylelint": "^14.2" } }, - "node_modules/@wordpress/url": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@wordpress/url/-/url-4.1.0.tgz", - "integrity": "sha512-6Yi9EbTgUGJgsm6XtfO4By8q2+9pTzWkxzx27ShKGF+PqIgIZjiDssf2NfD/oNUevIy48LbQMbyEyK+9r2Bw9A==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.16.0", - "remove-accents": "^0.5.0" - }, - "engines": { - "node": ">=18.12.0", - "npm": ">=8.19.2" - } - }, "node_modules/@wordpress/warning": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@wordpress/warning/-/warning-3.1.0.tgz", @@ -4759,13 +4734,15 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/@xtuc/long": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true + "dev": true, + "license": "Apache-2.0" }, "node_modules/abab": { "version": "2.0.6", @@ -4787,10 +4764,11 @@ } }, "node_modules/acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", "dev": true, + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -4808,15 +4786,6 @@ "acorn-walk": "^8.0.2" } }, - "node_modules/acorn-import-assertions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", - "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", - "dev": true, - "peerDependencies": { - "acorn": "^8" - } - }, "node_modules/acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", @@ -4934,6 +4903,7 @@ "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -5271,6 +5241,7 @@ "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -5282,9 +5253,9 @@ "dev": true }, "node_modules/autoprefixer": { - "version": "10.4.19", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.19.tgz", - "integrity": "sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==", + "version": "10.4.20", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz", + "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==", "dev": true, "funding": [ { @@ -5300,12 +5271,13 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "browserslist": "^4.23.0", - "caniuse-lite": "^1.0.30001599", + "browserslist": "^4.23.3", + "caniuse-lite": "^1.0.30001646", "fraction.js": "^4.3.7", "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", + "picocolors": "^1.0.1", "postcss-value-parser": "^4.2.0" }, "bin": { @@ -5334,21 +5306,23 @@ } }, "node_modules/axe-core": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.9.1.tgz", - "integrity": "sha512-QbUdXJVTpvUTHU7871ppZkdOLBeGUKBQWHkHrvN2V9IQWGMt61zf3B45BtzjxEJzYuj0JBjBZP/hmYS/R9pmAw==", + "version": "4.10.2", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.2.tgz", + "integrity": "sha512-RE3mdQ7P3FRSe7eqCWoeQ/Z9QXrtniSjp1wUjt5nRC3WIpz5rSCve6o3fsZ2aCpJtrZjSZgjwXAoTO5k4tEI0w==", "dev": true, + "license": "MPL-2.0", "engines": { "node": ">=4" } }, "node_modules/axios": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.2.tgz", - "integrity": "sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==", + "version": "1.7.9", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz", + "integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==", "dev": true, + "license": "MIT", "dependencies": { - "follow-redirects": "^1.15.0", + "follow-redirects": "^1.15.6", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } @@ -5390,36 +5364,74 @@ } }, "node_modules/babel-loader": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.3.0.tgz", - "integrity": "sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q==", + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.2.1.tgz", + "integrity": "sha512-fqe8naHt46e0yIdkjUZYqddSXfej3AHajX+CSO5X7oy0EmPc6o5Xh+RClNoHjnieWz9AW4kZxW9yyFMhVB1QLA==", "dev": true, + "license": "MIT", "dependencies": { - "find-cache-dir": "^3.3.1", - "loader-utils": "^2.0.0", - "make-dir": "^3.1.0", - "schema-utils": "^2.6.5" + "find-cache-dir": "^4.0.0", + "schema-utils": "^4.0.0" }, "engines": { - "node": ">= 8.9" + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0", + "webpack": ">=5" + } + }, + "node_modules/babel-loader/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/babel-loader/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" }, "peerDependencies": { - "@babel/core": "^7.0.0", - "webpack": ">=2" + "ajv": "^8.8.2" } }, + "node_modules/babel-loader/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, "node_modules/babel-loader/node_modules/schema-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", - "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz", + "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==", "dev": true, + "license": "MIT", "dependencies": { - "@types/json-schema": "^7.0.5", - "ajv": "^6.12.4", - "ajv-keywords": "^3.5.2" + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" }, "engines": { - "node": ">= 8.9.0" + "node": ">= 10.13.0" }, "funding": { "type": "opencollective", @@ -5588,20 +5600,63 @@ "dev": true, "optional": true }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "node_modules/bare-fs": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-2.3.5.tgz", + "integrity": "sha512-SlE9eTxifPDJrT6YgemQ1WGFleevzwY+XAP1Xqgl56HtcrisC2CHCZ2tq6dBpcH2TnNxwUEUGhweo+lrQtYuiw==", "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "bare-events": "^2.0.0", + "bare-path": "^2.0.0", + "bare-stream": "^2.0.0" + } + }, + "node_modules/bare-os": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-2.4.4.tgz", + "integrity": "sha512-z3UiI2yi1mK0sXeRdc4O1Kk8aOa/e+FNWZcTiPB/dfTWyLypuE99LibgRaQki914Jq//yAWylcAt+mknKdixRQ==", + "dev": true, + "license": "Apache-2.0", + "optional": true + }, + "node_modules/bare-path": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-2.1.3.tgz", + "integrity": "sha512-lh/eITfU8hrj9Ru5quUp0Io1kJWIk1bTjzo7JH1P5dWmQ2EL4hFUlfI8FonAhSlgIfhn63p84CDY/x+PisgcXA==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "bare-os": "^2.1.0" + } + }, + "node_modules/bare-stream": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.6.1.tgz", + "integrity": "sha512-eVZbtKM+4uehzrsj49KtCy3Pbg7kO1pJ3SKZ1SFrIH/0pnj9scuGGgUlNDf/7qS8WKtGdiJY5Kyhs/ivYPTB/g==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "streamx": "^2.21.0" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, { "type": "consulting", "url": "https://feross.org/support" @@ -5641,22 +5696,12 @@ "node": ">=8" } }, - "node_modules/bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, - "dependencies": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, "node_modules/body-parser": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", - "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", "dev": true, + "license": "MIT", "dependencies": { "bytes": "3.1.2", "content-type": "~1.0.5", @@ -5666,7 +5711,7 @@ "http-errors": "2.0.0", "iconv-lite": "0.4.24", "on-finished": "2.4.1", - "qs": "6.11.0", + "qs": "6.13.0", "raw-body": "2.5.2", "type-is": "~1.6.18", "unpipe": "1.0.0" @@ -5681,6 +5726,7 @@ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -5690,6 +5736,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, + "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -5699,6 +5746,7 @@ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, + "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -5710,7 +5758,8 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/bonjour-service": { "version": "1.1.1", @@ -5753,9 +5802,9 @@ } }, "node_modules/browserslist": { - "version": "4.23.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.1.tgz", - "integrity": "sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==", + "version": "4.24.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.3.tgz", + "integrity": "sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA==", "dev": true, "funding": [ { @@ -5771,11 +5820,12 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001629", - "electron-to-chromium": "^1.4.796", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.16" + "caniuse-lite": "^1.0.30001688", + "electron-to-chromium": "^1.5.73", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.1" }, "bin": { "browserslist": "cli.js" @@ -5984,9 +6034,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001636", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001636.tgz", - "integrity": "sha512-bMg2vmr8XBsbL6Lr0UHXy/21m84FTxDLWn2FSqMd5PrlbMxwJlQnC2YWYxVgp66PZE+BBNF2jYQUBKCo1FDeZg==", + "version": "1.0.30001688", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001688.tgz", + "integrity": "sha512-Nmqpru91cuABu/DTCXbM2NSRHzM2uVHfPnhJ/1zEAJx/ILBRVmz3pzH4N7DZqbdG0gWClsCC05Oj0mJ/1AWMbA==", "dev": true, "funding": [ { @@ -6001,7 +6051,8 @@ "type": "github", "url": "https://github.com/sponsors/ai" } - ] + ], + "license": "CC-BY-4.0" }, "node_modules/capital-case": { "version": "1.0.4", @@ -6045,24 +6096,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/chalk/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/chalk/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "node_modules/change-case": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/change-case/-/change-case-4.1.2.tgz", @@ -6140,24 +6173,6 @@ "node": ">=8" } }, - "node_modules/check-node-version/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/check-node-version/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "node_modules/chokidar": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", @@ -6185,22 +6200,17 @@ "fsevents": "~2.3.2" } }, - "node_modules/chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true - }, "node_modules/chrome-launcher": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-0.15.2.tgz", - "integrity": "sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-1.1.2.tgz", + "integrity": "sha512-YclTJey34KUm5jB1aEJCq807bSievi7Nb/TU4Gu504fUYi3jw3KCIaH6L7nFWQhdEgH3V+wCh+kKD1P5cXnfxw==", "dev": true, + "license": "Apache-2.0", "dependencies": { "@types/node": "*", "escape-string-regexp": "^4.0.0", "is-wsl": "^2.2.0", - "lighthouse-logger": "^1.0.0" + "lighthouse-logger": "^2.0.1" }, "bin": { "print-chrome-path": "bin/print-chrome-path.js" @@ -6214,6 +6224,7 @@ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", "dev": true, + "license": "MIT", "engines": { "node": ">=10" }, @@ -6222,26 +6233,15 @@ } }, "node_modules/chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.0" } }, - "node_modules/chromium-bidi": { - "version": "0.4.16", - "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.4.16.tgz", - "integrity": "sha512-7ZbXdWERxRxSwo3txsBjjmc/NLxqb1Bk30mRb0BMS4YIaiV6zvKZqL/UAH+DdqcDYayDWk2n/y8klkBDODrPvA==", - "dev": true, - "dependencies": { - "mitt": "3.0.0" - }, - "peerDependencies": { - "devtools-protocol": "*" - } - }, "node_modules/ci-info": { "version": "3.9.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", @@ -6338,19 +6338,24 @@ "dev": true }, "node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "license": "MIT", "dependencies": { - "color-name": "1.1.3" + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" } }, "node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true, + "license": "MIT" }, "node_modules/colord": { "version": "2.9.3", @@ -6381,6 +6386,7 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 6" } @@ -6400,12 +6406,6 @@ "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", "dev": true }, - "node_modules/commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", - "dev": true - }, "node_modules/compressible": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", @@ -6464,17 +6464,16 @@ "dev": true }, "node_modules/concurrently": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-8.2.2.tgz", - "integrity": "sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-9.1.0.tgz", + "integrity": "sha512-VxkzwMAn4LP7WyMnJNbHN5mKV9L2IbyDjpzemKr99sXNR3GqRNMMHdm7prV1ws9wg7ETj6WUkNOigZVsptwbgg==", "dev": true, + "license": "MIT", "dependencies": { "chalk": "^4.1.2", - "date-fns": "^2.30.0", "lodash": "^4.17.21", "rxjs": "^7.8.1", "shell-quote": "^1.8.1", - "spawn-command": "0.0.2", "supports-color": "^8.1.1", "tree-kill": "^1.2.2", "yargs": "^17.7.2" @@ -6484,7 +6483,7 @@ "concurrently": "dist/bin/concurrently.js" }, "engines": { - "node": "^14.13.0 || >=16.0.0" + "node": ">=18" }, "funding": { "url": "https://github.com/open-cli-tools/concurrently?sponsor=1" @@ -6510,6 +6509,7 @@ "resolved": "https://registry.npmjs.org/configstore/-/configstore-5.0.1.tgz", "integrity": "sha512-aMKprgk5YhBNyH25hj8wGt2+D52Sw1DRRIzqBwLp2Ya9mFmY8KPvvtvmna8SxVR9JMZ4kzMD68N22vlaRpkeFA==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "dot-prop": "^5.2.0", "graceful-fs": "^4.1.2", @@ -6527,6 +6527,7 @@ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", "dev": true, + "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4", "is-typedarray": "^1.0.0", @@ -6571,6 +6572,7 @@ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -6582,10 +6584,11 @@ "dev": true }, "node_modules/cookie": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -6807,47 +6810,27 @@ "node": "^14.15.0 || ^16.10.0 || >=18.0.0" } }, - "node_modules/cross-fetch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", - "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", - "dev": true, - "dependencies": { - "node-fetch": "2.6.7" - } - }, "node_modules/cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==", - "dev": true, - "dependencies": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - } - }, - "node_modules/cross-spawn/node_modules/lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, + "license": "MIT", "dependencies": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" } }, - "node_modules/cross-spawn/node_modules/yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", - "dev": true - }, "node_modules/crypto-random-string": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-2.0.0.tgz", "integrity": "sha512-v1plID3y9r/lPhviJ1wrXpLeyUIGAZ2SHNYTEapm7/8A9nLPoyvVp3RK/EPFqn5kEznyWgYZNsRtYYIWbuG8KA==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -6856,7 +6839,8 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/csp_evaluator/-/csp_evaluator-1.1.1.tgz", "integrity": "sha512-N3ASg0C4kNPUaNxt1XAvzHIVuzdtr8KLgfk1O8WDyimp1GisPAHESupArO2ieHk9QWbrJ/WkQODyh21Ps/xhxw==", - "dev": true + "dev": true, + "license": "Apache-2.0" }, "node_modules/css-declaration-sorter": { "version": "7.1.1", @@ -6871,12 +6855,13 @@ } }, "node_modules/css-functions-list": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.1.0.tgz", - "integrity": "sha512-/9lCvYZaUbBGvYUgYGFJ4dcYiyqdhSjG7IPVluoV8A1ILjkF7ilmhp1OGUz8n+nmBcu0RNrQAzgD8B6FJbrt2w==", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.3.tgz", + "integrity": "sha512-IQOkD3hbR5KrN93MtcYuad6YPuTSUhntLHDuLEbFWE+ff2/XSZNdZG+LcbbIW5AXKg/WFIfYItIzVoHngHXZzA==", "dev": true, + "license": "MIT", "engines": { - "node": ">=12.22" + "node": ">=12 || >=16" } }, "node_modules/css-loader": { @@ -7128,6 +7113,7 @@ "resolved": "https://registry.npmjs.org/cwd/-/cwd-0.10.0.tgz", "integrity": "sha512-YGZxdTTL9lmLkCUTpg4j0zQ7IhRB5ZmqNBbGCl3Tg6MP/d5/6sY7L5mmTjzbc6JKgVZYiqTQTNhPFsbXNGlRaA==", "dev": true, + "license": "MIT", "dependencies": { "find-pkg": "^0.1.2", "fs-exists-sync": "^0.1.0" @@ -7216,22 +7202,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/date-fns": { - "version": "2.30.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", - "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", - "dev": true, - "dependencies": { - "@babel/runtime": "^7.21.0" - }, - "engines": { - "node": ">=0.11" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/date-fns" - } - }, "node_modules/debounce": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", @@ -7503,6 +7473,7 @@ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -7521,6 +7492,7 @@ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8", "npm": "1.2.8000 || >= 1.4.16" @@ -7542,10 +7514,11 @@ "dev": true }, "node_modules/devtools-protocol": { - "version": "0.0.981744", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.981744.tgz", - "integrity": "sha512-0cuGS8+jhR67Fy7qG3i3Pc7Aw494sb9yG9QgpG97SFVWwolgYjlhJg7n+UaHxOQT30d1TYu/EYe9k01ivLErIg==", - "dev": true + "version": "0.0.1367902", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1367902.tgz", + "integrity": "sha512-XxtPuC3PGakY6PD7dG66/o8KwJ/LkH2/EKe19Dcw58w53dv4/vSQEkn/SzuyhHE2q4zPgCkxQBxus3VV4ql+Pg==", + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/diff-sequences": { "version": "29.6.3", @@ -7681,6 +7654,7 @@ "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", "dev": true, + "license": "MIT", "dependencies": { "is-obj": "^2.0.0" }, @@ -7698,13 +7672,15 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.4.810", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.810.tgz", - "integrity": "sha512-Kaxhu4T7SJGpRQx99tq216gCq2nMxJo+uuT6uzz9l8TVN2stL7M06MIIXAtr9jsrLs2Glflgf2vMQRepxawOdQ==", - "dev": true + "version": "1.5.73", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.73.tgz", + "integrity": "sha512-8wGNxG9tAG5KhGd3eeA0o6ixhiNdgr0DcHWm85XPCphwZgD1lIEoi6t3VERayWao7SF7AAZTw6oARGJeVjH8Kg==", + "dev": true, + "license": "ISC" }, "node_modules/emittery": { "version": "0.13.1", @@ -7734,23 +7710,15 @@ } }, "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } }, - "node_modules/encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "dev": true, - "dependencies": { - "iconv-lite": "^0.6.2" - } - }, "node_modules/end-of-stream": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", @@ -7761,10 +7729,11 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", - "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", + "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", "dev": true, + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -7778,6 +7747,7 @@ "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-colors": "^4.1.1", "strip-ansi": "^6.0.1" @@ -7798,6 +7768,16 @@ "url": "https://github.com/fb55/entities?sponsor=1" } }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/envinfo": { "version": "7.11.0", "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.11.0.tgz", @@ -7955,10 +7935,11 @@ } }, "node_modules/es-module-lexer": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.0.tgz", - "integrity": "sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==", - "dev": true + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", + "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", + "dev": true, + "license": "MIT" }, "node_modules/es-object-atoms": { "version": "1.0.0", @@ -8013,10 +7994,11 @@ } }, "node_modules/escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -8644,20 +8626,6 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, - "node_modules/eslint/node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/eslint/node_modules/doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", @@ -8761,42 +8729,6 @@ "js-yaml": "bin/js-yaml.js" } }, - "node_modules/eslint/node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/eslint/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/espree": { "version": "9.4.1", "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz", @@ -8901,6 +8833,7 @@ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -8916,6 +8849,7 @@ "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.8.x" } @@ -8943,56 +8877,6 @@ "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, - "node_modules/execa/node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/execa/node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/execa/node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/execa/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/exit": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", @@ -9007,6 +8891,7 @@ "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-1.2.2.tgz", "integrity": "sha512-rtmc+cjLZqnu9dSYosX9EWmSJhTwpACgJQTfj4hgg2JjOD/6SIQalZrt4a3aQeh++oNxkazcaxrhPUj6+g5G/Q==", "dev": true, + "license": "MIT", "dependencies": { "os-homedir": "^1.0.1" }, @@ -9037,37 +8922,38 @@ "dev": true }, "node_modules/express": { - "version": "4.19.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", - "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", "dev": true, + "license": "MIT", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.2", + "body-parser": "1.20.3", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.6.0", + "cookie": "0.7.1", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "1.2.0", + "finalhandler": "1.3.1", "fresh": "0.5.2", "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", + "merge-descriptors": "1.0.3", "methods": "~1.1.2", "on-finished": "2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", + "path-to-regexp": "0.1.12", "proxy-addr": "~2.0.7", - "qs": "6.11.0", + "qs": "6.13.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", + "send": "0.19.0", + "serve-static": "1.16.2", "setprototypeof": "1.2.0", "statuses": "2.0.1", "type-is": "~1.6.18", @@ -9076,6 +8962,10 @@ }, "engines": { "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/express/node_modules/array-flatten": { @@ -9084,15 +8974,6 @@ "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", "dev": true }, - "node_modules/express/node_modules/cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/express/node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -9189,6 +9070,13 @@ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true }, + "node_modules/fast-uri": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.3.tgz", + "integrity": "sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==", + "dev": true, + "license": "BSD-3-Clause" + }, "node_modules/fastest-levenshtein": { "version": "1.0.16", "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", @@ -9288,13 +9176,14 @@ } }, "node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", "dev": true, + "license": "MIT", "dependencies": { "debug": "2.6.9", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "on-finished": "2.4.1", "parseurl": "~1.3.3", @@ -9310,6 +9199,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, + "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -9318,23 +9208,128 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", + "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", + "dev": true, + "license": "MIT", + "dependencies": { + "common-path-prefix": "^3.0.0", + "pkg-dir": "^7.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-cache-dir/node_modules/find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", "dev": true, + "license": "MIT", "dependencies": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" }, "engines": { - "node": ">=8" + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-cache-dir/node_modules/locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-locate": "^6.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-cache-dir/node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-cache-dir/node_modules/p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "dev": true, + "license": "MIT", + "dependencies": { + "p-limit": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-cache-dir/node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/find-cache-dir/node_modules/pkg-dir": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", + "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", + "dev": true, + "license": "MIT", + "dependencies": { + "find-up": "^6.3.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-cache-dir/node_modules/yocto-queue": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz", + "integrity": "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.20" }, "funding": { - "url": "https://github.com/avajs/find-cache-dir?sponsor=1" + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/find-file-up": { @@ -9342,6 +9337,7 @@ "resolved": "https://registry.npmjs.org/find-file-up/-/find-file-up-0.1.3.tgz", "integrity": "sha512-mBxmNbVyjg1LQIIpgO8hN+ybWBgDQK8qjht+EbrTCGmmPV/sc7RF1i9stPTD6bpvXZywBdrwRYxhSdJv867L6A==", "dev": true, + "license": "MIT", "dependencies": { "fs-exists-sync": "^0.1.0", "resolve-dir": "^0.1.0" @@ -9361,6 +9357,7 @@ "resolved": "https://registry.npmjs.org/find-pkg/-/find-pkg-0.1.2.tgz", "integrity": "sha512-0rnQWcFwZr7eO0513HahrWafsc3CTFioEB7DRiEYCUM/70QXSY8f3mCST17HXLcPvEhzH/Ty/Bxd72ZZsr/yvw==", "dev": true, + "license": "MIT", "dependencies": { "find-file-up": "^0.1.2" }, @@ -9373,6 +9370,7 @@ "resolved": "https://registry.npmjs.org/find-process/-/find-process-1.4.7.tgz", "integrity": "sha512-/U4CYp1214Xrp3u3Fqr9yNynUrr5Le4y0SsJh2lMDDSbpwYSz3M2SMWQC+wqcx79cN8PQtHQIL8KnuY9M66fdg==", "dev": true, + "license": "MIT", "dependencies": { "chalk": "^4.0.0", "commander": "^5.1.0", @@ -9436,10 +9434,11 @@ } }, "node_modules/flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", - "dev": true + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz", + "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==", + "dev": true, + "license": "ISC" }, "node_modules/follow-redirects": { "version": "1.15.6", @@ -9532,21 +9531,17 @@ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } }, - "node_modules/fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "dev": true - }, "node_modules/fs-exists-sync": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz", "integrity": "sha512-cR/vflFyPZtrN6b38ZyWxpWdhlXrzZEBawlpBQMq7033xVY7/kg0GDMBK5jg8lDYQckdJ5x/YC88lM3C7VMsLg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -9750,16 +9745,6 @@ "node": ">= 14" } }, - "node_modules/gettext-parser": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/gettext-parser/-/gettext-parser-1.4.0.tgz", - "integrity": "sha512-sedZYLHlHeBop/gZ1jdg59hlUEcpcZJofLq2JFwJT1zTqAU3l2wFv6IsuwFHGqbiT9DWzMUW4/em2+hspnmMMA==", - "dev": true, - "dependencies": { - "encoding": "^0.1.12", - "safe-buffer": "^5.1.1" - } - }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -9796,13 +9781,15 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true + "dev": true, + "license": "BSD-2-Clause" }, "node_modules/global-modules": { "version": "0.2.3", "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-0.2.3.tgz", "integrity": "sha512-JeXuCbvYzYXcwE6acL9V2bAOeSIGl4dD+iwLY9iUx2VBJJ80R18HCn+JCwHM9Oegdfya3lEkGCdaRkSyc10hDA==", "dev": true, + "license": "MIT", "dependencies": { "global-prefix": "^0.1.4", "is-windows": "^0.2.0" @@ -9816,6 +9803,7 @@ "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-0.1.5.tgz", "integrity": "sha512-gOPiyxcD9dJGCEArAhF4Hd0BAqvAe/JzERP7tYumE4yIkmIedPUVXcJFWbV3/p/ovIIvKjkrTk+f1UVkq7vvbw==", "dev": true, + "license": "MIT", "dependencies": { "homedir-polyfill": "^1.0.0", "ini": "^1.3.4", @@ -9826,6 +9814,19 @@ "node": ">=0.10.0" } }, + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, "node_modules/globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", @@ -9875,7 +9876,8 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz", "integrity": "sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/gopd": { "version": "1.0.1", @@ -9890,10 +9892,11 @@ } }, "node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true, + "license": "ISC" }, "node_modules/grapheme-splitter": { "version": "1.0.4", @@ -10033,6 +10036,7 @@ "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", "integrity": "sha512-eSmmWE5bZTK2Nou4g0AI3zZ9rswp7GRKoKXS1BLUkvPviOqs4YTN1djQIqrXy9k5gEtdLPy86JjRwsNM9tnDcA==", "dev": true, + "license": "MIT", "dependencies": { "parse-passwd": "^1.0.0" }, @@ -10129,10 +10133,11 @@ "dev": true }, "node_modules/html-tags": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.2.0.tgz", - "integrity": "sha512-vy7ClnArOZwCnqZgvv+ddgHgJiAFXe3Ge9ML5/mBctVJoUoYPCdxVucOywjDARn6CVoh3dRSFdPHy2sX80L0Wg==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", + "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -10151,6 +10156,7 @@ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", "dev": true, + "license": "MIT", "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", @@ -10167,6 +10173,7 @@ "resolved": "https://registry.npmjs.org/http-link-header/-/http-link-header-1.1.3.tgz", "integrity": "sha512-3cZ0SRL8fb9MUlU3mKM61FcQvPfXx2dBrZW3Vbg5CXa8jFlK8OaEpePenLe1oEXQduhz8b0QjsqfS59QP4AJDQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.0.0" } @@ -10206,10 +10213,11 @@ } }, "node_modules/http-proxy-middleware": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", - "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.7.tgz", + "integrity": "sha512-fgVY8AV7qU7z/MmXJ/rxwbrtQH4jBQ9m7kp3llF0liB7glmFeVZFBepQb32T3y8n8k2+AEYuMPCpinYW+/CuRA==", "dev": true, + "license": "MIT", "dependencies": { "@types/http-proxy": "^1.17.8", "http-proxy": "^1.18.1", @@ -10320,7 +10328,15 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/image-ssim/-/image-ssim-0.2.0.tgz", "integrity": "sha512-W7+sO6/yhxy83L0G7xR8YAc5Z5QFtYEXXRV6EaE8tuYBZJnA3gVgp3q7X7muhLZVodeb9UfvjSbwt9VJwjIYAg==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "dev": true, + "license": "MIT" }, "node_modules/immutable": { "version": "4.2.4", @@ -10344,15 +10360,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/import-lazy": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", - "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/import-local": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", @@ -10410,7 +10417,8 @@ "version": "1.3.8", "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz", "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/internal-slot": { "version": "1.0.7", @@ -10436,21 +10444,18 @@ } }, "node_modules/intl-messageformat": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-4.4.0.tgz", - "integrity": "sha512-z+Bj2rS3LZSYU4+sNitdHrwnBhr0wO80ZJSW8EzKDBowwUe3Q/UsvgCGjrwa+HPzoGCLEb9HAjfJgo4j2Sac8w==", + "version": "10.7.10", + "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-10.7.10.tgz", + "integrity": "sha512-hp7iejCBiJdW3zmOe18FdlJu8U/JsADSDiBPQhfdSeI8B9POtvPRvPh3nMlvhYayGMKLv6maldhR7y3Pf1vkpw==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "intl-messageformat-parser": "^1.8.1" + "@formatjs/ecma402-abstract": "2.3.1", + "@formatjs/fast-memoize": "2.2.5", + "@formatjs/icu-messageformat-parser": "2.9.7", + "tslib": "2" } }, - "node_modules/intl-messageformat-parser": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/intl-messageformat-parser/-/intl-messageformat-parser-1.8.1.tgz", - "integrity": "sha512-IMSCKVf0USrM/959vj3xac7s8f87sc+80Y/ipBzdKy4ifBv5Gsj2tZ41EAaURVg01QU71fYr77uA8Meh6kELbg==", - "deprecated": "We've written a new parser that's 6x faster and is backwards compatible. Please use @formatjs/icu-messageformat-parser", - "dev": true - }, "node_modules/ip-address": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", @@ -10793,6 +10798,7 @@ "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -10961,7 +10967,8 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", "integrity": "sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/is-unicode-supported": { "version": "0.1.0", @@ -11020,6 +11027,7 @@ "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-0.2.0.tgz", "integrity": "sha512-n67eJYmXbniZB7RF4I/FTjK1s6RPOCTxhYrVYLRaCt3lF0mpWZPKr3T2LSZAqyjQsxR2qMmGYXXzK0YWwcPM1Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -11046,7 +11054,8 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/isobject": { "version": "3.0.1", @@ -11343,18 +11352,19 @@ } }, "node_modules/jest-dev-server": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/jest-dev-server/-/jest-dev-server-9.0.2.tgz", - "integrity": "sha512-Zc/JB0IlNNrpXkhBw+h86cGrde/Mey52KvF+FER2eyrtYJTHObOwW7Iarxm3rPyTKby5+3Y2QZtl8pRz/5GCxg==", + "version": "10.1.4", + "resolved": "https://registry.npmjs.org/jest-dev-server/-/jest-dev-server-10.1.4.tgz", + "integrity": "sha512-bGQ6sedNGtT6AFHhCVqGTXMPz7UyJi/ZrhNBgyqsP0XU9N8acCEIfqZEA22rOaZ+NdEVsaltk6tL7UT6aXfI7w==", "dev": true, + "license": "MIT", "dependencies": { "chalk": "^4.1.2", "cwd": "^0.10.0", "find-process": "^1.4.7", "prompts": "^2.4.2", - "spawnd": "^9.0.2", + "spawnd": "^10.1.4", "tree-kill": "^1.2.2", - "wait-on": "^7.2.0" + "wait-on": "^8.0.1" }, "engines": { "node": ">=16" @@ -11868,6 +11878,7 @@ "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", @@ -11882,6 +11893,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -11893,14 +11905,15 @@ } }, "node_modules/joi": { - "version": "17.11.0", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.11.0.tgz", - "integrity": "sha512-NgB+lZLNoqISVy1rZocE9PZI36bL/77ie924Ri43yEvi9GUUMPeyVIr8KdFTMUlby1p0PBYMk9spIxEUQYqrJQ==", + "version": "17.13.3", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.3.tgz", + "integrity": "sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "@hapi/hoek": "^9.0.0", - "@hapi/topo": "^5.0.0", - "@sideway/address": "^4.1.3", + "@hapi/hoek": "^9.3.0", + "@hapi/topo": "^5.1.0", + "@sideway/address": "^4.1.5", "@sideway/formula": "^3.0.1", "@sideway/pinpoint": "^2.0.0" } @@ -11909,13 +11922,15 @@ "version": "0.4.4", "resolved": "https://registry.npmjs.org/jpeg-js/-/jpeg-js-0.4.4.tgz", "integrity": "sha512-WZzeDOEtTOBK4Mdsar0IqEU5sMr3vSV2RqkAIzUEV2BHnUfKGyswWFPFwK5EeDo93K3FohSHbLAjj0s1Wzd+dg==", - "dev": true + "dev": true, + "license": "BSD-3-Clause" }, "node_modules/js-library-detector": { "version": "6.7.0", "resolved": "https://registry.npmjs.org/js-library-detector/-/js-library-detector-6.7.0.tgz", "integrity": "sha512-c80Qupofp43y4cJ7+8TTDN/AsDwLi5oOm/plBrWI+iQt485vKXCco+yVmOwEgdo9VOdsYTuV0UlTeetVPTriXA==", "dev": true, + "license": "MIT", "engines": { "node": ">=12" } @@ -12010,17 +12025,25 @@ } }, "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", "dev": true, + "license": "MIT", "bin": { "jsesc": "bin/jsesc" }, "engines": { - "node": ">=4" + "node": ">=6" } }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true, + "license": "MIT" + }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", @@ -12099,6 +12122,16 @@ "node": ">=4.0" } }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, "node_modules/kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", @@ -12130,10 +12163,11 @@ } }, "node_modules/known-css-properties": { - "version": "0.26.0", - "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.26.0.tgz", - "integrity": "sha512-5FZRzrZzNTBruuurWpvZnvP9pum+fe0HcK8z/ooo+U+Hmp4vtbyp1/QDsqmufirXy4egGzbaH/y2uCZf+6W5Kg==", - "dev": true + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.35.0.tgz", + "integrity": "sha512-a/RAk2BfKk+WFGhhOCAYqSiFLc34k8Mt/6NWRI4joER0EYUzXIcFivjjnoD3+XU1DggLn/tZc3DOAgke7l8a4A==", + "dev": true, + "license": "MIT" }, "node_modules/language-subtag-registry": { "version": "0.3.23", @@ -12194,36 +12228,48 @@ "node": ">= 0.8.0" } }, + "node_modules/lie": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz", + "integrity": "sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==", + "dev": true, + "license": "MIT", + "dependencies": { + "immediate": "~3.0.5" + } + }, "node_modules/lighthouse": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/lighthouse/-/lighthouse-10.4.0.tgz", - "integrity": "sha512-XQWHEWkJ8YxSPsxttBJORy5+hQrzbvGkYfeP3fJjyYKioWkF2MXfFqNK4ZuV4jL8pBu7Z91qnQP6In0bq1yXww==", + "version": "12.3.0", + "resolved": "https://registry.npmjs.org/lighthouse/-/lighthouse-12.3.0.tgz", + "integrity": "sha512-OaLE8DasnwQkn2CBo2lKtD+IQv42mNP3T+Vaw29I++rAh0Zpgc6SM15usdIYyzhRMR5EWFxze5Fyb+HENJSh2A==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "@sentry/node": "^6.17.4", - "axe-core": "4.7.2", - "chrome-launcher": "^0.15.2", + "@paulirish/trace_engine": "0.0.39", + "@sentry/node": "^7.0.0", + "axe-core": "^4.10.2", + "chrome-launcher": "^1.1.2", "configstore": "^5.0.1", "csp_evaluator": "1.1.1", - "devtools-protocol": "0.0.1155343", + "devtools-protocol": "0.0.1312386", "enquirer": "^2.3.6", "http-link-header": "^1.1.1", - "intl-messageformat": "^4.4.0", + "intl-messageformat": "^10.5.3", "jpeg-js": "^0.4.4", - "js-library-detector": "^6.6.0", - "lighthouse-logger": "^1.4.1", - "lighthouse-stack-packs": "1.11.0", - "lodash": "^4.17.21", + "js-library-detector": "^6.7.0", + "lighthouse-logger": "^2.0.1", + "lighthouse-stack-packs": "1.12.2", + "lodash-es": "^4.17.21", "lookup-closest-locale": "6.2.0", "metaviewport-parser": "0.3.0", "open": "^8.4.0", "parse-cache-control": "1.0.1", - "ps-list": "^8.0.0", - "puppeteer-core": "^20.8.0", - "robots-parser": "^3.0.0", + "puppeteer-core": "^23.10.4", + "robots-parser": "^3.0.1", "semver": "^5.3.0", "speedline-core": "^1.4.3", - "third-party-web": "^0.23.3", + "third-party-web": "^0.26.1", + "tldts-icann": "^6.1.16", "ws": "^7.0.0", "yargs": "^17.3.1", "yargs-parser": "^21.0.0" @@ -12234,14 +12280,15 @@ "smokehouse": "cli/test/smokehouse/frontends/smokehouse-bin.js" }, "engines": { - "node": ">=16.16" + "node": ">=18.16" } }, "node_modules/lighthouse-logger": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/lighthouse-logger/-/lighthouse-logger-1.4.2.tgz", - "integrity": "sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/lighthouse-logger/-/lighthouse-logger-2.0.1.tgz", + "integrity": "sha512-ioBrW3s2i97noEmnXxmUq7cjIcVRjT5HBpAYy8zE11CxU9HqlWHHeRxfeN1tn8F7OEMVPIC9x1f8t3Z7US9ehQ==", "dev": true, + "license": "Apache-2.0", "dependencies": { "debug": "^2.6.9", "marky": "^1.2.2" @@ -12252,6 +12299,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, + "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -12260,146 +12308,39 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/lighthouse-stack-packs": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/lighthouse-stack-packs/-/lighthouse-stack-packs-1.11.0.tgz", - "integrity": "sha512-sRr0z1S/I26VffRLq9KJsKtLk856YrJlNGmcJmbLX8dFn3MuzVPUbstuChEhqnSxZb8TZmVfthuXuwhG9vRoSw==", - "dev": true - }, - "node_modules/lighthouse/node_modules/axe-core": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.2.tgz", - "integrity": "sha512-zIURGIS1E1Q4pcrMjp+nnEh+16G56eG/MUllJH8yEvw7asDo7Ac9uhC9KIH5jzpITueEZolfYglnCGIuSBz39g==", "dev": true, - "engines": { - "node": ">=4" - } + "license": "MIT" }, - "node_modules/lighthouse/node_modules/cross-fetch": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", - "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", + "node_modules/lighthouse-stack-packs": { + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/lighthouse-stack-packs/-/lighthouse-stack-packs-1.12.2.tgz", + "integrity": "sha512-Ug8feS/A+92TMTCK6yHYLwaFMuelK/hAKRMdldYkMNwv+d9PtWxjXEg6rwKtsUXTADajhdrhXyuNCJ5/sfmPFw==", "dev": true, - "dependencies": { - "node-fetch": "^2.6.12" - } + "license": "Apache-2.0" }, "node_modules/lighthouse/node_modules/devtools-protocol": { - "version": "0.0.1155343", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1155343.tgz", - "integrity": "sha512-oD9vGBV2wTc7fAzAM6KC0chSgs234V8+qDEeK+mcbRj2UvcuA7lgBztGi/opj/iahcXD3BSj8Ymvib628yy9FA==", - "dev": true - }, - "node_modules/lighthouse/node_modules/node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "dev": true, - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/lighthouse/node_modules/puppeteer-core": { - "version": "20.9.0", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-20.9.0.tgz", - "integrity": "sha512-H9fYZQzMTRrkboEfPmf7m3CLDN6JvbxXA3qTtS+dFt27tR+CsFHzPsT6pzp6lYL6bJbAPaR0HaPO6uSi+F94Pg==", - "dev": true, - "dependencies": { - "@puppeteer/browsers": "1.4.6", - "chromium-bidi": "0.4.16", - "cross-fetch": "4.0.0", - "debug": "4.3.4", - "devtools-protocol": "0.0.1147663", - "ws": "8.13.0" - }, - "engines": { - "node": ">=16.3.0" - }, - "peerDependencies": { - "typescript": ">= 4.7.4" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/lighthouse/node_modules/puppeteer-core/node_modules/devtools-protocol": { - "version": "0.0.1147663", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1147663.tgz", - "integrity": "sha512-hyWmRrexdhbZ1tcJUGpO95ivbRhWXz++F4Ko+n21AY5PNln2ovoJw+8ZMNDTtip+CNFQfrtLVh/w4009dXO/eQ==", - "dev": true - }, - "node_modules/lighthouse/node_modules/puppeteer-core/node_modules/ws": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", - "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", + "version": "0.0.1312386", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1312386.tgz", + "integrity": "sha512-DPnhUXvmvKT2dFA/j7B+riVLUt9Q6RKJlcppojL5CoRywJJKLDYnRlw0gTFKfgDPHP5E04UoB71SxoJlVZy8FA==", "dev": true, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } + "license": "BSD-3-Clause" }, "node_modules/lighthouse/node_modules/semver": { "version": "5.7.2", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, + "license": "ISC", "bin": { "semver": "bin/semver" } }, - "node_modules/lighthouse/node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true - }, - "node_modules/lighthouse/node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true - }, - "node_modules/lighthouse/node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, "node_modules/lighthouse/node_modules/ws": { "version": "7.5.10", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8.3.0" }, @@ -12421,6 +12362,7 @@ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", "dev": true, + "license": "ISC", "engines": { "node": ">=12" } @@ -12454,6 +12396,7 @@ "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", "dev": true, + "license": "MIT", "engines": { "node": ">=6.11.5" } @@ -12472,6 +12415,16 @@ "node": ">=8.9.0" } }, + "node_modules/localforage": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/localforage/-/localforage-1.10.0.tgz", + "integrity": "sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "lie": "3.1.1" + } + }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -12493,6 +12446,13 @@ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, + "node_modules/lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", + "dev": true, + "license": "MIT" + }, "node_modules/lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", @@ -12515,7 +12475,8 @@ "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.uniq": { "version": "4.5.0", @@ -12543,7 +12504,8 @@ "version": "6.2.0", "resolved": "https://registry.npmjs.org/lookup-closest-locale/-/lookup-closest-locale-6.2.0.tgz", "integrity": "sha512-/c2kL+Vnp1jnV6K6RpDTHK3dgg0Tu2VVp+elEiJpjfS1UyY7AjOYHohRug6wT0OpoX2qFgNORndE9RqesfVxWQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/loose-envify": { "version": "1.4.0", @@ -12566,12 +12528,6 @@ "tslib": "^2.0.3" } }, - "node_modules/lru_map": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz", - "integrity": "sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==", - "dev": true - }, "node_modules/lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -12586,6 +12542,7 @@ "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", "dev": true, + "license": "MIT", "dependencies": { "semver": "^6.0.0" }, @@ -12739,13 +12696,15 @@ "version": "1.2.5", "resolved": "https://registry.npmjs.org/marky/-/marky-1.2.5.tgz", "integrity": "sha512-q9JtQJKjpsVxCRVgQ+WapguSbKC3SQ5HEzFGPAJMStgh3QjCawp00UKv3MTTAArTmGmmPUvllHZoNbZ3gs0I+Q==", - "dev": true + "dev": true, + "license": "Apache-2.0" }, "node_modules/mathml-tag-names": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz", "integrity": "sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==", "dev": true, + "license": "MIT", "funding": { "type": "github", "url": "https://github.com/sponsors/wooorm" @@ -12768,6 +12727,7 @@ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -12784,12 +12744,6 @@ "node": ">= 4.0.0" } }, - "node_modules/memize": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/memize/-/memize-2.1.0.tgz", - "integrity": "sha512-yywVJy8ctVlN5lNPxsep5urnZ6TTclwPEyigM9M3Bi8vseJBOfqNrGWN/r8NzuIt3PovM323W04blJfGQfQSVg==", - "dev": true - }, "node_modules/meow": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", @@ -12903,10 +12857,14 @@ } }, "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", - "dev": true + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/merge-stream": { "version": "2.0.0", @@ -12927,7 +12885,8 @@ "version": "0.3.0", "resolved": "https://registry.npmjs.org/metaviewport-parser/-/metaviewport-parser-0.3.0.tgz", "integrity": "sha512-EoYJ8xfjQ6kpe9VbVHvZTZHiOl4HL1Z18CrZ+qahvLXT7ZO4YTC2JMyt5FaUp9JJp6J4Ybb/z7IsCXZt86/QkQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/methods": { "version": "1.1.2", @@ -12939,12 +12898,13 @@ } }, "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, + "license": "MIT", "dependencies": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" }, "engines": { @@ -13003,12 +12963,14 @@ } }, "node_modules/mini-css-extract-plugin": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.2.tgz", - "integrity": "sha512-EdlUizq13o0Pd+uCp+WO/JpkLvHRVGt97RqfeGhXqAcorYo1ypJSpkV+WDT0vY/kmh/p7wRdJNJtuyK540PXDw==", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.2.tgz", + "integrity": "sha512-GJuACcS//jtq4kCtd5ii/M0SZf7OZRH+BxdqXZHaJfb8TJiVl+NgQRPwiYt2EuqeSkNydn/7vP+bcE27C5mb9w==", "dev": true, + "license": "MIT", "dependencies": { - "schema-utils": "^4.0.0" + "schema-utils": "^4.0.0", + "tapable": "^2.2.1" }, "engines": { "node": ">= 12.13.0" @@ -13022,15 +12984,16 @@ } }, "node_modules/mini-css-extract-plugin/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, + "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "require-from-string": "^2.0.2" }, "funding": { "type": "github", @@ -13042,6 +13005,7 @@ "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", "dev": true, + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3" }, @@ -13053,21 +13017,23 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/mini-css-extract-plugin/node_modules/schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz", + "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==", "dev": true, + "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", + "ajv": "^8.9.0", "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" + "ajv-keywords": "^5.1.0" }, "engines": { - "node": ">= 12.13.0" + "node": ">= 10.13.0" }, "funding": { "type": "opencollective", @@ -13133,12 +13099,6 @@ "node": ">=0.10.0" } }, - "node_modules/mitt": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.0.tgz", - "integrity": "sha512-7dX2/10ITVyqh4aOSVI9gdape+t9l2/8QxHrFmUXu4EEUpdlxl6RudZUPZoc+zuY2hk1j7XxVroIVIan/pD/SQ==", - "dev": true - }, "node_modules/mixin-object": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/mixin-object/-/mixin-object-2.0.1.tgz", @@ -13161,12 +13121,6 @@ "node": ">=0.10.0" } }, - "node_modules/mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "dev": true - }, "node_modules/mrmime": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", @@ -13196,9 +13150,9 @@ } }, "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", "dev": true, "funding": [ { @@ -13206,6 +13160,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -13232,7 +13187,8 @@ "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/netmask": { "version": "2.0.2", @@ -13253,48 +13209,6 @@ "tslib": "^2.0.3" } }, - "node_modules/node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "dev": true, - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/node-fetch/node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true - }, - "node_modules/node-fetch/node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true - }, - "node_modules/node-fetch/node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, "node_modules/node-forge": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", @@ -13311,10 +13225,11 @@ "dev": true }, "node_modules/node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", - "dev": true + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "dev": true, + "license": "MIT" }, "node_modules/normalize-package-data": { "version": "2.5.0", @@ -13703,6 +13618,7 @@ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", "dev": true, + "license": "MIT", "dependencies": { "ee-first": "1.1.1" }, @@ -13791,6 +13707,7 @@ "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", "integrity": "sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -13857,32 +13774,31 @@ } }, "node_modules/pac-proxy-agent": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.0.1.tgz", - "integrity": "sha512-ASV8yU4LLKBAjqIPMbrgtaKIvxQri/yh2OpI+S6hVa9JRkUI3Y3NPFbfngDtY7oFtSMD3w31Xns89mDa3Feo5A==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.1.0.tgz", + "integrity": "sha512-Z5FnLVVZSnX7WjBg0mhDtydeRZ1xMcATZThjySQUHqr+0ksP8kqaw23fNKkaaN/Z8gwLUs/W7xdl0I75eP2Xyw==", "dev": true, + "license": "MIT", "dependencies": { "@tootallnate/quickjs-emscripten": "^0.23.0", - "agent-base": "^7.0.2", + "agent-base": "^7.1.2", "debug": "^4.3.4", "get-uri": "^6.0.1", "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.2", - "pac-resolver": "^7.0.0", - "socks-proxy-agent": "^8.0.2" + "https-proxy-agent": "^7.0.6", + "pac-resolver": "^7.0.1", + "socks-proxy-agent": "^8.0.5" }, "engines": { "node": ">= 14" } }, "node_modules/pac-proxy-agent/node_modules/agent-base": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", + "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", "dev": true, - "dependencies": { - "debug": "^4.3.4" - }, + "license": "MIT", "engines": { "node": ">= 14" } @@ -13901,12 +13817,13 @@ } }, "node_modules/pac-proxy-agent/node_modules/https-proxy-agent": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", - "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", "dev": true, + "license": "MIT", "dependencies": { - "agent-base": "^7.0.2", + "agent-base": "^7.1.2", "debug": "4" }, "engines": { @@ -13977,6 +13894,7 @@ "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", "integrity": "sha512-1Y1A//QUXEZK7YKz+rD9WydcE1+EuPr6ZBgKecAB8tmoW6UFv0NREVJe1p+jRxtThkcbbKkfwIbWJe/IeE6m2Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -14062,10 +13980,11 @@ "dev": true }, "node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", - "dev": true + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "dev": true, + "license": "MIT" }, "node_modules/path-type": { "version": "4.0.0", @@ -14083,10 +14002,11 @@ "dev": true }, "node_modules/picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", - "dev": true + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" }, "node_modules/picomatch": { "version": "2.3.1", @@ -14228,9 +14148,9 @@ } }, "node_modules/postcss": { - "version": "8.4.38", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", - "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", + "version": "8.4.49", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", + "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", "dev": true, "funding": [ { @@ -14246,10 +14166,11 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { "nanoid": "^3.3.7", - "picocolors": "^1.0.0", - "source-map-js": "^1.2.0" + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" }, "engines": { "node": "^10 || ^12 || >=14" @@ -14898,25 +14819,37 @@ } }, "node_modules/postcss-resolve-nested-selector": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz", - "integrity": "sha512-HvExULSwLqHLgUy1rl3ANIqCsvMS0WHss2UOsXhXnQaZ9VCc2oBvIpXrl00IUFT5ZDITME0o6oiXeiHr2SAIfw==", - "dev": true + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.6.tgz", + "integrity": "sha512-0sglIs9Wmkzbr8lQwEyIzlDOOC9bGmfVKcJTaxv3vMmd3uo4o4DerC3En0bnmgceeql9BfC8hRkp7cg0fjdVqw==", + "dev": true, + "license": "MIT" }, "node_modules/postcss-safe-parser": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz", - "integrity": "sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-7.0.1.tgz", + "integrity": "sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss-safe-parser" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", "engines": { - "node": ">=12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" + "node": ">=18.0" }, "peerDependencies": { - "postcss": "^8.3.3" + "postcss": "^8.4.31" } }, "node_modules/postcss-scss": { @@ -15122,42 +15055,127 @@ "node": ">= 0.10" } }, - "node_modules/proxy-agent": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.3.0.tgz", - "integrity": "sha512-0LdR757eTj/JfuU7TL2YCuAZnxWXu3tkJbg4Oq3geW/qFNT/32T0sp2HnZ9O0lMR4q3vwAt0+xCA8SR0WAD0og==", + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "dev": true + }, + "node_modules/psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "dev": true + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", "dev": true, "dependencies": { - "agent-base": "^7.0.2", - "debug": "^4.3.4", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.0", - "lru-cache": "^7.14.1", - "pac-proxy-agent": "^7.0.0", - "proxy-from-env": "^1.1.0", - "socks-proxy-agent": "^8.0.1" + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/puppeteer-core": { + "version": "23.10.4", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-23.10.4.tgz", + "integrity": "sha512-pQAY7+IFAndWDkDodsQGguW1/ifV5OMlGXJDspwtK49Asb7poJZ/V5rXJxVSpq57bWrJasjQBZ1X27z1oWVq4Q==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "@puppeteer/browsers": "2.6.1", + "chromium-bidi": "0.8.0", + "debug": "^4.4.0", + "devtools-protocol": "0.0.1367902", + "typed-query-selector": "^2.12.0", + "ws": "^8.18.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/puppeteer-core/node_modules/@puppeteer/browsers": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.6.1.tgz", + "integrity": "sha512-aBSREisdsGH890S2rQqK82qmQYU3uFpSH8wcZWHgHzl3LfzsxAKbLNiAG9mO8v1Y0UICBeClICxPJvyr0rcuxg==", + "dev": true, + "license": "Apache-2.0", + "dependencies": { + "debug": "^4.4.0", + "extract-zip": "^2.0.1", + "progress": "^2.0.3", + "proxy-agent": "^6.5.0", + "semver": "^7.6.3", + "tar-fs": "^3.0.6", + "unbzip2-stream": "^1.4.3", + "yargs": "^17.7.2" + }, + "bin": { + "browsers": "lib/cjs/main-cli.js" }, + "engines": { + "node": ">=18" + } + }, + "node_modules/puppeteer-core/node_modules/agent-base": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", + "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", + "dev": true, + "license": "MIT", "engines": { "node": ">= 14" } }, - "node_modules/proxy-agent/node_modules/agent-base": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "node_modules/puppeteer-core/node_modules/chromium-bidi": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.8.0.tgz", + "integrity": "sha512-uJydbGdTw0DEUjhoogGveneJVWX/9YuqkWePzMmkBYwtdAqo5d3J/ovNKFr+/2hWXYmYCr6it8mSSTIj6SS6Ug==", "dev": true, + "license": "Apache-2.0", "dependencies": { - "debug": "^4.3.4" + "mitt": "3.0.1", + "urlpattern-polyfill": "10.0.0", + "zod": "3.23.8" + }, + "peerDependencies": { + "devtools-protocol": "*" + } + }, + "node_modules/puppeteer-core/node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" }, "engines": { - "node": ">= 14" + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } } }, - "node_modules/proxy-agent/node_modules/http-proxy-agent": { + "node_modules/puppeteer-core/node_modules/http-proxy-agent": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", "dev": true, + "license": "MIT", "dependencies": { "agent-base": "^7.1.0", "debug": "^4.3.4" @@ -15166,134 +15184,75 @@ "node": ">= 14" } }, - "node_modules/proxy-agent/node_modules/https-proxy-agent": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", - "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", + "node_modules/puppeteer-core/node_modules/https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", "dev": true, + "license": "MIT", "dependencies": { - "agent-base": "^7.0.2", + "agent-base": "^7.1.2", "debug": "4" }, "engines": { "node": ">= 14" } }, - "node_modules/proxy-agent/node_modules/lru-cache": { + "node_modules/puppeteer-core/node_modules/lru-cache": { "version": "7.18.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "dev": true, + "license": "ISC", "engines": { "node": ">=12" } }, - "node_modules/proxy-from-env": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", - "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", - "dev": true - }, - "node_modules/ps-list": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/ps-list/-/ps-list-8.1.1.tgz", - "integrity": "sha512-OPS9kEJYVmiO48u/B9qneqhkMvgCxT+Tm28VCEJpheTpl8cJ0ffZRRNgS5mrQRTrX5yRTpaJ+hRDeefXYmmorQ==", - "dev": true, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==", - "dev": true - }, - "node_modules/psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", - "dev": true - }, - "node_modules/pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "node_modules/puppeteer-core/node_modules/mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", "dev": true, - "dependencies": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } + "license": "MIT" }, - "node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "node_modules/puppeteer-core/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true, - "engines": { - "node": ">=6" - } + "license": "MIT" }, - "node_modules/puppeteer-core": { - "version": "13.7.0", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-13.7.0.tgz", - "integrity": "sha512-rXja4vcnAzFAP1OVLq/5dWNfwBGuzcOARJ6qGV7oAZhnLmVRU8G5MsdeQEAOy332ZhkIOnn9jp15R89LKHyp2Q==", + "node_modules/puppeteer-core/node_modules/proxy-agent": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.5.0.tgz", + "integrity": "sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==", "dev": true, + "license": "MIT", "dependencies": { - "cross-fetch": "3.1.5", - "debug": "4.3.4", - "devtools-protocol": "0.0.981744", - "extract-zip": "2.0.1", - "https-proxy-agent": "5.0.1", - "pkg-dir": "4.2.0", - "progress": "2.0.3", - "proxy-from-env": "1.1.0", - "rimraf": "3.0.2", - "tar-fs": "2.1.1", - "unbzip2-stream": "1.4.3", - "ws": "8.5.0" + "agent-base": "^7.1.2", + "debug": "^4.3.4", + "http-proxy-agent": "^7.0.1", + "https-proxy-agent": "^7.0.6", + "lru-cache": "^7.14.1", + "pac-proxy-agent": "^7.1.0", + "proxy-from-env": "^1.1.0", + "socks-proxy-agent": "^8.0.5" }, "engines": { - "node": ">=10.18.1" + "node": ">= 14" } }, - "node_modules/puppeteer-core/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "node_modules/puppeteer-core/node_modules/semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, + "license": "ISC", "bin": { - "rimraf": "bin.js" + "semver": "bin/semver.js" }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/puppeteer-core/node_modules/ws": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", - "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", - "dev": true, "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } + "node": ">=10" } }, "node_modules/pure-rand": { @@ -15313,12 +15272,13 @@ ] }, "node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { - "side-channel": "^1.0.4" + "side-channel": "^1.0.6" }, "engines": { "node": ">=0.6" @@ -15391,6 +15351,7 @@ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", "dev": true, + "license": "MIT", "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", @@ -15406,6 +15367,7 @@ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -15415,6 +15377,7 @@ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "dev": true, + "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -15742,12 +15705,6 @@ "jsesc": "bin/jsesc" } }, - "node_modules/remove-accents": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/remove-accents/-/remove-accents-0.5.0.tgz", - "integrity": "sha512-8g3/Otx1eJaVD12e31UbJj1YzdtVvzH85HV7t+9MJYk/u3XmkOUJ5Ys9wQrf9PCPK8+xn4ymzqYCiZl6QWKn+A==", - "dev": true - }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -15833,6 +15790,7 @@ "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-0.1.1.tgz", "integrity": "sha512-QxMPqI6le2u0dCLyiGzgy92kjkkL6zO0XyvHzjdTNH3zM6e5Hz3BwG6+aEyNgiQ5Xz6PwTwgQEj3U50dByPKIA==", "dev": true, + "license": "MIT", "dependencies": { "expand-tilde": "^1.2.2", "global-modules": "^0.2.3" @@ -15895,15 +15853,17 @@ "resolved": "https://registry.npmjs.org/robots-parser/-/robots-parser-3.0.1.tgz", "integrity": "sha512-s+pyvQeIKIZ0dx5iJiQk1tPLJAWln39+MI5jtM8wnyws+G5azk+dMnMX0qfbqNetKKNgcWWOdi0sfm+FbQbgdQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=10.0.0" } }, "node_modules/rtlcss": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-4.1.1.tgz", - "integrity": "sha512-/oVHgBtnPNcggP2aVXQjSy6N1mMAfHg4GSag0QtZBlD5bdDgAHwr4pydqJGd+SUCu9260+Pjqbjwtvu7EMH1KQ==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-4.3.0.tgz", + "integrity": "sha512-FI+pHEn7Wc4NqKXMXFM+VAYKEj/mRIcW4h24YVwVtyjI+EqGrLc2Hx/Ny0lrZ21cBWU2goLy36eqMcNj3AQJig==", "dev": true, + "license": "MIT", "dependencies": { "escalade": "^3.1.1", "picocolors": "^1.0.0", @@ -16077,30 +16037,30 @@ } }, "node_modules/sass-loader": { - "version": "12.6.0", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.6.0.tgz", - "integrity": "sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA==", + "version": "16.0.4", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-16.0.4.tgz", + "integrity": "sha512-LavLbgbBGUt3wCiYzhuLLu65+fWXaXLmq7YxivLhEqmiupCFZ5sKUAipK3do6V80YSU0jvSxNhEdT13IXNr3rg==", "dev": true, + "license": "MIT", "dependencies": { - "klona": "^2.0.4", "neo-async": "^2.6.2" }, "engines": { - "node": ">= 12.13.0" + "node": ">= 18.12.0" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/webpack" }, "peerDependencies": { - "fibers": ">= 3.1.0", - "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0", + "@rspack/core": "0.x || 1.x", + "node-sass": "^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0", "sass": "^1.3.0", "sass-embedded": "*", "webpack": "^5.0.0" }, "peerDependenciesMeta": { - "fibers": { + "@rspack/core": { "optional": true }, "node-sass": { @@ -16111,6 +16071,9 @@ }, "sass-embedded": { "optional": true + }, + "webpack": { + "optional": true } } }, @@ -16173,10 +16136,11 @@ } }, "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", "dev": true, + "license": "MIT", "dependencies": { "debug": "2.6.9", "depd": "2.0.0", @@ -16201,6 +16165,7 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, + "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -16209,14 +16174,26 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true - }, - "node_modules/send/node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", "dev": true, - "bin": { + "license": "MIT" + }, + "node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/send/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "dev": true, + "license": "MIT", + "bin": { "mime": "cli.js" }, "engines": { @@ -16227,7 +16204,8 @@ "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/sentence-case": { "version": "3.0.4", @@ -16241,10 +16219,11 @@ } }, "node_modules/serialize-javascript": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", - "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "randombytes": "^2.1.0" } @@ -16328,15 +16307,16 @@ } }, "node_modules/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", "dev": true, + "license": "MIT", "dependencies": { - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.18.0" + "send": "0.19.0" }, "engines": { "node": ">= 0.8.0" @@ -16378,7 +16358,8 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/shallow-clone": { "version": "0.1.2", @@ -16417,24 +16398,26 @@ } }, "node_modules/shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, + "license": "MIT", "dependencies": { - "shebang-regex": "^1.0.0" + "shebang-regex": "^3.0.0" }, "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, "node_modules/shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true, + "license": "MIT", "engines": { - "node": ">=0.10.0" + "node": ">=8" } }, "node_modules/shell-quote": { @@ -16504,6 +16487,7 @@ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "astral-regex": "^2.0.0", @@ -16521,6 +16505,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -16531,24 +16516,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/slice-ansi/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/slice-ansi/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "node_modules/smart-buffer": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", @@ -16595,27 +16562,26 @@ } }, "node_modules/socks-proxy-agent": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.3.tgz", - "integrity": "sha512-VNegTZKhuGq5vSD6XNKlbqWhyt/40CgoEw8XxD6dhnm8Jq9IEa3nIa4HwnM8XOqU0CdB0BwWVXusqiFXfHB3+A==", + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", + "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", "dev": true, + "license": "MIT", "dependencies": { - "agent-base": "^7.1.1", + "agent-base": "^7.1.2", "debug": "^4.3.4", - "socks": "^2.7.1" + "socks": "^2.8.3" }, "engines": { "node": ">= 14" } }, "node_modules/socks-proxy-agent/node_modules/agent-base": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", + "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", "dev": true, - "dependencies": { - "debug": "^4.3.4" - }, + "license": "MIT", "engines": { "node": ">= 14" } @@ -16630,10 +16596,11 @@ } }, "node_modules/source-map-js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", - "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -16664,6 +16631,7 @@ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", "dev": true, + "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -16674,21 +16642,17 @@ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } }, - "node_modules/spawn-command": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2.tgz", - "integrity": "sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==", - "dev": true - }, "node_modules/spawnd": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/spawnd/-/spawnd-9.0.2.tgz", - "integrity": "sha512-nl8DVHEDQ57IcKakzpjanspVChkMpGLuVwMR/eOn9cXE55Qr6luD2Kn06sA0ootRMdgrU4tInN6lA6ohTNvysw==", + "version": "10.1.4", + "resolved": "https://registry.npmjs.org/spawnd/-/spawnd-10.1.4.tgz", + "integrity": "sha512-drqHc0mKJmtMsiGMOCwzlc5eZ0RPtRvT7tQAluW2A0qUc0G7TQ8KLcn3E6K5qzkLkH2UkS3nYQiVGULvvsD9dw==", "dev": true, + "license": "MIT", "dependencies": { "signal-exit": "^4.1.0", "tree-kill": "^1.2.2" @@ -16702,6 +16666,7 @@ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", "dev": true, + "license": "ISC", "engines": { "node": ">=14" }, @@ -16776,6 +16741,7 @@ "resolved": "https://registry.npmjs.org/speedline-core/-/speedline-core-1.4.3.tgz", "integrity": "sha512-DI7/OuAUD+GMpR6dmu8lliO2Wg5zfeh+/xsdyJZCzd8o5JgFUjCeLsBDuZjIQJdwXS3J0L/uZYrELKYqx+PXog==", "dev": true, + "license": "MIT", "dependencies": { "@types/node": "*", "image-ssim": "^0.2.0", @@ -16823,6 +16789,7 @@ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -16840,10 +16807,11 @@ } }, "node_modules/streamx": { - "version": "2.18.0", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.18.0.tgz", - "integrity": "sha512-LLUC1TWdjVdn1weXGcSxyTR3T4+acB6tVGXT95y0nGbca4t4o/ng1wKAGTljm9VicuCVLvRlqFYXYy5GwgM7sQ==", + "version": "2.21.1", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.21.1.tgz", + "integrity": "sha512-PhP9wUnFLa+91CPy3N6tiQsK+gnYyUNuk15S3YG/zjYE7RuPeCjJngqnzpC31ow0lzBHQ+QGO4cNJnd0djYUsw==", "dev": true, + "license": "MIT", "dependencies": { "fast-fifo": "^1.3.2", "queue-tick": "^1.0.1", @@ -17046,12 +17014,6 @@ "node": ">=0.10.0" } }, - "node_modules/style-search": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz", - "integrity": "sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg==", - "dev": true - }, "node_modules/stylehacks": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-6.0.1.tgz", @@ -17069,59 +17031,66 @@ } }, "node_modules/stylelint": { - "version": "14.16.1", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-14.16.1.tgz", - "integrity": "sha512-ErlzR/T3hhbV+a925/gbfc3f3Fep9/bnspMiJPorfGEmcBbXdS+oo6LrVtoUZ/w9fqD6o6k7PtUlCOsCRdjX/A==", + "version": "16.11.0", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.11.0.tgz", + "integrity": "sha512-zrl4IrKmjJQ+h9FoMp69UMCq5SxeHk0URhxUBj4d3ISzo/DplOFBJZc7t7Dr6otB+1bfbbKNLOmCDpzKSlW+Nw==", "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/stylelint" + }, + { + "type": "github", + "url": "https://github.com/sponsors/stylelint" + } + ], + "license": "MIT", "dependencies": { - "@csstools/selector-specificity": "^2.0.2", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/media-query-list-parser": "^4.0.2", + "@csstools/selector-specificity": "^5.0.0", + "@dual-bundle/import-meta-resolve": "^4.1.0", "balanced-match": "^2.0.0", "colord": "^2.9.3", - "cosmiconfig": "^7.1.0", - "css-functions-list": "^3.1.0", - "debug": "^4.3.4", - "fast-glob": "^3.2.12", + "cosmiconfig": "^9.0.0", + "css-functions-list": "^3.2.3", + "css-tree": "^3.0.1", + "debug": "^4.3.7", + "fast-glob": "^3.3.2", "fastest-levenshtein": "^1.0.16", - "file-entry-cache": "^6.0.1", + "file-entry-cache": "^9.1.0", "global-modules": "^2.0.0", "globby": "^11.1.0", "globjoin": "^0.1.4", - "html-tags": "^3.2.0", - "ignore": "^5.2.1", - "import-lazy": "^4.0.0", + "html-tags": "^3.3.1", + "ignore": "^6.0.2", "imurmurhash": "^0.1.4", "is-plain-object": "^5.0.0", - "known-css-properties": "^0.26.0", + "known-css-properties": "^0.35.0", "mathml-tag-names": "^2.1.3", - "meow": "^9.0.0", - "micromatch": "^4.0.5", + "meow": "^13.2.0", + "micromatch": "^4.0.8", "normalize-path": "^3.0.0", - "picocolors": "^1.0.0", - "postcss": "^8.4.19", - "postcss-media-query-parser": "^0.2.3", - "postcss-resolve-nested-selector": "^0.1.1", - "postcss-safe-parser": "^6.0.0", - "postcss-selector-parser": "^6.0.11", + "picocolors": "^1.1.1", + "postcss": "^8.4.49", + "postcss-resolve-nested-selector": "^0.1.6", + "postcss-safe-parser": "^7.0.1", + "postcss-selector-parser": "^7.0.0", "postcss-value-parser": "^4.2.0", "resolve-from": "^5.0.0", "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "style-search": "^0.1.0", - "supports-hyperlinks": "^2.3.0", + "supports-hyperlinks": "^3.1.0", "svg-tags": "^1.0.0", - "table": "^6.8.1", - "v8-compile-cache": "^2.3.0", - "write-file-atomic": "^4.0.2" + "table": "^6.8.2", + "write-file-atomic": "^5.0.1" }, "bin": { - "stylelint": "bin/stylelint.js" + "stylelint": "bin/stylelint.mjs" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/stylelint" + "node": ">=18.12.0" } }, "node_modules/stylelint-a11y": { @@ -17174,17 +17143,112 @@ "stylelint": "^14.5.1 || ^15.0.0" } }, + "node_modules/stylelint/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true, + "license": "Python-2.0" + }, "node_modules/stylelint/node_modules/balanced-match": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz", "integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==", - "dev": true + "dev": true, + "license": "MIT" + }, + "node_modules/stylelint/node_modules/cosmiconfig": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "dev": true, + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/stylelint/node_modules/css-tree": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.1.0.tgz", + "integrity": "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "mdn-data": "2.12.2", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/stylelint/node_modules/debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/stylelint/node_modules/file-entry-cache": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-9.1.0.tgz", + "integrity": "sha512-/pqPFG+FdxWQj+/WSuzXSDaNzxgTLr/OrR1QuqfEZzDakpdYE70PwUxL7BPUa8hpjbvY1+qvCl8k+8Tq34xJgg==", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/stylelint/node_modules/flat-cache": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-5.0.0.tgz", + "integrity": "sha512-JrqFmyUl2PnPi1OvLyTVHnQvwQ0S+e6lGSwu8OkAZlSaNIZciTY2H/cOOROxsBA1m/LZNHDsqAgDZt6akWcjsQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.3.1", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=18" + } }, "node_modules/stylelint/node_modules/global-modules": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==", "dev": true, + "license": "MIT", "dependencies": { "global-prefix": "^3.0.0" }, @@ -17197,6 +17261,7 @@ "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz", "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==", "dev": true, + "license": "MIT", "dependencies": { "ini": "^1.3.5", "kind-of": "^6.0.2", @@ -17207,32 +17272,129 @@ } }, "node_modules/stylelint/node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-6.0.2.tgz", + "integrity": "sha512-InwqeHHN2XpumIkMvpl/DCJVrAHgCsG5+cn1XlnLWGwtZBm8QJfSusItfrwx81CTp5agNZqpKU2J/ccC5nGT4A==", "dev": true, + "license": "MIT", "engines": { "node": ">= 4" } }, + "node_modules/stylelint/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, "node_modules/stylelint/node_modules/kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } }, + "node_modules/stylelint/node_modules/mdn-data": { + "version": "2.12.2", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz", + "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==", + "dev": true, + "license": "CC0-1.0" + }, + "node_modules/stylelint/node_modules/meow": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz", + "integrity": "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stylelint/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/stylelint/node_modules/postcss-selector-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", + "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/stylelint/node_modules/resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, + "node_modules/stylelint/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/stylelint/node_modules/which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/stylelint/node_modules/write-file-atomic": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", + "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -17246,16 +17408,20 @@ } }, "node_modules/supports-hyperlinks": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", - "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.1.0.tgz", + "integrity": "sha512-2rn0BZ+/f7puLOHZm1HOJfwBggfaHXUpPUSSG/SWM4TWp5KCfmNYwnC3hruy2rZlMnmWZ+QAGpZfchu3f3695A==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0", "supports-color": "^7.0.0" }, "engines": { - "node": ">=8" + "node": ">=14.18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/supports-preserve-symlinks-flag": { @@ -17339,10 +17505,11 @@ } }, "node_modules/table": { - "version": "6.8.1", - "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", - "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/table/-/table-6.9.0.tgz", + "integrity": "sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "ajv": "^8.0.1", "lodash.truncate": "^4.4.2", @@ -17355,15 +17522,16 @@ } }, "node_modules/table/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, + "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "require-from-string": "^2.0.2" }, "funding": { "type": "github", @@ -17374,59 +17542,52 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "node_modules/tannin": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/tannin/-/tannin-1.2.0.tgz", - "integrity": "sha512-U7GgX/RcSeUETbV7gYgoz8PD7Ni4y95pgIP/Z6ayI3CfhSujwKEBlGFTCRN+Aqnuyf4AN2yHL+L8x+TCGjb9uA==", "dev": true, - "dependencies": { - "@tannin/plural-forms": "^1.1.0" - } + "license": "MIT" }, "node_modules/tapable": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } }, "node_modules/tar-fs": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", - "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.6.tgz", + "integrity": "sha512-iokBDQQkUyeXhgPYaZxmczGPhnhXZ0CmrqI+MOb/WFGS9DW5wnfrLgtjUJBvz50vQ3qfRwJ62QVoCFu8mPVu5w==", "dev": true, + "license": "MIT", "dependencies": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", "pump": "^3.0.0", - "tar-stream": "^2.1.4" + "tar-stream": "^3.1.5" + }, + "optionalDependencies": { + "bare-fs": "^2.1.1", + "bare-path": "^2.1.0" } }, "node_modules/tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", + "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", "dev": true, + "license": "MIT", "dependencies": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" - }, - "engines": { - "node": ">=6" + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" } }, "node_modules/terser": { - "version": "5.19.4", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.4.tgz", - "integrity": "sha512-6p1DjHeuluwxDXcuT9VR8p64klWJKo1ILiy19s6C9+0Bh2+NWTX6nD9EPppiER4ICkHDVB1RkVpin/YW2nQn/g==", + "version": "5.37.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.37.0.tgz", + "integrity": "sha512-B8wRRkmre4ERucLM/uXx4MOV5cbnOlVAqUst+1+iLKPI0dOgFO28f84ptoQt9HEI537PMzfYa/d+GEPKTRXmYA==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "@jridgewell/source-map": "^0.3.3", "acorn": "^8.8.2", @@ -17441,16 +17602,17 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.3.9", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", - "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", + "version": "5.3.11", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.11.tgz", + "integrity": "sha512-RVCsMfuD0+cTt3EwX8hSl2Ks56EbFHWmhluwcqoPKtBnfjiT6olaq7PRIRfhyU8nnC2MrnDrBLfrD/RGE+cVXQ==", "dev": true, + "license": "MIT", "dependencies": { - "@jridgewell/trace-mapping": "^0.3.17", + "@jridgewell/trace-mapping": "^0.3.25", "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.1", - "terser": "^5.16.8" + "schema-utils": "^4.3.0", + "serialize-javascript": "^6.0.2", + "terser": "^5.31.1" }, "engines": { "node": ">= 10.13.0" @@ -17474,11 +17636,69 @@ } } }, + "node_modules/terser-webpack-plugin/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/terser-webpack-plugin/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true, + "license": "MIT" + }, + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz", + "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, "node_modules/terser/node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/test-exclude": { "version": "6.0.0", @@ -17516,10 +17736,11 @@ "dev": true }, "node_modules/third-party-web": { - "version": "0.23.4", - "resolved": "https://registry.npmjs.org/third-party-web/-/third-party-web-0.23.4.tgz", - "integrity": "sha512-kwYnSZRhEvv0SBW2fp8SBBKRglMoBjV8xz6C31m0ewqOtknB5UL+Ihg+M81hyFY5ldkZuGWPb+e4GVDkzf/gYg==", - "dev": true + "version": "0.26.2", + "resolved": "https://registry.npmjs.org/third-party-web/-/third-party-web-0.26.2.tgz", + "integrity": "sha512-taJ0Us0lKoYBqcbccMuDElSUPOxmBfwlHe1OkHQ3KFf+RwovvBHdXhbFk9XJVQE2vHzxbTwvwg5GFsT9hbDokQ==", + "dev": true, + "license": "MIT" }, "node_modules/through": { "version": "2.3.8", @@ -17533,21 +17754,29 @@ "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", "dev": true }, + "node_modules/tldts-core": { + "version": "6.1.67", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.67.tgz", + "integrity": "sha512-12K5O4m3uUW6YM5v45Z7wc6NTSmAYj4Tq3de7eXghZkp879IlfPJrUWeWFwu1FS94U5t2vwETgJ1asu8UGNKVQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/tldts-icann": { + "version": "6.1.67", + "resolved": "https://registry.npmjs.org/tldts-icann/-/tldts-icann-6.1.67.tgz", + "integrity": "sha512-CJLFTYBgbnkP6nB8rqSYzd1oyWbM02SeQx9hrEpB6fTjx2+5FJ1lSkovxIWCjMgvzE7Nv54LCrf3lVW0zhupxQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "tldts-core": "^6.1.67" + } + }, "node_modules/tmpl": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", "dev": true }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -17565,6 +17794,7 @@ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.6" } @@ -17745,6 +17975,7 @@ "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", "dev": true, + "license": "MIT", "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" @@ -17826,11 +18057,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/typed-query-selector": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/typed-query-selector/-/typed-query-selector-2.12.0.tgz", + "integrity": "sha512-SbklCd1F0EiZOyPiW192rrHZzZ5sBijB6xM+cpmrwDqObvdtunOHHIk9fCGsoK5JVIYXoyEp4iEdE3upFH3PAg==", + "dev": true, + "license": "MIT" + }, "node_modules/typedarray-to-buffer": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", "dev": true, + "license": "MIT", "dependencies": { "is-typedarray": "^1.0.0" } @@ -17923,6 +18162,7 @@ "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-2.0.0.tgz", "integrity": "sha512-uNaeirEPvpZWSgzwsPGtU2zVSTrn/8L5q/IexZmH0eH6SA73CmAA5U4GwORTxQAZs95TAXLNqeLoPPNO5gZfWg==", "dev": true, + "license": "MIT", "dependencies": { "crypto-random-string": "^2.0.0" }, @@ -17944,14 +18184,15 @@ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } }, "node_modules/update-browserslist-db": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz", - "integrity": "sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", + "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", "dev": true, "funding": [ { @@ -17967,9 +18208,10 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "escalade": "^3.1.2", - "picocolors": "^1.0.1" + "escalade": "^3.2.0", + "picocolors": "^1.1.0" }, "bin": { "update-browserslist-db": "cli.js" @@ -18042,6 +18284,13 @@ "requires-port": "^1.0.0" } }, + "node_modules/urlpattern-polyfill": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.0.0.tgz", + "integrity": "sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==", + "dev": true, + "license": "MIT" + }, "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -18066,12 +18315,6 @@ "uuid": "dist/bin/uuid" } }, - "node_modules/v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, "node_modules/v8-to-istanbul": { "version": "9.2.0", "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz", @@ -18130,13 +18373,14 @@ } }, "node_modules/wait-on": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-7.2.0.tgz", - "integrity": "sha512-wCQcHkRazgjG5XoAq9jbTMLpNIjoSlZslrJ2+N9MxDsGEv1HnFoVjOCexL0ESva7Y9cu350j+DWADdk54s4AFQ==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-8.0.1.tgz", + "integrity": "sha512-1wWQOyR2LVVtaqrcIL2+OM+x7bkpmzVROa0Nf6FryXkS+er5Sa1kzFGjzZRqLnHa3n1rACFLeTwUqE1ETL9Mig==", "dev": true, + "license": "MIT", "dependencies": { - "axios": "^1.6.1", - "joi": "^17.11.0", + "axios": "^1.7.7", + "joi": "^17.13.3", "lodash": "^4.17.21", "minimist": "^1.2.8", "rxjs": "^7.8.1" @@ -18158,10 +18402,11 @@ } }, "node_modules/watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", + "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", "dev": true, + "license": "MIT", "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -18180,10 +18425,11 @@ } }, "node_modules/web-vitals": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-3.5.2.tgz", - "integrity": "sha512-c0rhqNcHXRkY/ogGDJQxZ9Im9D19hDihbzSQJrsioex+KnFgmMzBiy57Z1EjkhX/+OjyBpclDCzz2ITtjokFmg==", - "dev": true + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-4.2.4.tgz", + "integrity": "sha512-r4DIlprAGwJ7YM11VZp4R884m0Vmgr6EAKe3P+kO0PPj3Unqyvv59rczf6UiGcb9Z8QxZVcqKNwv/g0WNdWwsw==", + "dev": true, + "license": "Apache-2.0" }, "node_modules/webidl-conversions": { "version": "7.0.0", @@ -18195,34 +18441,34 @@ } }, "node_modules/webpack": { - "version": "5.88.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.88.2.tgz", - "integrity": "sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==", - "dev": true, - "dependencies": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^1.0.0", - "@webassemblyjs/ast": "^1.11.5", - "@webassemblyjs/wasm-edit": "^1.11.5", - "@webassemblyjs/wasm-parser": "^1.11.5", - "acorn": "^8.7.1", - "acorn-import-assertions": "^1.9.0", - "browserslist": "^4.14.5", + "version": "5.97.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.97.1.tgz", + "integrity": "sha512-EksG6gFY3L1eFMROS/7Wzgrii5mBAFe4rIr3r2BTfo7bcc+DWwFZ4OJ/miOuHJO/A85HwyI4eQ0F6IKXesO7Fg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.6", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", + "acorn": "^8.14.0", + "browserslist": "^4.24.0", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.15.0", + "enhanced-resolve": "^5.17.1", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", + "graceful-fs": "^4.2.11", "json-parse-even-better-errors": "^2.3.1", "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", "schema-utils": "^3.2.0", "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.7", - "watchpack": "^2.4.0", + "terser-webpack-plugin": "^5.3.10", + "watchpack": "^2.4.1", "webpack-sources": "^3.2.3" }, "bin": { @@ -18364,56 +18610,6 @@ "node": ">=14" } }, - "node_modules/webpack-cli/node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/webpack-cli/node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/webpack-cli/node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/webpack-cli/node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, "node_modules/webpack-dev-middleware": { "version": "5.3.4", "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz", @@ -18683,6 +18879,7 @@ "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", "dev": true, + "license": "MIT", "engines": { "node": ">=10.13.0" } @@ -18744,16 +18941,20 @@ "node": ">=12" } }, - "node_modules/which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, + "license": "ISC", "dependencies": { "isexe": "^2.0.0" }, "bin": { - "which": "bin/which" + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" } }, "node_modules/which-boxed-primitive": { @@ -18882,24 +19083,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/wrap-ansi/node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/wrap-ansi/node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -18920,10 +19103,11 @@ } }, "node_modules/ws": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", - "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", "dev": true, + "license": "MIT", "engines": { "node": ">=10.0.0" }, @@ -18945,6 +19129,7 @@ "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -19045,6 +19230,16 @@ "funding": { "url": "https://github.com/sponsors/sindresorhus" } + }, + "node_modules/zod": { + "version": "3.23.8", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", + "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } } }, "dependencies": { @@ -19059,37 +19254,38 @@ } }, "@babel/code-frame": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", - "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", "dev": true, "requires": { - "@babel/highlight": "^7.24.7", + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", "picocolors": "^1.0.0" } }, "@babel/compat-data": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", - "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.3.tgz", + "integrity": "sha512-nHIxvKPniQXpmQLb0vhY3VaFb3S0YrTAwpOWJZh1wn3oJPjJk9Asva204PsBdmAE8vpzfHudT8DB0scYvy9q0g==", "dev": true }, "@babel/core": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.6.tgz", - "integrity": "sha512-FxpRyGjrMJXh7X3wGLGhNDCRiwpWEF74sKjTLDJSG5Kyvow3QZaG0Adbqzi9ZrVjTWpsX+2cxWXD71NMg93kdw==", + "version": "7.25.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.7.tgz", + "integrity": "sha512-yJ474Zv3cwiSOO9nXJuqzvwEeM+chDuQ8GJirw+pZ91sCGCyOZ3dJkVE09fTV0VEVzXyLWhh3G/AolYTPX7Mow==", "dev": true, "requires": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", - "@babel/helper-compilation-targets": "^7.23.6", - "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.23.6", - "@babel/parser": "^7.23.6", - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.6", - "@babel/types": "^7.23.6", + "@babel/code-frame": "^7.25.7", + "@babel/generator": "^7.25.7", + "@babel/helper-compilation-targets": "^7.25.7", + "@babel/helper-module-transforms": "^7.25.7", + "@babel/helpers": "^7.25.7", + "@babel/parser": "^7.25.7", + "@babel/template": "^7.25.7", + "@babel/traverse": "^7.25.7", + "@babel/types": "^7.25.7", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -19109,15 +19305,16 @@ } }, "@babel/generator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.7.tgz", - "integrity": "sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==", + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.3.tgz", + "integrity": "sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==", "dev": true, "requires": { - "@babel/types": "^7.24.7", + "@babel/parser": "^7.26.3", + "@babel/types": "^7.26.3", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^2.5.1" + "jsesc": "^3.0.2" } }, "@babel/helper-annotate-as-pure": { @@ -19139,14 +19336,14 @@ } }, "@babel/helper-compilation-targets": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", - "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz", + "integrity": "sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==", "dev": true, "requires": { - "@babel/compat-data": "^7.23.5", - "@babel/helper-validator-option": "^7.23.5", - "browserslist": "^4.22.2", + "@babel/compat-data": "^7.25.9", + "@babel/helper-validator-option": "^7.25.9", + "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" } @@ -19230,26 +19427,24 @@ } }, "@babel/helper-module-imports": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.7.tgz", - "integrity": "sha512-8AyH3C+74cgCVVXow/myrynrAGv+nTVg5vKu2nZph9x7RcRwzmh0VFallJuFTZ9mx6u4eSdXZfcOzSqTUm0HCA==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", + "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", "dev": true, "requires": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" } }, "@babel/helper-module-transforms": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", - "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz", + "integrity": "sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==", "dev": true, "requires": { - "@babel/helper-environment-visitor": "^7.22.20", - "@babel/helper-module-imports": "^7.22.15", - "@babel/helper-simple-access": "^7.22.5", - "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/helper-validator-identifier": "^7.22.20" + "@babel/helper-module-imports": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9", + "@babel/traverse": "^7.25.9" } }, "@babel/helper-optimise-call-expression": { @@ -19317,21 +19512,21 @@ } }, "@babel/helper-string-parser": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.7.tgz", - "integrity": "sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", "dev": true }, "@babel/helper-validator-identifier": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", - "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", "dev": true }, "@babel/helper-validator-option": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", - "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz", + "integrity": "sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==", "dev": true }, "@babel/helper-wrap-function": { @@ -19346,71 +19541,24 @@ } }, "@babel/helpers": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.6.tgz", - "integrity": "sha512-wCfsbN4nBidDRhpDhvcKlzHWCTlgJYUUdSJfzXb2NuBssDSIjc3xcb+znA7l+zYsFljAcGM0aFkN40cR3lXiGA==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.26.0.tgz", + "integrity": "sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==", "dev": true, "requires": { - "@babel/template": "^7.22.15", - "@babel/traverse": "^7.23.6", - "@babel/types": "^7.23.6" + "@babel/template": "^7.25.9", + "@babel/types": "^7.26.0" } }, - "@babel/highlight": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", - "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", + "@babel/parser": { + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.3.tgz", + "integrity": "sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==", "dev": true, "requires": { - "@babel/helper-validator-identifier": "^7.24.7", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" - }, - "dependencies": { - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "requires": { - "color-convert": "^1.9.0" - } - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "requires": { - "has-flag": "^3.0.0" - } - } + "@babel/types": "^7.26.3" } }, - "@babel/parser": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.7.tgz", - "integrity": "sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==", - "dev": true - }, "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { "version": "7.23.3", "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.23.3.tgz", @@ -20374,43 +20522,39 @@ } }, "@babel/template": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz", - "integrity": "sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.9.tgz", + "integrity": "sha512-9DGttpmPvIxBb/2uwpVo3dqJ+O6RooAFOS+lB+xDqoE2PVCE8nfoHMdZLpfCQRLwvohzXISPZcgxt80xLfsuwg==", "dev": true, "requires": { - "@babel/code-frame": "^7.24.7", - "@babel/parser": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/code-frame": "^7.25.9", + "@babel/parser": "^7.25.9", + "@babel/types": "^7.25.9" } }, "@babel/traverse": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.7.tgz", - "integrity": "sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA==", - "dev": true, - "requires": { - "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.24.7", - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-function-name": "^7.24.7", - "@babel/helper-hoist-variables": "^7.24.7", - "@babel/helper-split-export-declaration": "^7.24.7", - "@babel/parser": "^7.24.7", - "@babel/types": "^7.24.7", + "version": "7.26.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.4.tgz", + "integrity": "sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w==", + "dev": true, + "requires": { + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.3", + "@babel/parser": "^7.26.3", + "@babel/template": "^7.25.9", + "@babel/types": "^7.26.3", "debug": "^4.3.1", "globals": "^11.1.0" } }, "@babel/types": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.7.tgz", - "integrity": "sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==", + "version": "7.26.3", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.3.tgz", + "integrity": "sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==", "dev": true, "requires": { - "@babel/helper-string-parser": "^7.24.7", - "@babel/helper-validator-identifier": "^7.24.7", - "to-fast-properties": "^2.0.0" + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" } }, "@bcoe/v8-coverage": { @@ -20419,10 +20563,28 @@ "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", "dev": true }, + "@csstools/css-parser-algorithms": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.4.tgz", + "integrity": "sha512-Up7rBoV77rv29d3uKHUIVubz1BTcgyUK72IvCQAbfbMv584xHcGKCKbWh7i8hPrRJ7qU4Y8IO3IY9m+iTB7P3A==", + "dev": true + }, + "@csstools/css-tokenizer": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.3.tgz", + "integrity": "sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw==", + "dev": true + }, + "@csstools/media-query-list-parser": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.2.tgz", + "integrity": "sha512-EUos465uvVvMJehckATTlNqGj4UJWkTmdWuDMjqvSUkjGpmOyFZBVwb4knxCm/k2GMTXY+c/5RkdndzFYWeX5A==", + "dev": true + }, "@csstools/selector-specificity": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.1.1.tgz", - "integrity": "sha512-jwx+WCqszn53YHOfvFMJJRd/B2GqkCBt+1MJSG6o5/s8+ytHMvDZXsJgUEWLk12UnLd7HYKac4BYU5i/Ron1Cw==", + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz", + "integrity": "sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw==", "dev": true }, "@discoveryjs/json-ext": { @@ -20431,6 +20593,12 @@ "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", "dev": true }, + "@dual-bundle/import-meta-resolve": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/@dual-bundle/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz", + "integrity": "sha512-+nxncfwHM5SgAtrVzgpzJOI1ol0PkumhVo469KCf9lUi21IGcY90G98VuHm9VRrUypmAzawAHO9bs6hqeADaVg==", + "dev": true + }, "@es-joy/jsdoccomment": { "version": "0.41.0", "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.41.0.tgz", @@ -20508,6 +20676,57 @@ } } }, + "@formatjs/ecma402-abstract": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@formatjs/ecma402-abstract/-/ecma402-abstract-2.3.1.tgz", + "integrity": "sha512-Ip9uV+/MpLXWRk03U/GzeJMuPeOXpJBSB5V1tjA6kJhvqssye5J5LoYLc7Z5IAHb7nR62sRoguzrFiVCP/hnzw==", + "dev": true, + "requires": { + "@formatjs/fast-memoize": "2.2.5", + "@formatjs/intl-localematcher": "0.5.9", + "decimal.js": "10", + "tslib": "2" + } + }, + "@formatjs/fast-memoize": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/@formatjs/fast-memoize/-/fast-memoize-2.2.5.tgz", + "integrity": "sha512-6PoewUMrrcqxSoBXAOJDiW1m+AmkrAj0RiXnOMD59GRaswjXhm3MDhgepXPBgonc09oSirAJTsAggzAGQf6A6g==", + "dev": true, + "requires": { + "tslib": "2" + } + }, + "@formatjs/icu-messageformat-parser": { + "version": "2.9.7", + "resolved": "https://registry.npmjs.org/@formatjs/icu-messageformat-parser/-/icu-messageformat-parser-2.9.7.tgz", + "integrity": "sha512-cuEHyRM5VqLQobANOjtjlgU7+qmk9Q3fDQuBiRRJ3+Wp3ZoZhpUPtUfuimZXsir6SaI2TaAJ+SLo9vLnV5QcbA==", + "dev": true, + "requires": { + "@formatjs/ecma402-abstract": "2.3.1", + "@formatjs/icu-skeleton-parser": "1.8.11", + "tslib": "2" + } + }, + "@formatjs/icu-skeleton-parser": { + "version": "1.8.11", + "resolved": "https://registry.npmjs.org/@formatjs/icu-skeleton-parser/-/icu-skeleton-parser-1.8.11.tgz", + "integrity": "sha512-8LlHHE/yL/zVJZHAX3pbKaCjZKmBIO6aJY1mkVh4RMSEu/2WRZ4Ysvv3kKXJ9M8RJLBHdnk1/dUQFdod1Dt7Dw==", + "dev": true, + "requires": { + "@formatjs/ecma402-abstract": "2.3.1", + "tslib": "2" + } + }, + "@formatjs/intl-localematcher": { + "version": "0.5.9", + "resolved": "https://registry.npmjs.org/@formatjs/intl-localematcher/-/intl-localematcher-0.5.9.tgz", + "integrity": "sha512-8zkGu/sv5euxbjfZ/xmklqLyDGQSxsLqg8XOq88JW3cmJtzhCP8EtSJXlaKZnVO4beEaoiT9wj4eIoCQ9smwxA==", + "dev": true, + "requires": { + "tslib": "2" + } + }, "@hapi/hoek": { "version": "9.3.0", "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", @@ -20920,13 +21139,13 @@ "dev": true }, "@jridgewell/source-map": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", - "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz", + "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==", "dev": true, "requires": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" } }, "@jridgewell/sourcemap-codec": { @@ -20986,6 +21205,15 @@ "fastq": "^1.6.0" } }, + "@paulirish/trace_engine": { + "version": "0.0.39", + "resolved": "https://registry.npmjs.org/@paulirish/trace_engine/-/trace_engine-0.0.39.tgz", + "integrity": "sha512-2Y/ejHX5DDi5bjfWY/0c/BLVSfQ61Jw1Hy60Hnh0hfEO632D3FVctkzT4Q/lVAdvIPR0bUaok9JDTr1pu/OziA==", + "dev": true, + "requires": { + "third-party-web": "latest" + } + }, "@pkgr/core": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz", @@ -21015,177 +21243,71 @@ "integrity": "sha512-2LuNTFBIO0m7kKIQvvPHN6UE63VjpmL9rnEEaOOaiSPbZK+zUOYIzBAWcED+3XYzhYsd/0mD57VdxAEqqV52CQ==", "dev": true }, - "@puppeteer/browsers": { - "version": "1.4.6", - "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-1.4.6.tgz", - "integrity": "sha512-x4BEjr2SjOPowNeiguzjozQbsc6h437ovD/wu+JpaenxVLm3jkgzHY2xOslMTp50HoTvQreMjiexiGQw1sqZlQ==", + "@sentry-internal/tracing": { + "version": "7.120.2", + "resolved": "https://registry.npmjs.org/@sentry-internal/tracing/-/tracing-7.120.2.tgz", + "integrity": "sha512-eo2F8cP6X+vr54Mp6vu+NoQEDz0M5O24Tz8jPY0T1CpiWdwCmHb7Sln+oLXeQ3/LlWdVQihBfKDBZfBdUfsBTg==", "dev": true, "requires": { - "debug": "4.3.4", - "extract-zip": "2.0.1", - "progress": "2.0.3", - "proxy-agent": "6.3.0", - "tar-fs": "3.0.4", - "unbzip2-stream": "1.4.3", - "yargs": "17.7.1" - }, - "dependencies": { - "tar-fs": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.4.tgz", - "integrity": "sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==", - "dev": true, - "requires": { - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^3.1.5" - } - }, - "tar-stream": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", - "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", - "dev": true, - "requires": { - "b4a": "^1.6.4", - "fast-fifo": "^1.2.0", - "streamx": "^2.15.0" - } - }, - "yargs": { - "version": "17.7.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", - "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", - "dev": true, - "requires": { - "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-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "dev": true - } + "@sentry/core": "7.120.2", + "@sentry/types": "7.120.2", + "@sentry/utils": "7.120.2" } }, "@sentry/core": { - "version": "6.19.7", - "resolved": "https://registry.npmjs.org/@sentry/core/-/core-6.19.7.tgz", - "integrity": "sha512-tOfZ/umqB2AcHPGbIrsFLcvApdTm9ggpi/kQZFkej7kMphjT+SGBiQfYtjyg9jcRW+ilAR4JXC9BGKsdEQ+8Vw==", - "dev": true, - "requires": { - "@sentry/hub": "6.19.7", - "@sentry/minimal": "6.19.7", - "@sentry/types": "6.19.7", - "@sentry/utils": "6.19.7", - "tslib": "^1.9.3" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } - } - }, - "@sentry/hub": { - "version": "6.19.7", - "resolved": "https://registry.npmjs.org/@sentry/hub/-/hub-6.19.7.tgz", - "integrity": "sha512-y3OtbYFAqKHCWezF0EGGr5lcyI2KbaXW2Ik7Xp8Mu9TxbSTuwTe4rTntwg8ngPjUQU3SUHzgjqVB8qjiGqFXCA==", + "version": "7.120.2", + "resolved": "https://registry.npmjs.org/@sentry/core/-/core-7.120.2.tgz", + "integrity": "sha512-eurLBFQJC7WWWYoEna25Z9I/GJjqAmH339tv52XP8sqXV7B5hRcHDcfrsT/UGHpU316M24p3lWhj0eimtCZ0SQ==", "dev": true, "requires": { - "@sentry/types": "6.19.7", - "@sentry/utils": "6.19.7", - "tslib": "^1.9.3" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } + "@sentry/types": "7.120.2", + "@sentry/utils": "7.120.2" } }, - "@sentry/minimal": { - "version": "6.19.7", - "resolved": "https://registry.npmjs.org/@sentry/minimal/-/minimal-6.19.7.tgz", - "integrity": "sha512-wcYmSJOdvk6VAPx8IcmZgN08XTXRwRtB1aOLZm+MVHjIZIhHoBGZJYTVQS/BWjldsamj2cX3YGbGXNunaCfYJQ==", + "@sentry/integrations": { + "version": "7.120.2", + "resolved": "https://registry.npmjs.org/@sentry/integrations/-/integrations-7.120.2.tgz", + "integrity": "sha512-bMvL2fD3TGLM5YAUoQ2Qz6bYeVU8f7YRFNSjKNxK4EbvFgAU9j1FD6EKg0V0RNOJYnJjGIZYMmcWTXBbVTJL6w==", "dev": true, "requires": { - "@sentry/hub": "6.19.7", - "@sentry/types": "6.19.7", - "tslib": "^1.9.3" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } + "@sentry/core": "7.120.2", + "@sentry/types": "7.120.2", + "@sentry/utils": "7.120.2", + "localforage": "^1.8.1" } }, "@sentry/node": { - "version": "6.19.7", - "resolved": "https://registry.npmjs.org/@sentry/node/-/node-6.19.7.tgz", - "integrity": "sha512-gtmRC4dAXKODMpHXKfrkfvyBL3cI8y64vEi3fDD046uqYcrWdgoQsffuBbxMAizc6Ez1ia+f0Flue6p15Qaltg==", + "version": "7.120.2", + "resolved": "https://registry.npmjs.org/@sentry/node/-/node-7.120.2.tgz", + "integrity": "sha512-ZnW9gpIGaoU+vYZyVZca9dObfmWYiXEWIMUM/JXaFb8AhP1OXvYweNiU0Pe/gNrz4oGAogU8scJc70ar7Vj0ww==", "dev": true, "requires": { - "@sentry/core": "6.19.7", - "@sentry/hub": "6.19.7", - "@sentry/types": "6.19.7", - "@sentry/utils": "6.19.7", - "cookie": "^0.4.1", - "https-proxy-agent": "^5.0.0", - "lru_map": "^0.3.3", - "tslib": "^1.9.3" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } + "@sentry-internal/tracing": "7.120.2", + "@sentry/core": "7.120.2", + "@sentry/integrations": "7.120.2", + "@sentry/types": "7.120.2", + "@sentry/utils": "7.120.2" } }, "@sentry/types": { - "version": "6.19.7", - "resolved": "https://registry.npmjs.org/@sentry/types/-/types-6.19.7.tgz", - "integrity": "sha512-jH84pDYE+hHIbVnab3Hr+ZXr1v8QABfhx39KknxqKWr2l0oEItzepV0URvbEhB446lk/S/59230dlUUIBGsXbg==", + "version": "7.120.2", + "resolved": "https://registry.npmjs.org/@sentry/types/-/types-7.120.2.tgz", + "integrity": "sha512-FWVoiblHQJ892GaOqdXx/5/n5XDLF28z81vJ0lCY49PMh8waz8LJ0b9RSmt9tasSDl0OQ7eUlPl1xu1jTrv1NA==", "dev": true }, "@sentry/utils": { - "version": "6.19.7", - "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-6.19.7.tgz", - "integrity": "sha512-z95ECmE3i9pbWoXQrD/7PgkBAzJYR+iXtPuTkpBjDKs86O3mT+PXOT3BAn79w2wkn7/i3vOGD2xVr1uiMl26dA==", + "version": "7.120.2", + "resolved": "https://registry.npmjs.org/@sentry/utils/-/utils-7.120.2.tgz", + "integrity": "sha512-jgnQlw11mRfQrQRAXbq4zEd+tbYwHel5eqeS/oU6EImXRjmHNtS79nB8MHvJeQu1FMCpFs1Ymrrs5FICwS6VeQ==", "dev": true, "requires": { - "@sentry/types": "6.19.7", - "tslib": "^1.9.3" - }, - "dependencies": { - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - } + "@sentry/types": "7.120.2" } }, "@sideway/address": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz", - "integrity": "sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.5.tgz", + "integrity": "sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==", "dev": true, "requires": { "@hapi/hoek": "^9.0.0" @@ -21417,37 +21539,6 @@ "@svgr/plugin-svgo": "8.1.0" } }, - "@tannin/compile": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@tannin/compile/-/compile-1.1.0.tgz", - "integrity": "sha512-n8m9eNDfoNZoxdvWiTfW/hSPhehzLJ3zW7f8E7oT6mCROoMNWCB4TYtv041+2FMAxweiE0j7i1jubQU4MEC/Gg==", - "dev": true, - "requires": { - "@tannin/evaluate": "^1.2.0", - "@tannin/postfix": "^1.1.0" - } - }, - "@tannin/evaluate": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@tannin/evaluate/-/evaluate-1.2.0.tgz", - "integrity": "sha512-3ioXvNowbO/wSrxsDG5DKIMxC81P0QrQTYai8zFNY+umuoHWRPbQ/TuuDEOju9E+jQDXmj6yI5GyejNuh8I+eg==", - "dev": true - }, - "@tannin/plural-forms": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@tannin/plural-forms/-/plural-forms-1.1.0.tgz", - "integrity": "sha512-xl9R2mDZO/qiHam1AgMnAES6IKIg7OBhcXqy6eDsRCdXuxAFPcjrej9HMjyCLE0DJ/8cHf0i5OQTstuBRhpbHw==", - "dev": true, - "requires": { - "@tannin/compile": "^1.1.0" - } - }, - "@tannin/postfix": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@tannin/postfix/-/postfix-1.1.0.tgz", - "integrity": "sha512-oocsqY7g0cR+Gur5jRQLSrX2OtpMLMse1I10JQBm8CdGMrDkh1Mg2gjsiquMHRtBs4Qwu5wgEp5GgIYHk4SNPw==", - "dev": true - }, "@tootallnate/once": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", @@ -21546,9 +21637,9 @@ } }, "@types/eslint": { - "version": "8.21.0", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.21.0.tgz", - "integrity": "sha512-35EhHNOXgxnUgh4XCJsGhE7zdlDhYDN/aMG6UbkByCFFNgQ7b3U+uVoqBpicFydR8JEfgdjCF7SJ7MiJfzuiTA==", + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz", + "integrity": "sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==", "dev": true, "requires": { "@types/estree": "*", @@ -21556,9 +21647,9 @@ } }, "@types/eslint-scope": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", - "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", "dev": true, "requires": { "@types/eslint": "*", @@ -21566,9 +21657,9 @@ } }, "@types/estree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", - "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", + "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", "dev": true }, "@types/express": { @@ -22050,148 +22141,148 @@ } }, "@webassemblyjs/ast": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", - "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", "dev": true, "requires": { - "@webassemblyjs/helper-numbers": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" } }, "@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", - "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", "dev": true }, "@webassemblyjs/helper-api-error": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", "dev": true }, "@webassemblyjs/helper-buffer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", - "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", "dev": true }, "@webassemblyjs/helper-numbers": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", - "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", "dev": true, "requires": { - "@webassemblyjs/floating-point-hex-parser": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", "@xtuc/long": "4.2.2" } }, "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", "dev": true }, "@webassemblyjs/helper-wasm-section": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", - "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" } }, "@webassemblyjs/ieee754": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", - "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", "dev": true, "requires": { "@xtuc/ieee754": "^1.2.0" } }, "@webassemblyjs/leb128": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", - "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", "dev": true, "requires": { "@xtuc/long": "4.2.2" } }, "@webassemblyjs/utf8": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", - "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", "dev": true }, "@webassemblyjs/wasm-edit": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", - "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-opt": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6", - "@webassemblyjs/wast-printer": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" } }, "@webassemblyjs/wasm-gen": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", - "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" } }, "@webassemblyjs/wasm-opt": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", - "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" } }, "@webassemblyjs/wasm-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", - "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" } }, "@webassemblyjs/wast-printer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", - "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", "dev": true, "requires": { - "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/ast": "1.14.1", "@xtuc/long": "4.2.2" } }, @@ -22213,17 +22304,6 @@ "integrity": "sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==", "dev": true }, - "@wordpress/api-fetch": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@wordpress/api-fetch/-/api-fetch-7.1.0.tgz", - "integrity": "sha512-mtEJi9IBPCRtNxyhP1VAwcLmncpQzt7CQX8rxhC4eAMnicamCG/fwZ3pFEKGXk3MUul3Bl1Q7y/UhdMtCGktGg==", - "dev": true, - "requires": { - "@babel/runtime": "^7.16.0", - "@wordpress/i18n": "^5.1.0", - "@wordpress/url": "^4.1.0" - } - }, "@wordpress/babel-preset-default": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/@wordpress/babel-preset-default/-/babel-preset-default-8.1.0.tgz", @@ -22250,9 +22330,9 @@ "dev": true }, "@wordpress/browserslist-config": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@wordpress/browserslist-config/-/browserslist-config-6.1.0.tgz", - "integrity": "sha512-cf5iwPq6JetQjiaRwlvzW5eX0S3OphVmy1YTxHQdrVqp79rOGvamVftxqvmf3C/GSRaNyI4eZV+nNwNRN0DkrQ==", + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@wordpress/browserslist-config/-/browserslist-config-6.14.0.tgz", + "integrity": "sha512-a26hxY8R/A7FH/Z8oZsYS31ZC/Xy9QSBTi5w84MKSeYdWlck7t1QdCwUNF1u621wbuP7beiiu9FkYY4hI3Bk9A==", "dev": true }, "@wordpress/dependency-extraction-webpack-plugin": { @@ -22265,20 +22345,17 @@ } }, "@wordpress/e2e-test-utils-playwright": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@wordpress/e2e-test-utils-playwright/-/e2e-test-utils-playwright-1.1.0.tgz", - "integrity": "sha512-lGA7/6S1Rsa9Zf7qnAs1nOWn8lPpg8vBOwUWHPBqV1a79r7nsD2KQqsrqsKy8wIJ763fIt5LljjD9VSca0UtIQ==", + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/@wordpress/e2e-test-utils-playwright/-/e2e-test-utils-playwright-1.14.0.tgz", + "integrity": "sha512-G9r3ZysgzAmUbR4bjGAEEP6P2RCIAG8uMU7yyzxOAHegINSbF3shEZKvVNBeKxNwHKAVa9koh/niGN3U4Kr6Rw==", "dev": true, "requires": { - "@wordpress/api-fetch": "^7.1.0", - "@wordpress/keycodes": "^4.1.0", - "@wordpress/url": "^4.1.0", "change-case": "^4.1.2", "form-data": "^4.0.0", "get-port": "^5.1.1", - "lighthouse": "^10.4.0", + "lighthouse": "^12.2.2", "mime": "^3.0.0", - "web-vitals": "^3.5.0" + "web-vitals": "^4.2.1" } }, "@wordpress/eslint-plugin": { @@ -22317,29 +22394,6 @@ } } }, - "@wordpress/hooks": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@wordpress/hooks/-/hooks-4.1.0.tgz", - "integrity": "sha512-uJ2zyLLs6AwWuEdLGv/P7oSXJuX27Ym6JglzWGBavxAKNXpTCCjiJwgxlZJbSjT3BzhRsRGl3bUMmzt3eh50Pg==", - "dev": true, - "requires": { - "@babel/runtime": "^7.16.0" - } - }, - "@wordpress/i18n": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/@wordpress/i18n/-/i18n-5.1.0.tgz", - "integrity": "sha512-zNJiudByLnpIVhIS45hr92r53t+wRYp9a6XOJ585xNYeUmoUpymY5GTdLSrExmQaytMhV5cSXSn3qMMDBMjUsg==", - "dev": true, - "requires": { - "@babel/runtime": "^7.16.0", - "@wordpress/hooks": "^4.1.0", - "gettext-parser": "^1.3.1", - "memize": "^2.1.0", - "sprintf-js": "^1.1.1", - "tannin": "^1.2.0" - } - }, "@wordpress/jest-console": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/@wordpress/jest-console/-/jest-console-8.1.0.tgz", @@ -22360,16 +22414,6 @@ "babel-jest": "^29.6.2" } }, - "@wordpress/keycodes": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@wordpress/keycodes/-/keycodes-4.1.0.tgz", - "integrity": "sha512-ibAR7qg4q7082s9kOPnZ0Hqb6KM/zjAZBjEH2Yrc2jwLJ83QDGKDWCSx6dNYkN7m9jGpH52w8j4nz1wcbFZSiw==", - "dev": true, - "requires": { - "@babel/runtime": "^7.16.0", - "@wordpress/i18n": "^5.1.0" - } - }, "@wordpress/npm-package-json-lint-config": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/@wordpress/npm-package-json-lint-config/-/npm-package-json-lint-config-5.1.0.tgz", @@ -22393,33 +22437,33 @@ "dev": true }, "@wordpress/scripts": { - "version": "28.1.0", - "resolved": "https://registry.npmjs.org/@wordpress/scripts/-/scripts-28.1.0.tgz", - "integrity": "sha512-BWmYA0fqOhfMcl20ppcJA/nw/zixt0FP6KPV+IiI560qpSHx6ZZieU354oX/5Vdaoe4O3ahPlGdUr9fWcprApQ==", + "version": "30.7.0", + "resolved": "https://registry.npmjs.org/@wordpress/scripts/-/scripts-30.7.0.tgz", + "integrity": "sha512-vwrf6Xo1GXV2ug4xdYMgZ2CVpNNfArOEJyX6w9CafIRmLOm8GkVGSza0VlEoOh1BTqQPv/awq6uiOKVMbVNB5Q==", "dev": true, "requires": { - "@babel/core": "^7.16.0", + "@babel/core": "7.25.7", "@pmmmwh/react-refresh-webpack-plugin": "^0.5.11", "@svgr/webpack": "^8.0.1", - "@wordpress/babel-preset-default": "^8.1.0", - "@wordpress/browserslist-config": "^6.1.0", - "@wordpress/dependency-extraction-webpack-plugin": "^6.1.0", - "@wordpress/e2e-test-utils-playwright": "^1.1.0", - "@wordpress/eslint-plugin": "^19.1.0", - "@wordpress/jest-preset-default": "^12.1.0", - "@wordpress/npm-package-json-lint-config": "^5.1.0", - "@wordpress/postcss-plugins-preset": "^5.1.0", - "@wordpress/prettier-config": "^4.1.0", - "@wordpress/stylelint-config": "^22.1.0", + "@wordpress/babel-preset-default": "*", + "@wordpress/browserslist-config": "*", + "@wordpress/dependency-extraction-webpack-plugin": "*", + "@wordpress/e2e-test-utils-playwright": "*", + "@wordpress/eslint-plugin": "*", + "@wordpress/jest-preset-default": "*", + "@wordpress/npm-package-json-lint-config": "*", + "@wordpress/postcss-plugins-preset": "*", + "@wordpress/prettier-config": "*", + "@wordpress/stylelint-config": "*", "adm-zip": "^0.5.9", - "babel-jest": "^29.6.2", - "babel-loader": "^8.2.3", + "babel-jest": "29.7.0", + "babel-loader": "9.2.1", "browserslist": "^4.21.10", "chalk": "^4.0.0", "check-node-version": "^4.1.0", "clean-webpack-plugin": "^3.0.0", "copy-webpack-plugin": "^10.2.0", - "cross-spawn": "^5.1.0", + "cross-spawn": "^7.0.6", "css-loader": "^6.2.0", "cssnano": "^6.0.1", "cwd": "^0.10.0", @@ -22429,33 +22473,82 @@ "fast-glob": "^3.2.7", "filenamify": "^4.2.0", "jest": "^29.6.2", - "jest-dev-server": "^9.0.1", + "jest-dev-server": "^10.1.4", "jest-environment-jsdom": "^29.6.2", "jest-environment-node": "^29.6.2", + "json2php": "^0.0.9", "markdownlint-cli": "^0.31.1", "merge-deep": "^3.0.3", - "mini-css-extract-plugin": "^2.5.1", + "mini-css-extract-plugin": "^2.9.2", "minimist": "^1.2.0", "npm-package-json-lint": "^6.4.0", "npm-packlist": "^3.0.0", "postcss": "^8.4.5", "postcss-loader": "^6.2.1", "prettier": "npm:wp-prettier@3.0.3", - "puppeteer-core": "^13.2.0", + "puppeteer-core": "^23.10.1", "react-refresh": "^0.14.0", "read-pkg-up": "^7.0.1", "resolve-bin": "^0.4.0", "rtlcss-webpack-plugin": "^4.0.7", - "sass": "^1.35.2", - "sass-loader": "^12.1.0", + "sass": "^1.50.1", + "sass-loader": "^16.0.3", + "schema-utils": "^4.2.0", "source-map-loader": "^3.0.0", - "stylelint": "^14.2.0", - "terser-webpack-plugin": "^5.3.9", + "stylelint": "^16.8.2", + "terser-webpack-plugin": "^5.3.10", "url-loader": "^4.1.1", - "webpack": "^5.88.2", + "webpack": "^5.97.0", "webpack-bundle-analyzer": "^4.9.1", "webpack-cli": "^5.1.4", "webpack-dev-server": "^4.15.1" + }, + "dependencies": { + "ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + } + }, + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "json2php": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/json2php/-/json2php-0.0.9.tgz", + "integrity": "sha512-fQMYwvPsQt8hxRnCGyg1r2JVi6yL8Um0DIIawiKiMK9yhAAkcRNj5UsBWoaFvFzPpcWbgw9L6wzj+UMYA702Mw==", + "dev": true + }, + "schema-utils": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz", + "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + } + } } }, "@wordpress/stylelint-config": { @@ -22468,16 +22561,6 @@ "stylelint-config-recommended-scss": "^5.0.2" } }, - "@wordpress/url": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@wordpress/url/-/url-4.1.0.tgz", - "integrity": "sha512-6Yi9EbTgUGJgsm6XtfO4By8q2+9pTzWkxzx27ShKGF+PqIgIZjiDssf2NfD/oNUevIy48LbQMbyEyK+9r2Bw9A==", - "dev": true, - "requires": { - "@babel/runtime": "^7.16.0", - "remove-accents": "^0.5.0" - } - }, "@wordpress/warning": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/@wordpress/warning/-/warning-3.1.0.tgz", @@ -22513,9 +22596,9 @@ } }, "acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "version": "8.14.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", + "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", "dev": true }, "acorn-globals": { @@ -22528,12 +22611,6 @@ "acorn-walk": "^8.0.2" } }, - "acorn-import-assertions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", - "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", - "dev": true - }, "acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", @@ -22872,16 +22949,16 @@ "dev": true }, "autoprefixer": { - "version": "10.4.19", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.19.tgz", - "integrity": "sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==", + "version": "10.4.20", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz", + "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==", "dev": true, "requires": { - "browserslist": "^4.23.0", - "caniuse-lite": "^1.0.30001599", + "browserslist": "^4.23.3", + "caniuse-lite": "^1.0.30001646", "fraction.js": "^4.3.7", "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", + "picocolors": "^1.0.1", "postcss-value-parser": "^4.2.0" } }, @@ -22895,18 +22972,18 @@ } }, "axe-core": { - "version": "4.9.1", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.9.1.tgz", - "integrity": "sha512-QbUdXJVTpvUTHU7871ppZkdOLBeGUKBQWHkHrvN2V9IQWGMt61zf3B45BtzjxEJzYuj0JBjBZP/hmYS/R9pmAw==", + "version": "4.10.2", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.10.2.tgz", + "integrity": "sha512-RE3mdQ7P3FRSe7eqCWoeQ/Z9QXrtniSjp1wUjt5nRC3WIpz5rSCve6o3fsZ2aCpJtrZjSZgjwXAoTO5k4tEI0w==", "dev": true }, "axios": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.6.2.tgz", - "integrity": "sha512-7i24Ri4pmDRfJTR7LDBhsOTtcm+9kjX5WiY1X3wIisx6G9So3pfMkEiU7emUBe46oceVImccTEM3k6C5dbVW8A==", + "version": "1.7.9", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.7.9.tgz", + "integrity": "sha512-LhLcE7Hbiryz8oMDdDptSrWowmB4Bl6RCt6sIJKpRB4XtVf0iEgewX3au/pJqm+Py1kCASkb/FFKjxQaLtxJvw==", "dev": true, "requires": { - "follow-redirects": "^1.15.0", + "follow-redirects": "^1.15.6", "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } @@ -22942,26 +23019,52 @@ } }, "babel-loader": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.3.0.tgz", - "integrity": "sha512-H8SvsMF+m9t15HNLMipppzkC+Y2Yq+v3SonZyU70RBL/h1gxPkH08Ot8pEE9Z4Kd+czyWJClmFS8qzIP9OZ04Q==", + "version": "9.2.1", + "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-9.2.1.tgz", + "integrity": "sha512-fqe8naHt46e0yIdkjUZYqddSXfej3AHajX+CSO5X7oy0EmPc6o5Xh+RClNoHjnieWz9AW4kZxW9yyFMhVB1QLA==", "dev": true, "requires": { - "find-cache-dir": "^3.3.1", - "loader-utils": "^2.0.0", - "make-dir": "^3.1.0", - "schema-utils": "^2.6.5" + "find-cache-dir": "^4.0.0", + "schema-utils": "^4.0.0" }, "dependencies": { + "ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + } + }, + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, "schema-utils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", - "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz", + "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==", "dev": true, "requires": { - "@types/json-schema": "^7.0.5", - "ajv": "^6.12.4", - "ajv-keywords": "^3.5.2" + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" } } } @@ -23103,6 +23206,45 @@ "dev": true, "optional": true }, + "bare-fs": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-2.3.5.tgz", + "integrity": "sha512-SlE9eTxifPDJrT6YgemQ1WGFleevzwY+XAP1Xqgl56HtcrisC2CHCZ2tq6dBpcH2TnNxwUEUGhweo+lrQtYuiw==", + "dev": true, + "optional": true, + "requires": { + "bare-events": "^2.0.0", + "bare-path": "^2.0.0", + "bare-stream": "^2.0.0" + } + }, + "bare-os": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-2.4.4.tgz", + "integrity": "sha512-z3UiI2yi1mK0sXeRdc4O1Kk8aOa/e+FNWZcTiPB/dfTWyLypuE99LibgRaQki914Jq//yAWylcAt+mknKdixRQ==", + "dev": true, + "optional": true + }, + "bare-path": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-2.1.3.tgz", + "integrity": "sha512-lh/eITfU8hrj9Ru5quUp0Io1kJWIk1bTjzo7JH1P5dWmQ2EL4hFUlfI8FonAhSlgIfhn63p84CDY/x+PisgcXA==", + "dev": true, + "optional": true, + "requires": { + "bare-os": "^2.1.0" + } + }, + "bare-stream": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.6.1.tgz", + "integrity": "sha512-eVZbtKM+4uehzrsj49KtCy3Pbg7kO1pJ3SKZ1SFrIH/0pnj9scuGGgUlNDf/7qS8WKtGdiJY5Kyhs/ivYPTB/g==", + "dev": true, + "optional": true, + "requires": { + "streamx": "^2.21.0" + } + }, "base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", @@ -23133,21 +23275,10 @@ "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", "dev": true }, - "bl": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", - "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "dev": true, - "requires": { - "buffer": "^5.5.0", - "inherits": "^2.0.4", - "readable-stream": "^3.4.0" - } - }, "body-parser": { - "version": "1.20.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", - "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", "dev": true, "requires": { "bytes": "3.1.2", @@ -23158,7 +23289,7 @@ "http-errors": "2.0.0", "iconv-lite": "0.4.24", "on-finished": "2.4.1", - "qs": "6.11.0", + "qs": "6.13.0", "raw-body": "2.5.2", "type-is": "~1.6.18", "unpipe": "1.0.0" @@ -23234,15 +23365,15 @@ } }, "browserslist": { - "version": "4.23.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.1.tgz", - "integrity": "sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==", + "version": "4.24.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.3.tgz", + "integrity": "sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001629", - "electron-to-chromium": "^1.4.796", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.16" + "caniuse-lite": "^1.0.30001688", + "electron-to-chromium": "^1.5.73", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.1" } }, "bser": { @@ -23390,9 +23521,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001636", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001636.tgz", - "integrity": "sha512-bMg2vmr8XBsbL6Lr0UHXy/21m84FTxDLWn2FSqMd5PrlbMxwJlQnC2YWYxVgp66PZE+BBNF2jYQUBKCo1FDeZg==", + "version": "1.0.30001688", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001688.tgz", + "integrity": "sha512-Nmqpru91cuABu/DTCXbM2NSRHzM2uVHfPnhJ/1zEAJx/ILBRVmz3pzH4N7DZqbdG0gWClsCC05Oj0mJ/1AWMbA==", "dev": true }, "capital-case": { @@ -23424,21 +23555,6 @@ "requires": { "color-convert": "^2.0.1" } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true } } }, @@ -23500,21 +23616,6 @@ "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true } } }, @@ -23534,22 +23635,16 @@ "readdirp": "~3.6.0" } }, - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "dev": true - }, "chrome-launcher": { - "version": "0.15.2", - "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-0.15.2.tgz", - "integrity": "sha512-zdLEwNo3aUVzIhKhTtXfxhdvZhUghrnmkvcAq2NoDd+LeOHKf03H5jwZ8T/STsAlzyALkBVK552iaG1fGf1xVQ==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/chrome-launcher/-/chrome-launcher-1.1.2.tgz", + "integrity": "sha512-YclTJey34KUm5jB1aEJCq807bSievi7Nb/TU4Gu504fUYi3jw3KCIaH6L7nFWQhdEgH3V+wCh+kKD1P5cXnfxw==", "dev": true, "requires": { "@types/node": "*", "escape-string-regexp": "^4.0.0", "is-wsl": "^2.2.0", - "lighthouse-logger": "^1.0.0" + "lighthouse-logger": "^2.0.1" }, "dependencies": { "escape-string-regexp": { @@ -23561,20 +23656,11 @@ } }, "chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz", + "integrity": "sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ==", "dev": true }, - "chromium-bidi": { - "version": "0.4.16", - "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.4.16.tgz", - "integrity": "sha512-7ZbXdWERxRxSwo3txsBjjmc/NLxqb1Bk30mRb0BMS4YIaiV6zvKZqL/UAH+DdqcDYayDWk2n/y8klkBDODrPvA==", - "dev": true, - "requires": { - "mitt": "3.0.0" - } - }, "ci-info": { "version": "3.9.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", @@ -23645,18 +23731,18 @@ "dev": true }, "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, "requires": { - "color-name": "1.1.3" + "color-name": "~1.1.4" } }, "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, "colord": { @@ -23698,12 +23784,6 @@ "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", "dev": true }, - "commondir": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", - "dev": true - }, "compressible": { "version": "2.0.18", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", @@ -23758,17 +23838,15 @@ "dev": true }, "concurrently": { - "version": "8.2.2", - "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-8.2.2.tgz", - "integrity": "sha512-1dP4gpXFhei8IOtlXRE/T/4H88ElHgTiUzh71YUmtjTEHMSRS2Z/fgOxHSxxusGHogsRfxNq1vyAwxSC+EVyDg==", + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/concurrently/-/concurrently-9.1.0.tgz", + "integrity": "sha512-VxkzwMAn4LP7WyMnJNbHN5mKV9L2IbyDjpzemKr99sXNR3GqRNMMHdm7prV1ws9wg7ETj6WUkNOigZVsptwbgg==", "dev": true, "requires": { "chalk": "^4.1.2", - "date-fns": "^2.30.0", "lodash": "^4.17.21", "rxjs": "^7.8.1", "shell-quote": "^1.8.1", - "spawn-command": "0.0.2", "supports-color": "^8.1.1", "tree-kill": "^1.2.2", "yargs": "^17.7.2" @@ -23852,9 +23930,9 @@ "dev": true }, "cookie": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", "dev": true }, "cookie-signature": { @@ -24008,42 +24086,15 @@ "prompts": "^2.0.1" } }, - "cross-fetch": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-3.1.5.tgz", - "integrity": "sha512-lvb1SBsI0Z7GDwmuid+mU3kWVBwTVUbe7S0H52yaaAdQOXq2YktTCZdlAcNKFzE6QtRz0snpw9bNiPeOIkkQvw==", - "dev": true, - "requires": { - "node-fetch": "2.6.7" - } - }, "cross-spawn": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", - "integrity": "sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, "requires": { - "lru-cache": "^4.0.1", - "shebang-command": "^1.2.0", - "which": "^1.2.9" - }, - "dependencies": { - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", - "dev": true - } + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" } }, "crypto-random-string": { @@ -24065,9 +24116,9 @@ "dev": true }, "css-functions-list": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.1.0.tgz", - "integrity": "sha512-/9lCvYZaUbBGvYUgYGFJ4dcYiyqdhSjG7IPVluoV8A1ILjkF7ilmhp1OGUz8n+nmBcu0RNrQAzgD8B6FJbrt2w==", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.3.tgz", + "integrity": "sha512-IQOkD3hbR5KrN93MtcYuad6YPuTSUhntLHDuLEbFWE+ff2/XSZNdZG+LcbbIW5AXKg/WFIfYItIzVoHngHXZzA==", "dev": true }, "css-loader": { @@ -24316,15 +24367,6 @@ "is-data-view": "^1.0.1" } }, - "date-fns": { - "version": "2.30.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", - "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", - "dev": true, - "requires": { - "@babel/runtime": "^7.21.0" - } - }, "debounce": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", @@ -24552,9 +24594,9 @@ "dev": true }, "devtools-protocol": { - "version": "0.0.981744", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.981744.tgz", - "integrity": "sha512-0cuGS8+jhR67Fy7qG3i3Pc7Aw494sb9yG9QgpG97SFVWwolgYjlhJg7n+UaHxOQT30d1TYu/EYe9k01ivLErIg==", + "version": "0.0.1367902", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1367902.tgz", + "integrity": "sha512-XxtPuC3PGakY6PD7dG66/o8KwJ/LkH2/EKe19Dcw58w53dv4/vSQEkn/SzuyhHE2q4zPgCkxQBxus3VV4ql+Pg==", "dev": true }, "diff-sequences": { @@ -24674,9 +24716,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.4.810", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.810.tgz", - "integrity": "sha512-Kaxhu4T7SJGpRQx99tq216gCq2nMxJo+uuT6uzz9l8TVN2stL7M06MIIXAtr9jsrLs2Glflgf2vMQRepxawOdQ==", + "version": "1.5.73", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.73.tgz", + "integrity": "sha512-8wGNxG9tAG5KhGd3eeA0o6ixhiNdgr0DcHWm85XPCphwZgD1lIEoi6t3VERayWao7SF7AAZTw6oARGJeVjH8Kg==", "dev": true }, "emittery": { @@ -24698,20 +24740,11 @@ "dev": true }, "encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "dev": true }, - "encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "dev": true, - "requires": { - "iconv-lite": "^0.6.2" - } - }, "end-of-stream": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", @@ -24722,9 +24755,9 @@ } }, "enhanced-resolve": { - "version": "5.15.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", - "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", + "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", "dev": true, "requires": { "graceful-fs": "^4.2.4", @@ -24747,6 +24780,12 @@ "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", "dev": true }, + "env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "dev": true + }, "envinfo": { "version": "7.11.0", "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.11.0.tgz", @@ -24880,9 +24919,9 @@ } }, "es-module-lexer": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.3.0.tgz", - "integrity": "sha512-vZK7T0N2CBmBOixhmjdqx2gWVbFZ4DXZ/NyRMZVlJXPa7CyFS+/a4QQsDGDQy9ZfEzxFuNEsMLeQJnKP2p5/JA==", + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", + "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", "dev": true }, "es-object-atoms": { @@ -24926,9 +24965,9 @@ } }, "escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true }, "escape-html": { @@ -25023,17 +25062,6 @@ "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", "dev": true }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, "doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", @@ -25103,30 +25131,6 @@ "requires": { "argparse": "^2.0.1" } - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } } } }, @@ -25566,43 +25570,6 @@ "onetime": "^5.1.2", "signal-exit": "^3.0.3", "strip-final-newline": "^2.0.0" - }, - "dependencies": { - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - } } }, "exit": { @@ -25640,37 +25607,37 @@ "dev": true }, "express": { - "version": "4.19.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", - "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", "dev": true, "requires": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.2", + "body-parser": "1.20.3", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.6.0", + "cookie": "0.7.1", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "1.2.0", + "finalhandler": "1.3.1", "fresh": "0.5.2", "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", + "merge-descriptors": "1.0.3", "methods": "~1.1.2", "on-finished": "2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", + "path-to-regexp": "0.1.12", "proxy-addr": "~2.0.7", - "qs": "6.11.0", + "qs": "6.13.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", + "send": "0.19.0", + "serve-static": "1.16.2", "setprototypeof": "1.2.0", "statuses": "2.0.1", "type-is": "~1.6.18", @@ -25684,12 +25651,6 @@ "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", "dev": true }, - "cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", - "dev": true - }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", @@ -25773,6 +25734,12 @@ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true }, + "fast-uri": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.3.tgz", + "integrity": "sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==", + "dev": true + }, "fastest-levenshtein": { "version": "1.0.16", "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", @@ -25851,13 +25818,13 @@ } }, "finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", "dev": true, "requires": { "debug": "2.6.9", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "on-finished": "2.4.1", "parseurl": "~1.3.3", @@ -25871,28 +25838,87 @@ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "dev": true, "requires": { - "ms": "2.0.0" + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "dev": true + } + } + }, + "find-cache-dir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-4.0.0.tgz", + "integrity": "sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==", + "dev": true, + "requires": { + "common-path-prefix": "^3.0.0", + "pkg-dir": "^7.0.0" + }, + "dependencies": { + "find-up": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-6.3.0.tgz", + "integrity": "sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==", + "dev": true, + "requires": { + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" + } + }, + "locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "dev": true, + "requires": { + "p-locate": "^6.0.0" + } + }, + "p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "requires": { + "yocto-queue": "^1.0.0" + } + }, + "p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "dev": true, + "requires": { + "p-limit": "^4.0.0" + } + }, + "path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "dev": true + }, + "pkg-dir": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-7.0.0.tgz", + "integrity": "sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==", + "dev": true, + "requires": { + "find-up": "^6.3.0" } }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "yocto-queue": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.1.1.tgz", + "integrity": "sha512-b4JR1PFR10y1mKjhHY9LaGo6tmrgjit7hxVIeAmyMw3jegXR4dhYqLaQF5zMXZxY7tLpMyJeLjr1C4rLmkVe8g==", "dev": true } } }, - "find-cache-dir": { - "version": "3.3.2", - "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", - "integrity": "sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==", - "dev": true, - "requires": { - "commondir": "^1.0.1", - "make-dir": "^3.0.2", - "pkg-dir": "^4.1.0" - } - }, "find-file-up": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/find-file-up/-/find-file-up-0.1.3.tgz", @@ -25967,9 +25993,9 @@ } }, "flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz", + "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==", "dev": true }, "follow-redirects": { @@ -26031,12 +26057,6 @@ "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", "dev": true }, - "fs-constants": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "dev": true - }, "fs-exists-sync": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/fs-exists-sync/-/fs-exists-sync-0.1.0.tgz", @@ -26177,16 +26197,6 @@ "fs-extra": "^11.2.0" } }, - "gettext-parser": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/gettext-parser/-/gettext-parser-1.4.0.tgz", - "integrity": "sha512-sedZYLHlHeBop/gZ1jdg59hlUEcpcZJofLq2JFwJT1zTqAU3l2wFv6IsuwFHGqbiT9DWzMUW4/em2+hspnmMMA==", - "dev": true, - "requires": { - "encoding": "^0.1.12", - "safe-buffer": "^5.1.1" - } - }, "glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -26236,6 +26246,17 @@ "ini": "^1.3.4", "is-windows": "^0.2.0", "which": "^1.2.12" + }, + "dependencies": { + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } } }, "globals": { @@ -26284,9 +26305,9 @@ } }, "graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "dev": true }, "grapheme-splitter": { @@ -26470,9 +26491,9 @@ "dev": true }, "html-tags": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.2.0.tgz", - "integrity": "sha512-vy7ClnArOZwCnqZgvv+ddgHgJiAFXe3Ge9ML5/mBctVJoUoYPCdxVucOywjDARn6CVoh3dRSFdPHy2sX80L0Wg==", + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz", + "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==", "dev": true }, "http-deceiver": { @@ -26529,9 +26550,9 @@ } }, "http-proxy-middleware": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", - "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.7.tgz", + "integrity": "sha512-fgVY8AV7qU7z/MmXJ/rxwbrtQH4jBQ9m7kp3llF0liB7glmFeVZFBepQb32T3y8n8k2+AEYuMPCpinYW+/CuRA==", "dev": true, "requires": { "@types/http-proxy": "^1.17.8", @@ -26599,6 +26620,12 @@ "integrity": "sha512-W7+sO6/yhxy83L0G7xR8YAc5Z5QFtYEXXRV6EaE8tuYBZJnA3gVgp3q7X7muhLZVodeb9UfvjSbwt9VJwjIYAg==", "dev": true }, + "immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", + "dev": true + }, "immutable": { "version": "4.2.4", "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.2.4.tgz", @@ -26615,12 +26642,6 @@ "resolve-from": "^4.0.0" } }, - "import-lazy": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", - "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", - "dev": true - }, "import-local": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", @@ -26683,20 +26704,17 @@ "dev": true }, "intl-messageformat": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-4.4.0.tgz", - "integrity": "sha512-z+Bj2rS3LZSYU4+sNitdHrwnBhr0wO80ZJSW8EzKDBowwUe3Q/UsvgCGjrwa+HPzoGCLEb9HAjfJgo4j2Sac8w==", + "version": "10.7.10", + "resolved": "https://registry.npmjs.org/intl-messageformat/-/intl-messageformat-10.7.10.tgz", + "integrity": "sha512-hp7iejCBiJdW3zmOe18FdlJu8U/JsADSDiBPQhfdSeI8B9POtvPRvPh3nMlvhYayGMKLv6maldhR7y3Pf1vkpw==", "dev": true, "requires": { - "intl-messageformat-parser": "^1.8.1" + "@formatjs/ecma402-abstract": "2.3.1", + "@formatjs/fast-memoize": "2.2.5", + "@formatjs/icu-messageformat-parser": "2.9.7", + "tslib": "2" } }, - "intl-messageformat-parser": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/intl-messageformat-parser/-/intl-messageformat-parser-1.8.1.tgz", - "integrity": "sha512-IMSCKVf0USrM/959vj3xac7s8f87sc+80Y/ipBzdKy4ifBv5Gsj2tZ41EAaURVg01QU71fYr77uA8Meh6kELbg==", - "dev": true - }, "ip-address": { "version": "9.0.5", "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", @@ -27298,18 +27316,18 @@ } }, "jest-dev-server": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/jest-dev-server/-/jest-dev-server-9.0.2.tgz", - "integrity": "sha512-Zc/JB0IlNNrpXkhBw+h86cGrde/Mey52KvF+FER2eyrtYJTHObOwW7Iarxm3rPyTKby5+3Y2QZtl8pRz/5GCxg==", + "version": "10.1.4", + "resolved": "https://registry.npmjs.org/jest-dev-server/-/jest-dev-server-10.1.4.tgz", + "integrity": "sha512-bGQ6sedNGtT6AFHhCVqGTXMPz7UyJi/ZrhNBgyqsP0XU9N8acCEIfqZEA22rOaZ+NdEVsaltk6tL7UT6aXfI7w==", "dev": true, "requires": { "chalk": "^4.1.2", "cwd": "^0.10.0", "find-process": "^1.4.7", "prompts": "^2.4.2", - "spawnd": "^9.0.2", + "spawnd": "^10.1.4", "tree-kill": "^1.2.2", - "wait-on": "^7.2.0" + "wait-on": "^8.0.1" } }, "jest-diff": { @@ -27733,14 +27751,14 @@ } }, "joi": { - "version": "17.11.0", - "resolved": "https://registry.npmjs.org/joi/-/joi-17.11.0.tgz", - "integrity": "sha512-NgB+lZLNoqISVy1rZocE9PZI36bL/77ie924Ri43yEvi9GUUMPeyVIr8KdFTMUlby1p0PBYMk9spIxEUQYqrJQ==", + "version": "17.13.3", + "resolved": "https://registry.npmjs.org/joi/-/joi-17.13.3.tgz", + "integrity": "sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA==", "dev": true, "requires": { - "@hapi/hoek": "^9.0.0", - "@hapi/topo": "^5.0.0", - "@sideway/address": "^4.1.3", + "@hapi/hoek": "^9.3.0", + "@hapi/topo": "^5.1.0", + "@sideway/address": "^4.1.5", "@sideway/formula": "^3.0.1", "@sideway/pinpoint": "^2.0.0" } @@ -27826,9 +27844,15 @@ } }, "jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "dev": true + }, + "json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", "dev": true }, "json-parse-even-better-errors": { @@ -27897,6 +27921,15 @@ "object.values": "^1.1.6" } }, + "keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "requires": { + "json-buffer": "3.0.1" + } + }, "kind-of": { "version": "3.2.2", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", @@ -27919,9 +27952,9 @@ "dev": true }, "known-css-properties": { - "version": "0.26.0", - "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.26.0.tgz", - "integrity": "sha512-5FZRzrZzNTBruuurWpvZnvP9pum+fe0HcK8z/ooo+U+Hmp4vtbyp1/QDsqmufirXy4egGzbaH/y2uCZf+6W5Kg==", + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.35.0.tgz", + "integrity": "sha512-a/RAk2BfKk+WFGhhOCAYqSiFLc34k8Mt/6NWRI4joER0EYUzXIcFivjjnoD3+XU1DggLn/tZc3DOAgke7l8a4A==", "dev": true }, "language-subtag-registry": { @@ -27971,127 +28004,63 @@ "type-check": "~0.4.0" } }, + "lie": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz", + "integrity": "sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==", + "dev": true, + "requires": { + "immediate": "~3.0.5" + } + }, "lighthouse": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/lighthouse/-/lighthouse-10.4.0.tgz", - "integrity": "sha512-XQWHEWkJ8YxSPsxttBJORy5+hQrzbvGkYfeP3fJjyYKioWkF2MXfFqNK4ZuV4jL8pBu7Z91qnQP6In0bq1yXww==", + "version": "12.3.0", + "resolved": "https://registry.npmjs.org/lighthouse/-/lighthouse-12.3.0.tgz", + "integrity": "sha512-OaLE8DasnwQkn2CBo2lKtD+IQv42mNP3T+Vaw29I++rAh0Zpgc6SM15usdIYyzhRMR5EWFxze5Fyb+HENJSh2A==", "dev": true, "requires": { - "@sentry/node": "^6.17.4", - "axe-core": "4.7.2", - "chrome-launcher": "^0.15.2", + "@paulirish/trace_engine": "0.0.39", + "@sentry/node": "^7.0.0", + "axe-core": "^4.10.2", + "chrome-launcher": "^1.1.2", "configstore": "^5.0.1", "csp_evaluator": "1.1.1", - "devtools-protocol": "0.0.1155343", + "devtools-protocol": "0.0.1312386", "enquirer": "^2.3.6", "http-link-header": "^1.1.1", - "intl-messageformat": "^4.4.0", + "intl-messageformat": "^10.5.3", "jpeg-js": "^0.4.4", - "js-library-detector": "^6.6.0", - "lighthouse-logger": "^1.4.1", - "lighthouse-stack-packs": "1.11.0", - "lodash": "^4.17.21", + "js-library-detector": "^6.7.0", + "lighthouse-logger": "^2.0.1", + "lighthouse-stack-packs": "1.12.2", + "lodash-es": "^4.17.21", "lookup-closest-locale": "6.2.0", "metaviewport-parser": "0.3.0", "open": "^8.4.0", "parse-cache-control": "1.0.1", - "ps-list": "^8.0.0", - "puppeteer-core": "^20.8.0", - "robots-parser": "^3.0.0", + "puppeteer-core": "^23.10.4", + "robots-parser": "^3.0.1", "semver": "^5.3.0", "speedline-core": "^1.4.3", - "third-party-web": "^0.23.3", + "third-party-web": "^0.26.1", + "tldts-icann": "^6.1.16", "ws": "^7.0.0", "yargs": "^17.3.1", "yargs-parser": "^21.0.0" }, "dependencies": { - "axe-core": { - "version": "4.7.2", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.7.2.tgz", - "integrity": "sha512-zIURGIS1E1Q4pcrMjp+nnEh+16G56eG/MUllJH8yEvw7asDo7Ac9uhC9KIH5jzpITueEZolfYglnCGIuSBz39g==", - "dev": true - }, - "cross-fetch": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", - "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", - "dev": true, - "requires": { - "node-fetch": "^2.6.12" - } - }, "devtools-protocol": { - "version": "0.0.1155343", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1155343.tgz", - "integrity": "sha512-oD9vGBV2wTc7fAzAM6KC0chSgs234V8+qDEeK+mcbRj2UvcuA7lgBztGi/opj/iahcXD3BSj8Ymvib628yy9FA==", + "version": "0.0.1312386", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1312386.tgz", + "integrity": "sha512-DPnhUXvmvKT2dFA/j7B+riVLUt9Q6RKJlcppojL5CoRywJJKLDYnRlw0gTFKfgDPHP5E04UoB71SxoJlVZy8FA==", "dev": true }, - "node-fetch": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", - "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", - "dev": true, - "requires": { - "whatwg-url": "^5.0.0" - } - }, - "puppeteer-core": { - "version": "20.9.0", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-20.9.0.tgz", - "integrity": "sha512-H9fYZQzMTRrkboEfPmf7m3CLDN6JvbxXA3qTtS+dFt27tR+CsFHzPsT6pzp6lYL6bJbAPaR0HaPO6uSi+F94Pg==", - "dev": true, - "requires": { - "@puppeteer/browsers": "1.4.6", - "chromium-bidi": "0.4.16", - "cross-fetch": "4.0.0", - "debug": "4.3.4", - "devtools-protocol": "0.0.1147663", - "ws": "8.13.0" - }, - "dependencies": { - "devtools-protocol": { - "version": "0.0.1147663", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1147663.tgz", - "integrity": "sha512-hyWmRrexdhbZ1tcJUGpO95ivbRhWXz++F4Ko+n21AY5PNln2ovoJw+8ZMNDTtip+CNFQfrtLVh/w4009dXO/eQ==", - "dev": true - }, - "ws": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", - "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", - "dev": true - } - } - }, "semver": { "version": "5.7.2", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true }, - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true - }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true - }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, "ws": { "version": "7.5.10", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", @@ -28107,9 +28076,9 @@ } }, "lighthouse-logger": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/lighthouse-logger/-/lighthouse-logger-1.4.2.tgz", - "integrity": "sha512-gPWxznF6TKmUHrOQjlVo2UbaL2EJ71mb2CCeRs/2qBpi4L/g4LUVc9+3lKQ6DTUZwJswfM7ainGrLO1+fOqa2g==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/lighthouse-logger/-/lighthouse-logger-2.0.1.tgz", + "integrity": "sha512-ioBrW3s2i97noEmnXxmUq7cjIcVRjT5HBpAYy8zE11CxU9HqlWHHeRxfeN1tn8F7OEMVPIC9x1f8t3Z7US9ehQ==", "dev": true, "requires": { "debug": "^2.6.9", @@ -28134,9 +28103,9 @@ } }, "lighthouse-stack-packs": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/lighthouse-stack-packs/-/lighthouse-stack-packs-1.11.0.tgz", - "integrity": "sha512-sRr0z1S/I26VffRLq9KJsKtLk856YrJlNGmcJmbLX8dFn3MuzVPUbstuChEhqnSxZb8TZmVfthuXuwhG9vRoSw==", + "version": "1.12.2", + "resolved": "https://registry.npmjs.org/lighthouse-stack-packs/-/lighthouse-stack-packs-1.12.2.tgz", + "integrity": "sha512-Ug8feS/A+92TMTCK6yHYLwaFMuelK/hAKRMdldYkMNwv+d9PtWxjXEg6rwKtsUXTADajhdrhXyuNCJ5/sfmPFw==", "dev": true }, "lilconfig": { @@ -28177,6 +28146,15 @@ "json5": "^2.1.2" } }, + "localforage": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/localforage/-/localforage-1.10.0.tgz", + "integrity": "sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==", + "dev": true, + "requires": { + "lie": "3.1.1" + } + }, "locate-path": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", @@ -28192,6 +28170,12 @@ "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, + "lodash-es": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.21.tgz", + "integrity": "sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==", + "dev": true + }, "lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", @@ -28256,12 +28240,6 @@ "tslib": "^2.0.3" } }, - "lru_map": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/lru_map/-/lru_map-0.3.3.tgz", - "integrity": "sha512-Pn9cox5CsMYngeDbmChANltQl+5pi6XmTrraMSzhPmMBbmgcxmqWry0U3PGapCU1yB4/LqCcom7qhHZiF/jGfQ==", - "dev": true - }, "lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -28432,12 +28410,6 @@ "fs-monkey": "^1.0.4" } }, - "memize": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/memize/-/memize-2.1.0.tgz", - "integrity": "sha512-yywVJy8ctVlN5lNPxsep5urnZ6TTclwPEyigM9M3Bi8vseJBOfqNrGWN/r8NzuIt3PovM323W04blJfGQfQSVg==", - "dev": true - }, "meow": { "version": "9.0.0", "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", @@ -28523,9 +28495,9 @@ } }, "merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", "dev": true }, "merge-stream": { @@ -28553,12 +28525,12 @@ "dev": true }, "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, "requires": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" } }, @@ -28596,24 +28568,25 @@ "dev": true }, "mini-css-extract-plugin": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.2.tgz", - "integrity": "sha512-EdlUizq13o0Pd+uCp+WO/JpkLvHRVGt97RqfeGhXqAcorYo1ypJSpkV+WDT0vY/kmh/p7wRdJNJtuyK540PXDw==", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.2.tgz", + "integrity": "sha512-GJuACcS//jtq4kCtd5ii/M0SZf7OZRH+BxdqXZHaJfb8TJiVl+NgQRPwiYt2EuqeSkNydn/7vP+bcE27C5mb9w==", "dev": true, "requires": { - "schema-utils": "^4.0.0" + "schema-utils": "^4.0.0", + "tapable": "^2.2.1" }, "dependencies": { "ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, "requires": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "require-from-string": "^2.0.2" } }, "ajv-keywords": { @@ -28632,15 +28605,15 @@ "dev": true }, "schema-utils": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", - "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz", + "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==", "dev": true, "requires": { "@types/json-schema": "^7.0.9", - "ajv": "^8.8.0", + "ajv": "^8.9.0", "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.0.0" + "ajv-keywords": "^5.1.0" } } } @@ -28691,12 +28664,6 @@ } } }, - "mitt": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.0.tgz", - "integrity": "sha512-7dX2/10ITVyqh4aOSVI9gdape+t9l2/8QxHrFmUXu4EEUpdlxl6RudZUPZoc+zuY2hk1j7XxVroIVIan/pD/SQ==", - "dev": true - }, "mixin-object": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/mixin-object/-/mixin-object-2.0.1.tgz", @@ -28715,12 +28682,6 @@ } } }, - "mkdirp-classic": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", - "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", - "dev": true - }, "mrmime": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", @@ -28744,9 +28705,9 @@ } }, "nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", "dev": true }, "natural-compare": { @@ -28783,39 +28744,6 @@ "tslib": "^2.0.3" } }, - "node-fetch": { - "version": "2.6.7", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.7.tgz", - "integrity": "sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==", - "dev": true, - "requires": { - "whatwg-url": "^5.0.0" - }, - "dependencies": { - "tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", - "dev": true - }, - "webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", - "dev": true - }, - "whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dev": true, - "requires": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - } - } - }, "node-forge": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", @@ -28829,9 +28757,9 @@ "dev": true }, "node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", "dev": true }, "normalize-package-data": { @@ -29226,29 +29154,26 @@ "dev": true }, "pac-proxy-agent": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.0.1.tgz", - "integrity": "sha512-ASV8yU4LLKBAjqIPMbrgtaKIvxQri/yh2OpI+S6hVa9JRkUI3Y3NPFbfngDtY7oFtSMD3w31Xns89mDa3Feo5A==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.1.0.tgz", + "integrity": "sha512-Z5FnLVVZSnX7WjBg0mhDtydeRZ1xMcATZThjySQUHqr+0ksP8kqaw23fNKkaaN/Z8gwLUs/W7xdl0I75eP2Xyw==", "dev": true, "requires": { "@tootallnate/quickjs-emscripten": "^0.23.0", - "agent-base": "^7.0.2", + "agent-base": "^7.1.2", "debug": "^4.3.4", "get-uri": "^6.0.1", "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.2", - "pac-resolver": "^7.0.0", - "socks-proxy-agent": "^8.0.2" + "https-proxy-agent": "^7.0.6", + "pac-resolver": "^7.0.1", + "socks-proxy-agent": "^8.0.5" }, "dependencies": { "agent-base": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", - "dev": true, - "requires": { - "debug": "^4.3.4" - } + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", + "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", + "dev": true }, "http-proxy-agent": { "version": "7.0.2", @@ -29261,12 +29186,12 @@ } }, "https-proxy-agent": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", - "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", "dev": true, "requires": { - "agent-base": "^7.0.2", + "agent-base": "^7.1.2", "debug": "4" } } @@ -29391,9 +29316,9 @@ "dev": true }, "path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", "dev": true }, "path-type": { @@ -29409,9 +29334,9 @@ "dev": true }, "picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", "dev": true }, "picomatch": { @@ -29511,14 +29436,14 @@ "dev": true }, "postcss": { - "version": "8.4.38", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", - "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", + "version": "8.4.49", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", + "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", "dev": true, "requires": { "nanoid": "^3.3.7", - "picocolors": "^1.0.0", - "source-map-js": "^1.2.0" + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" } }, "postcss-calc": { @@ -29908,15 +29833,15 @@ } }, "postcss-resolve-nested-selector": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz", - "integrity": "sha512-HvExULSwLqHLgUy1rl3ANIqCsvMS0WHss2UOsXhXnQaZ9VCc2oBvIpXrl00IUFT5ZDITME0o6oiXeiHr2SAIfw==", + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.6.tgz", + "integrity": "sha512-0sglIs9Wmkzbr8lQwEyIzlDOOC9bGmfVKcJTaxv3vMmd3uo4o4DerC3En0bnmgceeql9BfC8hRkp7cg0fjdVqw==", "dev": true }, "postcss-safe-parser": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz", - "integrity": "sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-7.0.1.tgz", + "integrity": "sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A==", "dev": true }, "postcss-scss": { @@ -30057,77 +29982,12 @@ } } }, - "proxy-agent": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.3.0.tgz", - "integrity": "sha512-0LdR757eTj/JfuU7TL2YCuAZnxWXu3tkJbg4Oq3geW/qFNT/32T0sp2HnZ9O0lMR4q3vwAt0+xCA8SR0WAD0og==", - "dev": true, - "requires": { - "agent-base": "^7.0.2", - "debug": "^4.3.4", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.0", - "lru-cache": "^7.14.1", - "pac-proxy-agent": "^7.0.0", - "proxy-from-env": "^1.1.0", - "socks-proxy-agent": "^8.0.1" - }, - "dependencies": { - "agent-base": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", - "dev": true, - "requires": { - "debug": "^4.3.4" - } - }, - "http-proxy-agent": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", - "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", - "dev": true, - "requires": { - "agent-base": "^7.1.0", - "debug": "^4.3.4" - } - }, - "https-proxy-agent": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", - "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", - "dev": true, - "requires": { - "agent-base": "^7.0.2", - "debug": "4" - } - }, - "lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "dev": true - } - } - }, "proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", "dev": true }, - "ps-list": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/ps-list/-/ps-list-8.1.1.tgz", - "integrity": "sha512-OPS9kEJYVmiO48u/B9qneqhkMvgCxT+Tm28VCEJpheTpl8cJ0ffZRRNgS5mrQRTrX5yRTpaJ+hRDeefXYmmorQ==", - "dev": true - }, - "pseudomap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", - "integrity": "sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==", - "dev": true - }, "psl": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", @@ -30151,38 +30011,119 @@ "dev": true }, "puppeteer-core": { - "version": "13.7.0", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-13.7.0.tgz", - "integrity": "sha512-rXja4vcnAzFAP1OVLq/5dWNfwBGuzcOARJ6qGV7oAZhnLmVRU8G5MsdeQEAOy332ZhkIOnn9jp15R89LKHyp2Q==", + "version": "23.10.4", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-23.10.4.tgz", + "integrity": "sha512-pQAY7+IFAndWDkDodsQGguW1/ifV5OMlGXJDspwtK49Asb7poJZ/V5rXJxVSpq57bWrJasjQBZ1X27z1oWVq4Q==", "dev": true, "requires": { - "cross-fetch": "3.1.5", - "debug": "4.3.4", - "devtools-protocol": "0.0.981744", - "extract-zip": "2.0.1", - "https-proxy-agent": "5.0.1", - "pkg-dir": "4.2.0", - "progress": "2.0.3", - "proxy-from-env": "1.1.0", - "rimraf": "3.0.2", - "tar-fs": "2.1.1", - "unbzip2-stream": "1.4.3", - "ws": "8.5.0" + "@puppeteer/browsers": "2.6.1", + "chromium-bidi": "0.8.0", + "debug": "^4.4.0", + "devtools-protocol": "0.0.1367902", + "typed-query-selector": "^2.12.0", + "ws": "^8.18.0" }, "dependencies": { - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "@puppeteer/browsers": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.6.1.tgz", + "integrity": "sha512-aBSREisdsGH890S2rQqK82qmQYU3uFpSH8wcZWHgHzl3LfzsxAKbLNiAG9mO8v1Y0UICBeClICxPJvyr0rcuxg==", + "dev": true, + "requires": { + "debug": "^4.4.0", + "extract-zip": "^2.0.1", + "progress": "^2.0.3", + "proxy-agent": "^6.5.0", + "semver": "^7.6.3", + "tar-fs": "^3.0.6", + "unbzip2-stream": "^1.4.3", + "yargs": "^17.7.2" + } + }, + "agent-base": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", + "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", + "dev": true + }, + "chromium-bidi": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.8.0.tgz", + "integrity": "sha512-uJydbGdTw0DEUjhoogGveneJVWX/9YuqkWePzMmkBYwtdAqo5d3J/ovNKFr+/2hWXYmYCr6it8mSSTIj6SS6Ug==", + "dev": true, + "requires": { + "mitt": "3.0.1", + "urlpattern-polyfill": "10.0.0", + "zod": "3.23.8" + } + }, + "debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "requires": { + "ms": "^2.1.3" + } + }, + "http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "dev": true, + "requires": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + } + }, + "https-proxy-agent": { + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.6.tgz", + "integrity": "sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==", + "dev": true, + "requires": { + "agent-base": "^7.1.2", + "debug": "4" + } + }, + "lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "dev": true + }, + "mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", + "dev": true + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "proxy-agent": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.5.0.tgz", + "integrity": "sha512-TmatMXdr2KlRiA2CyDu8GqR8EjahTG3aY3nXjdzFyoZbmB8hrBsTyMezhULIXKnC0jpfjlmiZ3+EaCzoInSu/A==", "dev": true, "requires": { - "glob": "^7.1.3" + "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" } }, - "ws": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.5.0.tgz", - "integrity": "sha512-BWX0SWVgLPzYwF8lTzEy1egjhS4S4OEAHfsO8o65WOVsrnSRGaSiUaa9e0ggGlkMTtBlmOpEXiie9RUcBO86qg==", + "semver": { + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", "dev": true } } @@ -30194,12 +30135,12 @@ "dev": true }, "qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", "dev": true, "requires": { - "side-channel": "^1.0.4" + "side-channel": "^1.0.6" } }, "querystringify": { @@ -30517,12 +30458,6 @@ } } }, - "remove-accents": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/remove-accents/-/remove-accents-0.5.0.tgz", - "integrity": "sha512-8g3/Otx1eJaVD12e31UbJj1YzdtVvzH85HV7t+9MJYk/u3XmkOUJ5Ys9wQrf9PCPK8+xn4ymzqYCiZl6QWKn+A==", - "dev": true - }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -30634,9 +30569,9 @@ "dev": true }, "rtlcss": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-4.1.1.tgz", - "integrity": "sha512-/oVHgBtnPNcggP2aVXQjSy6N1mMAfHg4GSag0QtZBlD5bdDgAHwr4pydqJGd+SUCu9260+Pjqbjwtvu7EMH1KQ==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-4.3.0.tgz", + "integrity": "sha512-FI+pHEn7Wc4NqKXMXFM+VAYKEj/mRIcW4h24YVwVtyjI+EqGrLc2Hx/Ny0lrZ21cBWU2goLy36eqMcNj3AQJig==", "dev": true, "requires": { "escalade": "^3.1.1", @@ -30754,12 +30689,11 @@ } }, "sass-loader": { - "version": "12.6.0", - "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-12.6.0.tgz", - "integrity": "sha512-oLTaH0YCtX4cfnJZxKSLAyglED0naiYfNG1iXfU5w1LNZ+ukoA5DtyDIN5zmKVZwYNJP4KRc5Y3hkWga+7tYfA==", + "version": "16.0.4", + "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-16.0.4.tgz", + "integrity": "sha512-LavLbgbBGUt3wCiYzhuLLu65+fWXaXLmq7YxivLhEqmiupCFZ5sKUAipK3do6V80YSU0jvSxNhEdT13IXNr3rg==", "dev": true, "requires": { - "klona": "^2.0.4", "neo-async": "^2.6.2" } }, @@ -30806,9 +30740,9 @@ "dev": true }, "send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", "dev": true, "requires": { "debug": "2.6.9", @@ -30843,6 +30777,12 @@ } } }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "dev": true + }, "mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", @@ -30869,9 +30809,9 @@ } }, "serialize-javascript": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", - "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", "dev": true, "requires": { "randombytes": "^2.1.0" @@ -30946,15 +30886,15 @@ } }, "serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", "dev": true, "requires": { - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.18.0" + "send": "0.19.0" } }, "set-function-length": { @@ -31019,18 +30959,18 @@ } }, "shebang-command": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", - "integrity": "sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", "dev": true, "requires": { - "shebang-regex": "^1.0.0" + "shebang-regex": "^3.0.0" } }, "shebang-regex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", - "integrity": "sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, "shell-quote": { @@ -31099,21 +31039,6 @@ "requires": { "color-convert": "^2.0.1" } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true } } }, @@ -31155,24 +31080,21 @@ } }, "socks-proxy-agent": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.3.tgz", - "integrity": "sha512-VNegTZKhuGq5vSD6XNKlbqWhyt/40CgoEw8XxD6dhnm8Jq9IEa3nIa4HwnM8XOqU0CdB0BwWVXusqiFXfHB3+A==", + "version": "8.0.5", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.5.tgz", + "integrity": "sha512-HehCEsotFqbPW9sJ8WVYB6UbmIMv7kUUORIF2Nncq4VQvBfNBLibW9YZR5dlYCSUhwcD628pRllm7n+E+YTzJw==", "dev": true, "requires": { - "agent-base": "^7.1.1", + "agent-base": "^7.1.2", "debug": "^4.3.4", - "socks": "^2.7.1" + "socks": "^2.8.3" }, "dependencies": { "agent-base": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", - "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", - "dev": true, - "requires": { - "debug": "^4.3.4" - } + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz", + "integrity": "sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==", + "dev": true } } }, @@ -31183,9 +31105,9 @@ "dev": true }, "source-map-js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", - "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "dev": true }, "source-map-loader": { @@ -31217,16 +31139,10 @@ } } }, - "spawn-command": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/spawn-command/-/spawn-command-0.0.2.tgz", - "integrity": "sha512-zC8zGoGkmc8J9ndvml8Xksr1Amk9qBujgbF0JAIWO7kXr43w0h/0GJNM/Vustixu+YE8N/MTrQ7N31FvHUACxQ==", - "dev": true - }, "spawnd": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/spawnd/-/spawnd-9.0.2.tgz", - "integrity": "sha512-nl8DVHEDQ57IcKakzpjanspVChkMpGLuVwMR/eOn9cXE55Qr6luD2Kn06sA0ootRMdgrU4tInN6lA6ohTNvysw==", + "version": "10.1.4", + "resolved": "https://registry.npmjs.org/spawnd/-/spawnd-10.1.4.tgz", + "integrity": "sha512-drqHc0mKJmtMsiGMOCwzlc5eZ0RPtRvT7tQAluW2A0qUc0G7TQ8KLcn3E6K5qzkLkH2UkS3nYQiVGULvvsD9dw==", "dev": true, "requires": { "signal-exit": "^4.1.0", @@ -31356,9 +31272,9 @@ } }, "streamx": { - "version": "2.18.0", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.18.0.tgz", - "integrity": "sha512-LLUC1TWdjVdn1weXGcSxyTR3T4+acB6tVGXT95y0nGbca4t4o/ng1wKAGTljm9VicuCVLvRlqFYXYy5GwgM7sQ==", + "version": "2.21.1", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.21.1.tgz", + "integrity": "sha512-PhP9wUnFLa+91CPy3N6tiQsK+gnYyUNuk15S3YG/zjYE7RuPeCjJngqnzpC31ow0lzBHQ+QGO4cNJnd0djYUsw==", "dev": true, "requires": { "bare-events": "^2.2.0", @@ -31514,12 +31430,6 @@ "escape-string-regexp": "^1.0.2" } }, - "style-search": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz", - "integrity": "sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg==", - "dev": true - }, "stylehacks": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-6.0.1.tgz", @@ -31531,57 +31441,113 @@ } }, "stylelint": { - "version": "14.16.1", - "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-14.16.1.tgz", - "integrity": "sha512-ErlzR/T3hhbV+a925/gbfc3f3Fep9/bnspMiJPorfGEmcBbXdS+oo6LrVtoUZ/w9fqD6o6k7PtUlCOsCRdjX/A==", + "version": "16.11.0", + "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.11.0.tgz", + "integrity": "sha512-zrl4IrKmjJQ+h9FoMp69UMCq5SxeHk0URhxUBj4d3ISzo/DplOFBJZc7t7Dr6otB+1bfbbKNLOmCDpzKSlW+Nw==", "dev": true, "requires": { - "@csstools/selector-specificity": "^2.0.2", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/media-query-list-parser": "^4.0.2", + "@csstools/selector-specificity": "^5.0.0", + "@dual-bundle/import-meta-resolve": "^4.1.0", "balanced-match": "^2.0.0", "colord": "^2.9.3", - "cosmiconfig": "^7.1.0", - "css-functions-list": "^3.1.0", - "debug": "^4.3.4", - "fast-glob": "^3.2.12", + "cosmiconfig": "^9.0.0", + "css-functions-list": "^3.2.3", + "css-tree": "^3.0.1", + "debug": "^4.3.7", + "fast-glob": "^3.3.2", "fastest-levenshtein": "^1.0.16", - "file-entry-cache": "^6.0.1", + "file-entry-cache": "^9.1.0", "global-modules": "^2.0.0", "globby": "^11.1.0", "globjoin": "^0.1.4", - "html-tags": "^3.2.0", - "ignore": "^5.2.1", - "import-lazy": "^4.0.0", + "html-tags": "^3.3.1", + "ignore": "^6.0.2", "imurmurhash": "^0.1.4", "is-plain-object": "^5.0.0", - "known-css-properties": "^0.26.0", + "known-css-properties": "^0.35.0", "mathml-tag-names": "^2.1.3", - "meow": "^9.0.0", - "micromatch": "^4.0.5", + "meow": "^13.2.0", + "micromatch": "^4.0.8", "normalize-path": "^3.0.0", - "picocolors": "^1.0.0", - "postcss": "^8.4.19", - "postcss-media-query-parser": "^0.2.3", - "postcss-resolve-nested-selector": "^0.1.1", - "postcss-safe-parser": "^6.0.0", - "postcss-selector-parser": "^6.0.11", + "picocolors": "^1.1.1", + "postcss": "^8.4.49", + "postcss-resolve-nested-selector": "^0.1.6", + "postcss-safe-parser": "^7.0.1", + "postcss-selector-parser": "^7.0.0", "postcss-value-parser": "^4.2.0", "resolve-from": "^5.0.0", "string-width": "^4.2.3", - "strip-ansi": "^6.0.1", - "style-search": "^0.1.0", - "supports-hyperlinks": "^2.3.0", + "supports-hyperlinks": "^3.1.0", "svg-tags": "^1.0.0", - "table": "^6.8.1", - "v8-compile-cache": "^2.3.0", - "write-file-atomic": "^4.0.2" + "table": "^6.8.2", + "write-file-atomic": "^5.0.1" }, "dependencies": { + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, "balanced-match": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz", "integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==", "dev": true }, + "cosmiconfig": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "dev": true, + "requires": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + } + }, + "css-tree": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.1.0.tgz", + "integrity": "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==", + "dev": true, + "requires": { + "mdn-data": "2.12.2", + "source-map-js": "^1.0.1" + } + }, + "debug": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", + "dev": true, + "requires": { + "ms": "^2.1.3" + } + }, + "file-entry-cache": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-9.1.0.tgz", + "integrity": "sha512-/pqPFG+FdxWQj+/WSuzXSDaNzxgTLr/OrR1QuqfEZzDakpdYE70PwUxL7BPUa8hpjbvY1+qvCl8k+8Tq34xJgg==", + "dev": true, + "requires": { + "flat-cache": "^5.0.0" + } + }, + "flat-cache": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-5.0.0.tgz", + "integrity": "sha512-JrqFmyUl2PnPi1OvLyTVHnQvwQ0S+e6lGSwu8OkAZlSaNIZciTY2H/cOOROxsBA1m/LZNHDsqAgDZt6akWcjsQ==", + "dev": true, + "requires": { + "flatted": "^3.3.1", + "keyv": "^4.5.4" + } + }, "global-modules": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz", @@ -31603,22 +31569,84 @@ } }, "ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-6.0.2.tgz", + "integrity": "sha512-InwqeHHN2XpumIkMvpl/DCJVrAHgCsG5+cn1XlnLWGwtZBm8QJfSusItfrwx81CTp5agNZqpKU2J/ccC5nGT4A==", "dev": true }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, "kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", "dev": true }, + "mdn-data": { + "version": "2.12.2", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz", + "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==", + "dev": true + }, + "meow": { + "version": "13.2.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz", + "integrity": "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==", + "dev": true + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + }, + "postcss-selector-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", + "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + }, "resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", "dev": true + }, + "signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "write-file-atomic": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", + "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4", + "signal-exit": "^4.0.1" + } } } }, @@ -31667,9 +31695,9 @@ } }, "supports-hyperlinks": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", - "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.1.0.tgz", + "integrity": "sha512-2rn0BZ+/f7puLOHZm1HOJfwBggfaHXUpPUSSG/SWM4TWp5KCfmNYwnC3hruy2rZlMnmWZ+QAGpZfchu3f3695A==", "dev": true, "requires": { "has-flag": "^4.0.0", @@ -31734,9 +31762,9 @@ } }, "table": { - "version": "6.8.1", - "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", - "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/table/-/table-6.9.0.tgz", + "integrity": "sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==", "dev": true, "requires": { "ajv": "^8.0.1", @@ -31747,15 +31775,15 @@ }, "dependencies": { "ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, "requires": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "require-from-string": "^2.0.2" } }, "json-schema-traverse": { @@ -31766,15 +31794,6 @@ } } }, - "tannin": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/tannin/-/tannin-1.2.0.tgz", - "integrity": "sha512-U7GgX/RcSeUETbV7gYgoz8PD7Ni4y95pgIP/Z6ayI3CfhSujwKEBlGFTCRN+Aqnuyf4AN2yHL+L8x+TCGjb9uA==", - "dev": true, - "requires": { - "@tannin/plural-forms": "^1.1.0" - } - }, "tapable": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", @@ -31782,34 +31801,32 @@ "dev": true }, "tar-fs": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", - "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.6.tgz", + "integrity": "sha512-iokBDQQkUyeXhgPYaZxmczGPhnhXZ0CmrqI+MOb/WFGS9DW5wnfrLgtjUJBvz50vQ3qfRwJ62QVoCFu8mPVu5w==", "dev": true, "requires": { - "chownr": "^1.1.1", - "mkdirp-classic": "^0.5.2", + "bare-fs": "^2.1.1", + "bare-path": "^2.1.0", "pump": "^3.0.0", - "tar-stream": "^2.1.4" + "tar-stream": "^3.1.5" } }, "tar-stream": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", - "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", + "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", "dev": true, "requires": { - "bl": "^4.0.3", - "end-of-stream": "^1.4.1", - "fs-constants": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.1.1" + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" } }, "terser": { - "version": "5.19.4", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.19.4.tgz", - "integrity": "sha512-6p1DjHeuluwxDXcuT9VR8p64klWJKo1ILiy19s6C9+0Bh2+NWTX6nD9EPppiER4ICkHDVB1RkVpin/YW2nQn/g==", + "version": "5.37.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.37.0.tgz", + "integrity": "sha512-B8wRRkmre4ERucLM/uXx4MOV5cbnOlVAqUst+1+iLKPI0dOgFO28f84ptoQt9HEI537PMzfYa/d+GEPKTRXmYA==", "dev": true, "requires": { "@jridgewell/source-map": "^0.3.3", @@ -31827,16 +31844,57 @@ } }, "terser-webpack-plugin": { - "version": "5.3.9", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", - "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", + "version": "5.3.11", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.11.tgz", + "integrity": "sha512-RVCsMfuD0+cTt3EwX8hSl2Ks56EbFHWmhluwcqoPKtBnfjiT6olaq7PRIRfhyU8nnC2MrnDrBLfrD/RGE+cVXQ==", "dev": true, "requires": { - "@jridgewell/trace-mapping": "^0.3.17", + "@jridgewell/trace-mapping": "^0.3.25", "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.1", - "terser": "^5.16.8" + "schema-utils": "^4.3.0", + "serialize-javascript": "^6.0.2", + "terser": "^5.31.1" + }, + "dependencies": { + "ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + } + }, + "ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.3" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "schema-utils": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz", + "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==", + "dev": true, + "requires": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + } + } } }, "test-exclude": { @@ -31872,9 +31930,9 @@ "dev": true }, "third-party-web": { - "version": "0.23.4", - "resolved": "https://registry.npmjs.org/third-party-web/-/third-party-web-0.23.4.tgz", - "integrity": "sha512-kwYnSZRhEvv0SBW2fp8SBBKRglMoBjV8xz6C31m0ewqOtknB5UL+Ihg+M81hyFY5ldkZuGWPb+e4GVDkzf/gYg==", + "version": "0.26.2", + "resolved": "https://registry.npmjs.org/third-party-web/-/third-party-web-0.26.2.tgz", + "integrity": "sha512-taJ0Us0lKoYBqcbccMuDElSUPOxmBfwlHe1OkHQ3KFf+RwovvBHdXhbFk9XJVQE2vHzxbTwvwg5GFsT9hbDokQ==", "dev": true }, "through": { @@ -31889,18 +31947,27 @@ "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", "dev": true }, + "tldts-core": { + "version": "6.1.67", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-6.1.67.tgz", + "integrity": "sha512-12K5O4m3uUW6YM5v45Z7wc6NTSmAYj4Tq3de7eXghZkp879IlfPJrUWeWFwu1FS94U5t2vwETgJ1asu8UGNKVQ==", + "dev": true + }, + "tldts-icann": { + "version": "6.1.67", + "resolved": "https://registry.npmjs.org/tldts-icann/-/tldts-icann-6.1.67.tgz", + "integrity": "sha512-CJLFTYBgbnkP6nB8rqSYzd1oyWbM02SeQx9hrEpB6fTjx2+5FJ1lSkovxIWCjMgvzE7Nv54LCrf3lVW0zhupxQ==", + "dev": true, + "requires": { + "tldts-core": "^6.1.67" + } + }, "tmpl": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", "dev": true }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true - }, "to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -32105,6 +32172,12 @@ "possible-typed-array-names": "^1.0.0" } }, + "typed-query-selector": { + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/typed-query-selector/-/typed-query-selector-2.12.0.tgz", + "integrity": "sha512-SbklCd1F0EiZOyPiW192rrHZzZ5sBijB6xM+cpmrwDqObvdtunOHHIk9fCGsoK5JVIYXoyEp4iEdE3upFH3PAg==", + "dev": true + }, "typedarray-to-buffer": { "version": "3.1.5", "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", @@ -32198,13 +32271,13 @@ "dev": true }, "update-browserslist-db": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz", - "integrity": "sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", + "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", "dev": true, "requires": { - "escalade": "^3.1.2", - "picocolors": "^1.0.1" + "escalade": "^3.2.0", + "picocolors": "^1.1.0" } }, "upper-case": { @@ -32255,6 +32328,12 @@ "requires-port": "^1.0.0" } }, + "urlpattern-polyfill": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.0.0.tgz", + "integrity": "sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==", + "dev": true + }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -32273,12 +32352,6 @@ "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", "dev": true }, - "v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, "v8-to-istanbul": { "version": "9.2.0", "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.2.0.tgz", @@ -32325,13 +32398,13 @@ } }, "wait-on": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-7.2.0.tgz", - "integrity": "sha512-wCQcHkRazgjG5XoAq9jbTMLpNIjoSlZslrJ2+N9MxDsGEv1HnFoVjOCexL0ESva7Y9cu350j+DWADdk54s4AFQ==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/wait-on/-/wait-on-8.0.1.tgz", + "integrity": "sha512-1wWQOyR2LVVtaqrcIL2+OM+x7bkpmzVROa0Nf6FryXkS+er5Sa1kzFGjzZRqLnHa3n1rACFLeTwUqE1ETL9Mig==", "dev": true, "requires": { - "axios": "^1.6.1", - "joi": "^17.11.0", + "axios": "^1.7.7", + "joi": "^17.13.3", "lodash": "^4.17.21", "minimist": "^1.2.8", "rxjs": "^7.8.1" @@ -32347,9 +32420,9 @@ } }, "watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", + "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", "dev": true, "requires": { "glob-to-regexp": "^0.4.1", @@ -32366,9 +32439,9 @@ } }, "web-vitals": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-3.5.2.tgz", - "integrity": "sha512-c0rhqNcHXRkY/ogGDJQxZ9Im9D19hDihbzSQJrsioex+KnFgmMzBiy57Z1EjkhX/+OjyBpclDCzz2ITtjokFmg==", + "version": "4.2.4", + "resolved": "https://registry.npmjs.org/web-vitals/-/web-vitals-4.2.4.tgz", + "integrity": "sha512-r4DIlprAGwJ7YM11VZp4R884m0Vmgr6EAKe3P+kO0PPj3Unqyvv59rczf6UiGcb9Z8QxZVcqKNwv/g0WNdWwsw==", "dev": true }, "webidl-conversions": { @@ -32378,34 +32451,33 @@ "dev": true }, "webpack": { - "version": "5.88.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.88.2.tgz", - "integrity": "sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==", - "dev": true, - "requires": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^1.0.0", - "@webassemblyjs/ast": "^1.11.5", - "@webassemblyjs/wasm-edit": "^1.11.5", - "@webassemblyjs/wasm-parser": "^1.11.5", - "acorn": "^8.7.1", - "acorn-import-assertions": "^1.9.0", - "browserslist": "^4.14.5", + "version": "5.97.1", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.97.1.tgz", + "integrity": "sha512-EksG6gFY3L1eFMROS/7Wzgrii5mBAFe4rIr3r2BTfo7bcc+DWwFZ4OJ/miOuHJO/A85HwyI4eQ0F6IKXesO7Fg==", + "dev": true, + "requires": { + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.6", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", + "acorn": "^8.14.0", + "browserslist": "^4.24.0", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.15.0", + "enhanced-resolve": "^5.17.1", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", + "graceful-fs": "^4.2.11", "json-parse-even-better-errors": "^2.3.1", "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", "schema-utils": "^3.2.0", "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.7", - "watchpack": "^2.4.0", + "terser-webpack-plugin": "^5.3.10", + "watchpack": "^2.4.1", "webpack-sources": "^3.2.3" } }, @@ -32476,41 +32548,6 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz", "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==", "dev": true - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } } } }, @@ -32753,9 +32790,9 @@ } }, "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "requires": { "isexe": "^2.0.0" @@ -32850,21 +32887,6 @@ "requires": { "color-convert": "^2.0.1" } - }, - "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "requires": { - "color-name": "~1.1.4" - } - }, - "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true } } }, @@ -32885,9 +32907,9 @@ } }, "ws": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", - "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "version": "8.18.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz", + "integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==", "dev": true }, "xdg-basedir": { @@ -32970,6 +32992,12 @@ "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", "dev": true + }, + "zod": { + "version": "3.23.8", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", + "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", + "dev": true } } } diff --git a/src/wp-content/themes/twentytwenty/package.json b/src/wp-content/themes/twentytwenty/package.json index 58f600ee5f29d..d0e3942cb15d2 100644 --- a/src/wp-content/themes/twentytwenty/package.json +++ b/src/wp-content/themes/twentytwenty/package.json @@ -10,6 +10,10 @@ "TwentyTwenty" ], "homepage": "https://wordpress.org/themes/twentytwenty/", + "repository": { + "type": "svn", + "url": "https://develop.svn.wordpress.org/trunk" + }, "bugs": { "url": "https://core.trac.wordpress.org/" }, @@ -18,13 +22,13 @@ "npm": ">=9.8.1" }, "devDependencies": { - "@wordpress/browserslist-config": "^6.1.0", - "@wordpress/scripts": "^28.1.0", - "autoprefixer": "^10.4.19", - "concurrently": "^8.2.2", - "postcss": "^8.4.38", + "@wordpress/browserslist-config": "^6.14.0", + "@wordpress/scripts": "^30.7.0", + "autoprefixer": "^10.4.20", + "concurrently": "^9.1.0", + "postcss": "^8.4.49", "postcss-cli": "^11.0.0", - "rtlcss": "^4.1.1", + "rtlcss": "^4.3.0", "stylelint-a11y": "^1.2.3" }, "browserslist": [ diff --git a/src/wp-content/themes/twentytwentyone/package-lock.json b/src/wp-content/themes/twentytwentyone/package-lock.json index 100300dcca9d9..703e5300ffed0 100644 --- a/src/wp-content/themes/twentytwentyone/package-lock.json +++ b/src/wp-content/themes/twentytwentyone/package-lock.json @@ -9,28 +9,28 @@ "version": "2.4.0", "license": "GPL-2.0-or-later", "devDependencies": { - "@wordpress/browserslist-config": "^6.1.0", + "@wordpress/browserslist-config": "^6.14.0", "@wordpress/eslint-plugin": "^17.4.0", "@wordpress/stylelint-config": "^21.30.0", - "autoprefixer": "^10.4.19", + "autoprefixer": "^10.4.20", "chokidar-cli": "^3.0.0", "eslint": "^8.55.0", "minimist": "^1.2.8", "npm-run-all": "^4.1.5", - "postcss": "^8.4.38", - "postcss-calc": "^10.0.0", + "postcss": "^8.4.49", + "postcss-calc": "^10.0.2", "postcss-cli": "^11.0.0", "postcss-css-variables": "^0.19.0", - "postcss-custom-media": "^10.0.6", - "postcss-discard-duplicates": "^7.0.0", + "postcss-custom-media": "^11.0.5", + "postcss-discard-duplicates": "^7.0.1", "postcss-discard-empty": "^7.0.0", - "postcss-focus-within": "^8.0.1", - "postcss-merge-rules": "^7.0.2", - "postcss-nested": "^6.0.0", - "rtlcss": "^4.0.0", - "sass": "^1.77.6", + "postcss-focus-within": "^9.0.1", + "postcss-merge-rules": "^7.0.4", + "postcss-nested": "^7.0.2", + "rtlcss": "^4.3.0", + "sass": "^1.83.0", "stylelint": "^14.16.1", - "stylelint-config-recommended-scss": "^14.0.0" + "stylelint-config-recommended-scss": "^14.1.0" }, "engines": { "node": ">=20.10.0", @@ -1959,9 +1959,9 @@ } }, "node_modules/@csstools/cascade-layer-name-parser": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-1.0.11.tgz", - "integrity": "sha512-yhsonEAhaWRQvHFYhSzOUobH2Ev++fMci+ppFRagw0qVSPlcPV4FnNmlwpM/b2BM10ZeMRkVV4So6YRswD0O0w==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-2.0.4.tgz", + "integrity": "sha512-7DFHlPuIxviKYZrOiwVU/PiHLm3lLUR23OMuEEtfEOQTOp9hzQ2JjdY6X5H18RVuUPJqSCI+qNnD5iOLMVE0bA==", "dev": true, "funding": [ { @@ -1973,18 +1973,19 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT", "engines": { - "node": "^14 || ^16 || >=18" + "node": ">=18" }, "peerDependencies": { - "@csstools/css-parser-algorithms": "^2.6.3", - "@csstools/css-tokenizer": "^2.3.1" + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" } }, "node_modules/@csstools/css-parser-algorithms": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.6.3.tgz", - "integrity": "sha512-xI/tL2zxzEbESvnSxwFgwvy5HS00oCXxL4MLs6HUiDcYfwowsoQaABKxUElp1ARITrINzBnsECOc1q0eg2GOrA==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.4.tgz", + "integrity": "sha512-Up7rBoV77rv29d3uKHUIVubz1BTcgyUK72IvCQAbfbMv584xHcGKCKbWh7i8hPrRJ7qU4Y8IO3IY9m+iTB7P3A==", "dev": true, "funding": [ { @@ -1996,17 +1997,18 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT", "engines": { - "node": "^14 || ^16 || >=18" + "node": ">=18" }, "peerDependencies": { - "@csstools/css-tokenizer": "^2.3.1" + "@csstools/css-tokenizer": "^3.0.3" } }, "node_modules/@csstools/css-tokenizer": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-2.3.1.tgz", - "integrity": "sha512-iMNHTyxLbBlWIfGtabT157LH9DUx9X8+Y3oymFEuMj8HNc+rpE3dPFGFgHjpKfjeFDjLjYIAIhXPGvS2lKxL9g==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.3.tgz", + "integrity": "sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw==", "dev": true, "funding": [ { @@ -2018,14 +2020,15 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT", "engines": { - "node": "^14 || ^16 || >=18" + "node": ">=18" } }, "node_modules/@csstools/media-query-list-parser": { - "version": "2.1.11", - "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.11.tgz", - "integrity": "sha512-uox5MVhvNHqitPP+SynrB1o8oPxPMt2JLgp5ghJOWf54WGQ5OKu47efne49r1SWqs3wRP8xSWjnO9MBKxhB1dA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.2.tgz", + "integrity": "sha512-EUos465uvVvMJehckATTlNqGj4UJWkTmdWuDMjqvSUkjGpmOyFZBVwb4knxCm/k2GMTXY+c/5RkdndzFYWeX5A==", "dev": true, "funding": [ { @@ -2037,12 +2040,13 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT", "engines": { - "node": "^14 || ^16 || >=18" + "node": ">=18" }, "peerDependencies": { - "@csstools/css-parser-algorithms": "^2.6.3", - "@csstools/css-tokenizer": "^2.3.1" + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3" } }, "node_modules/@csstools/selector-specificity": { @@ -2050,6 +2054,7 @@ "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-2.2.0.tgz", "integrity": "sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw==", "dev": true, + "license": "CC0-1.0", "engines": { "node": "^14 || ^16 || >=18" }, @@ -2259,6 +2264,316 @@ "node": ">= 8" } }, + "node_modules/@parcel/watcher": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.0.tgz", + "integrity": "sha512-i0GV1yJnm2n3Yq1qw6QrUrd/LI9bE8WEBOTtOkpCXHHdyN3TAGgqAK/DAT05z4fq2x04cARXt2pDmjWjL92iTQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "detect-libc": "^1.0.3", + "is-glob": "^4.0.3", + "micromatch": "^4.0.5", + "node-addon-api": "^7.0.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.5.0", + "@parcel/watcher-darwin-arm64": "2.5.0", + "@parcel/watcher-darwin-x64": "2.5.0", + "@parcel/watcher-freebsd-x64": "2.5.0", + "@parcel/watcher-linux-arm-glibc": "2.5.0", + "@parcel/watcher-linux-arm-musl": "2.5.0", + "@parcel/watcher-linux-arm64-glibc": "2.5.0", + "@parcel/watcher-linux-arm64-musl": "2.5.0", + "@parcel/watcher-linux-x64-glibc": "2.5.0", + "@parcel/watcher-linux-x64-musl": "2.5.0", + "@parcel/watcher-win32-arm64": "2.5.0", + "@parcel/watcher-win32-ia32": "2.5.0", + "@parcel/watcher-win32-x64": "2.5.0" + } + }, + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.0.tgz", + "integrity": "sha512-qlX4eS28bUcQCdribHkg/herLe+0A9RyYC+mm2PXpncit8z5b3nSqGVzMNR3CmtAOgRutiZ02eIJJgP/b1iEFQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.0.tgz", + "integrity": "sha512-hyZ3TANnzGfLpRA2s/4U1kbw2ZI4qGxaRJbBH2DCSREFfubMswheh8TeiC1sGZ3z2jUf3s37P0BBlrD3sjVTUw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-x64": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.0.tgz", + "integrity": "sha512-9rhlwd78saKf18fT869/poydQK8YqlU26TMiNg7AIu7eBp9adqbJZqmdFOsbZ5cnLp5XvRo9wcFmNHgHdWaGYA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.0.tgz", + "integrity": "sha512-syvfhZzyM8kErg3VF0xpV8dixJ+RzbUaaGaeb7uDuz0D3FK97/mZ5AJQ3XNnDsXX7KkFNtyQyFrXZzQIcN49Tw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.0.tgz", + "integrity": "sha512-0VQY1K35DQET3dVYWpOaPFecqOT9dbuCfzjxoQyif1Wc574t3kOSkKevULddcR9znz1TcklCE7Ht6NIxjvTqLA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-musl": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.0.tgz", + "integrity": "sha512-6uHywSIzz8+vi2lAzFeltnYbdHsDm3iIB57d4g5oaB9vKwjb6N6dRIgZMujw4nm5r6v9/BQH0noq6DzHrqr2pA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.0.tgz", + "integrity": "sha512-BfNjXwZKxBy4WibDb/LDCriWSKLz+jJRL3cM/DllnHH5QUyoiUNEp3GmL80ZqxeumoADfCCP19+qiYiC8gUBjA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.0.tgz", + "integrity": "sha512-S1qARKOphxfiBEkwLUbHjCY9BWPdWnW9j7f7Hb2jPplu8UZ3nes7zpPOW9bkLbHRvWM0WDTsjdOTUgW0xLBN1Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.0.tgz", + "integrity": "sha512-d9AOkusyXARkFD66S6zlGXyzx5RvY+chTP9Jp0ypSTC9d4lzyRs9ovGf/80VCxjKddcUvnsGwCHWuF2EoPgWjw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.0.tgz", + "integrity": "sha512-iqOC+GoTDoFyk/VYSFHwjHhYrk8bljW6zOhPuhi5t9ulqiYq1togGJB5e3PwYVFFfeVgc6pbz3JdQyDoBszVaA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.0.tgz", + "integrity": "sha512-twtft1d+JRNkM5YbmexfcH/N4znDtjgysFaV9zvZmmJezQsKpkfLYJ+JFV3uygugK6AtIM2oADPkB2AdhBrNig==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-ia32": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.0.tgz", + "integrity": "sha512-+rgpsNRKwo8A53elqbbHXdOMtY/tAtTzManTWShB5Kk54N8Q9mzNWV7tV+IbGueCbcj826MfWGU3mprWtuf1TA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.0.tgz", + "integrity": "sha512-lPrxve92zEHdgeff3aiu4gDOIt4u7sJYha6wbdEZDCDUhtjTsOMiaJzG5lMY4GkWH8p0fMmO2Ppq5G5XXG+DQw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, "node_modules/@pkgr/utils": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.4.2.tgz", @@ -2307,13 +2622,15 @@ "version": "1.2.5", "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/normalize-package-data": { "version": "2.4.4", "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/@types/parse-json": { "version": "4.0.0", @@ -2579,10 +2896,11 @@ } }, "node_modules/@wordpress/browserslist-config": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@wordpress/browserslist-config/-/browserslist-config-6.1.0.tgz", - "integrity": "sha512-cf5iwPq6JetQjiaRwlvzW5eX0S3OphVmy1YTxHQdrVqp79rOGvamVftxqvmf3C/GSRaNyI4eZV+nNwNRN0DkrQ==", + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@wordpress/browserslist-config/-/browserslist-config-6.14.0.tgz", + "integrity": "sha512-a26hxY8R/A7FH/Z8oZsYS31ZC/Xy9QSBTi5w84MKSeYdWlck7t1QdCwUNF1u621wbuP7beiiu9FkYY4hI3Bk9A==", "dev": true, + "license": "GPL-2.0-or-later", "engines": { "node": ">=18.12.0", "npm": ">=8.19.2" @@ -3309,6 +3627,7 @@ "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -3324,14 +3643,15 @@ "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/autoprefixer": { - "version": "10.4.19", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.19.tgz", - "integrity": "sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==", + "version": "10.4.20", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz", + "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==", "dev": true, "funding": [ { @@ -3347,12 +3667,13 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "browserslist": "^4.23.0", - "caniuse-lite": "^1.0.30001599", + "browserslist": "^4.23.3", + "caniuse-lite": "^1.0.30001646", "fraction.js": "^4.3.7", "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", + "picocolors": "^1.0.1", "postcss-value-parser": "^4.2.0" }, "bin": { @@ -3487,9 +3808,9 @@ } }, "node_modules/browserslist": { - "version": "4.23.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.1.tgz", - "integrity": "sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==", + "version": "4.24.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.3.tgz", + "integrity": "sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA==", "dev": true, "funding": [ { @@ -3505,11 +3826,12 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001629", - "electron-to-chromium": "^1.4.796", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.16" + "caniuse-lite": "^1.0.30001688", + "electron-to-chromium": "^1.5.73", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.1" }, "bin": { "browserslist": "cli.js" @@ -3581,6 +3903,7 @@ "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-6.2.2.tgz", "integrity": "sha512-YrwaA0vEKazPBkn0ipTiMpSajYDSe+KjQfrjhcBMxJt/znbvlHd8Pw/Vamaz5EB4Wfhs3SUR3Z9mwRu/P3s3Yg==", "dev": true, + "license": "MIT", "dependencies": { "camelcase": "^5.3.1", "map-obj": "^4.0.0", @@ -3606,9 +3929,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001636", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001636.tgz", - "integrity": "sha512-bMg2vmr8XBsbL6Lr0UHXy/21m84FTxDLWn2FSqMd5PrlbMxwJlQnC2YWYxVgp66PZE+BBNF2jYQUBKCo1FDeZg==", + "version": "1.0.30001689", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001689.tgz", + "integrity": "sha512-CmeR2VBycfa+5/jOfnp/NpWPGd06nf1XYiefUvhXFfZE4GkRc9jv+eGPS4nT558WS/8lYCzV8SlANCIPvbWP1g==", "dev": true, "funding": [ { @@ -3623,7 +3946,8 @@ "type": "github", "url": "https://github.com/sponsors/ai" } - ] + ], + "license": "CC-BY-4.0" }, "node_modules/chalk": { "version": "2.4.2", @@ -3784,10 +4108,11 @@ } }, "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, + "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -3798,14 +4123,29 @@ } }, "node_modules/css-functions-list": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.1.tgz", - "integrity": "sha512-Nj5YcaGgBtuUmn1D7oHqPW0c9iui7xsTsj5lIX8ZgevdfhmjFfKB3r8moHJtNJnctnYXJyYX5I1pp90HM4TPgQ==", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.3.tgz", + "integrity": "sha512-IQOkD3hbR5KrN93MtcYuad6YPuTSUhntLHDuLEbFWE+ff2/XSZNdZG+LcbbIW5AXKg/WFIfYItIzVoHngHXZzA==", "dev": true, + "license": "MIT", "engines": { "node": ">=12 || >=16" } }, + "node_modules/css-tree": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.1.0.tgz", + "integrity": "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==", + "dev": true, + "license": "MIT", + "dependencies": { + "mdn-data": "2.12.2", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, "node_modules/cssesc": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", @@ -3837,12 +4177,13 @@ "dev": true }, "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", "dev": true, + "license": "MIT", "dependencies": { - "ms": "2.1.2" + "ms": "^2.1.3" }, "engines": { "node": ">=6.0" @@ -3867,6 +4208,7 @@ "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.1.tgz", "integrity": "sha512-WiPxgEirIV0/eIOMcnFBA3/IJZAZqKnwAwWyvvdi4lsr1WCN22nhdf/3db3DoZcUjTV2SqfzIwNyp6y2xs3nmg==", "dev": true, + "license": "MIT", "dependencies": { "decamelize": "^1.1.0", "map-obj": "^1.0.0" @@ -3883,6 +4225,7 @@ "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", "integrity": "sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -3960,6 +4303,20 @@ "node": ">= 0.6.0" } }, + "node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, "node_modules/dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -3985,10 +4342,11 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.810", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.810.tgz", - "integrity": "sha512-Kaxhu4T7SJGpRQx99tq216gCq2nMxJo+uuT6uzz9l8TVN2stL7M06MIIXAtr9jsrLs2Glflgf2vMQRepxawOdQ==", - "dev": true + "version": "1.5.74", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.74.tgz", + "integrity": "sha512-ck3//9RC+6oss/1Bh9tiAVFy5vfSKbRHAFh7Z3/eTRkEqJeWgymloShB17Vg3Z4nmDNp35vAd1BZ6CMW4Wt6Iw==", + "dev": true, + "license": "ISC" }, "node_modules/emoji-regex": { "version": "9.2.2", @@ -4058,10 +4416,11 @@ } }, "node_modules/escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -5021,6 +5380,13 @@ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true }, + "node_modules/fast-uri": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.3.tgz", + "integrity": "sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==", + "dev": true, + "license": "BSD-3-Clause" + }, "node_modules/fastest-levenshtein": { "version": "1.0.16", "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", @@ -5090,10 +5456,11 @@ } }, "node_modules/flatted": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", - "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", - "dev": true + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz", + "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==", + "dev": true, + "license": "ISC" }, "node_modules/fraction.js": { "version": "4.3.7", @@ -5387,6 +5754,7 @@ "resolved": "https://registry.npmjs.org/hard-rejection/-/hard-rejection-2.1.0.tgz", "integrity": "sha512-VIZB+ibDhx7ObhAe7OVtoEbuP4h/MuOTHJ+J8h/eBXotJYl0fBgR72xDFCKgIh22OJZIOVNxBMWuhAr10r8HdA==", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -5509,10 +5877,11 @@ } }, "node_modules/immutable": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.2.4.tgz", - "integrity": "sha512-WDxL3Hheb1JkRN3sQkyujNlL/xRjAo3rJtaU5xeufUauG66JdMr32bLj4gF+vWl84DIA3Zxw7tiAjneYzRRw+w==", - "dev": true + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.0.3.tgz", + "integrity": "sha512-P8IdPQHq3lA1xVeBRi5VPqUm5HDgKnx0Ru51wZz5mjxHr5n3RWhjIpOFU7ybkUxfB+5IToy+OLaHYDBIWsv+uw==", + "dev": true, + "license": "MIT" }, "node_modules/import-fresh": { "version": "3.3.0", @@ -5535,6 +5904,7 @@ "resolved": "https://registry.npmjs.org/import-lazy/-/import-lazy-4.0.0.tgz", "integrity": "sha512-rKtvo6a868b5Hu3heneU+L4yEQ4jYKLtjpnPeUdK7h0yzXGmyBTypknlkCvHFBqfX9YlorEiMM6Dnq/5atfHkw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -5553,6 +5923,7 @@ "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -5841,6 +6212,7 @@ "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", "integrity": "sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -6147,10 +6519,11 @@ } }, "node_modules/known-css-properties": { - "version": "0.26.0", - "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.26.0.tgz", - "integrity": "sha512-5FZRzrZzNTBruuurWpvZnvP9pum+fe0HcK8z/ooo+U+Hmp4vtbyp1/QDsqmufirXy4egGzbaH/y2uCZf+6W5Kg==", - "dev": true + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.35.0.tgz", + "integrity": "sha512-a/RAk2BfKk+WFGhhOCAYqSiFLc34k8Mt/6NWRI4joER0EYUzXIcFivjjnoD3+XU1DggLn/tZc3DOAgke7l8a4A==", + "dev": true, + "license": "MIT" }, "node_modules/language-subtag-registry": { "version": "0.3.21", @@ -6267,7 +6640,8 @@ "version": "4.4.2", "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/lodash.uniq": { "version": "4.5.0", @@ -6304,6 +6678,7 @@ "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-4.3.0.tgz", "integrity": "sha512-hdN1wVrZbb29eBGiGjJbeP8JbKjq1urkHJ/LIP/NY48MZ1QVXUsQBV1G1zvYFHn1XE06cwjBsOI2K3Ulnj1YXQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" }, @@ -6321,6 +6696,13 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/mdn-data": { + "version": "2.12.2", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz", + "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==", + "dev": true, + "license": "CC0-1.0" + }, "node_modules/memorystream": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", @@ -6335,6 +6717,7 @@ "resolved": "https://registry.npmjs.org/meow/-/meow-9.0.0.tgz", "integrity": "sha512-+obSblOQmRhcyBt62furQqRAQpNyWXo8BuQ5bN7dG8wmwQ+vwHKp/rCFD4CrTP8CsDQD1sjoZ94K417XEUk8IQ==", "dev": true, + "license": "MIT", "dependencies": { "@types/minimist": "^1.2.0", "camelcase-keys": "^6.2.2", @@ -6361,6 +6744,7 @@ "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", "integrity": "sha512-kyCuEOWjJqZuDbRHzL8V93NzQhwIB71oFWSyzVo+KPZI+pnQPPxucdkrOZvkLRnrf5URsQM+IJ09Dw29cRALIA==", "dev": true, + "license": "ISC", "dependencies": { "lru-cache": "^6.0.0" }, @@ -6373,6 +6757,7 @@ "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-3.0.3.tgz", "integrity": "sha512-p2W1sgqij3zMMyRC067Dg16bfzVH+w7hyegmpIvZ4JNjqtGOVAIvLmjBx3yP7YTe9vKJgkoNOPjwQGogDoMXFA==", "dev": true, + "license": "BSD-2-Clause", "dependencies": { "hosted-git-info": "^4.0.1", "is-core-module": "^2.5.0", @@ -6383,23 +6768,12 @@ "node": ">=10" } }, - "node_modules/meow/node_modules/type-fest": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", - "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/meow/node_modules/yargs-parser": { "version": "20.2.9", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", "dev": true, + "license": "ISC", "engines": { "node": ">=10" } @@ -6420,12 +6794,13 @@ } }, "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, + "license": "MIT", "dependencies": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" }, "engines": { @@ -6449,6 +6824,7 @@ "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", "dev": true, + "license": "MIT", "engines": { "node": ">=4" } @@ -6479,6 +6855,7 @@ "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz", "integrity": "sha512-Q4r8ghd80yhO/0j1O3B2BjweX3fiHg9cdOwjJd2J76Q135c+NDxGCqdYKQ1SKBuFfgWbAUzBfvYjPUEeNgqN1A==", "dev": true, + "license": "MIT", "dependencies": { "arrify": "^1.0.1", "is-plain-obj": "^1.1.0", @@ -6489,15 +6866,16 @@ } }, "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" }, "node_modules/nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", "dev": true, "funding": [ { @@ -6505,6 +6883,7 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -6524,11 +6903,20 @@ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, + "node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "dev": true, + "license": "MIT", + "optional": true + }, "node_modules/node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", - "dev": true + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "dev": true, + "license": "MIT" }, "node_modules/normalize-package-data": { "version": "2.5.0", @@ -6595,10 +6983,11 @@ } }, "node_modules/npm-run-all/node_modules/cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz", + "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==", "dev": true, + "license": "MIT", "dependencies": { "nice-try": "^1.0.4", "path-key": "^2.0.1", @@ -7575,10 +7964,11 @@ } }, "node_modules/picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", - "dev": true + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "dev": true, + "license": "ISC" }, "node_modules/picomatch": { "version": "2.3.1", @@ -7614,9 +8004,9 @@ } }, "node_modules/postcss": { - "version": "8.4.38", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", - "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", + "version": "8.4.49", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", + "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", "dev": true, "funding": [ { @@ -7632,22 +8022,24 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { "nanoid": "^3.3.7", - "picocolors": "^1.0.0", - "source-map-js": "^1.2.0" + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" }, "engines": { "node": "^10 || ^12 || >=14" } }, "node_modules/postcss-calc": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-10.0.0.tgz", - "integrity": "sha512-OmjhudoNTP0QleZCwl1i6NeBwN+5MZbY5ersLZz69mjJiDVv/p57RjRuKDkHeDWr4T+S97wQfsqRTNoDHB2e3g==", + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-10.0.2.tgz", + "integrity": "sha512-DT/Wwm6fCKgpYVI7ZEWuPJ4az8hiEHtCUeYjZXqU7Ou4QqYh1Df2yCQ7Ca6N7xqKPFkxN3fhf+u9KSoOCJNAjg==", "dev": true, + "license": "MIT", "dependencies": { - "postcss-selector-parser": "^6.0.16", + "postcss-selector-parser": "^6.1.2", "postcss-value-parser": "^4.2.0" }, "engines": { @@ -7657,6 +8049,20 @@ "postcss": "^8.4.38" } }, + "node_modules/postcss-calc/node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/postcss-cli": { "version": "11.0.0", "resolved": "https://registry.npmjs.org/postcss-cli/-/postcss-cli-11.0.0.tgz", @@ -7907,9 +8313,9 @@ } }, "node_modules/postcss-custom-media": { - "version": "10.0.6", - "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-10.0.6.tgz", - "integrity": "sha512-BjihQoIO4Wjqv9fQNExSJIim8UAmkhLxuJnhJsLTRFSba1y1MhxkJK5awsM//6JJ+/Tu5QUxf624RQAvKHv6SA==", + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-11.0.5.tgz", + "integrity": "sha512-SQHhayVNgDvSAdX9NQ/ygcDQGEY+aSF4b/96z7QUX6mqL5yl/JgG/DywcF6fW9XbnCRE+aVYk+9/nqGuzOPWeQ==", "dev": true, "funding": [ { @@ -7921,24 +8327,26 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT", "dependencies": { - "@csstools/cascade-layer-name-parser": "^1.0.11", - "@csstools/css-parser-algorithms": "^2.6.3", - "@csstools/css-tokenizer": "^2.3.1", - "@csstools/media-query-list-parser": "^2.1.11" + "@csstools/cascade-layer-name-parser": "^2.0.4", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/media-query-list-parser": "^4.0.2" }, "engines": { - "node": "^14 || ^16 || >=18" + "node": ">=18" }, "peerDependencies": { "postcss": "^8.4" } }, "node_modules/postcss-discard-duplicates": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-7.0.0.tgz", - "integrity": "sha512-bAnSuBop5LpAIUmmOSsuvtKAAKREB6BBIYStWUTGq8oG5q9fClDMMuY8i4UPI/cEcDx2TN+7PMnXYIId20UVDw==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-7.0.1.tgz", + "integrity": "sha512-oZA+v8Jkpu1ct/xbbrntHRsfLGuzoP+cpt0nJe5ED2FQF8n8bJtn7Bo28jSmBYwqgqnqkuSXJfSUEE7if4nClQ==", "dev": true, + "license": "MIT", "engines": { "node": "^18.12.0 || ^20.9.0 || >=22.0" }, @@ -7959,9 +8367,9 @@ } }, "node_modules/postcss-focus-within": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-8.0.1.tgz", - "integrity": "sha512-NFU3xcY/xwNaapVb+1uJ4n23XImoC86JNwkY/uduytSl2s9Ekc2EpzmRR63+ExitnW3Mab3Fba/wRPCT5oDILA==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-9.0.1.tgz", + "integrity": "sha512-fzNUyS1yOYa7mOjpci/bR+u+ESvdar6hk8XNK/TRR0fiGTp2QT5N+ducP0n3rfH/m9I7H/EQU6lsa2BrgxkEjw==", "dev": true, "funding": [ { @@ -7973,16 +8381,31 @@ "url": "https://opencollective.com/csstools" } ], + "license": "MIT-0", "dependencies": { - "postcss-selector-parser": "^6.0.13" + "postcss-selector-parser": "^7.0.0" }, "engines": { - "node": "^14 || ^16 || >=18" + "node": ">=18" }, "peerDependencies": { "postcss": "^8.4" } }, + "node_modules/postcss-focus-within/node_modules/postcss-selector-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", + "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/postcss-load-config": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-5.1.0.tgz", @@ -8041,15 +8464,16 @@ "dev": true }, "node_modules/postcss-merge-rules": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-7.0.2.tgz", - "integrity": "sha512-VAR47UNvRsdrTHLe7TV1CeEtF9SJYR5ukIB9U4GZyZOptgtsS20xSxy+k5wMrI3udST6O1XuIn7cjQkg7sDAAw==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-7.0.4.tgz", + "integrity": "sha512-ZsaamiMVu7uBYsIdGtKJ64PkcQt6Pcpep/uO90EpLS3dxJi6OXamIobTYcImyXGoW0Wpugh7DSD3XzxZS9JCPg==", "dev": true, + "license": "MIT", "dependencies": { - "browserslist": "^4.23.1", + "browserslist": "^4.23.3", "caniuse-api": "^3.0.0", "cssnano-utils": "^5.0.0", - "postcss-selector-parser": "^6.1.0" + "postcss-selector-parser": "^6.1.2" }, "engines": { "node": "^18.12.0 || ^20.9.0 || >=22.0" @@ -8058,23 +8482,58 @@ "postcss": "^8.4.31" } }, + "node_modules/postcss-merge-rules/node_modules/postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/postcss-nested": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", - "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-7.0.2.tgz", + "integrity": "sha512-5osppouFc0VR9/VYzYxO03VaDa3e8F23Kfd6/9qcZTUI8P58GIYlArOET2Wq0ywSl2o2PjELhYOFI4W7l5QHKw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^7.0.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-nested/node_modules/postcss-selector-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", + "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", "dev": true, + "license": "MIT", "dependencies": { - "postcss-selector-parser": "^6.0.11" + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" }, "engines": { - "node": ">=12.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - "peerDependencies": { - "postcss": "^8.2.14" + "node": ">=4" } }, "node_modules/postcss-reporter": { @@ -8098,16 +8557,18 @@ } }, "node_modules/postcss-resolve-nested-selector": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz", - "integrity": "sha1-Kcy8fDfe36wwTp//C/FZaz9qDk4=", - "dev": true + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.6.tgz", + "integrity": "sha512-0sglIs9Wmkzbr8lQwEyIzlDOOC9bGmfVKcJTaxv3vMmd3uo4o4DerC3En0bnmgceeql9BfC8hRkp7cg0fjdVqw==", + "dev": true, + "license": "MIT" }, "node_modules/postcss-safe-parser": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz", "integrity": "sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=12.0" }, @@ -8239,6 +8700,7 @@ "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-4.0.1.tgz", "integrity": "sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -8298,6 +8760,7 @@ "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-7.0.1.tgz", "integrity": "sha512-zK0TB7Xd6JpCLmlLmufqykGE+/TlOePD6qKClNW7hHDKFh/J7/7gCWGR7joEQEW1bKq3a3yUZSObOoWLFQ4ohg==", "dev": true, + "license": "MIT", "dependencies": { "find-up": "^4.1.0", "read-pkg": "^5.2.0", @@ -8315,6 +8778,7 @@ "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", "dev": true, + "license": "MIT", "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -8328,6 +8792,7 @@ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", "dev": true, + "license": "MIT", "dependencies": { "p-locate": "^4.1.0" }, @@ -8340,6 +8805,7 @@ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", "dev": true, + "license": "MIT", "dependencies": { "p-limit": "^2.2.0" }, @@ -8352,6 +8818,7 @@ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -8361,6 +8828,7 @@ "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-5.2.0.tgz", "integrity": "sha512-Ug69mNOpfvKDAc2Q8DRpMjjzdtrnv9HcSMX+4VsZxD1aZ6ZzrIE7rlzXBtWTyhULSMKg076AW6WR5iZpD0JiOg==", "dev": true, + "license": "MIT", "dependencies": { "@types/normalize-package-data": "^2.4.0", "normalize-package-data": "^2.5.0", @@ -8376,6 +8844,17 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz", "integrity": "sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg==", "dev": true, + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=8" + } + }, + "node_modules/read-pkg-up/node_modules/type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=8" } @@ -8409,6 +8888,7 @@ "resolved": "https://registry.npmjs.org/redent/-/redent-3.0.0.tgz", "integrity": "sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==", "dev": true, + "license": "MIT", "dependencies": { "indent-string": "^4.0.0", "strip-indent": "^3.0.0" @@ -8546,6 +9026,7 @@ "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -8613,10 +9094,11 @@ } }, "node_modules/rtlcss": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-4.1.1.tgz", - "integrity": "sha512-/oVHgBtnPNcggP2aVXQjSy6N1mMAfHg4GSag0QtZBlD5bdDgAHwr4pydqJGd+SUCu9260+Pjqbjwtvu7EMH1KQ==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-4.3.0.tgz", + "integrity": "sha512-FI+pHEn7Wc4NqKXMXFM+VAYKEj/mRIcW4h24YVwVtyjI+EqGrLc2Hx/Ny0lrZ21cBWU2goLy36eqMcNj3AQJig==", "dev": true, + "license": "MIT", "dependencies": { "escalade": "^3.1.1", "picocolors": "^1.0.0", @@ -8758,13 +9240,14 @@ } }, "node_modules/sass": { - "version": "1.77.6", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.77.6.tgz", - "integrity": "sha512-ByXE1oLD79GVq9Ht1PeHWCPMPB8XHpBuz1r85oByKHjZY6qV6rWnQovQzXJXuQ/XyE1Oj3iPk3lo28uzaRA2/Q==", + "version": "1.83.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.83.0.tgz", + "integrity": "sha512-qsSxlayzoOjdvXMVLkzF84DJFc2HZEL/rFyGIKbbilYtAvlCxyuzUeff9LawTn4btVnLKg75Z8MMr1lxU1lfGw==", "dev": true, + "license": "MIT", "dependencies": { - "chokidar": ">=3.0.0 <4.0.0", - "immutable": "^4.0.0", + "chokidar": "^4.0.0", + "immutable": "^5.0.2", "source-map-js": ">=0.6.2 <2.0.0" }, "bin": { @@ -8772,6 +9255,39 @@ }, "engines": { "node": ">=14.0.0" + }, + "optionalDependencies": { + "@parcel/watcher": "^2.4.1" + } + }, + "node_modules/sass/node_modules/chokidar": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.2.tgz", + "integrity": "sha512-/b57FK+bblSU+dfewfFe0rT1YjVDfOmeLQwCAuC+vwvgLkXboATqqmy+Ipux6JrF6L5joe5CBnFOw+gLWH6yKg==", + "dev": true, + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/sass/node_modules/readdirp": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.0.2.tgz", + "integrity": "sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" } }, "node_modules/semver": { @@ -8870,6 +9386,7 @@ "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", "dev": true, + "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", "astral-regex": "^2.0.0", @@ -8887,6 +9404,7 @@ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, + "license": "MIT", "dependencies": { "color-convert": "^2.0.1" }, @@ -8902,6 +9420,7 @@ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "dev": true, + "license": "MIT", "dependencies": { "color-name": "~1.1.4" }, @@ -8913,22 +9432,25 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/slice-ansi/node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } }, "node_modules/source-map-js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", - "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "dev": true, + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -9233,6 +9755,7 @@ "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", "dev": true, + "license": "MIT", "dependencies": { "min-indent": "^1.0.0" }, @@ -9256,13 +9779,15 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz", "integrity": "sha512-Dj1Okke1C3uKKwQcetra4jSuk0DqbzbYtXipzFlFMZtowbF1x7BKJwB9AayVMyFARvU8EDrZdcax4At/452cAg==", - "dev": true + "dev": true, + "license": "ISC" }, "node_modules/stylelint": { "version": "14.16.1", "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-14.16.1.tgz", "integrity": "sha512-ErlzR/T3hhbV+a925/gbfc3f3Fep9/bnspMiJPorfGEmcBbXdS+oo6LrVtoUZ/w9fqD6o6k7PtUlCOsCRdjX/A==", "dev": true, + "license": "MIT", "dependencies": { "@csstools/selector-specificity": "^2.0.2", "balanced-match": "^2.0.0", @@ -9324,21 +9849,22 @@ } }, "node_modules/stylelint-config-recommended-scss": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/stylelint-config-recommended-scss/-/stylelint-config-recommended-scss-14.0.0.tgz", - "integrity": "sha512-HDvpoOAQ1RpF+sPbDOT2Q2/YrBDEJDnUymmVmZ7mMCeNiFSdhRdyGEimBkz06wsN+HaFwUh249gDR+I9JR7Onw==", + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/stylelint-config-recommended-scss/-/stylelint-config-recommended-scss-14.1.0.tgz", + "integrity": "sha512-bhaMhh1u5dQqSsf6ri2GVWWQW5iUjBYgcHkh7SgDDn92ijoItC/cfO/W+fpXshgTQWhwFkP1rVcewcv4jaftRg==", "dev": true, + "license": "MIT", "dependencies": { "postcss-scss": "^4.0.9", - "stylelint-config-recommended": "^14.0.0", - "stylelint-scss": "^6.0.0" + "stylelint-config-recommended": "^14.0.1", + "stylelint-scss": "^6.4.0" }, "engines": { "node": ">=18.12.0" }, "peerDependencies": { "postcss": "^8.3.3", - "stylelint": "^16.0.2" + "stylelint": "^16.6.1" }, "peerDependenciesMeta": { "postcss": { @@ -9369,15 +9895,19 @@ } }, "node_modules/stylelint-scss": { - "version": "6.3.2", - "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-6.3.2.tgz", - "integrity": "sha512-pNk9mXOVKkQtd+SROPC9io8ISSgX+tOVPhFdBE+LaKQnJMLdWPbGKAGYv4Wmf/RrnOjkutunNTN9kKMhkdE5qA==", + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-6.10.0.tgz", + "integrity": "sha512-y03if6Qw9xBMoVaf7tzp5BbnYhYvudIKzURkhSHzcHG0bW0fAYvQpTUVJOe7DyhHaxeThBil4ObEMvGbV7+M+w==", "dev": true, + "license": "MIT", "dependencies": { - "known-css-properties": "^0.31.0", + "css-tree": "^3.0.1", + "is-plain-object": "^5.0.0", + "known-css-properties": "^0.35.0", + "mdn-data": "^2.12.2", "postcss-media-query-parser": "^0.2.3", - "postcss-resolve-nested-selector": "^0.1.1", - "postcss-selector-parser": "^6.1.0", + "postcss-resolve-nested-selector": "^0.1.6", + "postcss-selector-parser": "^7.0.0", "postcss-value-parser": "^4.2.0" }, "engines": { @@ -9387,11 +9917,19 @@ "stylelint": "^16.0.2" } }, - "node_modules/stylelint-scss/node_modules/known-css-properties": { - "version": "0.31.0", - "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.31.0.tgz", - "integrity": "sha512-sBPIUGTNF0czz0mwGGUoKKJC8Q7On1GPbCSFPfyEsfHb2DyBG0Y4QtV+EVWpINSaiGKZblDNuF5AezxSgOhesQ==", - "dev": true + "node_modules/stylelint-scss/node_modules/postcss-selector-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", + "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } }, "node_modules/stylelint/node_modules/ansi-regex": { "version": "5.0.1", @@ -9423,6 +9961,13 @@ "node": ">=8" } }, + "node_modules/stylelint/node_modules/known-css-properties": { + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.26.0.tgz", + "integrity": "sha512-5FZRzrZzNTBruuurWpvZnvP9pum+fe0HcK8z/ooo+U+Hmp4vtbyp1/QDsqmufirXy4egGzbaH/y2uCZf+6W5Kg==", + "dev": true, + "license": "MIT" + }, "node_modules/stylelint/node_modules/resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", @@ -9475,6 +10020,7 @@ "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0", "supports-color": "^7.0.0" @@ -9488,6 +10034,7 @@ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -9497,6 +10044,7 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "dev": true, + "license": "MIT", "dependencies": { "has-flag": "^4.0.0" }, @@ -9539,10 +10087,11 @@ } }, "node_modules/table": { - "version": "6.8.1", - "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", - "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/table/-/table-6.9.0.tgz", + "integrity": "sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==", "dev": true, + "license": "BSD-3-Clause", "dependencies": { "ajv": "^8.0.1", "lodash.truncate": "^4.4.2", @@ -9555,15 +10104,16 @@ } }, "node_modules/table/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, + "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "require-from-string": "^2.0.2" }, "funding": { "type": "github", @@ -9575,6 +10125,7 @@ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -9583,13 +10134,15 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/table/node_modules/is-fullwidth-code-point": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -9598,13 +10151,15 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/table/node_modules/string-width": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", "dev": true, + "license": "MIT", "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -9619,6 +10174,7 @@ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", "dev": true, + "license": "MIT", "dependencies": { "ansi-regex": "^5.0.1" }, @@ -9676,6 +10232,7 @@ "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-3.0.1.tgz", "integrity": "sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==", "dev": true, + "license": "MIT", "engines": { "node": ">=8" } @@ -9744,12 +10301,16 @@ } }, "node_modules/type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", "dev": true, + "license": "(MIT OR CC0-1.0)", "engines": { - "node": ">=8" + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/unbox-primitive": { @@ -9877,9 +10438,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz", - "integrity": "sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", + "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", "dev": true, "funding": [ { @@ -9895,9 +10456,10 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "escalade": "^3.1.2", - "picocolors": "^1.0.1" + "escalade": "^3.2.0", + "picocolors": "^1.1.0" }, "bin": { "update-browserslist-db": "cli.js" @@ -9925,7 +10487,8 @@ "version": "2.4.0", "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.4.0.tgz", "integrity": "sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw==", - "dev": true + "dev": true, + "license": "MIT" }, "node_modules/validate-npm-package-license": { "version": "3.0.4", @@ -9999,6 +10562,7 @@ "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-4.0.2.tgz", "integrity": "sha512-7KxauUdBmSdWnmpaGFg+ppNjKF8uNLry8LyzjauQDOVONfFLNKrKvQOxZ/VuTIcS/gge/YNahf5RIIQWTSarlg==", "dev": true, + "license": "ISC", "dependencies": { "imurmurhash": "^0.1.4", "signal-exit": "^3.0.7" @@ -11445,27 +12009,27 @@ } }, "@csstools/cascade-layer-name-parser": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-1.0.11.tgz", - "integrity": "sha512-yhsonEAhaWRQvHFYhSzOUobH2Ev++fMci+ppFRagw0qVSPlcPV4FnNmlwpM/b2BM10ZeMRkVV4So6YRswD0O0w==", + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-2.0.4.tgz", + "integrity": "sha512-7DFHlPuIxviKYZrOiwVU/PiHLm3lLUR23OMuEEtfEOQTOp9hzQ2JjdY6X5H18RVuUPJqSCI+qNnD5iOLMVE0bA==", "dev": true }, "@csstools/css-parser-algorithms": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.6.3.tgz", - "integrity": "sha512-xI/tL2zxzEbESvnSxwFgwvy5HS00oCXxL4MLs6HUiDcYfwowsoQaABKxUElp1ARITrINzBnsECOc1q0eg2GOrA==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-3.0.4.tgz", + "integrity": "sha512-Up7rBoV77rv29d3uKHUIVubz1BTcgyUK72IvCQAbfbMv584xHcGKCKbWh7i8hPrRJ7qU4Y8IO3IY9m+iTB7P3A==", "dev": true }, "@csstools/css-tokenizer": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-2.3.1.tgz", - "integrity": "sha512-iMNHTyxLbBlWIfGtabT157LH9DUx9X8+Y3oymFEuMj8HNc+rpE3dPFGFgHjpKfjeFDjLjYIAIhXPGvS2lKxL9g==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-3.0.3.tgz", + "integrity": "sha512-UJnjoFsmxfKUdNYdWgOB0mWUypuLvAfQPH1+pyvRJs6euowbFkFC6P13w1l8mJyi3vxYMxc9kld5jZEGRQs6bw==", "dev": true }, "@csstools/media-query-list-parser": { - "version": "2.1.11", - "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.11.tgz", - "integrity": "sha512-uox5MVhvNHqitPP+SynrB1o8oPxPMt2JLgp5ghJOWf54WGQ5OKu47efne49r1SWqs3wRP8xSWjnO9MBKxhB1dA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-4.0.2.tgz", + "integrity": "sha512-EUos465uvVvMJehckATTlNqGj4UJWkTmdWuDMjqvSUkjGpmOyFZBVwb4knxCm/k2GMTXY+c/5RkdndzFYWeX5A==", "dev": true }, "@csstools/selector-specificity": { @@ -11619,6 +12183,123 @@ "fastq": "^1.6.0" } }, + "@parcel/watcher": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.0.tgz", + "integrity": "sha512-i0GV1yJnm2n3Yq1qw6QrUrd/LI9bE8WEBOTtOkpCXHHdyN3TAGgqAK/DAT05z4fq2x04cARXt2pDmjWjL92iTQ==", + "dev": true, + "optional": true, + "requires": { + "@parcel/watcher-android-arm64": "2.5.0", + "@parcel/watcher-darwin-arm64": "2.5.0", + "@parcel/watcher-darwin-x64": "2.5.0", + "@parcel/watcher-freebsd-x64": "2.5.0", + "@parcel/watcher-linux-arm-glibc": "2.5.0", + "@parcel/watcher-linux-arm-musl": "2.5.0", + "@parcel/watcher-linux-arm64-glibc": "2.5.0", + "@parcel/watcher-linux-arm64-musl": "2.5.0", + "@parcel/watcher-linux-x64-glibc": "2.5.0", + "@parcel/watcher-linux-x64-musl": "2.5.0", + "@parcel/watcher-win32-arm64": "2.5.0", + "@parcel/watcher-win32-ia32": "2.5.0", + "@parcel/watcher-win32-x64": "2.5.0", + "detect-libc": "^1.0.3", + "is-glob": "^4.0.3", + "micromatch": "^4.0.5", + "node-addon-api": "^7.0.0" + } + }, + "@parcel/watcher-android-arm64": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.0.tgz", + "integrity": "sha512-qlX4eS28bUcQCdribHkg/herLe+0A9RyYC+mm2PXpncit8z5b3nSqGVzMNR3CmtAOgRutiZ02eIJJgP/b1iEFQ==", + "dev": true, + "optional": true + }, + "@parcel/watcher-darwin-arm64": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.0.tgz", + "integrity": "sha512-hyZ3TANnzGfLpRA2s/4U1kbw2ZI4qGxaRJbBH2DCSREFfubMswheh8TeiC1sGZ3z2jUf3s37P0BBlrD3sjVTUw==", + "dev": true, + "optional": true + }, + "@parcel/watcher-darwin-x64": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.0.tgz", + "integrity": "sha512-9rhlwd78saKf18fT869/poydQK8YqlU26TMiNg7AIu7eBp9adqbJZqmdFOsbZ5cnLp5XvRo9wcFmNHgHdWaGYA==", + "dev": true, + "optional": true + }, + "@parcel/watcher-freebsd-x64": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.0.tgz", + "integrity": "sha512-syvfhZzyM8kErg3VF0xpV8dixJ+RzbUaaGaeb7uDuz0D3FK97/mZ5AJQ3XNnDsXX7KkFNtyQyFrXZzQIcN49Tw==", + "dev": true, + "optional": true + }, + "@parcel/watcher-linux-arm-glibc": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.0.tgz", + "integrity": "sha512-0VQY1K35DQET3dVYWpOaPFecqOT9dbuCfzjxoQyif1Wc574t3kOSkKevULddcR9znz1TcklCE7Ht6NIxjvTqLA==", + "dev": true, + "optional": true + }, + "@parcel/watcher-linux-arm-musl": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.0.tgz", + "integrity": "sha512-6uHywSIzz8+vi2lAzFeltnYbdHsDm3iIB57d4g5oaB9vKwjb6N6dRIgZMujw4nm5r6v9/BQH0noq6DzHrqr2pA==", + "dev": true, + "optional": true + }, + "@parcel/watcher-linux-arm64-glibc": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.0.tgz", + "integrity": "sha512-BfNjXwZKxBy4WibDb/LDCriWSKLz+jJRL3cM/DllnHH5QUyoiUNEp3GmL80ZqxeumoADfCCP19+qiYiC8gUBjA==", + "dev": true, + "optional": true + }, + "@parcel/watcher-linux-arm64-musl": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.0.tgz", + "integrity": "sha512-S1qARKOphxfiBEkwLUbHjCY9BWPdWnW9j7f7Hb2jPplu8UZ3nes7zpPOW9bkLbHRvWM0WDTsjdOTUgW0xLBN1Q==", + "dev": true, + "optional": true + }, + "@parcel/watcher-linux-x64-glibc": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.0.tgz", + "integrity": "sha512-d9AOkusyXARkFD66S6zlGXyzx5RvY+chTP9Jp0ypSTC9d4lzyRs9ovGf/80VCxjKddcUvnsGwCHWuF2EoPgWjw==", + "dev": true, + "optional": true + }, + "@parcel/watcher-linux-x64-musl": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.0.tgz", + "integrity": "sha512-iqOC+GoTDoFyk/VYSFHwjHhYrk8bljW6zOhPuhi5t9ulqiYq1togGJB5e3PwYVFFfeVgc6pbz3JdQyDoBszVaA==", + "dev": true, + "optional": true + }, + "@parcel/watcher-win32-arm64": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.0.tgz", + "integrity": "sha512-twtft1d+JRNkM5YbmexfcH/N4znDtjgysFaV9zvZmmJezQsKpkfLYJ+JFV3uygugK6AtIM2oADPkB2AdhBrNig==", + "dev": true, + "optional": true + }, + "@parcel/watcher-win32-ia32": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.0.tgz", + "integrity": "sha512-+rgpsNRKwo8A53elqbbHXdOMtY/tAtTzManTWShB5Kk54N8Q9mzNWV7tV+IbGueCbcj826MfWGU3mprWtuf1TA==", + "dev": true, + "optional": true + }, + "@parcel/watcher-win32-x64": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.0.tgz", + "integrity": "sha512-lPrxve92zEHdgeff3aiu4gDOIt4u7sJYha6wbdEZDCDUhtjTsOMiaJzG5lMY4GkWH8p0fMmO2Ppq5G5XXG+DQw==", + "dev": true, + "optional": true + }, "@pkgr/utils": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/@pkgr/utils/-/utils-2.4.2.tgz", @@ -11824,9 +12505,9 @@ } }, "@wordpress/browserslist-config": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@wordpress/browserslist-config/-/browserslist-config-6.1.0.tgz", - "integrity": "sha512-cf5iwPq6JetQjiaRwlvzW5eX0S3OphVmy1YTxHQdrVqp79rOGvamVftxqvmf3C/GSRaNyI4eZV+nNwNRN0DkrQ==", + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/@wordpress/browserslist-config/-/browserslist-config-6.14.0.tgz", + "integrity": "sha512-a26hxY8R/A7FH/Z8oZsYS31ZC/Xy9QSBTi5w84MKSeYdWlck7t1QdCwUNF1u621wbuP7beiiu9FkYY4hI3Bk9A==", "dev": true }, "@wordpress/eslint-plugin": { @@ -12355,16 +13036,16 @@ "dev": true }, "autoprefixer": { - "version": "10.4.19", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.19.tgz", - "integrity": "sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==", + "version": "10.4.20", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.20.tgz", + "integrity": "sha512-XY25y5xSv/wEoqzDyXXME4AFfkZI0P23z6Fs3YgymDnKJkCGOnkL0iTxCa85UTqaSgfcqyf3UA6+c7wUvx/16g==", "dev": true, "requires": { - "browserslist": "^4.23.0", - "caniuse-lite": "^1.0.30001599", + "browserslist": "^4.23.3", + "caniuse-lite": "^1.0.30001646", "fraction.js": "^4.3.7", "normalize-range": "^0.1.2", - "picocolors": "^1.0.0", + "picocolors": "^1.0.1", "postcss-value-parser": "^4.2.0" } }, @@ -12465,15 +13146,15 @@ } }, "browserslist": { - "version": "4.23.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.1.tgz", - "integrity": "sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==", + "version": "4.24.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.3.tgz", + "integrity": "sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001629", - "electron-to-chromium": "^1.4.796", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.16" + "caniuse-lite": "^1.0.30001688", + "electron-to-chromium": "^1.5.73", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.1" } }, "builtin-modules": { @@ -12537,9 +13218,9 @@ } }, "caniuse-lite": { - "version": "1.0.30001636", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001636.tgz", - "integrity": "sha512-bMg2vmr8XBsbL6Lr0UHXy/21m84FTxDLWn2FSqMd5PrlbMxwJlQnC2YWYxVgp66PZE+BBNF2jYQUBKCo1FDeZg==", + "version": "1.0.30001689", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001689.tgz", + "integrity": "sha512-CmeR2VBycfa+5/jOfnp/NpWPGd06nf1XYiefUvhXFfZE4GkRc9jv+eGPS4nT558WS/8lYCzV8SlANCIPvbWP1g==", "dev": true }, "chalk": { @@ -12666,9 +13347,9 @@ } }, "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", "dev": true, "requires": { "path-key": "^3.1.0", @@ -12677,11 +13358,21 @@ } }, "css-functions-list": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.1.tgz", - "integrity": "sha512-Nj5YcaGgBtuUmn1D7oHqPW0c9iui7xsTsj5lIX8ZgevdfhmjFfKB3r8moHJtNJnctnYXJyYX5I1pp90HM4TPgQ==", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.3.tgz", + "integrity": "sha512-IQOkD3hbR5KrN93MtcYuad6YPuTSUhntLHDuLEbFWE+ff2/XSZNdZG+LcbbIW5AXKg/WFIfYItIzVoHngHXZzA==", "dev": true }, + "css-tree": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-3.1.0.tgz", + "integrity": "sha512-0eW44TGN5SQXU1mWSkKwFstI/22X2bG1nYzZTYMAWjylYURhse752YgbE4Cx46AC+bAvI+/dYTPRk1LqSUnu6w==", + "dev": true, + "requires": { + "mdn-data": "2.12.2", + "source-map-js": "^1.0.1" + } + }, "cssesc": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", @@ -12701,12 +13392,12 @@ "dev": true }, "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz", + "integrity": "sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==", "dev": true, "requires": { - "ms": "2.1.2" + "ms": "^2.1.3" } }, "decamelize": { @@ -12782,6 +13473,13 @@ "integrity": "sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==", "dev": true }, + "detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "dev": true, + "optional": true + }, "dir-glob": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", @@ -12801,9 +13499,9 @@ } }, "electron-to-chromium": { - "version": "1.4.810", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.810.tgz", - "integrity": "sha512-Kaxhu4T7SJGpRQx99tq216gCq2nMxJo+uuT6uzz9l8TVN2stL7M06MIIXAtr9jsrLs2Glflgf2vMQRepxawOdQ==", + "version": "1.5.74", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.74.tgz", + "integrity": "sha512-ck3//9RC+6oss/1Bh9tiAVFy5vfSKbRHAFh7Z3/eTRkEqJeWgymloShB17Vg3Z4nmDNp35vAd1BZ6CMW4Wt6Iw==", "dev": true }, "emoji-regex": { @@ -12862,9 +13560,9 @@ } }, "escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true }, "escape-string-regexp": { @@ -13536,6 +14234,12 @@ "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", "dev": true }, + "fast-uri": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.3.tgz", + "integrity": "sha512-aLrHthzCjH5He4Z2H9YZ+v6Ujb9ocRuW6ZzkJQOrTxleEijANq4v1TsaPaVG1PZcuurEzrLcWRyYBYXD5cEiaw==", + "dev": true + }, "fastest-levenshtein": { "version": "1.0.16", "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", @@ -13590,9 +14294,9 @@ } }, "flatted": { - "version": "3.2.9", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", - "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz", + "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==", "dev": true }, "fraction.js": { @@ -13886,9 +14590,9 @@ "dev": true }, "immutable": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.2.4.tgz", - "integrity": "sha512-WDxL3Hheb1JkRN3sQkyujNlL/xRjAo3rJtaU5xeufUauG66JdMr32bLj4gF+vWl84DIA3Zxw7tiAjneYzRRw+w==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.0.3.tgz", + "integrity": "sha512-P8IdPQHq3lA1xVeBRi5VPqUm5HDgKnx0Ru51wZz5mjxHr5n3RWhjIpOFU7ybkUxfB+5IToy+OLaHYDBIWsv+uw==", "dev": true }, "import-fresh": { @@ -14349,9 +15053,9 @@ "dev": true }, "known-css-properties": { - "version": "0.26.0", - "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.26.0.tgz", - "integrity": "sha512-5FZRzrZzNTBruuurWpvZnvP9pum+fe0HcK8z/ooo+U+Hmp4vtbyp1/QDsqmufirXy4egGzbaH/y2uCZf+6W5Kg==", + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.35.0.tgz", + "integrity": "sha512-a/RAk2BfKk+WFGhhOCAYqSiFLc34k8Mt/6NWRI4joER0EYUzXIcFivjjnoD3+XU1DggLn/tZc3DOAgke7l8a4A==", "dev": true }, "language-subtag-registry": { @@ -14491,6 +15195,12 @@ "integrity": "sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==", "dev": true }, + "mdn-data": { + "version": "2.12.2", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz", + "integrity": "sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==", + "dev": true + }, "memorystream": { "version": "0.3.1", "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", @@ -14538,12 +15248,6 @@ "validate-npm-package-license": "^3.0.1" } }, - "type-fest": { - "version": "0.18.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", - "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", - "dev": true - }, "yargs-parser": { "version": "20.2.9", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", @@ -14565,12 +15269,12 @@ "dev": true }, "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, "requires": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" } }, @@ -14613,15 +15317,15 @@ } }, "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, "nanoid": { - "version": "3.3.7", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", - "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "version": "3.3.8", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz", + "integrity": "sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==", "dev": true }, "natural-compare": { @@ -14636,10 +15340,17 @@ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, + "node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "dev": true, + "optional": true + }, "node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", "dev": true }, "normalize-package-data": { @@ -14692,9 +15403,9 @@ }, "dependencies": { "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz", + "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==", "dev": true, "requires": { "nice-try": "^1.0.4", @@ -15395,9 +16106,9 @@ "dev": true }, "picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", "dev": true }, "picomatch": { @@ -15419,24 +16130,36 @@ "dev": true }, "postcss": { - "version": "8.4.38", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", - "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", + "version": "8.4.49", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.49.tgz", + "integrity": "sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==", "dev": true, "requires": { "nanoid": "^3.3.7", - "picocolors": "^1.0.0", - "source-map-js": "^1.2.0" + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" } }, "postcss-calc": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-10.0.0.tgz", - "integrity": "sha512-OmjhudoNTP0QleZCwl1i6NeBwN+5MZbY5ersLZz69mjJiDVv/p57RjRuKDkHeDWr4T+S97wQfsqRTNoDHB2e3g==", + "version": "10.0.2", + "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-10.0.2.tgz", + "integrity": "sha512-DT/Wwm6fCKgpYVI7ZEWuPJ4az8hiEHtCUeYjZXqU7Ou4QqYh1Df2yCQ7Ca6N7xqKPFkxN3fhf+u9KSoOCJNAjg==", "dev": true, "requires": { - "postcss-selector-parser": "^6.0.16", + "postcss-selector-parser": "^6.1.2", "postcss-value-parser": "^4.2.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + } } }, "postcss-cli": { @@ -15616,21 +16339,21 @@ } }, "postcss-custom-media": { - "version": "10.0.6", - "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-10.0.6.tgz", - "integrity": "sha512-BjihQoIO4Wjqv9fQNExSJIim8UAmkhLxuJnhJsLTRFSba1y1MhxkJK5awsM//6JJ+/Tu5QUxf624RQAvKHv6SA==", + "version": "11.0.5", + "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-11.0.5.tgz", + "integrity": "sha512-SQHhayVNgDvSAdX9NQ/ygcDQGEY+aSF4b/96z7QUX6mqL5yl/JgG/DywcF6fW9XbnCRE+aVYk+9/nqGuzOPWeQ==", "dev": true, "requires": { - "@csstools/cascade-layer-name-parser": "^1.0.11", - "@csstools/css-parser-algorithms": "^2.6.3", - "@csstools/css-tokenizer": "^2.3.1", - "@csstools/media-query-list-parser": "^2.1.11" + "@csstools/cascade-layer-name-parser": "^2.0.4", + "@csstools/css-parser-algorithms": "^3.0.4", + "@csstools/css-tokenizer": "^3.0.3", + "@csstools/media-query-list-parser": "^4.0.2" } }, "postcss-discard-duplicates": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-7.0.0.tgz", - "integrity": "sha512-bAnSuBop5LpAIUmmOSsuvtKAAKREB6BBIYStWUTGq8oG5q9fClDMMuY8i4UPI/cEcDx2TN+7PMnXYIId20UVDw==", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-7.0.1.tgz", + "integrity": "sha512-oZA+v8Jkpu1ct/xbbrntHRsfLGuzoP+cpt0nJe5ED2FQF8n8bJtn7Bo28jSmBYwqgqnqkuSXJfSUEE7if4nClQ==", "dev": true }, "postcss-discard-empty": { @@ -15640,12 +16363,24 @@ "dev": true }, "postcss-focus-within": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-8.0.1.tgz", - "integrity": "sha512-NFU3xcY/xwNaapVb+1uJ4n23XImoC86JNwkY/uduytSl2s9Ekc2EpzmRR63+ExitnW3Mab3Fba/wRPCT5oDILA==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/postcss-focus-within/-/postcss-focus-within-9.0.1.tgz", + "integrity": "sha512-fzNUyS1yOYa7mOjpci/bR+u+ESvdar6hk8XNK/TRR0fiGTp2QT5N+ducP0n3rfH/m9I7H/EQU6lsa2BrgxkEjw==", "dev": true, "requires": { - "postcss-selector-parser": "^6.0.13" + "postcss-selector-parser": "^7.0.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", + "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + } } }, "postcss-load-config": { @@ -15673,24 +16408,48 @@ "dev": true }, "postcss-merge-rules": { - "version": "7.0.2", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-7.0.2.tgz", - "integrity": "sha512-VAR47UNvRsdrTHLe7TV1CeEtF9SJYR5ukIB9U4GZyZOptgtsS20xSxy+k5wMrI3udST6O1XuIn7cjQkg7sDAAw==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-7.0.4.tgz", + "integrity": "sha512-ZsaamiMVu7uBYsIdGtKJ64PkcQt6Pcpep/uO90EpLS3dxJi6OXamIobTYcImyXGoW0Wpugh7DSD3XzxZS9JCPg==", "dev": true, "requires": { - "browserslist": "^4.23.1", + "browserslist": "^4.23.3", "caniuse-api": "^3.0.0", "cssnano-utils": "^5.0.0", - "postcss-selector-parser": "^6.1.0" + "postcss-selector-parser": "^6.1.2" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", + "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + } } }, "postcss-nested": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", - "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-7.0.2.tgz", + "integrity": "sha512-5osppouFc0VR9/VYzYxO03VaDa3e8F23Kfd6/9qcZTUI8P58GIYlArOET2Wq0ywSl2o2PjELhYOFI4W7l5QHKw==", "dev": true, "requires": { - "postcss-selector-parser": "^6.0.11" + "postcss-selector-parser": "^7.0.0" + }, + "dependencies": { + "postcss-selector-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", + "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + } } }, "postcss-reporter": { @@ -15704,9 +16463,9 @@ } }, "postcss-resolve-nested-selector": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz", - "integrity": "sha1-Kcy8fDfe36wwTp//C/FZaz9qDk4=", + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.6.tgz", + "integrity": "sha512-0sglIs9Wmkzbr8lQwEyIzlDOOC9bGmfVKcJTaxv3vMmd3uo4o4DerC3En0bnmgceeql9BfC8hRkp7cg0fjdVqw==", "dev": true }, "postcss-safe-parser": { @@ -15905,6 +16664,12 @@ "dev": true } } + }, + "type-fest": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", + "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "dev": true } } }, @@ -16078,9 +16843,9 @@ } }, "rtlcss": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-4.1.1.tgz", - "integrity": "sha512-/oVHgBtnPNcggP2aVXQjSy6N1mMAfHg4GSag0QtZBlD5bdDgAHwr4pydqJGd+SUCu9260+Pjqbjwtvu7EMH1KQ==", + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/rtlcss/-/rtlcss-4.3.0.tgz", + "integrity": "sha512-FI+pHEn7Wc4NqKXMXFM+VAYKEj/mRIcW4h24YVwVtyjI+EqGrLc2Hx/Ny0lrZ21cBWU2goLy36eqMcNj3AQJig==", "dev": true, "requires": { "escalade": "^3.1.1", @@ -16169,14 +16934,32 @@ } }, "sass": { - "version": "1.77.6", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.77.6.tgz", - "integrity": "sha512-ByXE1oLD79GVq9Ht1PeHWCPMPB8XHpBuz1r85oByKHjZY6qV6rWnQovQzXJXuQ/XyE1Oj3iPk3lo28uzaRA2/Q==", + "version": "1.83.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.83.0.tgz", + "integrity": "sha512-qsSxlayzoOjdvXMVLkzF84DJFc2HZEL/rFyGIKbbilYtAvlCxyuzUeff9LawTn4btVnLKg75Z8MMr1lxU1lfGw==", "dev": true, "requires": { - "chokidar": ">=3.0.0 <4.0.0", - "immutable": "^4.0.0", + "@parcel/watcher": "^2.4.1", + "chokidar": "^4.0.0", + "immutable": "^5.0.2", "source-map-js": ">=0.6.2 <2.0.0" + }, + "dependencies": { + "chokidar": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.2.tgz", + "integrity": "sha512-/b57FK+bblSU+dfewfFe0rT1YjVDfOmeLQwCAuC+vwvgLkXboATqqmy+Ipux6JrF6L5joe5CBnFOw+gLWH6yKg==", + "dev": true, + "requires": { + "readdirp": "^4.0.1" + } + }, + "readdirp": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.0.2.tgz", + "integrity": "sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==", + "dev": true + } } }, "semver": { @@ -16295,9 +17078,9 @@ } }, "source-map-js": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", - "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", "dev": true }, "spdx-correct": { @@ -16615,6 +17398,12 @@ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true }, + "known-css-properties": { + "version": "0.26.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.26.0.tgz", + "integrity": "sha512-5FZRzrZzNTBruuurWpvZnvP9pum+fe0HcK8z/ooo+U+Hmp4vtbyp1/QDsqmufirXy4egGzbaH/y2uCZf+6W5Kg==", + "dev": true + }, "resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", @@ -16650,14 +17439,14 @@ "dev": true }, "stylelint-config-recommended-scss": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/stylelint-config-recommended-scss/-/stylelint-config-recommended-scss-14.0.0.tgz", - "integrity": "sha512-HDvpoOAQ1RpF+sPbDOT2Q2/YrBDEJDnUymmVmZ7mMCeNiFSdhRdyGEimBkz06wsN+HaFwUh249gDR+I9JR7Onw==", + "version": "14.1.0", + "resolved": "https://registry.npmjs.org/stylelint-config-recommended-scss/-/stylelint-config-recommended-scss-14.1.0.tgz", + "integrity": "sha512-bhaMhh1u5dQqSsf6ri2GVWWQW5iUjBYgcHkh7SgDDn92ijoItC/cfO/W+fpXshgTQWhwFkP1rVcewcv4jaftRg==", "dev": true, "requires": { "postcss-scss": "^4.0.9", - "stylelint-config-recommended": "^14.0.0", - "stylelint-scss": "^6.0.0" + "stylelint-config-recommended": "^14.0.1", + "stylelint-scss": "^6.4.0" }, "dependencies": { "stylelint-config-recommended": { @@ -16669,23 +17458,30 @@ } }, "stylelint-scss": { - "version": "6.3.2", - "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-6.3.2.tgz", - "integrity": "sha512-pNk9mXOVKkQtd+SROPC9io8ISSgX+tOVPhFdBE+LaKQnJMLdWPbGKAGYv4Wmf/RrnOjkutunNTN9kKMhkdE5qA==", + "version": "6.10.0", + "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-6.10.0.tgz", + "integrity": "sha512-y03if6Qw9xBMoVaf7tzp5BbnYhYvudIKzURkhSHzcHG0bW0fAYvQpTUVJOe7DyhHaxeThBil4ObEMvGbV7+M+w==", "dev": true, "requires": { - "known-css-properties": "^0.31.0", + "css-tree": "^3.0.1", + "is-plain-object": "^5.0.0", + "known-css-properties": "^0.35.0", + "mdn-data": "^2.12.2", "postcss-media-query-parser": "^0.2.3", - "postcss-resolve-nested-selector": "^0.1.1", - "postcss-selector-parser": "^6.1.0", + "postcss-resolve-nested-selector": "^0.1.6", + "postcss-selector-parser": "^7.0.0", "postcss-value-parser": "^4.2.0" }, "dependencies": { - "known-css-properties": { - "version": "0.31.0", - "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.31.0.tgz", - "integrity": "sha512-sBPIUGTNF0czz0mwGGUoKKJC8Q7On1GPbCSFPfyEsfHb2DyBG0Y4QtV+EVWpINSaiGKZblDNuF5AezxSgOhesQ==", - "dev": true + "postcss-selector-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.0.0.tgz", + "integrity": "sha512-9RbEr1Y7FFfptd/1eEdntyjMwLeghW1bHX9GWjXo19vx4ytPQhANltvVxDggzJl7mnWM+dX28kb6cyS/4iQjlQ==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } } } }, @@ -16748,9 +17544,9 @@ } }, "table": { - "version": "6.8.1", - "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", - "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", + "version": "6.9.0", + "resolved": "https://registry.npmjs.org/table/-/table-6.9.0.tgz", + "integrity": "sha512-9kY+CygyYM6j02t5YFHbNz2FN5QmYGv9zAjVp4lCDjlCw7amdckXlEt/bjMhUIfj4ThGRE4gCUH5+yGnNuPo5A==", "dev": true, "requires": { "ajv": "^8.0.1", @@ -16761,15 +17557,15 @@ }, "dependencies": { "ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "dev": true, "requires": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "require-from-string": "^2.0.2" } }, "ansi-regex": { @@ -16908,9 +17704,9 @@ } }, "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz", + "integrity": "sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw==", "dev": true }, "unbox-primitive": { @@ -17001,13 +17797,13 @@ "dev": true }, "update-browserslist-db": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz", - "integrity": "sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", + "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", "dev": true, "requires": { - "escalade": "^3.1.2", - "picocolors": "^1.0.1" + "escalade": "^3.2.0", + "picocolors": "^1.1.0" } }, "uri-js": { diff --git a/src/wp-content/themes/twentytwentyone/package.json b/src/wp-content/themes/twentytwentyone/package.json index 077ba6396cfe3..f073b6c99bebc 100644 --- a/src/wp-content/themes/twentytwentyone/package.json +++ b/src/wp-content/themes/twentytwentyone/package.json @@ -17,28 +17,28 @@ "npm": ">=10.2.3" }, "devDependencies": { - "@wordpress/browserslist-config": "^6.1.0", + "@wordpress/browserslist-config": "^6.14.0", "@wordpress/eslint-plugin": "^17.4.0", "@wordpress/stylelint-config": "^21.30.0", - "autoprefixer": "^10.4.19", + "autoprefixer": "^10.4.20", "chokidar-cli": "^3.0.0", "eslint": "^8.55.0", "minimist": "^1.2.8", "npm-run-all": "^4.1.5", - "postcss": "^8.4.38", - "postcss-calc": "^10.0.0", + "postcss": "^8.4.49", + "postcss-calc": "^10.0.2", "postcss-cli": "^11.0.0", "postcss-css-variables": "^0.19.0", - "postcss-custom-media": "^10.0.6", - "postcss-discard-duplicates": "^7.0.0", + "postcss-custom-media": "^11.0.5", + "postcss-discard-duplicates": "^7.0.1", "postcss-discard-empty": "^7.0.0", - "postcss-focus-within": "^8.0.1", - "postcss-merge-rules": "^7.0.2", - "postcss-nested": "^6.0.0", - "rtlcss": "^4.0.0", - "sass": "^1.77.6", + "postcss-focus-within": "^9.0.1", + "postcss-merge-rules": "^7.0.4", + "postcss-nested": "^7.0.2", + "rtlcss": "^4.3.0", + "sass": "^1.83.0", "stylelint": "^14.16.1", - "stylelint-config-recommended-scss": "^14.0.0" + "stylelint-config-recommended-scss": "^14.1.0" }, "rtlcssConfig": { "options": { From c697356c29effcfa8115d852bc89385f7112c202 Mon Sep 17 00:00:00 2001 From: Jonathan Desrosiers Date: Tue, 17 Dec 2024 17:20:35 +0000 Subject: [PATCH 034/117] Build/Test Tools: Document every matrix exclusion. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit There should be inline documentation anytime a strategy matrix has an `exclude` combination configured so that contributors have proper context as to why it’s there. See #62221. git-svn-id: https://develop.svn.wordpress.org/trunk@59531 602fd350-edb4-49c9-b593-d223f7449a82 --- .github/workflows/install-testing.yml | 4 ++++ .github/workflows/local-docker-environment.yml | 4 ++-- .github/workflows/phpunit-tests.yml | 2 +- .github/workflows/upgrade-testing.yml | 9 +++++++-- 4 files changed, 14 insertions(+), 5 deletions(-) diff --git a/.github/workflows/install-testing.yml b/.github/workflows/install-testing.yml index ca03ebd518a00..f40f044586c88 100644 --- a/.github/workflows/install-testing.yml +++ b/.github/workflows/install-testing.yml @@ -78,15 +78,19 @@ jobs: # Exclude some PHP and MySQL versions that cannot currently be tested with Docker containers. exclude: + # There are no local WordPress Docker environment containers for PHP <= 5.3. - php: '5.2' - php: '5.3' + # MySQL containers <= 5.5 do not exist or fail to start properly. - db-version: '5.0' - db-version: '5.1' - db-version: '5.5' + # The PHP <= 7.3/MySQL 8.4 jobs currently fail due to mysql_native_password being disabled by default. See https://core.trac.wordpress.org/ticket/61218. - php: '7.2' db-version: '8.4' - php: '7.3' db-version: '8.4' + # MySQL 9.0+ will not work on PHP 7.2 & 7.3. See https://core.trac.wordpress.org/ticket/61218. - php: '7.2' db-version: '9.0' - php: '7.3' diff --git a/.github/workflows/local-docker-environment.yml b/.github/workflows/local-docker-environment.yml index 1e25c82ef1287..17d078198c009 100644 --- a/.github/workflows/local-docker-environment.yml +++ b/.github/workflows/local-docker-environment.yml @@ -88,9 +88,9 @@ jobs: db-version: ${{ fromJSON( needs.build-test-matrix.outputs.mysql-versions ) }} exclude: - # The MySQL 5.5 containers will not start. + # MySQL containers <= 5.5 do not exist or fail to start properly. - db-version: '5.5' - # MySQL 9.0+ will not work on PHP 7.2 & 7.3 + # MySQL 9.0+ will not work on PHP 7.2 & 7.3. See https://core.trac.wordpress.org/ticket/61218. - php: '7.2' db-version: '9.0' - php: '7.3' diff --git a/.github/workflows/phpunit-tests.yml b/.github/workflows/phpunit-tests.yml index d5aa3fa3de5cd..3ea45fcdc331e 100644 --- a/.github/workflows/phpunit-tests.yml +++ b/.github/workflows/phpunit-tests.yml @@ -93,7 +93,7 @@ jobs: report: true exclude: - # MySQL 9.0+ will not work on PHP 7.2 & 7.3 + # MySQL 9.0+ will not work on PHP 7.2 & 7.3. See https://core.trac.wordpress.org/ticket/61218. - php: '7.2' db-version: '9.0' - php: '7.3' diff --git a/.github/workflows/upgrade-testing.yml b/.github/workflows/upgrade-testing.yml index bfa94f3874e08..9ee2665b0bd6b 100644 --- a/.github/workflows/upgrade-testing.yml +++ b/.github/workflows/upgrade-testing.yml @@ -72,11 +72,12 @@ jobs: multisite: [ false, true ] exclude: + # The PHP <= 7.3/MySQL 8.4 jobs currently fail due to mysql_native_password being disabled by default. See https://core.trac.wordpress.org/ticket/61218. - php: '7.2' db-version: '8.4' - php: '7.3' db-version: '8.4' - # MySQL 9.0+ will not work on PHP 7.2 & 7.3 + # MySQL 9.0+ will not work on PHP 7.2 & 7.3. See https://core.trac.wordpress.org/ticket/61218. - php: '7.2' db-version: '9.1' - php: '7.3' @@ -108,6 +109,7 @@ jobs: multisite: [ false, true ] exclude: + # The PHP <= 7.3/MySQL 8.4 jobs currently fail due to mysql_native_password being disabled by default. See https://core.trac.wordpress.org/ticket/61218. - php: '7.2' db-version: '8.4' - php: '7.3' @@ -137,6 +139,7 @@ jobs: multisite: [ false, true ] exclude: + # The PHP <= 7.3/MySQL 8.4 jobs currently fail due to mysql_native_password being disabled by default. See https://core.trac.wordpress.org/ticket/61218. - php: '7.2' db-version: '8.4' - php: '7.3' @@ -195,6 +198,7 @@ jobs: multisite: [ false, true ] exclude: + # The PHP <= 7.3/MySQL 8.4 jobs currently fail due to mysql_native_password being disabled by default. See https://core.trac.wordpress.org/ticket/61218. - php: '7.2' db-version: '8.4' - php: '7.3' @@ -254,11 +258,12 @@ jobs: multisite: [ false, true ] exclude: + # The PHP <= 7.3/MySQL 8.4 jobs currently fail due to mysql_native_password being disabled by default. See https://core.trac.wordpress.org/ticket/61218. - php: '7.2' db-version: '8.4' - php: '7.3' db-version: '8.4' - # MySQL 9.0+ will not work on PHP 7.2 & 7.3 + # MySQL 9.0+ will not work on PHP 7.2 & 7.3. See https://core.trac.wordpress.org/ticket/61218. - php: '7.2' db-version: '9.1' - php: '7.3' From 68c4efcd5729fbc1859f01f4a40928d5e33a0216 Mon Sep 17 00:00:00 2001 From: Sergey Biryukov Date: Tue, 17 Dec 2024 23:56:28 +0000 Subject: [PATCH 035/117] Privacy: Use SHA-256 hashing algorithm for Gravatar. This aims to improve privacy by switching to a more secure algorithm, as an MD5 string can be reversed. Follow-up to [6748], [31107]. Props henry.wright, jucaduca, haozi, desrosj, dd32, SergeyBiryukov. See #60638. git-svn-id: https://develop.svn.wordpress.org/trunk@59532 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/link-template.php | 18 ++++++---- tests/phpunit/tests/avatar.php | 9 +++-- .../tests/rest-api/rest-schema-setup.php | 6 ++-- tests/qunit/fixtures/wp-api-generated.js | 36 +++++++++---------- 4 files changed, 38 insertions(+), 31 deletions(-) diff --git a/src/wp-includes/link-template.php b/src/wp-includes/link-template.php index 61798c379841b..a375b0ee06a4b 100644 --- a/src/wp-includes/link-template.php +++ b/src/wp-includes/link-template.php @@ -4289,7 +4289,7 @@ function the_shortlink( $text = '', $title = '', $before = '', $after = '' ) { * * @since 4.2.0 * - * @param mixed $id_or_email The avatar to retrieve a URL for. Accepts a user ID, Gravatar MD5 hash, + * @param mixed $id_or_email The avatar to retrieve a URL for. Accepts a user ID, Gravatar SHA-256 or MD5 hash, * user email, WP_User object, WP_Post object, or WP_Comment object. * @param array $args { * Optional. Arguments to use instead of the default arguments. @@ -4353,8 +4353,9 @@ function is_avatar_comment_type( $comment_type ) { * * @since 4.2.0 * @since 6.7.0 Gravatar URLs always use HTTPS. + * @since 6.8.0 Gravatar URLs use the SHA-256 hashing algorithm. * - * @param mixed $id_or_email The avatar to retrieve. Accepts a user ID, Gravatar MD5 hash, + * @param mixed $id_or_email The avatar to retrieve. Accepts a user ID, Gravatar SHA-256 or MD5 hash, * user email, WP_User object, WP_Post object, or WP_Comment object. * @param array $args { * Optional. Arguments to use instead of the default arguments. @@ -4474,7 +4475,7 @@ function get_avatar_data( $id_or_email, $args = null ) { * @since 4.2.0 * * @param array $args Arguments passed to get_avatar_data(), after processing. - * @param mixed $id_or_email The avatar to retrieve. Accepts a user ID, Gravatar MD5 hash, + * @param mixed $id_or_email The avatar to retrieve. Accepts a user ID, Gravatar SHA-256 or MD5 hash, * user email, WP_User object, WP_Post object, or WP_Comment object. */ $args = apply_filters( 'pre_get_avatar_data', $args, $id_or_email ); @@ -4496,7 +4497,10 @@ function get_avatar_data( $id_or_email, $args = null ) { if ( is_numeric( $id_or_email ) ) { $user = get_user_by( 'id', absint( $id_or_email ) ); } elseif ( is_string( $id_or_email ) ) { - if ( str_contains( $id_or_email, '@md5.gravatar.com' ) ) { + if ( str_contains( $id_or_email, '@sha256.gravatar.com' ) ) { + // SHA-256 hash. + list( $email_hash ) = explode( '@', $id_or_email ); + } else if ( str_contains( $id_or_email, '@md5.gravatar.com' ) ) { // MD5 hash. list( $email_hash ) = explode( '@', $id_or_email ); } else { @@ -4530,7 +4534,7 @@ function get_avatar_data( $id_or_email, $args = null ) { } if ( $email ) { - $email_hash = md5( strtolower( trim( $email ) ) ); + $email_hash = hash( 'sha256', strtolower( trim( $email ) ) ); } } @@ -4564,7 +4568,7 @@ function get_avatar_data( $id_or_email, $args = null ) { * @since 4.2.0 * * @param string $url The URL of the avatar. - * @param mixed $id_or_email The avatar to retrieve. Accepts a user ID, Gravatar MD5 hash, + * @param mixed $id_or_email The avatar to retrieve. Accepts a user ID, Gravatar SHA-256 or MD5 hash, * user email, WP_User object, WP_Post object, or WP_Comment object. * @param array $args Arguments passed to get_avatar_data(), after processing. */ @@ -4576,7 +4580,7 @@ function get_avatar_data( $id_or_email, $args = null ) { * @since 4.2.0 * * @param array $args Arguments passed to get_avatar_data(), after processing. - * @param mixed $id_or_email The avatar to retrieve. Accepts a user ID, Gravatar MD5 hash, + * @param mixed $id_or_email The avatar to retrieve. Accepts a user ID, Gravatar SHA-256 or MD5 hash, * user email, WP_User object, WP_Post object, or WP_Comment object. */ return apply_filters( 'get_avatar_data', $args, $id_or_email ); diff --git a/tests/phpunit/tests/avatar.php b/tests/phpunit/tests/avatar.php index 97f24841e372b..baec404c81285 100644 --- a/tests/phpunit/tests/avatar.php +++ b/tests/phpunit/tests/avatar.php @@ -11,7 +11,7 @@ class Tests_Avatar extends WP_UnitTestCase { */ public function test_get_avatar_url_gravatar_url() { $url = get_avatar_url( 1 ); - $this->assertSame( preg_match( '|^https?://secure.gravatar.com/avatar/[0-9a-f]{32}\?|', $url ), 1 ); + $this->assertSame( preg_match( '|^https?://secure.gravatar.com/avatar/[0-9a-f]{64}\?|', $url ), 1 ); } /** @@ -90,9 +90,12 @@ public function test_get_avatar_url_user() { $url2 = get_avatar_url( WP_TESTS_EMAIL ); $this->assertSame( $url, $url2 ); - $url2 = get_avatar_url( md5( WP_TESTS_EMAIL ) . '@md5.gravatar.com' ); + $url2 = get_avatar_url( hash( 'sha256', WP_TESTS_EMAIL ) . '@sha256.gravatar.com' ); $this->assertSame( $url, $url2 ); + $url2 = get_avatar_url( md5( WP_TESTS_EMAIL ) . '@md5.gravatar.com' ); + $this->assertSame( preg_match( '|^https?://secure.gravatar.com/avatar/[0-9a-f]{32}\?|', $url2 ), 1 ); + $user = get_user_by( 'id', 1 ); $url2 = get_avatar_url( $user ); $this->assertSame( $url, $url2 ); @@ -267,7 +270,7 @@ public function test_get_avatar_data_should_return_gravatar_url_when_input_avata $actual_data = get_avatar_data( $comment ); $this->assertTrue( is_avatar_comment_type( $comment_type ) ); - $this->assertMatchesRegularExpression( '|^https?://secure.gravatar.com/avatar/[0-9a-f]{32}\?|', $actual_data['url'] ); + $this->assertMatchesRegularExpression( '|^https?://secure.gravatar.com/avatar/[0-9a-f]{64}\?|', $actual_data['url'] ); } /** diff --git a/tests/phpunit/tests/rest-api/rest-schema-setup.php b/tests/phpunit/tests/rest-api/rest-schema-setup.php index 4d5c269357a68..03dcb0631f133 100644 --- a/tests/phpunit/tests/rest-api/rest-schema-setup.php +++ b/tests/phpunit/tests/rest-api/rest-schema-setup.php @@ -729,9 +729,9 @@ public function test_build_wp_api_client_fixtures() { 'TagModel.meta.test_multi' => array(), 'TagModel.meta.test_tag_meta' => '', 'UsersCollection.0.link' => 'http://example.org/?author=1', - 'UsersCollection.0.avatar_urls.24' => 'https://secure.gravatar.com/avatar/96614ec98aa0c0d2ee75796dced6df54?s=24&d=mm&r=g', - 'UsersCollection.0.avatar_urls.48' => 'https://secure.gravatar.com/avatar/96614ec98aa0c0d2ee75796dced6df54?s=48&d=mm&r=g', - 'UsersCollection.0.avatar_urls.96' => 'https://secure.gravatar.com/avatar/96614ec98aa0c0d2ee75796dced6df54?s=96&d=mm&r=g', + 'UsersCollection.0.avatar_urls.24' => 'https://secure.gravatar.com/avatar/9387ed9432ec25ef93df84b8a0b9697ddef435a945e7f244670c4f79f88363e9?s=24&d=mm&r=g', + 'UsersCollection.0.avatar_urls.48' => 'https://secure.gravatar.com/avatar/9387ed9432ec25ef93df84b8a0b9697ddef435a945e7f244670c4f79f88363e9?s=48&d=mm&r=g', + 'UsersCollection.0.avatar_urls.96' => 'https://secure.gravatar.com/avatar/9387ed9432ec25ef93df84b8a0b9697ddef435a945e7f244670c4f79f88363e9?s=96&d=mm&r=g', 'UsersCollection.0._links.self.0.href' => 'http://example.org/index.php?rest_route=/wp/v2/users/1', 'UsersCollection.0._links.collection.0.href' => 'http://example.org/index.php?rest_route=/wp/v2/users', 'UsersCollection.1.id' => 2, diff --git a/tests/qunit/fixtures/wp-api-generated.js b/tests/qunit/fixtures/wp-api-generated.js index 4fc897a6242e7..448548aab0c07 100644 --- a/tests/qunit/fixtures/wp-api-generated.js +++ b/tests/qunit/fixtures/wp-api-generated.js @@ -13877,9 +13877,9 @@ mockedApiResponse.UsersCollection = [ "link": "http://example.org/?author=1", "slug": "admin", "avatar_urls": { - "24": "https://secure.gravatar.com/avatar/96614ec98aa0c0d2ee75796dced6df54?s=24&d=mm&r=g", - "48": "https://secure.gravatar.com/avatar/96614ec98aa0c0d2ee75796dced6df54?s=48&d=mm&r=g", - "96": "https://secure.gravatar.com/avatar/96614ec98aa0c0d2ee75796dced6df54?s=96&d=mm&r=g" + "24": "https://secure.gravatar.com/avatar/9387ed9432ec25ef93df84b8a0b9697ddef435a945e7f244670c4f79f88363e9?s=24&d=mm&r=g", + "48": "https://secure.gravatar.com/avatar/9387ed9432ec25ef93df84b8a0b9697ddef435a945e7f244670c4f79f88363e9?s=48&d=mm&r=g", + "96": "https://secure.gravatar.com/avatar/9387ed9432ec25ef93df84b8a0b9697ddef435a945e7f244670c4f79f88363e9?s=96&d=mm&r=g" }, "meta": { "meta_key": "meta_value" @@ -13914,9 +13914,9 @@ mockedApiResponse.UsersCollection = [ "link": "http://example.org/?author=2", "slug": "restapiclientfixtureuser", "avatar_urls": { - "24": "https://secure.gravatar.com/avatar/57cbd982c963c7eb2294e2eee1b4448e?s=24&d=mm&r=g", - "48": "https://secure.gravatar.com/avatar/57cbd982c963c7eb2294e2eee1b4448e?s=48&d=mm&r=g", - "96": "https://secure.gravatar.com/avatar/57cbd982c963c7eb2294e2eee1b4448e?s=96&d=mm&r=g" + "24": "https://secure.gravatar.com/avatar/ea862d9636c72500beece7b1990870e2776f89c2096d0c064c14f2beb910077d?s=24&d=mm&r=g", + "48": "https://secure.gravatar.com/avatar/ea862d9636c72500beece7b1990870e2776f89c2096d0c064c14f2beb910077d?s=48&d=mm&r=g", + "96": "https://secure.gravatar.com/avatar/ea862d9636c72500beece7b1990870e2776f89c2096d0c064c14f2beb910077d?s=96&d=mm&r=g" }, "meta": { "meta_key": "" @@ -13953,9 +13953,9 @@ mockedApiResponse.UserModel = { "link": "http://example.org/?author=2", "slug": "restapiclientfixtureuser", "avatar_urls": { - "24": "https://secure.gravatar.com/avatar/57cbd982c963c7eb2294e2eee1b4448e?s=24&d=mm&r=g", - "48": "https://secure.gravatar.com/avatar/57cbd982c963c7eb2294e2eee1b4448e?s=48&d=mm&r=g", - "96": "https://secure.gravatar.com/avatar/57cbd982c963c7eb2294e2eee1b4448e?s=96&d=mm&r=g" + "24": "https://secure.gravatar.com/avatar/ea862d9636c72500beece7b1990870e2776f89c2096d0c064c14f2beb910077d?s=24&d=mm&r=g", + "48": "https://secure.gravatar.com/avatar/ea862d9636c72500beece7b1990870e2776f89c2096d0c064c14f2beb910077d?s=48&d=mm&r=g", + "96": "https://secure.gravatar.com/avatar/ea862d9636c72500beece7b1990870e2776f89c2096d0c064c14f2beb910077d?s=96&d=mm&r=g" }, "meta": { "meta_key": "" @@ -13970,9 +13970,9 @@ mockedApiResponse.me = { "link": "http://example.org/?author=2", "slug": "restapiclientfixtureuser", "avatar_urls": { - "24": "https://secure.gravatar.com/avatar/57cbd982c963c7eb2294e2eee1b4448e?s=24&d=mm&r=g", - "48": "https://secure.gravatar.com/avatar/57cbd982c963c7eb2294e2eee1b4448e?s=48&d=mm&r=g", - "96": "https://secure.gravatar.com/avatar/57cbd982c963c7eb2294e2eee1b4448e?s=96&d=mm&r=g" + "24": "https://secure.gravatar.com/avatar/ea862d9636c72500beece7b1990870e2776f89c2096d0c064c14f2beb910077d?s=24&d=mm&r=g", + "48": "https://secure.gravatar.com/avatar/ea862d9636c72500beece7b1990870e2776f89c2096d0c064c14f2beb910077d?s=48&d=mm&r=g", + "96": "https://secure.gravatar.com/avatar/ea862d9636c72500beece7b1990870e2776f89c2096d0c064c14f2beb910077d?s=96&d=mm&r=g" }, "meta": { "meta_key": "" @@ -13996,9 +13996,9 @@ mockedApiResponse.CommentsCollection = [ "status": "approved", "type": "comment", "author_avatar_urls": { - "24": "https://secure.gravatar.com/avatar/bd7c2b505bcf39cc71cfee564c614956?s=24&d=mm&r=g", - "48": "https://secure.gravatar.com/avatar/bd7c2b505bcf39cc71cfee564c614956?s=48&d=mm&r=g", - "96": "https://secure.gravatar.com/avatar/bd7c2b505bcf39cc71cfee564c614956?s=96&d=mm&r=g" + "24": "https://secure.gravatar.com/avatar/9ca51ced0b389ffbeba3d269c6d824be664c84fa1b35503282abdd302e1f417c?s=24&d=mm&r=g", + "48": "https://secure.gravatar.com/avatar/9ca51ced0b389ffbeba3d269c6d824be664c84fa1b35503282abdd302e1f417c?s=48&d=mm&r=g", + "96": "https://secure.gravatar.com/avatar/9ca51ced0b389ffbeba3d269c6d824be664c84fa1b35503282abdd302e1f417c?s=96&d=mm&r=g" }, "meta": { "meta_key": "meta_value" @@ -14050,9 +14050,9 @@ mockedApiResponse.CommentModel = { "status": "approved", "type": "comment", "author_avatar_urls": { - "24": "https://secure.gravatar.com/avatar/bd7c2b505bcf39cc71cfee564c614956?s=24&d=mm&r=g", - "48": "https://secure.gravatar.com/avatar/bd7c2b505bcf39cc71cfee564c614956?s=48&d=mm&r=g", - "96": "https://secure.gravatar.com/avatar/bd7c2b505bcf39cc71cfee564c614956?s=96&d=mm&r=g" + "24": "https://secure.gravatar.com/avatar/9ca51ced0b389ffbeba3d269c6d824be664c84fa1b35503282abdd302e1f417c?s=24&d=mm&r=g", + "48": "https://secure.gravatar.com/avatar/9ca51ced0b389ffbeba3d269c6d824be664c84fa1b35503282abdd302e1f417c?s=48&d=mm&r=g", + "96": "https://secure.gravatar.com/avatar/9ca51ced0b389ffbeba3d269c6d824be664c84fa1b35503282abdd302e1f417c?s=96&d=mm&r=g" }, "meta": { "meta_key": "meta_value" From 2238011c33b55e68c1d8f91d850528c153582b67 Mon Sep 17 00:00:00 2001 From: Sergey Biryukov Date: Wed, 18 Dec 2024 00:23:35 +0000 Subject: [PATCH 036/117] Coding Standards: Fix WPCS issues in `get_avatar_data()`. Follow-up to [59532]. See #60638. git-svn-id: https://develop.svn.wordpress.org/trunk@59533 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/link-template.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/wp-includes/link-template.php b/src/wp-includes/link-template.php index a375b0ee06a4b..da57ebd64df80 100644 --- a/src/wp-includes/link-template.php +++ b/src/wp-includes/link-template.php @@ -4353,7 +4353,7 @@ function is_avatar_comment_type( $comment_type ) { * * @since 4.2.0 * @since 6.7.0 Gravatar URLs always use HTTPS. - * @since 6.8.0 Gravatar URLs use the SHA-256 hashing algorithm. + * @since 6.8.0 Gravatar URLs use the SHA-256 hashing algorithm. * * @param mixed $id_or_email The avatar to retrieve. Accepts a user ID, Gravatar SHA-256 or MD5 hash, * user email, WP_User object, WP_Post object, or WP_Comment object. @@ -4500,7 +4500,7 @@ function get_avatar_data( $id_or_email, $args = null ) { if ( str_contains( $id_or_email, '@sha256.gravatar.com' ) ) { // SHA-256 hash. list( $email_hash ) = explode( '@', $id_or_email ); - } else if ( str_contains( $id_or_email, '@md5.gravatar.com' ) ) { + } elseif ( str_contains( $id_or_email, '@md5.gravatar.com' ) ) { // MD5 hash. list( $email_hash ) = explode( '@', $id_or_email ); } else { From 7af04695d86ebeeb0d3f314c53f1f425a14323a7 Mon Sep 17 00:00:00 2001 From: John Blackbourn Date: Wed, 18 Dec 2024 11:29:53 +0000 Subject: [PATCH 037/117] Build/Test Tools: Remove an unnecessary call to svn in a debugging step. None of the steps in any of the workflows use svn, so this debugging step is unnecessary, and svn has been removed in the ubuntu-24.04 runner which will be rolling out to GitHub Actions imminently. See #62221 git-svn-id: https://develop.svn.wordpress.org/trunk@59534 602fd350-edb4-49c9-b593-d223f7449a82 --- .github/workflows/reusable-phpunit-tests-v1.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/reusable-phpunit-tests-v1.yml b/.github/workflows/reusable-phpunit-tests-v1.yml index ad45726102dbe..e02a890a6debf 100644 --- a/.github/workflows/reusable-phpunit-tests-v1.yml +++ b/.github/workflows/reusable-phpunit-tests-v1.yml @@ -143,7 +143,6 @@ jobs: node --version curl --version git --version - svn --version - name: Log running Docker containers run: docker ps -a From a2107c2f3958f307ea748d2431775766dde77dfa Mon Sep 17 00:00:00 2001 From: Jonathan Desrosiers Date: Wed, 18 Dec 2024 18:49:53 +0000 Subject: [PATCH 038/117] External Libraries: Append a string to `react`/`react-dom` versions. In 6.7, [58775] changed the way `react` and `react-dom` are bundled in Core. This commit resulted in some changes to the built files that are distributed in WordPress even though the actual version of the libraries remained the same. The result can be a blank white screen when trying to edit a post when those two script files are heavily cached. This adds `-umd` to the end of the version number to properly purge caches until the next update to these libraries occurs. Props levskipg, get_dave, smerriman, jdnd, juanwp22, seanlanglands, robertstaddon. Fixes 62422. git-svn-id: https://develop.svn.wordpress.org/trunk@59536 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/script-loader.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/wp-includes/script-loader.php b/src/wp-includes/script-loader.php index d2c8dbe97e393..14027aa52a88f 100644 --- a/src/wp-includes/script-loader.php +++ b/src/wp-includes/script-loader.php @@ -106,8 +106,8 @@ function wp_default_packages_vendor( $scripts ) { ); $vendor_scripts_versions = array( - 'react' => '18.3.1', - 'react-dom' => '18.3.1', + 'react' => '18.3.1-umd', + 'react-dom' => '18.3.1-umd', 'react-jsx-runtime' => '18.3.1', 'regenerator-runtime' => '0.14.1', 'moment' => '2.30.1', From 9e4b268049b69e96e78bcc1ab77d9d6a4134f8cf Mon Sep 17 00:00:00 2001 From: Peter Wilson Date: Thu, 19 Dec 2024 03:07:09 +0000 Subject: [PATCH 039/117] External Libraries: Append `.1` to `react`/`react-dom` versions. Replaces the `-umd` appendage for the `react` and `react-dom` script versions with `.1`. This it to prevent issues with third party code expecting the version number in the form `/^[\d\.]+$/`. Updates the version to tests in `Tests_Dependencies_Scripts::test_vendor_script_versions_registered_manually` to include the modified version used for cache busting. Follow up to [59536], [58775]. Props azaozz, desrosj, peterwilsoncc. Fixes #62422. git-svn-id: https://develop.svn.wordpress.org/trunk@59540 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/script-loader.php | 4 ++-- tests/phpunit/tests/dependencies/scripts.php | 15 +++++++++++++++ 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/src/wp-includes/script-loader.php b/src/wp-includes/script-loader.php index 14027aa52a88f..f4e37d7164139 100644 --- a/src/wp-includes/script-loader.php +++ b/src/wp-includes/script-loader.php @@ -106,8 +106,8 @@ function wp_default_packages_vendor( $scripts ) { ); $vendor_scripts_versions = array( - 'react' => '18.3.1-umd', - 'react-dom' => '18.3.1-umd', + 'react' => '18.3.1.1', // Final .1 due to switch to UMD build, can be removed in the next update. + 'react-dom' => '18.3.1.1', // Final .1 due to switch to UMD build, can be removed in the next update. 'react-jsx-runtime' => '18.3.1', 'regenerator-runtime' => '0.14.1', 'moment' => '2.30.1', diff --git a/tests/phpunit/tests/dependencies/scripts.php b/tests/phpunit/tests/dependencies/scripts.php index 03dba5df69744..89bfb4ef922e6 100644 --- a/tests/phpunit/tests/dependencies/scripts.php +++ b/tests/phpunit/tests/dependencies/scripts.php @@ -3413,6 +3413,21 @@ public function test_vendor_script_versions_registered_manually( $script, $handl $handle = $script; } + /* + * Append '.1' to the version number for React and ReactDOM. + * + * This is due to a change in the build to use the UMD version of the + * scripts, requiring a different version number in order to break the + * caches of some CDNs. + * + * This can be removed in the next update to the packages. + * + * See https://core.trac.wordpress.org/ticket/62422 + */ + if ( in_array( $handle, array( 'react', 'react-dom' ), true ) ) { + $package_json[ $script ] .= '.1'; + } + $script_query = $wp_scripts->query( $handle, 'registered' ); $this->assertNotFalse( $script_query, "The script '{$handle}' should be registered." ); From 17b50d3d9c0c3f1383bae3c9241bd618c9160b09 Mon Sep 17 00:00:00 2001 From: Sergey Biryukov Date: Thu, 19 Dec 2024 03:42:32 +0000 Subject: [PATCH 040/117] Privacy: Replace hardcoded MD5 references in `wp_credits_section_list()`. The Credits API has been updated to return SHA-256 email hashes. Follow-up to [59532], [meta14307]. Props haozi. Fixes #62706, #60638. git-svn-id: https://develop.svn.wordpress.org/trunk@59541 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-admin/includes/credits.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/wp-admin/includes/credits.php b/src/wp-admin/includes/credits.php index 1ad2a37c2bb7e..79b2a0b46c854 100644 --- a/src/wp-admin/includes/credits.php +++ b/src/wp-admin/includes/credits.php @@ -147,8 +147,8 @@ function wp_credits_section_list( $credits = array(), $slug = '' ) { echo '
  • ' . "\n\t"; echo ''; $size = $compact ? 80 : 160; - $data = get_avatar_data( $person_data[1] . '@md5.gravatar.com', array( 'size' => $size ) ); - $data2x = get_avatar_data( $person_data[1] . '@md5.gravatar.com', array( 'size' => $size * 2 ) ); + $data = get_avatar_data( $person_data[1] . '@sha256.gravatar.com', array( 'size' => $size ) ); + $data2x = get_avatar_data( $person_data[1] . '@sha256.gravatar.com', array( 'size' => $size * 2 ) ); echo '' . "\n"; echo esc_html( $person_data[0] ) . "\n\t"; if ( ! $compact && ! empty( $person_data[3] ) ) { From 816ec5df8a5970254d4b6d6ab73ba01b06d3c6f4 Mon Sep 17 00:00:00 2001 From: Sergey Biryukov Date: Thu, 19 Dec 2024 10:22:34 +0000 Subject: [PATCH 041/117] Docs: Add missing single quote in `WP_User_Query::prepare_query()` DocBlock. Follow-up to [38715], [52226]. Props kkmuffme, mukesh27. Fixes #62714. git-svn-id: https://develop.svn.wordpress.org/trunk@59542 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/class-wp-user-query.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wp-includes/class-wp-user-query.php b/src/wp-includes/class-wp-user-query.php index f9bb823c55900..fd35182eab9f5 100644 --- a/src/wp-includes/class-wp-user-query.php +++ b/src/wp-includes/class-wp-user-query.php @@ -202,7 +202,7 @@ public static function fill_query_vars( $args ) { * - 'login__in' * - 'user_nicename' (or 'nicename') * - 'nicename__in' - * - 'user_email (or 'email') + * - 'user_email' (or 'email') * - 'user_url' (or 'url') * - 'user_registered' (or 'registered') * - 'post_count' From ef7606073b8a016c5e32e230e50685ec62b3e7d2 Mon Sep 17 00:00:00 2001 From: bernhard-reiter Date: Thu, 19 Dec 2024 13:24:22 +0000 Subject: [PATCH 042/117] Block Hooks: Apply to synced patterns. Apply Block Hooks to synced patterns (i.e. `core/block` instances). Props bernhard-reiter, gziolo. Fixes #62704. git-svn-id: https://develop.svn.wordpress.org/trunk@59543 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/blocks.php | 11 ++++++++++- src/wp-includes/default-filters.php | 4 +++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/src/wp-includes/blocks.php b/src/wp-includes/blocks.php index 6a4ab4636c803..25a4a7e3b29a1 100644 --- a/src/wp-includes/blocks.php +++ b/src/wp-includes/blocks.php @@ -1219,6 +1219,8 @@ function update_ignored_hooked_blocks_postmeta( $post ) { if ( 'wp_navigation' === $post->post_type ) { $wrapper_block_type = 'core/navigation'; + } elseif ( 'wp_block' === $post->post_type ) { + $wrapper_block_type = 'core/block'; } else { $wrapper_block_type = 'core/post-content'; } @@ -1291,7 +1293,7 @@ function insert_hooked_blocks_and_set_ignored_hooked_blocks_metadata( &$parsed_a * @return WP_REST_Response The response object. */ function insert_hooked_blocks_into_rest_response( $response, $post ) { - if ( empty( $response->data['content']['raw'] ) || empty( $response->data['content']['rendered'] ) ) { + if ( empty( $response->data['content']['raw'] ) ) { return $response; } @@ -1306,6 +1308,8 @@ function insert_hooked_blocks_into_rest_response( $response, $post ) { if ( 'wp_navigation' === $post->post_type ) { $wrapper_block_type = 'core/navigation'; + } elseif ( 'wp_block' === $post->post_type ) { + $wrapper_block_type = 'core/block'; } else { $wrapper_block_type = 'core/post-content'; } @@ -1327,6 +1331,11 @@ function insert_hooked_blocks_into_rest_response( $response, $post ) { $response->data['content']['raw'] = $content; + // If the rendered content was previously empty, we leave it like that. + if ( empty( $response->data['content']['rendered'] ) ) { + return $response; + } + // `apply_block_hooks_to_content` is called above. Ensure it is not called again as a filter. $priority = has_filter( 'the_content', 'apply_block_hooks_to_content' ); if ( false !== $priority ) { diff --git a/src/wp-includes/default-filters.php b/src/wp-includes/default-filters.php index 18ef8517edce2..9eff6ecbeb67a 100644 --- a/src/wp-includes/default-filters.php +++ b/src/wp-includes/default-filters.php @@ -760,14 +760,16 @@ add_filter( 'rest_pre_insert_wp_template', 'inject_ignored_hooked_blocks_metadata_attributes' ); add_filter( 'rest_pre_insert_wp_template_part', 'inject_ignored_hooked_blocks_metadata_attributes' ); -// Update ignoredHookedBlocks postmeta for wp_navigation post type. +// Update ignoredHookedBlocks postmeta for some post types. add_filter( 'rest_pre_insert_page', 'update_ignored_hooked_blocks_postmeta' ); add_filter( 'rest_pre_insert_post', 'update_ignored_hooked_blocks_postmeta' ); +add_filter( 'rest_pre_insert_wp_block', 'update_ignored_hooked_blocks_postmeta' ); add_filter( 'rest_pre_insert_wp_navigation', 'update_ignored_hooked_blocks_postmeta' ); // Inject hooked blocks into the Posts endpoint REST response for some given post types. add_filter( 'rest_prepare_page', 'insert_hooked_blocks_into_rest_response', 10, 2 ); add_filter( 'rest_prepare_post', 'insert_hooked_blocks_into_rest_response', 10, 2 ); +add_filter( 'rest_prepare_wp_block', 'insert_hooked_blocks_into_rest_response', 10, 2 ); add_filter( 'rest_prepare_wp_navigation', 'insert_hooked_blocks_into_rest_response', 10, 2 ); unset( $filter, $action ); From 7381a8273a3c5c3e63a194dace734612a610a135 Mon Sep 17 00:00:00 2001 From: Peter Wilson Date: Thu, 19 Dec 2024 21:41:19 +0000 Subject: [PATCH 043/117] REST API: Protect against fatal error for post types without format support. Ignore the `format` parameter introduced in WordPress 6.7 for post types that do not support post formats. This protects against a fatal error being thrown in later version of PHP or a warning in earlier versions of PHP. Follow up to r59115. Props dd32, sergeybiryukov, yogeshbhutkar. Fixes #62646. See #62014. git-svn-id: https://develop.svn.wordpress.org/trunk@59544 602fd350-edb4-49c9-b593-d223f7449a82 --- .../class-wp-rest-posts-controller.php | 2 +- .../tests/rest-api/rest-posts-controller.php | 39 +++++++++++++++++++ 2 files changed, 40 insertions(+), 1 deletion(-) diff --git a/src/wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php b/src/wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php index 8852519ec45c9..95851199c6e4d 100644 --- a/src/wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php +++ b/src/wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php @@ -346,7 +346,7 @@ public function get_items( $request ) { $args = $this->prepare_tax_query( $args, $request ); - if ( ! empty( $request['format'] ) ) { + if ( isset( $registered['format'], $request['format'] ) ) { $formats = $request['format']; /* * The relation needs to be set to `OR` since the request can contain diff --git a/tests/phpunit/tests/rest-api/rest-posts-controller.php b/tests/phpunit/tests/rest-api/rest-posts-controller.php index 4574bde83621e..e2fd7139f3f54 100644 --- a/tests/phpunit/tests/rest-api/rest-posts-controller.php +++ b/tests/phpunit/tests/rest-api/rest-posts-controller.php @@ -5507,6 +5507,45 @@ public function test_draft_post_does_not_have_the_same_slug_as_existing_post() { ); } + /** + * Test the REST API ignores the post format parameter for post types that do not support them. + * + * @ticket 62646 + * @ticket 62014 + * + * @covers WP_REST_Posts_Controller::get_items + */ + public function test_standard_post_format_ignored_for_post_types_that_do_not_support_them() { + $initial_theme_support = get_theme_support( 'post-formats' ); + add_theme_support( 'post-formats', array( 'aside', 'gallery', 'link', 'image', 'quote', 'status', 'video', 'audio', 'chat' ) ); + + self::factory()->post->create( + array( + 'post_type' => 'page', + 'post_status' => 'publish', + ) + ); + + $request = new WP_REST_Request( 'GET', '/wp/v2/pages' ); + $request->set_param( 'format', 'invalid_type' ); + + $response = rest_get_server()->dispatch( $request ); + + /* + * Restore the initial post formats support. + * + * This needs to be done prior to the assertions to avoid unexpected + * results for other tests should an assertion fail. + */ + if ( $initial_theme_support ) { + add_theme_support( 'post-formats', $initial_theme_support[0] ); + } else { + remove_theme_support( 'post-formats' ); + } + + $this->assertCount( 1, $response->get_data(), 'The response should ignore the post format parameter' ); + } + /** * Test the REST API support for the standard post format. * From b8ecfbf9542198b1d88230221faeca6b71fa0ac7 Mon Sep 17 00:00:00 2001 From: Peter Wilson Date: Thu, 19 Dec 2024 21:54:57 +0000 Subject: [PATCH 044/117] Help/About: Add additional release squad titles to credits page. Introduces translatable strings for additional [https://make.wordpress.org/core/handbook/about/release-cycle/wordpress-release-team-and-focus-leads/ release squad titles]. This is to allow improved acknowledgement of an individual's role in a release squad by enabling the use of these roles in the credits API going forward. Props audrasjb, desrosj, jorbin, timse201, yogeshbhutkar. Fixes #62386. git-svn-id: https://develop.svn.wordpress.org/trunk@59545 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-admin/credits.php | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/src/wp-admin/credits.php b/src/wp-admin/credits.php index d3d0bbf7d6ece..acc8a21c28ab8 100644 --- a/src/wp-admin/credits.php +++ b/src/wp-admin/credits.php @@ -135,3 +135,17 @@ __( 'Release Deputy' ); __( 'Core Developer' ); __( 'External Libraries' ); +__( 'Release Coordination' ); +__( 'Core Tech Lead' ); +__( 'Core Triage Lead' ); +__( 'Editor Tech Lead' ); +__( 'Editor Triage Lead' ); +__( 'Documentation Lead' ); +__( 'Test Lead' ); +__( 'Design Lead' ); +__( 'Performance Lead' ); +__( 'Default Theme Design Lead' ); +__( 'Default Theme Development Lead' ); +__( 'Tech Lead' ); +__( 'Triage Lead' ); +__( 'Minor Release Lead' ); From a64ad57db6837a6b1c681676c0c31d43dced7508 Mon Sep 17 00:00:00 2001 From: Sergey Biryukov Date: Fri, 20 Dec 2024 23:33:05 +0000 Subject: [PATCH 045/117] Docs: Update parameter type hints to include `null` for post thumbnail functions. Follow-up to [12320], [12351], [20646], [32618], [34167], [34373], [37915]. Props apermo, jasonsa19. Fixes #62720. git-svn-id: https://develop.svn.wordpress.org/trunk@59548 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/post-thumbnail-template.php | 24 ++++++++++----------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/src/wp-includes/post-thumbnail-template.php b/src/wp-includes/post-thumbnail-template.php index 7d722ae9de407..59723c7fadb07 100644 --- a/src/wp-includes/post-thumbnail-template.php +++ b/src/wp-includes/post-thumbnail-template.php @@ -19,7 +19,7 @@ * @since 2.9.0 * @since 4.4.0 `$post` can be a post ID or WP_Post object. * - * @param int|WP_Post $post Optional. Post ID or WP_Post object. Default is global `$post`. + * @param int|WP_Post|null $post Optional. Post ID or WP_Post object. Default is global `$post`. * @return bool Whether the post has an image attached. */ function has_post_thumbnail( $post = null ) { @@ -46,7 +46,7 @@ function has_post_thumbnail( $post = null ) { * @since 5.5.0 The return value for a non-existing post * was changed to false instead of an empty string. * - * @param int|WP_Post $post Optional. Post ID or WP_Post object. Default is global `$post`. + * @param int|WP_Post|null $post Optional. Post ID or WP_Post object. Default is global `$post`. * @return int|false Post thumbnail ID (which can be 0 if the thumbnail is not set), * or false if the post does not exist. */ @@ -99,7 +99,7 @@ function the_post_thumbnail( $size = 'post-thumbnail', $attr = '' ) { * * @global WP_Query $wp_query WordPress Query object. * - * @param WP_Query $wp_query Optional. A WP_Query instance. Defaults to the $wp_query global. + * @param WP_Query|null $wp_query Optional. A WP_Query instance. Defaults to the $wp_query global. */ function update_post_thumbnail_cache( $wp_query = null ) { if ( ! $wp_query ) { @@ -156,10 +156,10 @@ function update_post_thumbnail_cache( $wp_query = null ) { * @since 2.9.0 * @since 4.4.0 `$post` can be a post ID or WP_Post object. * - * @param int|WP_Post $post Optional. Post ID or WP_Post object. Default is global `$post`. - * @param string|int[] $size Optional. Image size. Accepts any registered image size name, or an array of - * width and height values in pixels (in that order). Default 'post-thumbnail'. - * @param string|array $attr Optional. Query string or array of attributes. Default empty. + * @param int|WP_Post|null $post Optional. Post ID or WP_Post object. Default is global `$post`. + * @param string|int[] $size Optional. Image size. Accepts any registered image size name, or an array of + * width and height values in pixels (in that order). Default 'post-thumbnail'. + * @param string|array $attr Optional. Query string or array of attributes. Default empty. * @return string The post thumbnail image tag. */ function get_the_post_thumbnail( $post = null, $size = 'post-thumbnail', $attr = '' ) { @@ -241,9 +241,9 @@ function get_the_post_thumbnail( $post = null, $size = 'post-thumbnail', $attr = * * @since 4.4.0 * - * @param int|WP_Post $post Optional. Post ID or WP_Post object. Default is global `$post`. - * @param string|int[] $size Optional. Registered image size to retrieve the source for or a flat array - * of height and width dimensions. Default 'post-thumbnail'. + * @param int|WP_Post|null $post Optional. Post ID or WP_Post object. Default is global `$post`. + * @param string|int[] $size Optional. Registered image size to retrieve the source for or a flat array + * of height and width dimensions. Default 'post-thumbnail'. * @return string|false Post thumbnail URL or false if no image is available. If `$size` does not match * any registered image size, the original image URL will be returned. */ @@ -291,7 +291,7 @@ function the_post_thumbnail_url( $size = 'post-thumbnail' ) { * * @since 4.6.0 * - * @param int|WP_Post $post Optional. Post ID or WP_Post object. Default is global `$post`. + * @param int|WP_Post|null $post Optional. Post ID or WP_Post object. Default is global `$post`. * @return string Post thumbnail caption. */ function get_the_post_thumbnail_caption( $post = null ) { @@ -315,7 +315,7 @@ function get_the_post_thumbnail_caption( $post = null ) { * * @since 4.6.0 * - * @param int|WP_Post $post Optional. Post ID or WP_Post object. Default is global `$post`. + * @param int|WP_Post|null $post Optional. Post ID or WP_Post object. Default is global `$post`. */ function the_post_thumbnail_caption( $post = null ) { /** From afc8acfbf6ba5b03f28bed2716bfc48f54dd159e Mon Sep 17 00:00:00 2001 From: Jb Audras Date: Sat, 21 Dec 2024 17:21:30 +0000 Subject: [PATCH 046/117] Docs: Docblock improvements in . Props shailu25. Fixes #62730. See #62281. git-svn-id: https://develop.svn.wordpress.org/trunk@59549 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/block-supports/block-style-variations.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/wp-includes/block-supports/block-style-variations.php b/src/wp-includes/block-supports/block-style-variations.php index 4397a34af9701..62fb04e1a0c86 100644 --- a/src/wp-includes/block-supports/block-style-variations.php +++ b/src/wp-includes/block-supports/block-style-variations.php @@ -62,7 +62,7 @@ function wp_resolve_block_style_variation_ref_values( &$variation_data, $theme_j } } /** - * Render the block style variation's styles. + * Renders the block style variation's styles. * * In the case of nested blocks with variations applied, we want the parent * variation's styles to be rendered before their descendants. This solves the @@ -194,15 +194,15 @@ function wp_render_block_style_variation_support_styles( $parsed_block ) { } /** - * Ensure the variation block support class name generated and added to + * Ensures the variation block support class name generated and added to * block attributes in the `render_block_data` filter gets applied to the * block's markup. * - * @see wp_render_block_style_variation_support_styles - * * @since 6.6.0 * @access private * + * @see wp_render_block_style_variation_support_styles + * * @param string $block_content Rendered block content. * @param array $block Block object. * From 17d5e47aee6c849f4cde733eba4d9403af1406e4 Mon Sep 17 00:00:00 2001 From: Jb Audras Date: Sat, 21 Dec 2024 21:52:56 +0000 Subject: [PATCH 047/117] Media: Fix margin issues on the Media file upload screen. This changeset fixes an issue in the Media Library where icons or thumbnails of uploaded files were stuck to the border of their container after file upload. Follow-up to [58279]. Props sukhendu2002, im3dabasia1, sainathpoojary, joedolson. Fixes #62573. See #60141. git-svn-id: https://develop.svn.wordpress.org/trunk@59550 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-admin/css/media.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wp-admin/css/media.css b/src/wp-admin/css/media.css index 41beffc2e8669..0db92775a9f2b 100644 --- a/src/wp-admin/css/media.css +++ b/src/wp-admin/css/media.css @@ -174,7 +174,7 @@ .media-item .pinkynail { float: left; - margin: 0 10px 0 0; + margin: 14px; max-height: 70px; max-width: 70px; } From 08c3dd4aff7298ffc882072f9c3d9f2c46a9a927 Mon Sep 17 00:00:00 2001 From: Jb Audras Date: Sat, 21 Dec 2024 22:37:35 +0000 Subject: [PATCH 048/117] Login and Registration: Adjust login form margins for better consistency. This changeset addresses adjusts margins around the login form for visual consistency. The margin above and below the form is now consistently set to 24px, and the margin below the logo has also been adjusted to 24px. Follow-up to [26072]. Props deeppatel8950, audrasjb, priyank9033, viralsampat, vijaysinh9094, sabernhardt, . Fixes #61667. git-svn-id: https://develop.svn.wordpress.org/trunk@59551 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-admin/css/login.css | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/wp-admin/css/login.css b/src/wp-admin/css/login.css index c2211d9da681e..269f1115e2417 100644 --- a/src/wp-admin/css/login.css +++ b/src/wp-admin/css/login.css @@ -139,8 +139,7 @@ p { } .login form { - margin-top: 20px; - margin-left: 0; + margin: 24px 0; padding: 26px 24px; font-weight: 400; overflow: hidden; @@ -284,7 +283,7 @@ p { font-size: 20px; font-weight: 400; line-height: 1.3; - margin: 0 auto 25px; + margin: 0 auto 24px; padding: 0; text-decoration: none; width: 84px; From 322b9843959c2cc7261001a336961cf1bc73f06e Mon Sep 17 00:00:00 2001 From: Sergey Biryukov Date: Sat, 21 Dec 2024 23:14:46 +0000 Subject: [PATCH 049/117] Help/About: Reorder release squad titles for some consistency in translation tools. Follow-up to [59545]. See #62386. git-svn-id: https://develop.svn.wordpress.org/trunk@59552 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-admin/credits.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/wp-admin/credits.php b/src/wp-admin/credits.php index acc8a21c28ab8..46b035419cc87 100644 --- a/src/wp-admin/credits.php +++ b/src/wp-admin/credits.php @@ -133,9 +133,9 @@ __( 'Release Lead' ); __( 'Release Design Lead' ); __( 'Release Deputy' ); -__( 'Core Developer' ); -__( 'External Libraries' ); __( 'Release Coordination' ); +__( 'Minor Release Lead' ); +__( 'Core Developer' ); __( 'Core Tech Lead' ); __( 'Core Triage Lead' ); __( 'Editor Tech Lead' ); @@ -148,4 +148,4 @@ __( 'Default Theme Development Lead' ); __( 'Tech Lead' ); __( 'Triage Lead' ); -__( 'Minor Release Lead' ); +__( 'External Libraries' ); From 71eaaad6895608e85443a46106a4f3171c6557f4 Mon Sep 17 00:00:00 2001 From: Jb Audras Date: Sun, 22 Dec 2024 08:34:08 +0000 Subject: [PATCH 050/117] Themes: Fix unwanted horizontal scrolling in theme details screen on mobile. This changeset fixes an issue where the theme browser created unwanted horizontal scrolling on some mobile devices. The issue occured when viewing theme details on mobile. Follow-up to [26142]. Props wildworks, abcd95, sainathpoojary, dhruvang21, sabernhardt. Fixes #62411. git-svn-id: https://develop.svn.wordpress.org/trunk@59553 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-admin/css/themes.css | 1 + 1 file changed, 1 insertion(+) diff --git a/src/wp-admin/css/themes.css b/src/wp-admin/css/themes.css index e7c58b257fc76..2d81613dbce47 100644 --- a/src/wp-admin/css/themes.css +++ b/src/wp-admin/css/themes.css @@ -935,6 +935,7 @@ body.folded .theme-browser ~ .theme-overlay .theme-wrap { .theme-overlay .theme-screenshots { width: 100%; float: none; + margin: 0; } .theme-overlay .theme-info { From de76b6ee76b7052b2da246476cadc05c21686dd8 Mon Sep 17 00:00:00 2001 From: Jb Audras Date: Sun, 22 Dec 2024 19:13:23 +0000 Subject: [PATCH 051/117] I18n: Add translator context for various occurrences of "upload". This changeset adds a `noun` or `verb` context to the various occurrences of "upload" in the admin, to make it easier for translators to differenciate these strings depending on the context. Props timse201, wpgerd. Fixes #62732. git-svn-id: https://develop.svn.wordpress.org/trunk@59554 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-admin/includes/class-custom-background.php | 2 +- src/wp-admin/includes/class-custom-image-header.php | 2 +- src/wp-admin/includes/class-wp-theme-install-list-table.php | 2 +- src/wp-admin/includes/media.php | 4 ++-- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/wp-admin/includes/class-custom-background.php b/src/wp-admin/includes/class-custom-background.php index 3dab05c99a49c..d8500d8570405 100644 --- a/src/wp-admin/includes/class-custom-background.php +++ b/src/wp-admin/includes/class-custom-background.php @@ -354,7 +354,7 @@ public function admin_page() { - +


    diff --git a/src/wp-admin/includes/class-custom-image-header.php b/src/wp-admin/includes/class-custom-image-header.php index 480a0643244d4..2e1bf47fdaf5e 100644 --- a/src/wp-admin/includes/class-custom-image-header.php +++ b/src/wp-admin/includes/class-custom-image-header.php @@ -664,7 +664,7 @@ public function step_1() { - +

    - +

    From d030306983076b1834fb9d6d25776d0b49112430 Mon Sep 17 00:00:00 2001 From: Joe Dolson Date: Sun, 22 Dec 2024 20:44:06 +0000 Subject: [PATCH 052/117] Customizer: Allow custom accordion items with obsolete structure. In [59224], customizer accordion item HTML structure was changed to include a `button` element as the interactive control. However, some themes inject custom markup for panel headings. Fix `controls.js` to handle both the new markup and the old markup, which is relatively common in themes. Props paullb, desrosj, sabernhardt, joedolson, jorbin. Fixes #62494. git-svn-id: https://develop.svn.wordpress.org/trunk@59555 602fd350-edb4-49c9-b593-d223f7449a82 --- src/js/_enqueues/wp/customize/controls.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/js/_enqueues/wp/customize/controls.js b/src/js/_enqueues/wp/customize/controls.js index 1d402bc1c3273..7a6e69cf3eb9c 100644 --- a/src/js/_enqueues/wp/customize/controls.js +++ b/src/js/_enqueues/wp/customize/controls.js @@ -1530,7 +1530,7 @@ } // Expand/Collapse accordion sections on click. - section.container.find( '.accordion-section-title button, .customize-section-back' ).on( 'click keydown', function( event ) { + section.container.find( '.accordion-section-title button, .customize-section-back, .accordion-section-title[tabindex]' ).on( 'click keydown', function( event ) { if ( api.utils.isKeydownButNotEnterEvent( event ) ) { return; } @@ -1605,7 +1605,7 @@ content = section.contentContainer, overlay = section.headContainer.closest( '.wp-full-overlay' ), backBtn = content.find( '.customize-section-back' ), - sectionTitle = section.headContainer.find( '.accordion-section-title button' ).first(), + sectionTitle = section.headContainer.find( '.accordion-section-title button, .accordion-section-title[tabindex]' ).first(), expand, panel; if ( expanded && ! content.hasClass( 'open' ) ) { @@ -2694,7 +2694,7 @@ container = section.headContainer.closest( '.wp-full-overlay-sidebar-content' ), content = section.contentContainer, backBtn = content.find( '.customize-section-back' ), - sectionTitle = section.headContainer.find( '.accordion-section-title button' ).first(), + sectionTitle = section.headContainer.find( '.accordion-section-title button, .accordion-section-title[tabindex]' ).first(), body = $( document.body ), expand, panel; @@ -2833,7 +2833,7 @@ var meta, panel = this; // Expand/Collapse accordion sections on click. - panel.headContainer.find( '.accordion-section-title button' ).on( 'click keydown', function( event ) { + panel.headContainer.find( '.accordion-section-title button, .accordion-section-title[tabindex]' ).on( 'click keydown', function( event ) { if ( api.utils.isKeydownButNotEnterEvent( event ) ) { return; } @@ -2937,7 +2937,7 @@ accordionSection = panel.contentContainer, overlay = accordionSection.closest( '.wp-full-overlay' ), container = accordionSection.closest( '.wp-full-overlay-sidebar-content' ), - topPanel = panel.headContainer.find( '.accordion-section-title button' ), + topPanel = panel.headContainer.find( '.accordion-section-title button, .accordion-section-title[tabindex]' ), backBtn = accordionSection.find( '.customize-panel-back' ), childSections = panel.sections(), skipTransition; From 07be2445e45066147105206da08acf31bcee974d Mon Sep 17 00:00:00 2001 From: Sergey Biryukov Date: Sun, 22 Dec 2024 22:42:35 +0000 Subject: [PATCH 053/117] Coding Standards: Use strict comparison in `wp_handle_comment_submission()`. Follow-up to [549], [1985], [2464], [2556], [2558], [34799], [40667]. Props deepakrohilla, narenin. See #62316. git-svn-id: https://develop.svn.wordpress.org/trunk@59556 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/comment.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wp-includes/comment.php b/src/wp-includes/comment.php index 4360f14d09554..2762b77593308 100644 --- a/src/wp-includes/comment.php +++ b/src/wp-includes/comment.php @@ -3658,7 +3658,7 @@ function wp_handle_comment_submission( $comment_data ) { $comment_type = 'comment'; if ( get_option( 'require_name_email' ) && ! $user->exists() ) { - if ( '' == $comment_author_email || '' == $comment_author ) { + if ( '' === $comment_author_email || '' === $comment_author ) { return new WP_Error( 'require_name_email', __( 'Error: Please fill the required fields.' ), 200 ); } elseif ( ! is_email( $comment_author_email ) ) { return new WP_Error( 'require_valid_email', __( 'Error: Please enter a valid email address.' ), 200 ); From a9e2f1c1e55f55c105b58fcc9c2303fead4870fc Mon Sep 17 00:00:00 2001 From: Sergey Biryukov Date: Mon, 23 Dec 2024 20:04:18 +0000 Subject: [PATCH 054/117] Coding Standards: Use strict comparison in `wpmu_validate_user_signup()`. Follow-up to [14298], [19852]. Props debarghyabanerjee. See #62283. git-svn-id: https://develop.svn.wordpress.org/trunk@59557 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/ms-functions.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wp-includes/ms-functions.php b/src/wp-includes/ms-functions.php index fa8df6d10875b..d17de7ead01da 100644 --- a/src/wp-includes/ms-functions.php +++ b/src/wp-includes/ms-functions.php @@ -462,7 +462,7 @@ function wpmu_validate_user_signup( $user_name, $user_email ) { $orig_username = $user_name; $user_name = preg_replace( '/\s+/', '', sanitize_user( $user_name, true ) ); - if ( $user_name != $orig_username || preg_match( '/[^a-z0-9]/', $user_name ) ) { + if ( $user_name !== $orig_username || preg_match( '/[^a-z0-9]/', $user_name ) ) { $errors->add( 'user_name', __( 'Usernames can only contain lowercase letters (a-z) and numbers.' ) ); $user_name = $orig_username; } From 9dd87b8f91300917447c271968d3c36289b440e8 Mon Sep 17 00:00:00 2001 From: Jb Audras Date: Mon, 23 Dec 2024 22:07:47 +0000 Subject: [PATCH 055/117] Coding Standards: Fix a comment indentation issue in `script-loader.php`. Follow-up to [58703]. Props mukesh27. See #62279. git-svn-id: https://develop.svn.wordpress.org/trunk@59558 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/script-loader.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/wp-includes/script-loader.php b/src/wp-includes/script-loader.php index f4e37d7164139..6a5768a8a4b9b 100644 --- a/src/wp-includes/script-loader.php +++ b/src/wp-includes/script-loader.php @@ -2517,9 +2517,9 @@ function wp_enqueue_global_styles() { if ( $is_block_theme ) { /* - * Dequeue the Customizer's custom CSS - * and add it before the global styles custom CSS. - */ + * Dequeue the Customizer's custom CSS + * and add it before the global styles custom CSS. + */ remove_action( 'wp_head', 'wp_custom_css_cb', 101 ); // Get the custom CSS from the Customizer and add it to the global stylesheet. $custom_css = wp_get_custom_css(); From 70ecc6b6423b4a7de607c196933bc5935588a091 Mon Sep 17 00:00:00 2001 From: Joe Dolson Date: Mon, 23 Dec 2024 23:01:23 +0000 Subject: [PATCH 056/117] Themes: Add an ID to the block theme skip link. Add the ID `wp-skip-link` to the block theme generated skip link, so that block themes have a standardized target at the top of the `body` element. Props philliproth, audrasjb, debarghyabanerjee, sabernhardt, joedolson, apermo. Fixes #62311. git-svn-id: https://develop.svn.wordpress.org/trunk@59559 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/theme-templates.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/wp-includes/theme-templates.php b/src/wp-includes/theme-templates.php index c01a4ec6721e8..55b9c8fac4990 100644 --- a/src/wp-includes/theme-templates.php +++ b/src/wp-includes/theme-templates.php @@ -203,6 +203,7 @@ function wp_enqueue_block_template_skip_link() { // Create the skip link. skipLink = document.createElement( 'a' ); skipLink.classList.add( 'skip-link', 'screen-reader-text' ); + skipLink.id = 'wp-skip-link'; skipLink.href = '#' + skipLinkTargetID; skipLink.innerHTML = ''; From 87f99b4316bf2bf8f20efead24424e6fdeb1e976 Mon Sep 17 00:00:00 2001 From: Sergey Biryukov Date: Tue, 24 Dec 2024 22:22:49 +0000 Subject: [PATCH 057/117] Coding Standards: Use strict comparison in `wpmu_signup_blog_notification()`. Follow-up to [https://mu.trac.wordpress.org/changeset/1970 mu:1970]. Props debarghyabanerjee. See #62283. git-svn-id: https://develop.svn.wordpress.org/trunk@59560 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/ms-functions.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wp-includes/ms-functions.php b/src/wp-includes/ms-functions.php index d17de7ead01da..7cfb403e9e289 100644 --- a/src/wp-includes/ms-functions.php +++ b/src/wp-includes/ms-functions.php @@ -941,7 +941,7 @@ function wpmu_signup_blog_notification( $domain, $path, $title, $user_login, $us } // Send email with activation link. - if ( ! is_subdomain_install() || get_current_network_id() != 1 ) { + if ( ! is_subdomain_install() || get_current_network_id() !== 1 ) { $activate_url = network_site_url( "wp-activate.php?key=$key" ); } else { $activate_url = "http://{$domain}{$path}wp-activate.php?key=$key"; // @todo Use *_url() API. From 27bb7ac2349eb81eb4e0ff5d275ff4ff3b98f3c4 Mon Sep 17 00:00:00 2001 From: Sergey Biryukov Date: Wed, 25 Dec 2024 18:29:51 +0000 Subject: [PATCH 058/117] Coding Standards: Use strict comparison in `remove_user_from_blog()`. Follow-up to [https://mu.trac.wordpress.org/changeset/543 mu:543]. Props debarghyabanerjee, aristath, poena, afercia, SergeyBiryukov. See #62279, #62283. git-svn-id: https://develop.svn.wordpress.org/trunk@59561 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/ms-functions.php | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/wp-includes/ms-functions.php b/src/wp-includes/ms-functions.php index 7cfb403e9e289..9f1889fda6b36 100644 --- a/src/wp-includes/ms-functions.php +++ b/src/wp-includes/ms-functions.php @@ -230,8 +230,10 @@ function add_user_to_blog( $blog_id, $user_id, $role ) { function remove_user_from_blog( $user_id, $blog_id = 0, $reassign = 0 ) { global $wpdb; - switch_to_blog( $blog_id ); $user_id = (int) $user_id; + $blog_id = (int) $blog_id; + + switch_to_blog( $blog_id ); /** * Fires before a user is removed from a site. @@ -249,13 +251,13 @@ function remove_user_from_blog( $user_id, $blog_id = 0, $reassign = 0 ) { * If being removed from the primary blog, set a new primary * if the user is assigned to multiple blogs. */ - $primary_blog = get_user_meta( $user_id, 'primary_blog', true ); - if ( $primary_blog == $blog_id ) { + $primary_blog = (int) get_user_meta( $user_id, 'primary_blog', true ); + if ( $primary_blog === $blog_id ) { $new_id = ''; $new_domain = ''; $blogs = get_blogs_of_user( $user_id ); foreach ( (array) $blogs as $blog ) { - if ( $blog->userblog_id == $blog_id ) { + if ( $blog->userblog_id === $blog_id ) { continue; } $new_id = $blog->userblog_id; From 20110f63aac507e2b64bb2b6270471957dec8ca3 Mon Sep 17 00:00:00 2001 From: Sergey Biryukov Date: Thu, 26 Dec 2024 23:55:05 +0000 Subject: [PATCH 059/117] Coding Standards: Use strict comparison in `get_active_blog_for_user()`. Follow-up to [https://mu.trac.wordpress.org/changeset/804 mu:804], [https://mu.trac.wordpress.org/changeset/1918 mu:1918]. Props debarghyabanerjee, aristath, poena, afercia, SergeyBiryukov. See #62279, #62283. git-svn-id: https://develop.svn.wordpress.org/trunk@59562 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/ms-functions.php | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/wp-includes/ms-functions.php b/src/wp-includes/ms-functions.php index 9f1889fda6b36..fdbcc6fb78e83 100644 --- a/src/wp-includes/ms-functions.php +++ b/src/wp-includes/ms-functions.php @@ -71,18 +71,23 @@ function get_active_blog_for_user( $user_id ) { } } - if ( ( ! is_object( $primary ) ) || ( 1 == $primary->archived || 1 == $primary->spam || 1 == $primary->deleted ) ) { + if ( ( ! is_object( $primary ) ) + || ( '1' === $primary->archived || '1' === $primary->spam || '1' === $primary->deleted ) + ) { $blogs = get_blogs_of_user( $user_id, true ); // If a user's primary blog is shut down, check their other blogs. $ret = false; if ( is_array( $blogs ) && count( $blogs ) > 0 ) { foreach ( (array) $blogs as $blog_id => $blog ) { - if ( get_current_network_id() != $blog->site_id ) { + if ( get_current_network_id() !== $blog->site_id ) { continue; } + $details = get_site( $blog_id ); - if ( is_object( $details ) && 0 == $details->archived && 0 == $details->spam && 0 == $details->deleted ) { + if ( is_object( $details ) + && '0' === $details->archived && '0' === $details->spam && '0' === $details->deleted + ) { $ret = $details; - if ( get_user_meta( $user_id, 'primary_blog', true ) != $blog_id ) { + if ( (int) get_user_meta( $user_id, 'primary_blog', true ) !== $blog_id ) { update_user_meta( $user_id, 'primary_blog', $blog_id ); } if ( ! get_user_meta( $user_id, 'source_domain', true ) ) { From 779ed48a034c60a65cd1ac7ab35262e496e39c99 Mon Sep 17 00:00:00 2001 From: Sergey Biryukov Date: Fri, 27 Dec 2024 23:00:41 +0000 Subject: [PATCH 060/117] Coding Standards: Use strict comparison in `is_user_spammy()`. Follow-up to [https://mu.trac.wordpress.org/changeset/1640 mu:1640]. Props debarghyabanerjee, aristath, poena, afercia, SergeyBiryukov. See #62279, #62283. git-svn-id: https://develop.svn.wordpress.org/trunk@59563 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/ms-functions.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wp-includes/ms-functions.php b/src/wp-includes/ms-functions.php index fdbcc6fb78e83..e0ae1a0315f17 100644 --- a/src/wp-includes/ms-functions.php +++ b/src/wp-includes/ms-functions.php @@ -2304,7 +2304,7 @@ function is_user_spammy( $user = null ) { } } - return $user && isset( $user->spam ) && 1 == $user->spam; + return $user && isset( $user->spam ) && '1' === $user->spam; } /** From 4a6b12bea7761ec8f9037685aad3104285e15b21 Mon Sep 17 00:00:00 2001 From: Sergey Biryukov Date: Sat, 28 Dec 2024 22:08:19 +0000 Subject: [PATCH 061/117] Options, Meta APIs: Ensure `after_section` is printed for sections without any fields. This brings consistency with the `before_section` HTML content, which did get printed in `do_settings_sections()` regardless of whether the settings section has any fields attached. Follow-up to [8855], [21742], [54247]. Props alpipego, SergeyBiryukov. Fixes #62746. git-svn-id: https://develop.svn.wordpress.org/trunk@59564 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-admin/includes/template.php | 9 ++++--- .../phpunit/tests/admin/includesTemplate.php | 24 +++++++++++++++++++ 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/src/wp-admin/includes/template.php b/src/wp-admin/includes/template.php index 3bff8bc279b5f..a0d07696d3019 100644 --- a/src/wp-admin/includes/template.php +++ b/src/wp-admin/includes/template.php @@ -1784,12 +1784,11 @@ function do_settings_sections( $page ) { call_user_func( $section['callback'], $section ); } - if ( ! isset( $wp_settings_fields ) || ! isset( $wp_settings_fields[ $page ] ) || ! isset( $wp_settings_fields[ $page ][ $section['id'] ] ) ) { - continue; + if ( isset( $wp_settings_fields[ $page ][ $section['id'] ] ) ) { + echo '
  • ' . esc_html_x( 'Active', 'theme' ) . '' . esc_html_x( 'Uploaded', 'theme' ) . '
    ' . esc_html_x( 'Installed', 'theme' ) . '' . esc_html_x( 'Uploaded', 'theme' ) . '
    '; + do_settings_fields( $page, $section['id'] ); + echo ''; } - echo ''; - do_settings_fields( $page, $section['id'] ); - echo ''; if ( '' !== $section['after_section'] ) { echo wp_kses_post( $section['after_section'] ); diff --git a/tests/phpunit/tests/admin/includesTemplate.php b/tests/phpunit/tests/admin/includesTemplate.php index f24a046933922..66e3befd5f07b 100644 --- a/tests/phpunit/tests/admin/includesTemplate.php +++ b/tests/phpunit/tests/admin/includesTemplate.php @@ -240,6 +240,30 @@ public function test_add_settings_section_with_extra_args( $extra_args, $expecte $this->assertStringContainsString( $expected_after_section_html, $output, 'Test page output does not contain the custom markup to be placed after the section.' ); } + /** + * @ticket 62746 + * + * @param array $extra_args Extra arguments to pass to function `add_settings_section()`. + * @param array $expected_section_data Expected set of section data. + * @param string $expected_before_section_html Expected HTML markup to be rendered before the settings section. + * @param string $expected_after_section_html Expected HTML markup to be rendered after the settings section. + * + * @covers ::add_settings_section + * @covers ::do_settings_sections + * + * @dataProvider data_extra_args_for_add_settings_section + */ + public function test_add_settings_section_without_any_fields( $extra_args, $expected_section_data, $expected_before_section_html, $expected_after_section_html ) { + add_settings_section( 'test-section', 'Section title', '__return_false', 'test-page', $extra_args ); + + ob_start(); + do_settings_sections( 'test-page' ); + $output = ob_get_clean(); + + $this->assertStringContainsString( $expected_before_section_html, $output, 'Test page output does not contain the custom markup to be placed before the section.' ); + $this->assertStringContainsString( $expected_after_section_html, $output, 'Test page output does not contain the custom markup to be placed after the section.' ); + } + /** * Data provider for `test_add_settings_section_with_extra_args()`. * From 4e1752dee97eb3454c7a6da9176b8890d7c371a8 Mon Sep 17 00:00:00 2001 From: Sergey Biryukov Date: Sun, 29 Dec 2024 21:52:34 +0000 Subject: [PATCH 062/117] Coding Standards: Use strict comparison in `sanitize_post()`. Follow-up to [12062]. Props aristath, poena, afercia, SergeyBiryukov. See #62279. git-svn-id: https://develop.svn.wordpress.org/trunk@59565 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/post.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/wp-includes/post.php b/src/wp-includes/post.php index eb90e762f5663..cadc929457979 100644 --- a/src/wp-includes/post.php +++ b/src/wp-includes/post.php @@ -2823,7 +2823,7 @@ function is_sticky( $post_id = 0 ) { function sanitize_post( $post, $context = 'display' ) { if ( is_object( $post ) ) { // Check if post already filtered for this context. - if ( isset( $post->filter ) && $context == $post->filter ) { + if ( isset( $post->filter ) && $context === $post->filter ) { return $post; } if ( ! isset( $post->ID ) ) { @@ -2835,7 +2835,7 @@ function sanitize_post( $post, $context = 'display' ) { $post->filter = $context; } elseif ( is_array( $post ) ) { // Check if post already filtered for this context. - if ( isset( $post['filter'] ) && $context == $post['filter'] ) { + if ( isset( $post['filter'] ) && $context === $post['filter'] ) { return $post; } if ( ! isset( $post['ID'] ) ) { From 2ba84334c9d412956322544564c1a8e32fb56363 Mon Sep 17 00:00:00 2001 From: Sergey Biryukov Date: Mon, 30 Dec 2024 09:30:14 +0000 Subject: [PATCH 063/117] Coding Standards: Use strict comparison in `get_post_ancestors()`. Follow-up to [7074], [15758], [21559], [21953]. Props aristath, poena, afercia, SergeyBiryukov. See #62279. git-svn-id: https://develop.svn.wordpress.org/trunk@59566 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/post.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/wp-includes/post.php b/src/wp-includes/post.php index cadc929457979..dfdd41ed5ef93 100644 --- a/src/wp-includes/post.php +++ b/src/wp-includes/post.php @@ -1135,7 +1135,7 @@ function get_post( $post = null, $output = OBJECT, $filter = 'raw' ) { function get_post_ancestors( $post ) { $post = get_post( $post ); - if ( ! $post || empty( $post->post_parent ) || $post->post_parent == $post->ID ) { + if ( ! $post || empty( $post->post_parent ) || $post->post_parent === $post->ID ) { return array(); } @@ -1146,7 +1146,9 @@ function get_post_ancestors( $post ) { while ( $ancestor = get_post( $id ) ) { // Loop detection: If the ancestor has been seen before, break. - if ( empty( $ancestor->post_parent ) || ( $ancestor->post_parent == $post->ID ) || in_array( $ancestor->post_parent, $ancestors, true ) ) { + if ( empty( $ancestor->post_parent ) || $ancestor->post_parent === $post->ID + || in_array( $ancestor->post_parent, $ancestors, true ) + ) { break; } From 7fedfd4dc13200edb7a1e467d78b619cd7235b92 Mon Sep 17 00:00:00 2001 From: Sergey Biryukov Date: Tue, 31 Dec 2024 19:17:10 +0000 Subject: [PATCH 064/117] Coding Standards: Use strict comparison in `wp_count_attachments()`. Follow-up to [54255]. Props aristath, poena, afercia, SergeyBiryukov. See #62279. git-svn-id: https://develop.svn.wordpress.org/trunk@59567 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/post.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/wp-includes/post.php b/src/wp-includes/post.php index dfdd41ed5ef93..3c3a422430324 100644 --- a/src/wp-includes/post.php +++ b/src/wp-includes/post.php @@ -3390,7 +3390,8 @@ function wp_count_attachments( $mime_type = '' ) { ); $counts = wp_cache_get( $cache_key, 'counts' ); - if ( false == $counts ) { + + if ( false === $counts ) { $and = wp_post_mime_type_where( $mime_type ); $count = $wpdb->get_results( "SELECT post_mime_type, COUNT( * ) AS num_posts FROM $wpdb->posts WHERE post_type = 'attachment' AND post_status != 'trash' $and GROUP BY post_mime_type", ARRAY_A ); From de14028c7637ccfb0746311dd4da0c040f49126a Mon Sep 17 00:00:00 2001 From: Sergey Biryukov Date: Wed, 1 Jan 2025 00:10:57 +0000 Subject: [PATCH 065/117] =?UTF-8?q?Happy=20New=20Year!=20=F0=9F=8E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Update copyright year to 2025 in `license.txt` and bundled themes. Follow-up to [18201], [23306], [28064], [36855], [36856], [39659], [40241], [42424], [46719], [46720], [47025], [47026], [49915], [52427], [55024], [57235]. git-svn-id: https://develop.svn.wordpress.org/trunk@59568 602fd350-edb4-49c9-b593-d223f7449a82 --- src/license.txt | 2 +- src/wp-content/themes/twentyeleven/readme.txt | 2 +- src/wp-content/themes/twentyfifteen/readme.txt | 2 +- src/wp-content/themes/twentyfourteen/readme.txt | 2 +- src/wp-content/themes/twentynineteen/readme.txt | 4 ++-- src/wp-content/themes/twentyseventeen/readme.txt | 2 +- src/wp-content/themes/twentysixteen/readme.txt | 2 +- src/wp-content/themes/twentyten/readme.txt | 2 +- src/wp-content/themes/twentythirteen/readme.txt | 2 +- src/wp-content/themes/twentytwelve/readme.txt | 2 +- src/wp-content/themes/twentytwenty/readme.txt | 8 ++++---- src/wp-content/themes/twentytwentyfour/readme.txt | 2 +- src/wp-content/themes/twentytwentyone/readme.txt | 12 ++++++------ src/wp-content/themes/twentytwentythree/readme.txt | 2 +- src/wp-content/themes/twentytwentytwo/readme.txt | 2 +- 15 files changed, 24 insertions(+), 24 deletions(-) diff --git a/src/license.txt b/src/license.txt index 90cf5383fe5a4..a22eda8f3bbf4 100644 --- a/src/license.txt +++ b/src/license.txt @@ -1,6 +1,6 @@ WordPress - Web publishing software -Copyright 2011-2024 by the contributors +Copyright 2011-2025 by the contributors This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by diff --git a/src/wp-content/themes/twentyeleven/readme.txt b/src/wp-content/themes/twentyeleven/readme.txt index 16d4d11e26b57..f8d794b9b8a23 100644 --- a/src/wp-content/themes/twentyeleven/readme.txt +++ b/src/wp-content/themes/twentyeleven/readme.txt @@ -23,7 +23,7 @@ For more information about Twenty Eleven please go to https://codex.wordpress.or == Copyright == -Twenty Eleven WordPress Theme, Copyright 2011-2024 WordPress.org, Automattic Inc., and contributors. +Twenty Eleven WordPress Theme, Copyright 2011-2025 WordPress.org, Automattic Inc., and contributors. Twenty Eleven is Distributed under the terms of the GNU GPL This program is free software: you can redistribute it and/or modify diff --git a/src/wp-content/themes/twentyfifteen/readme.txt b/src/wp-content/themes/twentyfifteen/readme.txt index 358101e7a55af..2fd9ff16029ad 100644 --- a/src/wp-content/themes/twentyfifteen/readme.txt +++ b/src/wp-content/themes/twentyfifteen/readme.txt @@ -31,7 +31,7 @@ For more information about Twenty Fifteen please go to https://wordpress.org/doc == Copyright == -Twenty Fifteen WordPress Theme, Copyright 2014-2024 WordPress.org, Automattic Inc., and contributors. +Twenty Fifteen WordPress Theme, Copyright 2014-2025 WordPress.org, Automattic Inc., and contributors. Twenty Fifteen is distributed under the terms of the GNU GPL This program is free software: you can redistribute it and/or modify diff --git a/src/wp-content/themes/twentyfourteen/readme.txt b/src/wp-content/themes/twentyfourteen/readme.txt index a54226a83f7fb..af119167596ea 100644 --- a/src/wp-content/themes/twentyfourteen/readme.txt +++ b/src/wp-content/themes/twentyfourteen/readme.txt @@ -23,7 +23,7 @@ For more information about Twenty Fourteen please go to https://codex.wordpress. == Copyright == -Twenty Fourteen WordPress Theme, Copyright 2013-2024 WordPress.org, Automattic Inc., and contributors. +Twenty Fourteen WordPress Theme, Copyright 2013-2025 WordPress.org, Automattic Inc., and contributors. Twenty Fourteen is Distributed under the terms of the GNU GPL This program is free software: you can redistribute it and/or modify diff --git a/src/wp-content/themes/twentynineteen/readme.txt b/src/wp-content/themes/twentynineteen/readme.txt index d3ca13553e2d1..e30e9291c221d 100644 --- a/src/wp-content/themes/twentynineteen/readme.txt +++ b/src/wp-content/themes/twentynineteen/readme.txt @@ -25,7 +25,7 @@ For more information about Twenty Nineteen please go to https://wordpress.org/do == Copyright == -Twenty Nineteen WordPress Theme, Copyright 2018-2024 WordPress.org, and contributors. +Twenty Nineteen WordPress Theme, Copyright 2018-2025 WordPress.org, and contributors. Twenty Nineteen is distributed under the terms of the GNU GPL This program is free software: you can redistribute it and/or modify @@ -147,7 +147,7 @@ Initial release == Resources == * normalize.css, © 2012-2018 Nicolas Gallagher and Jonathan Neal, MIT -* Underscores, © 2012-2024 Automattic, Inc., GNU GPL v2 or later +* Underscores, © 2012-2025 Automattic, Inc., GNU GPL v2 or later * Bundled block pattern images: * Abstract Background by HD Wallpapers, CC0. https://stocksnap.io/photo/abstract-background-0SRRVNMKBX * Abstract Waves by HD Wallpapers, CC0. https://stocksnap.io/photo/abstract-waves-0KREGLTZQ3 diff --git a/src/wp-content/themes/twentyseventeen/readme.txt b/src/wp-content/themes/twentyseventeen/readme.txt index c78ed84d89e3a..cc3246ea4d8e3 100644 --- a/src/wp-content/themes/twentyseventeen/readme.txt +++ b/src/wp-content/themes/twentyseventeen/readme.txt @@ -24,7 +24,7 @@ For more information about Twenty Seventeen please go to https://wordpress.org/d == Copyright == -Twenty Seventeen WordPress Theme, Copyright 2016-2024 WordPress.org, and contributors. +Twenty Seventeen WordPress Theme, Copyright 2016-2025 WordPress.org, and contributors. Twenty Seventeen is distributed under the terms of the GNU GPL This program is free software: you can redistribute it and/or modify diff --git a/src/wp-content/themes/twentysixteen/readme.txt b/src/wp-content/themes/twentysixteen/readme.txt index 6891502fe3b5e..e5a5a2776773d 100644 --- a/src/wp-content/themes/twentysixteen/readme.txt +++ b/src/wp-content/themes/twentysixteen/readme.txt @@ -30,7 +30,7 @@ For more information about Twenty Sixteen please go to https://wordpress.org/doc == Copyright == -Twenty Sixteen WordPress Theme, Copyright 2014-2024 WordPress.org, and contributors. +Twenty Sixteen WordPress Theme, Copyright 2014-2025 WordPress.org, and contributors. Twenty Sixteen is distributed under the terms of the GNU GPL This program is free software: you can redistribute it and/or modify diff --git a/src/wp-content/themes/twentyten/readme.txt b/src/wp-content/themes/twentyten/readme.txt index 1127216542e5d..f0e8c057cfb64 100644 --- a/src/wp-content/themes/twentyten/readme.txt +++ b/src/wp-content/themes/twentyten/readme.txt @@ -23,7 +23,7 @@ For more information about Twenty Ten theme please go to https://codex.wordpress == Copyright == -Twenty Ten WordPress Theme, Copyright 2010-2024 WordPress.org, Automattic Inc., and contributors. +Twenty Ten WordPress Theme, Copyright 2010-2025 WordPress.org, Automattic Inc., and contributors. Twenty Ten is Distributed under the terms of the GNU GPL This program is free software: you can redistribute it and/or modify diff --git a/src/wp-content/themes/twentythirteen/readme.txt b/src/wp-content/themes/twentythirteen/readme.txt index e02e6eae1cc07..94261e7c4c002 100644 --- a/src/wp-content/themes/twentythirteen/readme.txt +++ b/src/wp-content/themes/twentythirteen/readme.txt @@ -23,7 +23,7 @@ For more information about Twenty Thirteen please go to https://codex.wordpress. == Copyright == -Twenty Thirteen WordPress Theme, Copyright 2013-2024 WordPress.org, Automattic Inc., and contributors. +Twenty Thirteen WordPress Theme, Copyright 2013-2025 WordPress.org, Automattic Inc., and contributors. Twenty Thirteen is Distributed under the terms of the GNU GPL This program is free software: you can redistribute it and/or modify diff --git a/src/wp-content/themes/twentytwelve/readme.txt b/src/wp-content/themes/twentytwelve/readme.txt index 3e716ee1b4ab7..f746e9add5048 100644 --- a/src/wp-content/themes/twentytwelve/readme.txt +++ b/src/wp-content/themes/twentytwelve/readme.txt @@ -23,7 +23,7 @@ For more information about Twenty Twelve please go to https://codex.wordpress.or == Copyright == -Twenty Twelve WordPress Theme, Copyright 2012-2024 WordPress.org, Automattic Inc., and contributors. +Twenty Twelve WordPress Theme, Copyright 2012-2025 WordPress.org, Automattic Inc., and contributors. Twenty Twelve is Distributed under the terms of the GNU GPL This program is free software: you can redistribute it and/or modify diff --git a/src/wp-content/themes/twentytwenty/readme.txt b/src/wp-content/themes/twentytwenty/readme.txt index 293baaef7c382..cd5d4b01d62c3 100644 --- a/src/wp-content/themes/twentytwenty/readme.txt +++ b/src/wp-content/themes/twentytwenty/readme.txt @@ -121,7 +121,7 @@ Initial release == Copyright == -Twenty Twenty WordPress Theme, Copyright 2019-2024 WordPress.org and contributors. +Twenty Twenty WordPress Theme, Copyright 2019-2025 WordPress.org and contributors. Twenty Twenty is distributed under the terms of the GNU GPL. This program is free software: you can redistribute it and/or modify @@ -170,7 +170,7 @@ License URI: http://www.gnu.org/licenses/gpl-2.0.html Source: WordPress Social Link Block (See wp-includes\blocks\social-link.php) Code from Twenty Nineteen -Copyright (c) 2018-2024 WordPress.org +Copyright (c) 2018-2025 WordPress.org License: GPLv2 Source: https://wordpress.org/themes/twentynineteen/ Included as part of the following classes and functions: @@ -180,11 +180,11 @@ Included as part of the following classes and functions: - twentytwenty_nav_menu_social_icons() Code from Twenty Seventeen -Copyright (c) 2016-2024 WordPress.org +Copyright (c) 2016-2025 WordPress.org License: GPLv2 Source: https://wordpress.org/themes/twentyseventeen/ Included as part of the following classes and functions: - twentytwenty_unique_id() Underscores -https://underscores.me/, (C) 2012-2024 Automattic, Inc., [GPLv2 or later](https://www.gnu.org/licenses/gpl-2.0.html) +https://underscores.me/, (C) 2012-2025 Automattic, Inc., [GPLv2 or later](https://www.gnu.org/licenses/gpl-2.0.html) diff --git a/src/wp-content/themes/twentytwentyfour/readme.txt b/src/wp-content/themes/twentytwentyfour/readme.txt index 8008a10b2fd9b..299a63d4c997c 100644 --- a/src/wp-content/themes/twentytwentyfour/readme.txt +++ b/src/wp-content/themes/twentytwentyfour/readme.txt @@ -35,7 +35,7 @@ https://wordpress.org/documentation/article/twenty-twenty-four-changelog/#Versio == Copyright == -Twenty Twenty-Four WordPress Theme, (C) 2023-2024 WordPress.org and contributors. +Twenty Twenty-Four WordPress Theme, (C) 2023-2025 WordPress.org and contributors. Twenty Twenty-Four is distributed under the terms of the GNU GPL. This program is free software: you can redistribute it and/or modify diff --git a/src/wp-content/themes/twentytwentyone/readme.txt b/src/wp-content/themes/twentytwentyone/readme.txt index e0c9e6949c2d5..b955225ca6a83 100644 --- a/src/wp-content/themes/twentytwentyone/readme.txt +++ b/src/wp-content/themes/twentytwentyone/readme.txt @@ -107,7 +107,7 @@ https://wordpress.org/documentation/article/twenty-twenty-one-changelog/#Version == Copyright == -Twenty Twenty-One WordPress Theme, 2020-2024 WordPress.org and contributors. +Twenty Twenty-One WordPress Theme, 2020-2025 WordPress.org and contributors. Twenty Twenty-One is distributed under the terms of the GNU GPL. This program is free software: you can redistribute it and/or modify @@ -125,19 +125,19 @@ Twenty Twenty-One is derived from Seedlet, (C) 2020 Automattic, Inc. Twenty Twenty-One is also based on: -Twenty Nineteen. 2018-2024 WordPress.org +Twenty Nineteen. 2018-2025 WordPress.org Twenty Nineteen is distributed under the terms of the GNU GPL v2 or later. -Twenty Seventeen. Copyright (C) 2016-2024 WordPress.org +Twenty Seventeen. Copyright (C) 2016-2025 WordPress.org Twenty Seventeen is distributed under the terms of the GNU GPL v2 or later. -Twenty Sixteen. Copyright (C) 2015-2024 WordPress.org +Twenty Sixteen. Copyright (C) 2015-2025 WordPress.org Twenty Sixteen is distributed under the terms of the GNU GPL v2 or later. -Twenty Twenty. Copyright (C) 2020-2024 WordPress.org +Twenty Twenty. Copyright (C) 2020-2025 WordPress.org Twenty Twenty is distributed under the terms of the GNU GPL v2 or later. -Underscores https://underscores.me/, Copyright (C) 2012-2024 Automattic, Inc. +Underscores https://underscores.me/, Copyright (C) 2012-2025 Automattic, Inc. Underscores is distributed under the terms of the GNU GPL v2 or later. Normalizing styles have been helped along thanks to the fine work of diff --git a/src/wp-content/themes/twentytwentythree/readme.txt b/src/wp-content/themes/twentytwentythree/readme.txt index 237758249f85d..9e4653b7f4ec4 100644 --- a/src/wp-content/themes/twentytwentythree/readme.txt +++ b/src/wp-content/themes/twentytwentythree/readme.txt @@ -52,7 +52,7 @@ https://wordpress.org/documentation/article/twenty-twenty-three-changelog/#Versi == Copyright == -Twenty Twenty-Three WordPress Theme, (C) 2022-2024 WordPress.org and contributors. +Twenty Twenty-Three WordPress Theme, (C) 2022-2025 WordPress.org and contributors. Twenty Twenty-Three is distributed under the terms of the GNU GPL. This program is free software: you can redistribute it and/or modify diff --git a/src/wp-content/themes/twentytwentytwo/readme.txt b/src/wp-content/themes/twentytwentytwo/readme.txt index d2635dbfe0207..ace8251b15899 100644 --- a/src/wp-content/themes/twentytwentytwo/readme.txt +++ b/src/wp-content/themes/twentytwentytwo/readme.txt @@ -91,7 +91,7 @@ https://wordpress.org/documentation/article/twenty-twenty-two-changelog/#Version == Copyright == -Twenty Twenty-Two WordPress Theme, 2021-2024 WordPress.org and contributors. +Twenty Twenty-Two WordPress Theme, 2021-2025 WordPress.org and contributors. Twenty Twenty-Two is distributed under the terms of the GNU GPL. This program is free software: you can redistribute it and/or modify From 238f8657d7a06e5077e6177e308c464c73754a8e Mon Sep 17 00:00:00 2001 From: Peter Wilson Date: Thu, 2 Jan 2025 01:06:38 +0000 Subject: [PATCH 066/117] =?UTF-8?q?Happy=20New=20Year=20Twenty=20Twenty-Fi?= =?UTF-8?q?ve!=20=F0=9F=8E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Update copyright year to 2025 in the Twenty Twenty-Five bundled theme's `readme.txt`. Follow-up to [18201], [23306], [28064], [36855], [36856], [39659], [40241], [42424], [46719], [46720], [47025], [47026], [49915], [52427], [55024], [57235], [59568]. git-svn-id: https://develop.svn.wordpress.org/trunk@59569 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-content/themes/twentytwentyfive/readme.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wp-content/themes/twentytwentyfive/readme.txt b/src/wp-content/themes/twentytwentyfive/readme.txt index c04796c2e7343..b4dc89e9c9fe6 100644 --- a/src/wp-content/themes/twentytwentyfive/readme.txt +++ b/src/wp-content/themes/twentytwentyfive/readme.txt @@ -17,7 +17,7 @@ Twenty Twenty-Five emphasizes simplicity and adaptability. It offers flexible de == Copyright == -Twenty Twenty-Five WordPress Theme, (C) 2024 WordPress.org and contributors. +Twenty Twenty-Five WordPress Theme, (C) 2024-2025 WordPress.org and contributors. Twenty Twenty-Five is distributed under the terms of the GNU GPL. This program is free software: you can redistribute it and/or modify From 5948245e57bdbf18b45568b3bb9b5566a9e8d907 Mon Sep 17 00:00:00 2001 From: Felix Arntz Date: Thu, 2 Jan 2025 16:11:14 +0000 Subject: [PATCH 067/117] Build/Test Tools: Fix incorrect commit time being reported to WordPress Code Vitals Dashboard. Props mukesh27, ayeshrajans. Fixes #62766. git-svn-id: https://develop.svn.wordpress.org/trunk@59570 602fd350-edb4-49c9-b593-d223f7449a82 --- .github/workflows/reusable-performance.yml | 14 +------------- 1 file changed, 1 insertion(+), 13 deletions(-) diff --git a/.github/workflows/reusable-performance.yml b/.github/workflows/reusable-performance.yml index e5c29aa0b1849..c9dad187499ce 100644 --- a/.github/workflows/reusable-performance.yml +++ b/.github/workflows/reusable-performance.yml @@ -94,7 +94,6 @@ jobs: # - Compare results. # - Add workflow summary. # - Set the base sha. - # - Set commit details. # - Publish performance results. # - Ensure version-controlled files are not modified or deleted. performance: @@ -312,23 +311,12 @@ jobs: const baseRef = await github.rest.git.getRef({ owner: context.repo.owner, repo: context.repo.repo, ref: 'tags/${{ env.BASE_TAG }}' }); return baseRef.data.object.sha; - - name: Set commit details - # Only needed when publishing results. - if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/trunk' && ! inputs.memcached }} - uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 - id: commit-timestamp - with: - github-token: ${{ secrets.GITHUB_TOKEN }} - script: | - const commit_details = await github.rest.git.getCommit({ owner: context.repo.owner, repo: context.repo.repo, commit_sha: context.sha }); - return parseInt((new Date( commit_details.data.author.date ).getTime() / 1000).toFixed(0)) - - name: Publish performance results # Only publish results on pushes to trunk. if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/trunk' && ! inputs.memcached }} env: BASE_SHA: ${{ steps.base-sha.outputs.result }} - COMMITTED_AT: ${{ steps.commit-timestamp.outputs.result }} + COMMITTED_AT: $(git show -s $GITHUB_SHA --format="%cI") CODEVITALS_PROJECT_TOKEN: ${{ secrets.CODEVITALS_PROJECT_TOKEN }} HOST_NAME: "www.codevitals.run" run: | From 7bd68355aac022d3fd336b292b650088bcedde08 Mon Sep 17 00:00:00 2001 From: Felix Arntz Date: Thu, 2 Jan 2025 16:39:28 +0000 Subject: [PATCH 068/117] Build/Test Tools: Revert [59570]. The fix did not work properly and is causing performance data for commits to not be sent at all. It is therefore reverted until a proper solution has been implemented. See #62766. git-svn-id: https://develop.svn.wordpress.org/trunk@59571 602fd350-edb4-49c9-b593-d223f7449a82 --- .github/workflows/reusable-performance.yml | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/.github/workflows/reusable-performance.yml b/.github/workflows/reusable-performance.yml index c9dad187499ce..e5c29aa0b1849 100644 --- a/.github/workflows/reusable-performance.yml +++ b/.github/workflows/reusable-performance.yml @@ -94,6 +94,7 @@ jobs: # - Compare results. # - Add workflow summary. # - Set the base sha. + # - Set commit details. # - Publish performance results. # - Ensure version-controlled files are not modified or deleted. performance: @@ -311,12 +312,23 @@ jobs: const baseRef = await github.rest.git.getRef({ owner: context.repo.owner, repo: context.repo.repo, ref: 'tags/${{ env.BASE_TAG }}' }); return baseRef.data.object.sha; + - name: Set commit details + # Only needed when publishing results. + if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/trunk' && ! inputs.memcached }} + uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 + id: commit-timestamp + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + const commit_details = await github.rest.git.getCommit({ owner: context.repo.owner, repo: context.repo.repo, commit_sha: context.sha }); + return parseInt((new Date( commit_details.data.author.date ).getTime() / 1000).toFixed(0)) + - name: Publish performance results # Only publish results on pushes to trunk. if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/trunk' && ! inputs.memcached }} env: BASE_SHA: ${{ steps.base-sha.outputs.result }} - COMMITTED_AT: $(git show -s $GITHUB_SHA --format="%cI") + COMMITTED_AT: ${{ steps.commit-timestamp.outputs.result }} CODEVITALS_PROJECT_TOKEN: ${{ secrets.CODEVITALS_PROJECT_TOKEN }} HOST_NAME: "www.codevitals.run" run: | From 016bbeca9bfe96b3e024441059b76a3ad7d31df9 Mon Sep 17 00:00:00 2001 From: Sergey Biryukov Date: Thu, 2 Jan 2025 18:25:59 +0000 Subject: [PATCH 069/117] Coding Standards: Use strict comparison in `_reset_front_page_settings_for_post()`. Follow-up to [6337], [25686]. Props aristath, poena, afercia, SergeyBiryukov. See #62279. git-svn-id: https://develop.svn.wordpress.org/trunk@59572 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/post.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/wp-includes/post.php b/src/wp-includes/post.php index 3c3a422430324..a197180d9e172 100644 --- a/src/wp-includes/post.php +++ b/src/wp-includes/post.php @@ -3859,11 +3859,11 @@ function _reset_front_page_settings_for_post( $post_id ) { * If the page is defined in option page_on_front or post_for_posts, * adjust the corresponding options. */ - if ( get_option( 'page_on_front' ) == $post->ID ) { + if ( (int) get_option( 'page_on_front' ) === $post->ID ) { update_option( 'show_on_front', 'posts' ); update_option( 'page_on_front', 0 ); } - if ( get_option( 'page_for_posts' ) == $post->ID ) { + if ( (int) get_option( 'page_for_posts' ) === $post->ID ) { update_option( 'page_for_posts', 0 ); } } From 8da02a8665521cb79d21241299284f362881ed7d Mon Sep 17 00:00:00 2001 From: Sergey Biryukov Date: Fri, 3 Jan 2025 22:55:42 +0000 Subject: [PATCH 070/117] Coding Standards: Use strict comparison in `wpmu_validate_blog_signup()`. Follow-up to [https://mu.trac.wordpress.org/changeset/8 mu:8], [https://mu.trac.wordpress.org/changeset/543 mu:543], [https://mu.trac.wordpress.org/changeset/550 mu:550], [https://mu.trac.wordpress.org/changeset/1364 mu:1364], [https://mu.trac.wordpress.org/changeset/1958 mu:1958], [12603], [32733]. Props debarghyabanerjee, aristath, poena, afercia, SergeyBiryukov. See #62279, #62283. git-svn-id: https://develop.svn.wordpress.org/trunk@59573 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/ms-functions.php | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/src/wp-includes/ms-functions.php b/src/wp-includes/ms-functions.php index e0ae1a0315f17..5bb3cab118bee 100644 --- a/src/wp-includes/ms-functions.php +++ b/src/wp-includes/ms-functions.php @@ -481,10 +481,12 @@ function wpmu_validate_user_signup( $user_name, $user_email ) { } $illegal_names = get_site_option( 'illegal_names' ); + if ( ! is_array( $illegal_names ) ) { $illegal_names = array( 'www', 'web', 'root', 'admin', 'main', 'invite', 'administrator' ); add_site_option( 'illegal_names', $illegal_names ); } + if ( in_array( $user_name, $illegal_names, true ) ) { $errors->add( 'user_name', __( 'Sorry, that username is not allowed.' ) ); } @@ -516,10 +518,12 @@ function wpmu_validate_user_signup( $user_name, $user_email ) { } $limited_email_domains = get_site_option( 'limited_email_domains' ); + if ( is_array( $limited_email_domains ) && ! empty( $limited_email_domains ) ) { $limited_email_domains = array_map( 'strtolower', $limited_email_domains ); - $emaildomain = strtolower( substr( $user_email, 1 + strpos( $user_email, '@' ) ) ); - if ( ! in_array( $emaildomain, $limited_email_domains, true ) ) { + $email_domain = strtolower( substr( $user_email, 1 + strpos( $user_email, '@' ) ) ); + + if ( ! in_array( $email_domain, $limited_email_domains, true ) ) { $errors->add( 'user_email', __( 'Sorry, that email address is not allowed!' ) ); } } @@ -637,7 +641,8 @@ function wpmu_validate_blog_signup( $blogname, $blog_title, $user = '' ) { $errors = new WP_Error(); $illegal_names = get_site_option( 'illegal_names' ); - if ( false == $illegal_names ) { + + if ( ! is_array( $illegal_names ) ) { $illegal_names = array( 'www', 'web', 'root', 'admin', 'main', 'invite', 'administrator' ); add_site_option( 'illegal_names', $illegal_names ); } @@ -721,7 +726,7 @@ function wpmu_validate_blog_signup( $blogname, $blog_title, $user = '' ) { * unless it's the user's own username. */ if ( username_exists( $blogname ) ) { - if ( ! is_object( $user ) || ( is_object( $user ) && ( $user->user_login != $blogname ) ) ) { + if ( ! is_object( $user ) || ( is_object( $user ) && ( $user->user_login !== $blogname ) ) ) { $errors->add( 'blogname', __( 'Sorry, that site is reserved!' ) ); } } From 8f6f8098efd1ff74da806b576a33b4ba152d17b3 Mon Sep 17 00:00:00 2001 From: Sergey Biryukov Date: Sat, 4 Jan 2025 10:25:13 +0000 Subject: [PATCH 071/117] Coding Standards: Replace loose comparison in `wpmu_welcome_notification()`. Follow-up to [https://mu.trac.wordpress.org/changeset/543 mu:543]. Props debarghyabanerjee, aristath, poena, afercia, SergeyBiryukov. Fixes #62283. See #62279. git-svn-id: https://develop.svn.wordpress.org/trunk@59574 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/ms-functions.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/wp-includes/ms-functions.php b/src/wp-includes/ms-functions.php index 5bb3cab118bee..77603313b2a2f 100644 --- a/src/wp-includes/ms-functions.php +++ b/src/wp-includes/ms-functions.php @@ -726,7 +726,7 @@ function wpmu_validate_blog_signup( $blogname, $blog_title, $user = '' ) { * unless it's the user's own username. */ if ( username_exists( $blogname ) ) { - if ( ! is_object( $user ) || ( is_object( $user ) && ( $user->user_login !== $blogname ) ) ) { + if ( ! is_object( $user ) || ( is_object( $user ) && $user->user_login !== $blogname ) ) { $errors->add( 'blogname', __( 'Sorry, that site is reserved!' ) ); } } @@ -1632,7 +1632,8 @@ function wpmu_welcome_notification( $blog_id, $user_id, $password, $title, $meta $switched_locale = switch_to_user_locale( $user_id ); $welcome_email = get_site_option( 'welcome_email' ); - if ( false == $welcome_email ) { + + if ( ! $welcome_email ) { /* translators: Do not translate USERNAME, SITE_NAME, BLOG_URL, PASSWORD: those are placeholders. */ $welcome_email = __( 'Howdy USERNAME, From bb3f90f97423bacf31717c2095bfc78945a94222 Mon Sep 17 00:00:00 2001 From: Sergey Biryukov Date: Sun, 5 Jan 2025 22:10:39 +0000 Subject: [PATCH 072/117] Coding Standards: Use strict comparison in `get_pages()`. Follow-up to [4180], [49108]. Props aristath, poena, afercia, SergeyBiryukov. See #62279. git-svn-id: https://develop.svn.wordpress.org/trunk@59575 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/post.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wp-includes/post.php b/src/wp-includes/post.php index a197180d9e172..4d85ef2fb25d7 100644 --- a/src/wp-includes/post.php +++ b/src/wp-includes/post.php @@ -6354,7 +6354,7 @@ function get_pages( $args = array() ) { $query_args['author__in'] = array(); foreach ( $post_authors as $post_author ) { // Do we have an author id or an author login? - if ( 0 == (int) $post_author ) { + if ( 0 === (int) $post_author ) { $post_author = get_user_by( 'login', $post_author ); if ( empty( $post_author ) ) { continue; From 938d27abf2362bb77f731c4ccd13a52c31a36674 Mon Sep 17 00:00:00 2001 From: Peter Wilson Date: Sun, 5 Jan 2025 22:12:25 +0000 Subject: [PATCH 073/117] Comments: Noindex pages containing unapproved comments. Adds a `noindex` directive to pages displaying a preview of an unapproved comment, ie pages with both an `approved` and `moderation-hash` parameter. This is to prevent the pages from appearing in search engines which can be the case if they ignore the canonical URL directive. Props peterwilsoncc, flixos90, joostdevalk. Fixes #62760. git-svn-id: https://develop.svn.wordpress.org/trunk@59576 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/default-filters.php | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/wp-includes/default-filters.php b/src/wp-includes/default-filters.php index 9eff6ecbeb67a..575e8a91758f1 100644 --- a/src/wp-includes/default-filters.php +++ b/src/wp-includes/default-filters.php @@ -366,7 +366,13 @@ add_action( 'wp_enqueue_scripts', 'wp_enqueue_emoji_styles' ); add_action( 'wp_print_styles', 'print_emoji_styles' ); // Retained for backwards-compatibility. Unhooked by wp_enqueue_emoji_styles(). -if ( isset( $_GET['replytocom'] ) ) { +if ( + // Comment reply link. + isset( $_GET['replytocom'] ) + || + // Unapproved comment preview. + ( isset( $_GET['unapproved'] ) && isset( $_GET['moderation-hash'] ) ) +) { add_filter( 'wp_robots', 'wp_robots_no_robots' ); } From d6aa0438536bb5d12ca3c8e9c2fa5a84fb083dc1 Mon Sep 17 00:00:00 2001 From: Pascal Birchler Date: Mon, 6 Jan 2025 10:29:09 +0000 Subject: [PATCH 074/117] Build/Test Tools: Expand performance tests setup. Run tests against Multisite (possible since [58097]) and on single post pages. Also improve cache flushes/resets between iterations. Props swissspidy, flixos90, desrosj, mukesh27. Fixes #62725. git-svn-id: https://develop.svn.wordpress.org/trunk@59577 602fd350-edb4-49c9-b593-d223f7449a82 --- .github/workflows/performance.yml | 4 +- .github/workflows/reusable-performance.yml | 28 +++++-- tests/performance/compare-results.js | 6 +- tests/performance/log-results.js | 14 +++- tests/performance/specs/admin.test.js | 9 ++- tests/performance/specs/home.test.js | 12 +-- tests/performance/specs/single-post.test.js | 79 +++++++++++++++++++ tests/performance/utils.js | 6 ++ .../wp-content/mu-plugins/clear-cache.php | 27 +++++++ 9 files changed, 164 insertions(+), 21 deletions(-) create mode 100644 tests/performance/specs/single-post.test.js create mode 100644 tests/performance/wp-content/mu-plugins/clear-cache.php diff --git a/.github/workflows/performance.yml b/.github/workflows/performance.yml index dba6091a5547a..dbb672a30da39 100644 --- a/.github/workflows/performance.yml +++ b/.github/workflows/performance.yml @@ -32,7 +32,7 @@ permissions: {} jobs: # Runs the performance test suite. performance: - name: Performance tests ${{ matrix.memcached && '(with memcached)' || '' }} + name: ${{ matrix.multisite && 'Multisite' || 'Single site' }} uses: WordPress/wordpress-develop/.github/workflows/reusable-performance.yml@trunk permissions: contents: read @@ -41,8 +41,10 @@ jobs: fail-fast: false matrix: memcached: [ true, false ] + multisite: [ true, false ] with: memcached: ${{ matrix.memcached }} + multisite: ${{ matrix.multisite }} secrets: CODEVITALS_PROJECT_TOKEN: ${{ secrets.CODEVITALS_PROJECT_TOKEN }} diff --git a/.github/workflows/reusable-performance.yml b/.github/workflows/reusable-performance.yml index e5c29aa0b1849..61c40b80a41db 100644 --- a/.github/workflows/reusable-performance.yml +++ b/.github/workflows/reusable-performance.yml @@ -1,7 +1,7 @@ ## # A reusable workflow that runs the performance test suite. ## -name: Performance Tests +name: Run performance Tests on: workflow_call: @@ -26,6 +26,11 @@ on: required: false type: 'boolean' default: false + multisite: + description: 'Whether to use Multisite.' + required: false + type: 'boolean' + default: false secrets: CODEVITALS_PROJECT_TOKEN: description: 'The authorization token for https://www.codevitals.run/project/wordpress.' @@ -53,6 +58,7 @@ env: LOCAL_PHP_MEMCACHED: ${{ inputs.memcached }} LOCAL_PHP: ${{ inputs.php-version }}${{ 'latest' != inputs.php-version && '-fpm' || '' }} + LOCAL_MULTISITE: ${{ inputs.multisite }} jobs: # Performs the following steps: @@ -65,9 +71,11 @@ jobs: # - Install Playwright browsers. # - Build WordPress. # - Start Docker environment. + # - Install object cache drop-in. # - Log running Docker containers. # - Docker debug information. # - Install WordPress. + # - Enable themes on Multisite. # - Install WordPress Importer plugin. # - Import mock data. # - Deactivate WordPress Importer plugin. @@ -98,7 +106,7 @@ jobs: # - Publish performance results. # - Ensure version-controlled files are not modified or deleted. performance: - name: Run tests + name: ${{ inputs.multisite && 'Multisite' || 'Single site' }} / ${{ inputs.memcached && 'Memcached' || 'Default' }} runs-on: ubuntu-latest permissions: contents: read @@ -166,6 +174,14 @@ jobs: - name: Install WordPress run: npm run env:install + - name: Enable themes on Multisite + if: ${{ inputs.multisite }} + run: | + npm run env:cli -- theme enable twentytwentyone --network --path=/var/www/${{ env.LOCAL_DIR }} + npm run env:cli -- theme enable twentytwentythree --network --path=/var/www/${{ env.LOCAL_DIR }} + npm run env:cli -- theme enable twentytwentyfour --network --path=/var/www/${{ env.LOCAL_DIR }} + npm run env:cli -- theme enable twentytwentyfive --network --path=/var/www/${{ env.LOCAL_DIR }} + - name: Install WordPress Importer plugin run: npm run env:cli -- plugin install wordpress-importer --activate --path=/var/www/${{ env.LOCAL_DIR }} @@ -290,7 +306,7 @@ jobs: uses: actions/upload-artifact@b4b15b8c7c6ac21ea08fcf65892d2ee8f75cf882 # v4.4.3 if: always() with: - name: performance-artifacts${{ inputs.memcached && '-memcached' || '' }}-${{ github.run_id }} + name: performance-artifacts${{ inputs.multisite && '-multisite' || '' }}${{ inputs.memcached && '-memcached' || '' }}-${{ github.run_id }} path: artifacts if-no-files-found: ignore include-hidden-files: true @@ -303,7 +319,7 @@ jobs: - name: Set the base sha # Only needed when publishing results. - if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/trunk' && ! inputs.memcached }} + if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/trunk' && ! inputs.memcached && ! inputs.multisite }} uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 id: base-sha with: @@ -314,7 +330,7 @@ jobs: - name: Set commit details # Only needed when publishing results. - if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/trunk' && ! inputs.memcached }} + if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/trunk' && ! inputs.memcached && ! inputs.multisite }} uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 id: commit-timestamp with: @@ -325,7 +341,7 @@ jobs: - name: Publish performance results # Only publish results on pushes to trunk. - if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/trunk' && ! inputs.memcached }} + if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/trunk' && ! inputs.memcached && ! inputs.multisite }} env: BASE_SHA: ${{ steps.base-sha.outputs.result }} COMMITTED_AT: ${{ steps.commit-timestamp.outputs.result }} diff --git a/tests/performance/compare-results.js b/tests/performance/compare-results.js index c9d51e1a11117..c47de270f0727 100644 --- a/tests/performance/compare-results.js +++ b/tests/performance/compare-results.js @@ -96,6 +96,8 @@ if ( process.env.GITHUB_SHA ) { ); } +summaryMarkdown += `
    Results`; + for ( const { title, results } of afterStats ) { const prevStat = beforeStats.find( ( s ) => s.title === title ); @@ -143,10 +145,12 @@ for ( const { title, results } of afterStats ) { console.log( '(no results)' ); } - summaryMarkdown += `**${ title }**\n\n`; + summaryMarkdown += `${ title }\n\n`; summaryMarkdown += `${ formatAsMarkdownTable( rows ) }\n`; } +summaryMarkdown += `
    `; + writeFileSync( join( process.env.WP_ARTIFACTS_PATH, '/performance-results.md' ), summaryMarkdown diff --git a/tests/performance/log-results.js b/tests/performance/log-results.js index 581c0d39868b5..3612780bb361f 100644 --- a/tests/performance/log-results.js +++ b/tests/performance/log-results.js @@ -18,12 +18,18 @@ const { median, parseFile, accumulateValues } = require( './utils' ); const testSuiteMap = { 'Admin › Locale: en_US': 'admin', 'Admin › Locale: de_DE': 'admin-l10n', - 'Front End › Theme: twentytwentyone, Locale: en_US': 'home-classic-theme', - 'Front End › Theme: twentytwentyone, Locale: de_DE': + 'Homepage › Theme: twentytwentyone, Locale: en_US': 'home-classic-theme', + 'Homepage › Theme: twentytwentyone, Locale: de_DE': 'home-classic-theme-l10n', - 'Front End › Theme: twentytwentythree, Locale: en_US': 'home-block-theme', - 'Front End › Theme: twentytwentythree, Locale: de_DE': + 'Homepage › Theme: twentytwentythree, Locale: en_US': 'home-block-theme', + 'Homepage › Theme: twentytwentythree, Locale: de_DE': 'home-block-theme-l10n', + 'Homepage › Theme: twentytwentyfour, Locale: en_US': 'home-twentytwentyfour', + 'Homepage › Theme: twentytwentyfour, Locale: de_DE': + 'home-twentytwentyfour-l10n', + 'Homepage › Theme: twentytwentyfive, Locale: en_US': 'home-twentytwentyfive', + 'Homepage › Theme: twentytwentyfive, Locale: de_DE': + 'home-twentytwentyfive-l10n', }; /** diff --git a/tests/performance/specs/admin.test.js b/tests/performance/specs/admin.test.js index 36bdd9c628aa1..3414fdd3dbed9 100644 --- a/tests/performance/specs/admin.test.js +++ b/tests/performance/specs/admin.test.js @@ -6,14 +6,12 @@ import { test } from '@wordpress/e2e-test-utils-playwright'; /** * Internal dependencies */ -import { camelCaseDashes } from '../utils'; +import { camelCaseDashes, locales } from '../utils'; const results = { timeToFirstByte: [], }; -const locales = [ 'en_US', 'de_DE' ]; - test.describe( 'Admin', () => { for ( const locale of locales ) { test.describe( `Locale: ${ locale }`, () => { @@ -47,9 +45,14 @@ test.describe( 'Admin', () => { const iterations = Number( process.env.TEST_RUNS ); for ( let i = 1; i <= iterations; i++ ) { test( `Measure load time metrics (${ i } of ${ iterations })`, async ( { + page, admin, metrics, } ) => { + // Clear caches using the clear-cache.php mu-plugin. Not actually loading the page. + await page.goto( '/?clear_cache' ); + + // This is the actual page to test. await admin.visitAdminPage( '/' ); const serverTiming = await metrics.getServerTiming(); diff --git a/tests/performance/specs/home.test.js b/tests/performance/specs/home.test.js index 004c8f03debd4..cd3de40518fe3 100644 --- a/tests/performance/specs/home.test.js +++ b/tests/performance/specs/home.test.js @@ -6,7 +6,7 @@ import { test } from '@wordpress/e2e-test-utils-playwright'; /** * Internal dependencies */ -import { camelCaseDashes } from '../utils'; +import { camelCaseDashes, themes, locales } from '../utils'; const results = { timeToFirstByte: [], @@ -14,11 +14,7 @@ const results = { lcpMinusTtfb: [], }; -const themes = [ 'twentytwentyone', 'twentytwentythree', 'twentytwentyfour', 'twentytwentyfive' ]; - -const locales = [ 'en_US', 'de_DE' ]; - -test.describe( 'Front End', () => { +test.describe( 'Homepage', () => { test.use( { storageState: {}, // User will be logged out. } ); @@ -54,6 +50,10 @@ test.describe( 'Front End', () => { page, metrics, } ) => { + // Clear caches using the clear-cache.php mu-plugin. Not actually loading the page. + await page.goto( '/?clear_cache' ); + + // This is the actual page to test. await page.goto( '/' ); const serverTiming = await metrics.getServerTiming(); diff --git a/tests/performance/specs/single-post.test.js b/tests/performance/specs/single-post.test.js new file mode 100644 index 0000000000000..dbdf6916ef2fd --- /dev/null +++ b/tests/performance/specs/single-post.test.js @@ -0,0 +1,79 @@ +/** + * WordPress dependencies + */ +import { test } from '@wordpress/e2e-test-utils-playwright'; + +/** + * Internal dependencies + */ +import { camelCaseDashes, themes, locales } from '../utils'; + +const results = { + timeToFirstByte: [], + largestContentfulPaint: [], + lcpMinusTtfb: [], +}; + +test.describe( 'Single Post', () => { + test.use( { + storageState: {}, // User will be logged out. + } ); + + for ( const theme of themes ) { + for ( const locale of locales ) { + test.describe( `Theme: ${ theme }, Locale: ${ locale }`, () => { + test.beforeAll( async ( { requestUtils } ) => { + await requestUtils.activateTheme( theme ); + await requestUtils.updateSiteSettings( { + language: 'en_US' === locale ? '' : locale, + } ); + } ); + + test.afterAll( async ( { requestUtils }, testInfo ) => { + await testInfo.attach( 'results', { + body: JSON.stringify( results, null, 2 ), + contentType: 'application/json', + } ); + + await requestUtils.updateSiteSettings( { + language: '', + } ); + + results.largestContentfulPaint = []; + results.timeToFirstByte = []; + results.lcpMinusTtfb = []; + } ); + + const iterations = Number( process.env.TEST_RUNS ); + for ( let i = 1; i <= iterations; i++ ) { + test( `Measure load time metrics (${ i } of ${ iterations })`, async ( { + page, + metrics, + } ) => { + // Clear caches using the clear-cache.php mu-plugin. Not actually loading the page. + await page.goto( '/?clear_cache' ); + + // This is the actual page to test. + await page.goto( '/2018/11/03/block-image/' ); + + const serverTiming = await metrics.getServerTiming(); + + for ( const [ key, value ] of Object.entries( + serverTiming + ) ) { + results[ camelCaseDashes( key ) ] ??= []; + results[ camelCaseDashes( key ) ].push( value ); + } + + const ttfb = await metrics.getTimeToFirstByte(); + const lcp = await metrics.getLargestContentfulPaint(); + + results.largestContentfulPaint.push( lcp ); + results.timeToFirstByte.push( ttfb ); + results.lcpMinusTtfb.push( lcp - ttfb ); + } ); + } + } ); + } + } +} ); diff --git a/tests/performance/utils.js b/tests/performance/utils.js index 4d023be586048..b7481dfd67605 100644 --- a/tests/performance/utils.js +++ b/tests/performance/utils.js @@ -6,6 +6,10 @@ const { join } = require( 'node:path' ); process.env.WP_ARTIFACTS_PATH ??= join( process.cwd(), 'artifacts' ); +const locales = [ 'en_US', 'de_DE' ]; + +const themes = [ 'twentytwentyone', 'twentytwentythree', 'twentytwentyfour', 'twentytwentyfive' ]; + /** * Parse test files into JSON objects. * @@ -189,4 +193,6 @@ module.exports = { standardDeviation, medianAbsoluteDeviation, accumulateValues, + themes, + locales, }; diff --git a/tests/performance/wp-content/mu-plugins/clear-cache.php b/tests/performance/wp-content/mu-plugins/clear-cache.php new file mode 100644 index 0000000000000..4d6ff4ea2c586 --- /dev/null +++ b/tests/performance/wp-content/mu-plugins/clear-cache.php @@ -0,0 +1,27 @@ + Date: Mon, 6 Jan 2025 15:21:26 +0000 Subject: [PATCH 075/117] Security: Enhance the `wp_hash()` function to support custom hashing algorithms. The default algorithm remains as md5, but this change allows any algorithm that's supported by `hash_hmac()` to be used instead. Props pushpenderindia, ayeshrajans, debarghyabanerjee, johnbillion Fixes #62005 git-svn-id: https://develop.svn.wordpress.org/trunk@59578 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/pluggable.php | 26 +++++++++++-- tests/phpunit/tests/functions/wpHash.php | 39 ++++++++++++++++++++ tests/phpunit/tests/pluggable/signatures.php | 1 + 3 files changed, 63 insertions(+), 3 deletions(-) create mode 100644 tests/phpunit/tests/functions/wpHash.php diff --git a/src/wp-includes/pluggable.php b/src/wp-includes/pluggable.php index 3dd629fa1990c..d0b2d3602a980 100644 --- a/src/wp-includes/pluggable.php +++ b/src/wp-includes/pluggable.php @@ -2581,18 +2581,38 @@ function wp_salt( $scheme = 'auth' ) { if ( ! function_exists( 'wp_hash' ) ) : /** - * Gets hash of given string. + * Gets the hash of the given string. + * + * The default algorithm is md5 but can be changed to any algorithm supported by + * `hash_hmac()`. Use the `hash_hmac_algos()` function to check the supported + * algorithms. * * @since 2.0.3 + * @since 6.8.0 The `$algo` parameter was added. + * + * @throws InvalidArgumentException if the hashing algorithm is not supported. * * @param string $data Plain text to hash. * @param string $scheme Authentication scheme (auth, secure_auth, logged_in, nonce). + * @param string $algo Hashing algorithm to use. Default: 'md5'. * @return string Hash of $data. */ - function wp_hash( $data, $scheme = 'auth' ) { + function wp_hash( $data, $scheme = 'auth', $algo = 'md5' ) { $salt = wp_salt( $scheme ); - return hash_hmac( 'md5', $data, $salt ); + // Ensure the algorithm is supported by the hash_hmac function. + if ( ! in_array( $algo, hash_hmac_algos(), true ) ) { + throw new InvalidArgumentException( + sprintf( + /** translators: 1: Name of a cryptographic hash algorithm. 2: List of supported algorithms. */ + __( 'Unsupported hashing algorithm: %1$s. Supported algorithms are: %2$s' ), + $algo, + implode( ', ', hash_hmac_algos() ) + ) + ); + } + + return hash_hmac( $algo, $data, $salt ); } endif; diff --git a/tests/phpunit/tests/functions/wpHash.php b/tests/phpunit/tests/functions/wpHash.php new file mode 100644 index 0000000000000..63744b188dace --- /dev/null +++ b/tests/phpunit/tests/functions/wpHash.php @@ -0,0 +1,39 @@ +assertSame( $expected_length, strlen( $hash ) ); + } + + public function data_wp_hash_uses_specified_algorithm() { + return array( + array( 'md5', 32 ), + array( 'sha1', 40 ), + array( 'sha256', 64 ), + ); + } + + /** + * @ticket 62005 + */ + public function test_wp_hash_throws_exception_on_invalid_algorithm() { + $this->expectException( 'InvalidArgumentException' ); + + wp_hash( 'data', 'auth', 'invalid' ); + } +} diff --git a/tests/phpunit/tests/pluggable/signatures.php b/tests/phpunit/tests/pluggable/signatures.php index 81fd079621916..8ac1dfb6966b6 100644 --- a/tests/phpunit/tests/pluggable/signatures.php +++ b/tests/phpunit/tests/pluggable/signatures.php @@ -209,6 +209,7 @@ public function get_pluggable_function_signatures() { 'wp_hash' => array( 'data', 'scheme' => 'auth', + 'algo' => 'md5', ), 'wp_hash_password' => array( 'password' ), 'wp_check_password' => array( From 375af8c6c6fe222fc4dacad6eed16f31a68061d7 Mon Sep 17 00:00:00 2001 From: Sergey Biryukov Date: Mon, 6 Jan 2025 15:58:50 +0000 Subject: [PATCH 076/117] Tests: Improve the test for the copyright year in bundled themes' `readme.txt`. This aims to catch entries like `(C) 2024 WordPress.org` in addition to `Copyright 2024 WordPress.org`. Includes converting the test to use a data provider, so that messages could be displayed for each individual theme. Follow-up to [46719], [59569]. See #62280. git-svn-id: https://develop.svn.wordpress.org/trunk@59579 602fd350-edb4-49c9-b593-d223f7449a82 --- tests/phpunit/tests/theme.php | 40 ++++++++++++++++++----------------- 1 file changed, 21 insertions(+), 19 deletions(-) diff --git a/tests/phpunit/tests/theme.php b/tests/phpunit/tests/theme.php index 248aaa833a02f..c18c4d434f44b 100644 --- a/tests/phpunit/tests/theme.php +++ b/tests/phpunit/tests/theme.php @@ -302,36 +302,38 @@ public function test_default_themes_have_textdomain() { /** * @ticket 48566 + * + * @dataProvider data_year_in_readme */ - public function test_year_in_readme() { + public function test_year_in_readme( $theme ) { // This test is designed to only run on trunk. $this->skipOnAutomatedBranches(); - foreach ( $this->default_themes as $theme ) { - $wp_theme = wp_get_theme( $theme ); - - $path_to_readme_txt = $wp_theme->get_theme_root() . '/' . $wp_theme->get_stylesheet() . '/readme.txt'; - $this->assertFileExists( $path_to_readme_txt ); + $wp_theme = wp_get_theme( $theme ); - $readme = file_get_contents( $path_to_readme_txt ); - $this_year = gmdate( 'Y' ); + $path_to_readme_txt = $wp_theme->get_theme_root() . '/' . $wp_theme->get_stylesheet() . '/readme.txt'; + $this->assertFileExists( $path_to_readme_txt ); - preg_match( '#Copyright (\d+) WordPress.org#', $readme, $matches ); - if ( $matches ) { - $readme_year = trim( $matches[1] ); + $readme = file_get_contents( $path_to_readme_txt ); + $this_year = gmdate( 'Y' ); - $this->assertSame( $this_year, $readme_year, "Bundled themes readme.txt's year needs to be updated to $this_year." ); - } - - preg_match( '#Copyright 20\d\d-(\d+) WordPress.org#', $readme, $matches ); - if ( $matches ) { - $readme_year = trim( $matches[1] ); + preg_match( '#(Copyright|\(C\)) (20\d\d-)?(\d+) WordPress.org#i', $readme, $matches ); + if ( $matches ) { + $readme_year = trim( $matches[3] ); - $this->assertSame( $this_year, $readme_year, "Bundled themes readme.txt's year needs to be updated to $this_year." ); - } + $this->assertSame( $this_year, $readme_year, "$theme readme.txt's year needs to be updated to $this_year." ); } } + public function data_year_in_readme() { + return array_map( + static function ( $theme ) { + return array( $theme ); + }, + $this->default_themes + ); + } + /** * @ticket 20897 * @expectedDeprecated get_theme_data From d49258b6f77d2dbeba9846a71bc474c2ec9a7690 Mon Sep 17 00:00:00 2001 From: Kelly Choyce-Dwan Date: Mon, 6 Jan 2025 16:18:25 +0000 Subject: [PATCH 077/117] Help/About: Allow "See everything new" button to wrap On some screen sizes and languages, the "See everything new" button expands out of the content area. This change allows the button to wrap at all screen sizes, and updates the style of this button for wrapped text. Props franciscabusas22, sabernhardt, yogeshbhutka, sainathpoojary, im3dabasia1, audrasjb. Fixes #62380. git-svn-id: https://develop.svn.wordpress.org/trunk@59580 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-admin/css/about.css | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/wp-admin/css/about.css b/src/wp-admin/css/about.css index 79f0254ad33b8..70af0337307ab 100644 --- a/src/wp-admin/css/about.css +++ b/src/wp-admin/css/about.css @@ -454,7 +454,12 @@ } .about__section a.button.button-hero { + padding-top: 1.1875rem; + padding-bottom: 1.1875rem; font-size: 1.5rem; + line-height: 1.4; + white-space: normal; + text-wrap: pretty; } .about__container ul { From 4a9a928dbcd1c91d3633c8de51614dd90d8ea0ac Mon Sep 17 00:00:00 2001 From: Felix Arntz Date: Mon, 6 Jan 2025 21:19:51 +0000 Subject: [PATCH 078/117] Build/Test Tools: Fix incorrect commit time being reported to WordPress Code Vitals Dashboard. 2nd attempt of [59570]. Props mukesh27, ayeshrajans, swissspidy, desrosj. Fixes #62766. git-svn-id: https://develop.svn.wordpress.org/trunk@59582 602fd350-edb4-49c9-b593-d223f7449a82 --- .github/workflows/reusable-performance.yml | 10 ++-------- tests/performance/log-results.js | 4 ++-- 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/.github/workflows/reusable-performance.yml b/.github/workflows/reusable-performance.yml index 61c40b80a41db..f75cb6b3e4969 100644 --- a/.github/workflows/reusable-performance.yml +++ b/.github/workflows/reusable-performance.yml @@ -331,20 +331,14 @@ jobs: - name: Set commit details # Only needed when publishing results. if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/trunk' && ! inputs.memcached && ! inputs.multisite }} - uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 - id: commit-timestamp - with: - github-token: ${{ secrets.GITHUB_TOKEN }} - script: | - const commit_details = await github.rest.git.getCommit({ owner: context.repo.owner, repo: context.repo.repo, commit_sha: context.sha }); - return parseInt((new Date( commit_details.data.author.date ).getTime() / 1000).toFixed(0)) + # Write to an environment variable to have the output available in later steps of the job. + run: echo "COMMITTED_AT=$(git show -s $GITHUB_SHA --format='%cI')" >> $GITHUB_ENV - name: Publish performance results # Only publish results on pushes to trunk. if: ${{ github.event_name == 'push' && github.ref == 'refs/heads/trunk' && ! inputs.memcached && ! inputs.multisite }} env: BASE_SHA: ${{ steps.base-sha.outputs.result }} - COMMITTED_AT: ${{ steps.commit-timestamp.outputs.result }} CODEVITALS_PROJECT_TOKEN: ${{ secrets.CODEVITALS_PROJECT_TOKEN }} HOST_NAME: "www.codevitals.run" run: | diff --git a/tests/performance/log-results.js b/tests/performance/log-results.js index 3612780bb361f..f8214b68d4eb3 100644 --- a/tests/performance/log-results.js +++ b/tests/performance/log-results.js @@ -11,7 +11,7 @@ * External dependencies. */ const https = require( 'https' ); -const [ token, branch, hash, baseHash, timestamp, host ] = +const [ token, branch, hash, baseHash, date, host ] = process.argv.slice( 2 ); const { median, parseFile, accumulateValues } = require( './utils' ); @@ -87,7 +87,7 @@ const data = new TextEncoder().encode( branch, hash, baseHash, - timestamp: parseInt( timestamp, 10 ), + timestamp: date, metrics: metrics, baseMetrics: baseMetrics, } ) From d0e1e903fbfbd232f3032e74f6846acb0865d93c Mon Sep 17 00:00:00 2001 From: Jonathan Desrosiers Date: Tue, 7 Jan 2025 15:40:19 +0000 Subject: [PATCH 079/117] Tests: Fix `explode()` error for old DB versions on PHP 8.1+. On MySQL/MariaDB 5.5, the default value for `sql_mode` was a blank string. By itself this is not a problem. However, `$wpdb->get_var()` returns `null` when a variable has an empty value. One test method currently passes the result of `$wpdb->get_var( 'SELECT @@SESSION.sql_mode;' )` to `explode()` in order to reset the database to the pre-test method state. This causes an error when running PHP 8.1+, which deprecated the ability to pass `null` as a parameter of `explode()`. This edge case was undiscovered because these versions are not currently included in the automated testing matrix. See #62280. git-svn-id: https://develop.svn.wordpress.org/trunk@59583 602fd350-edb4-49c9-b593-d223f7449a82 --- tests/phpunit/tests/db.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/phpunit/tests/db.php b/tests/phpunit/tests/db.php index 3e06afcc1bf2c..57f5db65a2f5a 100644 --- a/tests/phpunit/tests/db.php +++ b/tests/phpunit/tests/db.php @@ -296,7 +296,7 @@ public function test_set_sql_mode() { $check_new_modes = $wpdb->get_var( 'SELECT @@SESSION.sql_mode;' ); $this->assertSameSets( $new_modes, explode( ',', $check_new_modes ) ); - $wpdb->set_sql_mode( explode( ',', $current_modes ) ); + $wpdb->set_sql_mode( empty( $current_modes ) ? array() : explode( ',', $current_modes ) ); } /** From 0134aa371e45a9dbe67aa1e8cc8908eb6fcd92e2 Mon Sep 17 00:00:00 2001 From: Sergey Biryukov Date: Tue, 7 Jan 2025 15:46:25 +0000 Subject: [PATCH 080/117] Coding Standards: Use strict comparison in `wp_check_for_changed_slugs()`. Follow-up to [4556], [4637], [34685]. Props aristath, poena, afercia, SergeyBiryukov. See #62279. git-svn-id: https://develop.svn.wordpress.org/trunk@59584 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/post.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/wp-includes/post.php b/src/wp-includes/post.php index 4d85ef2fb25d7..6d225470d2b4e 100644 --- a/src/wp-includes/post.php +++ b/src/wp-includes/post.php @@ -7207,12 +7207,14 @@ function wp_mime_type_icon( $mime = 0, $preferred_ext = '.png' ) { */ function wp_check_for_changed_slugs( $post_id, $post, $post_before ) { // Don't bother if it hasn't changed. - if ( $post->post_name == $post_before->post_name ) { + if ( $post->post_name === $post_before->post_name ) { return; } // We're only concerned with published, non-hierarchical objects. - if ( ! ( 'publish' === $post->post_status || ( 'attachment' === get_post_type( $post ) && 'inherit' === $post->post_status ) ) || is_post_type_hierarchical( $post->post_type ) ) { + if ( ! ( 'publish' === $post->post_status || ( 'attachment' === $post->post_type && 'inherit' === $post->post_status ) ) + || is_post_type_hierarchical( $post->post_type ) + ) { return; } From 615b03f51ad6e090af3d6e4fb6dc6cf69b4cf3ce Mon Sep 17 00:00:00 2001 From: Jonathan Desrosiers Date: Tue, 7 Jan 2025 15:51:30 +0000 Subject: [PATCH 081/117] Build/Test Tools: Test against MySQL 9.1. This is the latest innovation release from MySQL. Props johnbillion, jorbin. See #62221. git-svn-id: https://develop.svn.wordpress.org/trunk@59585 602fd350-edb4-49c9-b593-d223f7449a82 --- .github/workflows/install-testing.yml | 6 ++++-- .github/workflows/local-docker-environment.yml | 6 ++++-- .github/workflows/phpunit-tests.yml | 6 +++--- .version-support-mysql.json | 1 + 4 files changed, 12 insertions(+), 7 deletions(-) diff --git a/.github/workflows/install-testing.yml b/.github/workflows/install-testing.yml index f40f044586c88..f347958e8b4ae 100644 --- a/.github/workflows/install-testing.yml +++ b/.github/workflows/install-testing.yml @@ -90,11 +90,13 @@ jobs: db-version: '8.4' - php: '7.3' db-version: '8.4' + # Only test the latest innovation release. + - db-version: '9.0' # MySQL 9.0+ will not work on PHP 7.2 & 7.3. See https://core.trac.wordpress.org/ticket/61218. - php: '7.2' - db-version: '9.0' + db-version: '9.1' - php: '7.3' - db-version: '9.0' + db-version: '9.1' services: database: diff --git a/.github/workflows/local-docker-environment.yml b/.github/workflows/local-docker-environment.yml index 17d078198c009..09b212e90ead5 100644 --- a/.github/workflows/local-docker-environment.yml +++ b/.github/workflows/local-docker-environment.yml @@ -90,11 +90,13 @@ jobs: exclude: # MySQL containers <= 5.5 do not exist or fail to start properly. - db-version: '5.5' + # Only test the latest innovation release. + - db-version: '9.0' # MySQL 9.0+ will not work on PHP 7.2 & 7.3. See https://core.trac.wordpress.org/ticket/61218. - php: '7.2' - db-version: '9.0' + db-version: '9.1' - php: '7.3' - db-version: '9.0' + db-version: '9.1' with: os: ${{ matrix.os }} diff --git a/.github/workflows/phpunit-tests.yml b/.github/workflows/phpunit-tests.yml index 3ea45fcdc331e..89f4c0ab64ff8 100644 --- a/.github/workflows/phpunit-tests.yml +++ b/.github/workflows/phpunit-tests.yml @@ -47,7 +47,7 @@ jobs: os: [ ubuntu-latest ] php: [ '7.2', '7.3', '7.4', '8.0', '8.1', '8.2', '8.3', '8.4' ] db-type: [ 'mysql' ] - db-version: [ '5.7', '8.0', '8.4', '9.0' ] + db-version: [ '5.7', '8.0', '8.4', '9.1' ] tests-domain: [ 'example.org' ] multisite: [ false, true ] memcached: [ false ] @@ -95,9 +95,9 @@ jobs: exclude: # MySQL 9.0+ will not work on PHP 7.2 & 7.3. See https://core.trac.wordpress.org/ticket/61218. - php: '7.2' - db-version: '9.0' + db-version: '9.1' - php: '7.3' - db-version: '9.0' + db-version: '9.1' with: os: ${{ matrix.os }} diff --git a/.version-support-mysql.json b/.version-support-mysql.json index f6cffac449cae..8616ffb294e43 100644 --- a/.version-support-mysql.json +++ b/.version-support-mysql.json @@ -1,5 +1,6 @@ { "6-8": [ + "9.1", "9.0", "8.4", "8.0", From 8c45570f5acaa9c46c77fb0f9749c2b681bafa7a Mon Sep 17 00:00:00 2001 From: Jonathan Desrosiers Date: Tue, 7 Jan 2025 15:57:22 +0000 Subject: [PATCH 082/117] Build/Test Tools: Test MariaDB innovation releases. MariaDB also follows the innovation release model. This adds testing for these releases to the test matrix and moves innovation versions to a new job in order to more clearly differentiate from LTS ones. The current innovation release for MariaDB is `11.6`. Props johnbillion, jorbin. See #62221. git-svn-id: https://develop.svn.wordpress.org/trunk@59586 602fd350-edb4-49c9-b593-d223f7449a82 --- .github/workflows/phpunit-tests.yml | 61 ++++++++++++++++--- .../workflows/reusable-phpunit-tests-v3.yml | 7 ++- 2 files changed, 57 insertions(+), 11 deletions(-) diff --git a/.github/workflows/phpunit-tests.yml b/.github/workflows/phpunit-tests.yml index 89f4c0ab64ff8..81d9520b7021b 100644 --- a/.github/workflows/phpunit-tests.yml +++ b/.github/workflows/phpunit-tests.yml @@ -47,7 +47,7 @@ jobs: os: [ ubuntu-latest ] php: [ '7.2', '7.3', '7.4', '8.0', '8.1', '8.2', '8.3', '8.4' ] db-type: [ 'mysql' ] - db-version: [ '5.7', '8.0', '8.4', '9.1' ] + db-version: [ '5.7', '8.0', '8.4' ] tests-domain: [ 'example.org' ] multisite: [ false, true ] memcached: [ false ] @@ -91,14 +91,6 @@ jobs: multisite: false memcached: false report: true - - exclude: - # MySQL 9.0+ will not work on PHP 7.2 & 7.3. See https://core.trac.wordpress.org/ticket/61218. - - php: '7.2' - db-version: '9.1' - - php: '7.3' - db-version: '9.1' - with: os: ${{ matrix.os }} php: ${{ matrix.php }} @@ -154,6 +146,55 @@ jobs: phpunit-config: ${{ matrix.multisite && 'tests/phpunit/multisite.xml' || 'phpunit.xml.dist' }} report: ${{ matrix.report || false }} + # + # Creates PHPUnit test jobs to test MariaDB and MySQL innovation releases. + # + # Though innovation releases are deemed "production grade" and never receive LTS status, they include new features + # and updates that will be included in the next LTS version. + # + # Because upstream support for innovation releases gets dropped when a new one is released, only the most recent + # innovation version is tested. + # + test-innovation-releases: + name: PHP ${{ matrix.php }} + uses: WordPress/wordpress-develop/.github/workflows/reusable-phpunit-tests-v3.yml@trunk + permissions: + contents: read + secrets: inherit + if: ${{ github.repository == 'WordPress/wordpress-develop' || github.event_name == 'pull_request' }} + strategy: + fail-fast: false + matrix: + os: [ ubuntu-latest ] + php: [ '7.2', '7.3', '7.4', '8.0', '8.1', '8.2', '8.3', '8.4' ] + db-type: [ 'mysql', 'mariadb' ] + db-version: [ '9.1', '11.6' ] + multisite: [ false, true ] + memcached: [ false ] + db-innovation: [ true ] + + exclude: + # MySQL 9.0+ will not work on PHP <= 7.3 because mysql_native_password was removed. See https://core.trac.wordpress.org/ticket/61218. + - php: '7.2' + db-version: '9.1' + - php: '7.3' + db-version: '9.1' + # Exclude version combinations that don't exist. + - db-type: 'mariadb' + db-version: '9.1' + - db-type: 'mysql' + db-version: '11.6' + with: + os: ${{ matrix.os }} + php: ${{ matrix.php }} + db-type: ${{ matrix.db-type }} + db-version: ${{ matrix.db-version }} + db-innovation: ${{ matrix.db-innovation }} + multisite: ${{ matrix.multisite }} + memcached: ${{ matrix.memcached }} + phpunit-config: ${{ matrix.multisite && 'tests/phpunit/multisite.xml' || 'phpunit.xml.dist' }} + report: ${{ matrix.report || false }} + # # Runs specific individual test groups. # @@ -183,7 +224,7 @@ jobs: permissions: actions: read contents: read - needs: [ test-with-mysql, test-with-mariadb, specific-test-groups ] + needs: [ test-with-mysql, test-with-mariadb, test-innovation-releases, specific-test-groups ] if: ${{ github.repository == 'WordPress/wordpress-develop' && github.event_name != 'pull_request' && always() }} with: calling_status: ${{ contains( needs.*.result, 'cancelled' ) && 'cancelled' || contains( needs.*.result, 'failure' ) && 'failure' || 'success' }} diff --git a/.github/workflows/reusable-phpunit-tests-v3.yml b/.github/workflows/reusable-phpunit-tests-v3.yml index cac3015af383a..3d26efa7026b2 100644 --- a/.github/workflows/reusable-phpunit-tests-v3.yml +++ b/.github/workflows/reusable-phpunit-tests-v3.yml @@ -27,6 +27,11 @@ on: required: false type: 'string' default: '8.4' + db-innovation: + description: 'Whether a database software innovation release is being tested.' + required: false + type: 'boolean' + default: false multisite: description: 'Whether to run tests as multisite' required: false @@ -105,7 +110,7 @@ jobs: # - Checks out the WordPress Test reporter repository. # - Submit the test results to the WordPress.org host test results. phpunit-tests: - name: ${{ inputs.phpunit-test-groups && format( '{0} / ', inputs.phpunit-test-groups ) || '' }}PHP ${{ inputs.php }} ${{ ! inputs.phpunit-test-groups && ! inputs.coverage-report && '/ ' || 'with ' }}${{ 'mariadb' == inputs.db-type && 'MariaDB' || 'MySQL' }} ${{ inputs.db-version }}${{ inputs.multisite && ' multisite' || '' }}${{ inputs.memcached && ' with memcached' || '' }}${{ inputs.report && ' (test reporting enabled)' || '' }} ${{ 'example.org' != inputs.tests-domain && inputs.tests-domain || '' }} + name: ${{ inputs.phpunit-test-groups && format( '{0} / ', inputs.phpunit-test-groups ) || '' }}PHP ${{ inputs.php }} ${{ ! inputs.phpunit-test-groups && ! inputs.coverage-report && '/ ' || 'with ' }}${{ 'mariadb' == inputs.db-type && 'MariaDB' || 'MySQL' }} ${{ inputs.db-version }}${{ inputs.multisite && ' multisite' || '' }}${{ inputs.db-innovation && ' (innovation release)' || '' }}${{ inputs.memcached && ' with memcached' || '' }}${{ inputs.report && ' (test reporting enabled)' || '' }} ${{ 'example.org' != inputs.tests-domain && inputs.tests-domain || '' }} runs-on: ${{ inputs.os }} timeout-minutes: ${{ inputs.coverage-report && 120 || 20 }} From 4cd96f7f5cad2f1099f6470e9b5677b0c7943b88 Mon Sep 17 00:00:00 2001 From: Jonathan Desrosiers Date: Tue, 7 Jan 2025 16:13:20 +0000 Subject: [PATCH 083/117] Build/Test Tools: Expand and improve MariaDB test matrix. The latest LTS version of MariaDB is 11.4, which is now included in the test matrix. This changeset also expands the test matrix to include all LTS versions of MariaDB with > 1% of usage on WordPress sites in the wild as reported by the stats page on WordPress.org. Though a few of these are unsupported upstream, they are still supported in WordPress itself. MariaDB 5.5 is also included in the new matrix. Because it was intended as a drop-in replacement to MySQL at the time, this also brings some MySQL 5.5 testing into the matrix. This has not been regularly tested against since specific database versions were included due to the lack of a working Docker container. Props johnbillion, jorbin. See #62221. git-svn-id: https://develop.svn.wordpress.org/trunk@59587 602fd350-edb4-49c9-b593-d223f7449a82 --- .github/workflows/phpunit-tests.yml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.github/workflows/phpunit-tests.yml b/.github/workflows/phpunit-tests.yml index 81d9520b7021b..3fe069b709fea 100644 --- a/.github/workflows/phpunit-tests.yml +++ b/.github/workflows/phpunit-tests.yml @@ -118,7 +118,7 @@ jobs: os: [ ubuntu-latest ] php: [ '7.2', '7.3', '7.4', '8.0', '8.1', '8.2', '8.3', '8.4' ] db-type: [ 'mariadb' ] - db-version: [ '10.4', '10.6', '10.11', '11.2' ] + db-version: [ '5.5', '10.3', '10.4', '10.5', '10.6', '10.11', '11.4' ] multisite: [ false, true ] memcached: [ false ] @@ -127,13 +127,13 @@ jobs: - os: ubuntu-latest php: '8.3' db-type: 'mariadb' - db-version: '11.2' + db-version: '11.4' multisite: false memcached: true - os: ubuntu-latest php: '8.3' db-type: 'mariadb' - db-version: '11.2' + db-version: '11.4' multisite: true memcached: true with: From 2bab211bc76f7070dc986ee4ebce28ee6a7fa05b Mon Sep 17 00:00:00 2001 From: Adam Silverstein Date: Tue, 7 Jan 2025 21:04:35 +0000 Subject: [PATCH 084/117] Media: enable high bit depth resized image output with Imagick. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fix an issue where uploaded HDR images were resized and output as SDR and thus significantly degraded from the original. When using Imagick, output images will now match the bit depth of the uploaded image. Add a new filter ‘image_max_bit_depth’ which developers can use to control the maximum bit depth for resized images. Props adamsilverstein, kirasong, gregbenz, apermo. Fixes #62285. git-svn-id: https://develop.svn.wordpress.org/trunk@59588 602fd350-edb4-49c9-b593-d223f7449a82 --- .../class-wp-image-editor-imagick.php | 20 ++++-- tests/phpunit/tests/image/editorImagick.php | 67 +++++++++++++++++++ 2 files changed, 83 insertions(+), 4 deletions(-) diff --git a/src/wp-includes/class-wp-image-editor-imagick.php b/src/wp-includes/class-wp-image-editor-imagick.php index dd8b9ad5191ee..9abb631847544 100644 --- a/src/wp-includes/class-wp-image-editor-imagick.php +++ b/src/wp-includes/class-wp-image-editor-imagick.php @@ -503,11 +503,23 @@ protected function thumbnail_image( $dst_w, $dst_h, $filter_name = 'FILTER_TRIAN } } - // Limit the bit depth of resized images to 8 bits per channel. + // Limit the bit depth of resized images. if ( is_callable( array( $this->image, 'getImageDepth' ) ) && is_callable( array( $this->image, 'setImageDepth' ) ) ) { - if ( 8 < $this->image->getImageDepth() ) { - $this->image->setImageDepth( 8 ); - } + /** + * Filters the maximum bit depth of resized images. + * + * This filter only applies when resizing using the Imagick editor since GD + * does not support getting or setting bit depth. + * + * Use this to adjust the maximum bit depth of resized images. + * + * @since 6.8.0 + * + * @param int $max_depth The maximum bit depth. Default is the input depth. + * @param int $image_depth The bit depth of the original image. + */ + $max_depth = apply_filters( 'image_max_bit_depth', $this->image->getImageDepth(), $this->image->getImageDepth() ); + $this->image->setImageDepth( $max_depth ); } } catch ( Exception $e ) { return new WP_Error( 'image_resize_error', $e->getMessage() ); diff --git a/tests/phpunit/tests/image/editorImagick.php b/tests/phpunit/tests/image/editorImagick.php index 30747f69f1b62..cd424a8856cc5 100644 --- a/tests/phpunit/tests/image/editorImagick.php +++ b/tests/phpunit/tests/image/editorImagick.php @@ -691,4 +691,71 @@ static function ( $value ) { $imagick->destroy(); $this->assertSame( $expected, $output, 'The image color of the generated thumb does not match expected opaque background.' ); // Allow for floating point equivalence. } + + /** + * Test filter `image_max_bit_depth` correctly sets the maximum bit depth of resized images. + * + * @ticket 62285 + */ + public function test_image_max_bit_depth() { + $file = DIR_TESTDATA . '/images/colors_hdr_p3.avif'; + $imagick_image_editor = new WP_Image_Editor_Imagick( $file ); + + // Skip if AVIF not supported. + if ( ! $imagick_image_editor->supports_mime_type( 'image/avif' ) ) { + $this->markTestSkipped( 'The image editor does not support the AVIF mime type.' ); + } + + // Skip if depth methods not available. + if ( ! method_exists( 'Imagick', 'getImageDepth' ) || ! method_exists( 'Imagick', 'setImageDepth' ) ) { + $this->markTestSkipped( 'The image editor does not support get or setImageDepth.' ); + } + + // Verify source image has 10-bit depth. + $imagick = new Imagick( $file ); + $this->assertSame( 10, $imagick->getImageDepth() ); + + // Test ability to save 10-bit image. + $imagick->setImageDepth( 10 ); + $test_file = tempnam( get_temp_dir(), '' ) . 'test10.avif'; + $imagick->writeImage( $test_file ); + $im = new Imagick( $test_file ); + + if ( $im->getImageDepth() !== 10 ) { + $this->markTestSkipped( 'Imagick is unable to save a 10 bit image.' ); + } + $im->destroy(); + unlink( $test_file ); + + // Test default behavior preserves 10-bit depth. + $imagick_image_editor->load(); + $imagick_image_editor->resize( 100, 50 ); + $test_file = tempnam( get_temp_dir(), '' ) . 'test1.avif'; + $imagick_image_editor->save( $test_file ); + $im = new Imagick( $test_file ); + $this->assertSame( 10, $im->getImageDepth() ); + unlink( $test_file ); + $im->destroy(); + + // Test filter can set 8-bit depth + add_filter( 'image_max_bit_depth', array( $this, '__return_eight' ) ); + $imagick_image_editor = new WP_Image_Editor_Imagick( $file ); + $imagick_image_editor->load(); + $imagick_image_editor->resize( 100, 50 ); + $test_file = tempnam( get_temp_dir(), '' ) . 'test2.avif'; + $imagick_image_editor->save( $test_file ); + $im = new Imagick( $test_file ); + $this->assertSame( 8, $im->getImageDepth() ); + unlink( $test_file ); + $im->destroy(); + } + + /** + * Helper function to return 8 for the `image_max_bit_depth` filter. + * + * @return int + */ + public function __return_eight() { + return 8; + } } From 082f6e6f3bb0716969414d47b9fe71251b984ccb Mon Sep 17 00:00:00 2001 From: Adam Silverstein Date: Tue, 7 Jan 2025 22:33:37 +0000 Subject: [PATCH 085/117] Media: improve Imagick handling of colors and alpha channel for PNG image uploads. Fix an issue where index color (8 bit) PNG uploads were output as true color (24 bit) PNGs, significantly increasing their size. When using Imagick, PNG output images will now match the colors of the uploaded image. Also, correct handling of PNG alpha channel information so it is preserved in output images. Props adamsilverstein, pbearne, nosilver4u, peterdavehello, joemcgill, azaozz, codex-m, kirasong, justlevine, jokanane, sallyruchman, wpfed, tgsrvrs, antpb, tb1909. Fixes #36477. git-svn-id: https://develop.svn.wordpress.org/trunk@59589 602fd350-edb4-49c9-b593-d223f7449a82 --- .../class-wp-image-editor-imagick.php | 33 ++++++++++- .../images/png-tests/Palette_icon-or8.png | Bin 0 -> 24841 bytes .../images/png-tests/cloudflare-status.png | Bin 0 -> 24940 bytes .../data/images/png-tests/deskcat8.png | Bin 0 -> 105705 bytes .../png-tests/rabbit-time-paletted-or8.png | Bin 0 -> 200581 bytes tests/phpunit/data/images/png-tests/test8.png | Bin 0 -> 45231 bytes tests/phpunit/tests/image/editorImagick.php | 53 ++++++++++++++++++ 7 files changed, 85 insertions(+), 1 deletion(-) create mode 100644 tests/phpunit/data/images/png-tests/Palette_icon-or8.png create mode 100644 tests/phpunit/data/images/png-tests/cloudflare-status.png create mode 100644 tests/phpunit/data/images/png-tests/deskcat8.png create mode 100644 tests/phpunit/data/images/png-tests/rabbit-time-paletted-or8.png create mode 100644 tests/phpunit/data/images/png-tests/test8.png diff --git a/src/wp-includes/class-wp-image-editor-imagick.php b/src/wp-includes/class-wp-image-editor-imagick.php index 9abb631847544..edce8d2b7dcd9 100644 --- a/src/wp-includes/class-wp-image-editor-imagick.php +++ b/src/wp-includes/class-wp-image-editor-imagick.php @@ -484,7 +484,38 @@ protected function thumbnail_image( $dst_w, $dst_h, $filter_name = 'FILTER_TRIAN $this->image->setOption( 'png:compression-filter', '5' ); $this->image->setOption( 'png:compression-level', '9' ); $this->image->setOption( 'png:compression-strategy', '1' ); - $this->image->setOption( 'png:exclude-chunk', 'all' ); + // Check to see if a PNG is indexed, and find the pixel depth. + if ( is_callable( array( $this->image, 'getImageDepth' ) ) ) { + $indexed_pixel_depth = $this->image->getImageDepth(); + + // Indexed PNG files get some additional handling. + if ( 0 < $indexed_pixel_depth && 8 >= $indexed_pixel_depth ) { + // Check for an alpha channel. + if ( + is_callable( array( $this->image, 'getImageAlphaChannel' ) ) + && $this->image->getImageAlphaChannel() + ) { + $this->image->setOption( 'png:include-chunk', 'tRNS' ); + } else { + $this->image->setOption( 'png:exclude-chunk', 'all' ); + } + + // Reduce colors in the images to maximum needed, using the global colorspace. + $max_colors = pow( 2, $indexed_pixel_depth ); + if ( is_callable( array( $this->image, 'getImageColors' ) ) ) { + $current_colors = $this->image->getImageColors(); + $max_colors = min( $max_colors, $current_colors ); + } + $this->image->quantizeImage( $max_colors, $this->image->getColorspace(), 0, false, false ); + + /** + * If the colorspace is 'gray', use the png8 format to ensure it stays indexed. + */ + if ( Imagick::COLORSPACE_GRAY === $this->image->getImageColorspace() ) { + $this->image->setOption( 'png:format', 'png8' ); + } + } + } } /* diff --git a/tests/phpunit/data/images/png-tests/Palette_icon-or8.png b/tests/phpunit/data/images/png-tests/Palette_icon-or8.png new file mode 100644 index 0000000000000000000000000000000000000000..ead89766a3246f5185c07757b2e23f541ee72897 GIT binary patch literal 24841 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 literal 0 HcmV?d00001 diff --git a/tests/phpunit/data/images/png-tests/cloudflare-status.png b/tests/phpunit/data/images/png-tests/cloudflare-status.png new file mode 100644 index 0000000000000000000000000000000000000000..8517ff0b59fb97559a3a5aefb13fc6a53b19d1d3 GIT binary patch literal 24940 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 literal 0 HcmV?d00001 diff --git a/tests/phpunit/data/images/png-tests/deskcat8.png b/tests/phpunit/data/images/png-tests/deskcat8.png new file mode 100644 index 0000000000000000000000000000000000000000..89e62cd9e2b2c3d6a0113ea9af77c4b2724811a6 GIT binary patch literal 105705 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 literal 0 HcmV?d00001 diff --git a/tests/phpunit/data/images/png-tests/rabbit-time-paletted-or8.png b/tests/phpunit/data/images/png-tests/rabbit-time-paletted-or8.png new file mode 100644 index 0000000000000000000000000000000000000000..cff28ed3b2b3aaf81679599aa02160cdedd01608 GIT binary patch literal 200581 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

    D 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

    eQUs!A$BL53pBx3J0vIw@`p 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 literal 0 HcmV?d00001 diff --git a/tests/phpunit/data/images/png-tests/test8.png b/tests/phpunit/data/images/png-tests/test8.png new file mode 100644 index 0000000000000000000000000000000000000000..49a513647147f0ffeff943c37810fa71719971ec GIT binary patch literal 45231 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

    Byi~(UkDYyYxoh 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 JwfvXB{{#6-^CtiR literal 0 HcmV?d00001 diff --git a/tests/phpunit/tests/image/editorImagick.php b/tests/phpunit/tests/image/editorImagick.php index cd424a8856cc5..eb71d9ff4715b 100644 --- a/tests/phpunit/tests/image/editorImagick.php +++ b/tests/phpunit/tests/image/editorImagick.php @@ -758,4 +758,57 @@ public function test_image_max_bit_depth() { public function __return_eight() { return 8; } + + /** + * Test that resizes are smaller for 16 bit PNG images. + * + * @ticket 36477 + * + * @dataProvider data_resizes_are_small_for_16bit_images + */ + public function test_resizes_are_small_for_16bit_images( $file ) { + + $temp_file = DIR_TESTDATA . '/images/test-temp.png'; + + $imagick_image_editor = new WP_Image_Editor_Imagick( $file ); + $imagick_image_editor->load(); + $size = $imagick_image_editor->get_size(); + + $org_filesize = filesize( $file ); + + $imagick_image_editor->resize( $size['width'] * .5, $size['height'] * .5 ); + + $saved = $imagick_image_editor->save( $temp_file ); + + $new_filesize = filesize( $temp_file ); + + unlink( $temp_file ); + + $this->assertLessThan( $org_filesize, $new_filesize, 'The resized image file size is not smaller than the original file size.' ); + } + + /** + * data_test_resizes_are_small_for_16bit + * + * @return array[] + */ + public static function data_resizes_are_small_for_16bit_images() { + return array( + 'cloudflare-status' => array( + DIR_TESTDATA . '/images/png-tests/cloudflare-status.png', + ), + 'deskcat8' => array( + DIR_TESTDATA . '/images/png-tests/deskcat8.png', + ), + '17-c3-duplicate-entries' => array( + DIR_TESTDATA . '/images/png-tests/Palette_icon-or8.png', + ), + 'rabbit-time-paletted' => array( + DIR_TESTDATA . '/images/png-tests/rabbit-time-paletted-or8.png', + ), + 'test8' => array( + DIR_TESTDATA . '/images/png-tests/test8.png', + ), + ); + } } From 09459f1e4b5eeb3604cfedfa12047ec03c7489b5 Mon Sep 17 00:00:00 2001 From: Adam Silverstein Date: Tue, 7 Jan 2025 22:51:51 +0000 Subject: [PATCH 086/117] Media: improve error messages for unsupported uploads. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Improve language explaining the reason for failure when uploading a modern image format like WebP or AVIF that the server doesn’t handle. Props adamsilverstein, Cybr. Fixes #61361. git-svn-id: https://develop.svn.wordpress.org/trunk@59590 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/script-loader.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/wp-includes/script-loader.php b/src/wp-includes/script-loader.php index 6a5768a8a4b9b..19813615bd80e 100644 --- a/src/wp-includes/script-loader.php +++ b/src/wp-includes/script-loader.php @@ -983,7 +983,7 @@ function wp_default_scripts( $scripts ) { /* translators: %s: File name. */ 'file_exceeds_size_limit' => __( '%s exceeds the maximum upload size for this site.' ), 'zero_byte_file' => __( 'This file is empty. Please try another.' ), - 'invalid_filetype' => __( 'Sorry, you are not allowed to upload this file type.' ), + 'invalid_filetype' => __( 'This file cannot be processed by the web server.' ), 'not_an_image' => __( 'This file is not an image. Please try another.' ), 'image_memory_exceeded' => __( 'Memory exceeded. Please try another smaller file.' ), 'image_dimensions_exceeded' => __( 'This is larger than the maximum size. Please try another.' ), @@ -1007,7 +1007,7 @@ function wp_default_scripts( $scripts ) { /* translators: %s: File name. */ 'error_uploading' => __( '“%s” has failed to upload.' ), 'unsupported_image' => __( 'This image cannot be displayed in a web browser. For best results convert it to JPEG before uploading.' ), - 'noneditable_image' => __( 'This image cannot be processed by the web server. Convert it to JPEG or PNG before uploading.' ), + 'noneditable_image' => __( 'The web server cannot generate responsive image sizes for this image. Convert it to JPEG or PNG before uploading.' ), 'file_url_copied' => __( 'The file URL has been copied to your clipboard' ), ); From d5f8c9b3e6546856a1af66ce2fb1527481afc251 Mon Sep 17 00:00:00 2001 From: Pascal Birchler Date: Wed, 8 Jan 2025 12:34:17 +0000 Subject: [PATCH 087/117] I18N: Update `theme.json` i18n schema with latest changes from Gutenberg. Makes shadow, duotone and aspect ratio names properly translatable. Props dalleyne, audrasjb, oandregal, swissspidy. Fixes #62728. git-svn-id: https://develop.svn.wordpress.org/trunk@59591 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/theme-i18n.json | 69 +++++++++++++++++++++------------ 1 file changed, 44 insertions(+), 25 deletions(-) diff --git a/src/wp-includes/theme-i18n.json b/src/wp-includes/theme-i18n.json index 1781b9356f4bf..1b7a8d0d31190 100644 --- a/src/wp-includes/theme-i18n.json +++ b/src/wp-includes/theme-i18n.json @@ -3,33 +3,33 @@ "description": "Style variation description", "settings": { "typography": { - "fontSizes": [ - { - "name": "Font size name" - } - ], - "fontFamilies": [ - { - "name": "Font family name" - } - ] + "fontSizes": [ + { + "name": "Font size name" + } + ], + "fontFamilies": [ + { + "name": "Font family name" + } + ] }, "color": { - "palette": [ - { - "name": "Color name" - } - ], - "gradients": [ - { - "name": "Gradient name" - } - ], - "duotone": [ - { - "name": "Duotone name" - } - ] + "palette": [ + { + "name": "Color name" + } + ], + "gradients": [ + { + "name": "Gradient name" + } + ], + "duotone": [ + { + "name": "Duotone name" + } + ] }, "spacing": { "spacingSizes": [ @@ -45,6 +45,13 @@ } ] }, + "shadow": { + "presets": [ + { + "name": "Shadow name" + } + ] + }, "blocks": { "*": { "typography": { @@ -69,6 +76,18 @@ { "name": "Gradient name" } + ], + "duotone": [ + { + "name": "Duotone name" + } + ] + }, + "dimensions": { + "aspectRatios": [ + { + "name": "Aspect ratio name" + } ] }, "spacing": { From 287b2f8c961e8a67b2a232d37273b6ddfa611c28 Mon Sep 17 00:00:00 2001 From: Pascal Birchler Date: Wed, 8 Jan 2025 12:52:04 +0000 Subject: [PATCH 088/117] I18N: Mail: Make PHPMailer messages translatable. Adds a new `WP_PHPMailer` class to leverage the WordPress i18n system with PHPMailer, so that any user-visible error messages can be properly translated. Props sukhendu2002, swissspidy, audrasjb, iandunn, nacin, mark-k. Fixes #23311. git-svn-id: https://develop.svn.wordpress.org/trunk@59592 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/class-wp-locale-switcher.php | 7 +- src/wp-includes/class-wp-phpmailer.php | 93 ++++++++++++++++++ src/wp-includes/pluggable.php | 3 +- tests/phpunit/data/languages/de_DE.l10n.php | 2 +- tests/phpunit/data/languages/de_DE.mo | Bin 863 -> 965 bytes tests/phpunit/data/languages/de_DE.po | 4 + tests/phpunit/includes/bootstrap.php | 9 +- tests/phpunit/includes/mock-mailer.php | 16 ++- .../tests/l10n/phpmailerTranslations.php | 66 +++++++++++++ 9 files changed, 192 insertions(+), 8 deletions(-) create mode 100644 src/wp-includes/class-wp-phpmailer.php create mode 100644 tests/phpunit/tests/l10n/phpmailerTranslations.php diff --git a/src/wp-includes/class-wp-locale-switcher.php b/src/wp-includes/class-wp-locale-switcher.php index 9f1c4831ed446..db4ae298c69c0 100644 --- a/src/wp-includes/class-wp-locale-switcher.php +++ b/src/wp-includes/class-wp-locale-switcher.php @@ -273,11 +273,12 @@ private function load_translations( $locale ) { * @since 4.7.0 * * @global WP_Locale $wp_locale WordPress date and time locale object. + * @global PHPMailer\PHPMailer\PHPMailer $phpmailer * * @param string $locale The locale to change to. */ private function change_locale( $locale ) { - global $wp_locale; + global $wp_locale, $phpmailer; $this->load_translations( $locale ); @@ -285,6 +286,10 @@ private function change_locale( $locale ) { WP_Translation_Controller::get_instance()->set_locale( $locale ); + if ( $phpmailer instanceof WP_PHPMailer ) { + $phpmailer->SetLanguage(); + } + /** * Fires when the locale is switched to or restored. * diff --git a/src/wp-includes/class-wp-phpmailer.php b/src/wp-includes/class-wp-phpmailer.php new file mode 100644 index 0000000000000..b3c976d13d9a6 --- /dev/null +++ b/src/wp-includes/class-wp-phpmailer.php @@ -0,0 +1,93 @@ +SetLanguage(); + } + + /** + * Defines the error messages using WordPress' internationalization method. + * + * @since 6.8.0 + * + * @return true Always returns true. + */ + public function SetLanguage( $langcode = 'en', $lang_path = '' ) { + $error_strings = array( + 'authenticate' => __( 'SMTP Error: Could not authenticate.' ), + 'buggy_php' => sprintf( + /* translators: 1: mail.add_x_header. 2: php.ini */ + __( + 'Your version of PHP is affected by a bug that may result in corrupted messages. To fix it, switch to sending using SMTP, disable the %1$s option in your %2$s, or switch to MacOS or Linux, or upgrade your PHP version.' + ), + 'mail.add_x_header', + 'php.ini' + ), + 'connect_host' => __( 'SMTP Error: Could not connect to SMTP host.' ), + 'data_not_accepted' => __( 'SMTP Error: data not accepted.' ), + 'empty_message' => __( 'Message body empty' ), + /* translators: There is a space after the colon. */ + 'encoding' => __( 'Unknown encoding: ' ), + /* translators: There is a space after the colon. */ + 'execute' => __( 'Could not execute: ' ), + /* translators: There is a space after the colon. */ + 'extension_missing' => __( 'Extension missing: ' ), + /* translators: There is a space after the colon. */ + 'file_access' => __( 'Could not access file: ' ), + /* translators: There is a space after the colon. */ + 'file_open' => __( 'File Error: Could not open file: ' ), + /* translators: There is a space after the colon. */ + 'from_failed' => __( 'The following From address failed: ' ), + 'instantiate' => __( 'Could not instantiate mail function.' ), + /* translators: There is a space after the colon. */ + 'invalid_address' => __( 'Invalid address: ' ), + 'invalid_header' => __( 'Invalid header name or value' ), + /* translators: There is a space after the colon. */ + 'invalid_hostentry' => __( 'Invalid hostentry: ' ), + /* translators: There is a space after the colon. */ + 'invalid_host' => __( 'Invalid host: ' ), + /* translators: There is a space at the beginning. */ + 'mailer_not_supported' => __( ' mailer is not supported.' ), + 'provide_address' => __( 'You must provide at least one recipient email address.' ), + /* translators: There is a space after the colon. */ + 'recipients_failed' => __( 'SMTP Error: The following recipients failed: ' ), + /* translators: There is a space after the colon. */ + 'signing' => __( 'Signing Error: ' ), + /* translators: There is a space after the colon. */ + 'smtp_code' => __( 'SMTP code: ' ), + /* translators: There is a space after the colon. */ + 'smtp_code_ex' => __( 'Additional SMTP info: ' ), + 'smtp_connect_failed' => __( 'SMTP connect() failed.' ), + /* translators: There is a space after the colon. */ + 'smtp_detail' => __( 'Detail: ' ), + /* translators: There is a space after the colon. */ + 'smtp_error' => __( 'SMTP server error: ' ), + /* translators: There is a space after the colon. */ + 'variable_set' => __( 'Cannot set or reset variable: ' ), + ); + $this->language = $error_strings; + return true; + } +} diff --git a/src/wp-includes/pluggable.php b/src/wp-includes/pluggable.php index d0b2d3602a980..42a63fa63ddf7 100644 --- a/src/wp-includes/pluggable.php +++ b/src/wp-includes/pluggable.php @@ -251,7 +251,8 @@ function wp_mail( $to, $subject, $message, $headers = '', $attachments = array() require_once ABSPATH . WPINC . '/PHPMailer/PHPMailer.php'; require_once ABSPATH . WPINC . '/PHPMailer/SMTP.php'; require_once ABSPATH . WPINC . '/PHPMailer/Exception.php'; - $phpmailer = new PHPMailer\PHPMailer\PHPMailer( true ); + require_once ABSPATH . WPINC . '/class-wp-phpmailer.php'; + $phpmailer = new WP_PHPMailer( true ); $phpmailer::$validator = static function ( $email ) { return (bool) is_email( $email ); diff --git a/tests/phpunit/data/languages/de_DE.l10n.php b/tests/phpunit/data/languages/de_DE.l10n.php index 8eef01d79ce00..9190d3641ca68 100644 --- a/tests/phpunit/data/languages/de_DE.l10n.php +++ b/tests/phpunit/data/languages/de_DE.l10n.php @@ -1,2 +1,2 @@ NULL,'plural-forms'=>'nplurals=2; plural=n != 1;','messages'=>['html_lang_attribute'=>'de-DE','text directionltr'=>'ltr','number_format_decimal_point'=>',','number_format_thousands_sep'=>'.','Update %s now'=>'Jetzt %s aktualisieren','[%1$s] Confirm Action: %2$s'=>'[%1$s] Aktion bestätigen: %2$s','[%s] Erasure Request Fulfilled'=>'[%s] Löschauftrag ausgeführt','[%s] Personal Data Export'=>'[%s] Export personenbezogener Daten'],'language'=>'de_DE','x-generator'=>'Poedit 2.2.1']; \ No newline at end of file +return ['domain'=>NULL,'plural-forms'=>'nplurals=2; plural=n != 1;','messages'=>['html_lang_attribute'=>'de-DE','text directionltr'=>'ltr','number_format_decimal_point'=>',','number_format_thousands_sep'=>'.','Update %s now'=>'Jetzt %s aktualisieren','[%1$s] Confirm Action: %2$s'=>'[%1$s] Aktion bestätigen: %2$s','[%s] Erasure Request Fulfilled'=>'[%s] Löschauftrag ausgeführt','[%s] Personal Data Export'=>'[%s] Export personenbezogener Daten', 'You must provide at least one recipient email address.'=>'Du musst mindestens eine Empfänger-E-Mail-Adresse angeben.'],'language'=>'de_DE','x-generator'=>'Poedit 2.2.1']; diff --git a/tests/phpunit/data/languages/de_DE.mo b/tests/phpunit/data/languages/de_DE.mo index dcfef58f489228b3208aef0fbc17704d06c6fe8c..8254de97f2af35c7f3e97a518dce585162dcb2f3 100644 GIT binary patch delta 416 zcmXZWze>YE90%}A>K_n9XhjsI9%#`e9UT-0C0&YLv?Aglr}-Iv51IM-$9>1pTTcxk9_mF`-LRm@2St}?pJx@fnm)cD@arvuwMTeIg9-O*+PcM zGU7UnRbdq_!ChE^C$M;$rW`?KlmDAzss5B{%Fe$$6Y>!_zFemH}~Lctiq&L=n&EQl^rW;S>uQaS;R= zm9(zk|MsnPH|7s1O)}%PbSMLFKM%FnPVBQ=vqR_1KDrg#b2jG=gbH&J(l!t1+;7-* z*FR!SGPkB^Avz`(k<^khQp_LK!S7?K0@8+*<|I+25vNxlPb#F$Yj`b`@%GR~Yc$62 Kf>ho9xY-}a9${<% delta 295 zcmX@gexI%Wo)F7a1|Z-BVi_P#0b*VtUIWA+@BoNG{D(j+4aDz(SPqD}85tNPfwUHo z76#HTKpG?;0i{cTv=ER#0Z1DI@nRqr1M;skF)+vj>32XHXih!@A2S1kGEhJlNV5Xz zKp+iN%McEwBY`v!F+@Z8KqlC+AhjUC2E;(K7&t&2AYg$|U_I<0c4$FLVo9okYOz9I ze)(iZ#%+_^nA9hWGeu9{$K*758>0rlPhwtrX<~Y+l|o8tyo>AP0w&SPUm2AqF-uGi HVJ-v!bHXIt diff --git a/tests/phpunit/data/languages/de_DE.po b/tests/phpunit/data/languages/de_DE.po index aa97af62e9a0f..b68c53867d8bc 100644 --- a/tests/phpunit/data/languages/de_DE.po +++ b/tests/phpunit/data/languages/de_DE.po @@ -57,3 +57,7 @@ msgstr "[%s] Löschauftrag ausgeführt" #: wp-admin/includes/file.php:2415 msgid "[%s] Personal Data Export" msgstr "[%s] Export personenbezogener Daten" + +#: wp-includes/class-wp-phpmailer.php:71 +msgid "You must provide at least one recipient email address." +msgstr "Du musst mindestens eine Empfänger-E-Mail-Adresse angeben." diff --git a/tests/phpunit/includes/bootstrap.php b/tests/phpunit/includes/bootstrap.php index 5ee8f38b5753f..c28ddb6eb07b2 100644 --- a/tests/phpunit/includes/bootstrap.php +++ b/tests/phpunit/includes/bootstrap.php @@ -246,10 +246,6 @@ $multisite = $multisite || ( defined( 'WP_TESTS_MULTISITE' ) && WP_TESTS_MULTISITE ); $multisite = $multisite || ( defined( 'MULTISITE' ) && MULTISITE ); -// Override the PHPMailer. -require_once __DIR__ . '/mock-mailer.php'; -$phpmailer = new MockPHPMailer( true ); - if ( ! defined( 'WP_DEFAULT_THEME' ) ) { define( 'WP_DEFAULT_THEME', 'default' ); } @@ -305,6 +301,11 @@ function wp_tests_options( $value ) { // Load WordPress. require_once ABSPATH . 'wp-settings.php'; +// Override the PHPMailer. +require_once __DIR__ . '/mock-mailer.php'; + +$phpmailer = new MockPHPMailer( true ); + // Delete any default posts & related data. _delete_all_posts(); diff --git a/tests/phpunit/includes/mock-mailer.php b/tests/phpunit/includes/mock-mailer.php index f5172d62a6c59..aedeba4e40cd0 100644 --- a/tests/phpunit/includes/mock-mailer.php +++ b/tests/phpunit/includes/mock-mailer.php @@ -1,8 +1,22 @@ setFrom( 'invalid-email@example.com' ); + + try { + $phpmailer->send(); + $this->fail( 'Expected exception was not thrown' ); + } catch ( PHPMailer\PHPMailer\Exception $e ) { + $error_message = $e->getMessage(); + } finally { + if ( $is_switched ) { + restore_previous_locale(); + } + } + + $this->assertSame( + 'Du musst mindestens eine Empfänger-E-Mail-Adresse angeben.', + $error_message, + 'Error message is not translated as expected' + ); + } + + /** + * Test that PHPMailer error message keys are consistent across implementations. + * + * @ticket 23311 + */ + public function test_all_error_message_keys_should_be_translated() { + reset_phpmailer_instance(); + + $phpmailer = new PHPMailer\PHPMailer\PHPMailer(); + $wp_phpmailer = tests_retrieve_phpmailer_instance(); + + $this->assertEqualSets( array_keys( $phpmailer->GetTranslations() ), array_keys( $wp_phpmailer->GetTranslations() ) ); + } +} From 86f31c81668c0a680b6db275b41298f7e8513389 Mon Sep 17 00:00:00 2001 From: Sergey Biryukov Date: Wed, 8 Jan 2025 17:46:54 +0000 Subject: [PATCH 089/117] Coding Standards: Use strict comparison in `wp_check_for_changed_dates()`. Follow-up to [42401]. Props aristath, poena, afercia, SergeyBiryukov. See #62279. git-svn-id: https://develop.svn.wordpress.org/trunk@59593 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/post.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/wp-includes/post.php b/src/wp-includes/post.php index 6d225470d2b4e..a0933f1ffdbf8 100644 --- a/src/wp-includes/post.php +++ b/src/wp-includes/post.php @@ -7255,12 +7255,14 @@ function wp_check_for_changed_dates( $post_id, $post, $post_before ) { $new_date = gmdate( 'Y-m-d', strtotime( $post->post_date ) ); // Don't bother if it hasn't changed. - if ( $new_date == $previous_date ) { + if ( $new_date === $previous_date ) { return; } // We're only concerned with published, non-hierarchical objects. - if ( ! ( 'publish' === $post->post_status || ( 'attachment' === get_post_type( $post ) && 'inherit' === $post->post_status ) ) || is_post_type_hierarchical( $post->post_type ) ) { + if ( ! ( 'publish' === $post->post_status || ( 'attachment' === $post->post_type && 'inherit' === $post->post_status ) ) + || is_post_type_hierarchical( $post->post_type ) + ) { return; } From c53397d1f852fd1f53d8ae9defc5907283a9e198 Mon Sep 17 00:00:00 2001 From: Carolina Nymark Date: Thu, 9 Jan 2025 09:21:33 +0000 Subject: [PATCH 090/117] Twenty Twenty: Correct the font weight of the quote block in the editor. This change removes the font weight of the paragraph inside the quote block, so that the design in the editor and the front looks the same. Props sainathpoojary, ankitkumarshah, sabernhardt, krupajnanda. Fixes #62753. git-svn-id: https://develop.svn.wordpress.org/trunk@59594 602fd350-edb4-49c9-b593-d223f7449a82 --- .../themes/twentytwenty/assets/css/editor-style-block-rtl.css | 1 - .../themes/twentytwenty/assets/css/editor-style-block.css | 1 - 2 files changed, 2 deletions(-) diff --git a/src/wp-content/themes/twentytwenty/assets/css/editor-style-block-rtl.css b/src/wp-content/themes/twentytwenty/assets/css/editor-style-block-rtl.css index 8a5f813502b72..141b9d9f86a4c 100644 --- a/src/wp-content/themes/twentytwenty/assets/css/editor-style-block-rtl.css +++ b/src/wp-content/themes/twentytwenty/assets/css/editor-style-block-rtl.css @@ -682,7 +682,6 @@ hr.wp-block-separator.is-style-dots::before { .editor-styles-wrapper .wp-block-quote p { color: inherit; - font-weight: 400; margin: 0 0 20px 0; letter-spacing: inherit; } diff --git a/src/wp-content/themes/twentytwenty/assets/css/editor-style-block.css b/src/wp-content/themes/twentytwenty/assets/css/editor-style-block.css index 7f18f4772441e..862a51cc2b8e1 100644 --- a/src/wp-content/themes/twentytwenty/assets/css/editor-style-block.css +++ b/src/wp-content/themes/twentytwenty/assets/css/editor-style-block.css @@ -686,7 +686,6 @@ hr.wp-block-separator.is-style-dots::before { .editor-styles-wrapper .wp-block-quote p { color: inherit; - font-weight: 400; margin: 0 0 20px 0; letter-spacing: inherit; } From a48e1806f767c550cbb8b66d672507f589a7be9a Mon Sep 17 00:00:00 2001 From: Sergey Biryukov Date: Thu, 9 Jan 2025 19:41:47 +0000 Subject: [PATCH 091/117] Login and Registration: Check that the `$_POST` values are strings in `wp_signon()`. This prevents a fatal error from `trim()` via `wp_authenticate()` if an array is passed instead. Follow-up to [6643], [58093]. Props leedxw, audrasjb, SergeyBiryukov. Fixes #62794. git-svn-id: https://develop.svn.wordpress.org/trunk@59595 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/user.php | 4 ++-- tests/phpunit/tests/auth.php | 22 ++++++++++++++++++++++ 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/wp-includes/user.php b/src/wp-includes/user.php index f60dbe5d3fae2..6222e932a9015 100644 --- a/src/wp-includes/user.php +++ b/src/wp-includes/user.php @@ -48,10 +48,10 @@ function wp_signon( $credentials = array(), $secure_cookie = '' ) { 'remember' => false, ); - if ( ! empty( $_POST['log'] ) ) { + if ( ! empty( $_POST['log'] ) && is_string( $_POST['log'] ) ) { $credentials['user_login'] = wp_unslash( $_POST['log'] ); } - if ( ! empty( $_POST['pwd'] ) ) { + if ( ! empty( $_POST['pwd'] ) && is_string( $_POST['pwd'] ) ) { $credentials['user_password'] = $_POST['pwd']; } if ( ! empty( $_POST['rememberme'] ) ) { diff --git a/tests/phpunit/tests/auth.php b/tests/phpunit/tests/auth.php index 5c196b499fcce..f45071904e9c8 100644 --- a/tests/phpunit/tests/auth.php +++ b/tests/phpunit/tests/auth.php @@ -634,6 +634,28 @@ public function test_wp_signon_does_not_throw_deprecation_notices_with_default_p $this->assertContains( 'empty_password', $error_codes, 'The "empty_password" error code should be present.' ); } + /** + * Tests that a warning or a fatal error is not thrown when the login or password + * passed via `$_POST` is an array instead of a string. + * + * The messages that we should not see: + * `Warning: wp_strip_all_tags() expects parameter #1 ($text) to be a string, array given`. + * `TypeError: trim(): Argument #1 ($string) must be of type string, array given`. + * + * @ticket 62794 + */ + public function test_wp_signon_does_not_throw_fatal_errors_with_array_parameters() { + $_POST['log'] = array( 'example' ); + $_POST['pwd'] = array( 'example' ); + + $error = wp_signon(); + $this->assertWPError( $error, 'The result should be an instance of WP_Error.' ); + + $error_codes = $error->get_error_codes(); + $this->assertContains( 'empty_username', $error_codes, 'The "empty_username" error code should be present.' ); + $this->assertContains( 'empty_password', $error_codes, 'The "empty_password" error code should be present.' ); + } + /** * HTTP Auth headers are used to determine the current user. * From 1dd2f28680c98373468adb53aff18df00586c559 Mon Sep 17 00:00:00 2001 From: Sergey Biryukov Date: Fri, 10 Jan 2025 18:12:08 +0000 Subject: [PATCH 092/117] Coding Standards: Use strict comparison in `get_posts_by_author_sql()`. Follow-up to [13576], [25669]. Props aristath, poena, afercia, SergeyBiryukov. See #62279. git-svn-id: https://develop.svn.wordpress.org/trunk@59596 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/post.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wp-includes/post.php b/src/wp-includes/post.php index a0933f1ffdbf8..ebf7c7f3a9e40 100644 --- a/src/wp-includes/post.php +++ b/src/wp-includes/post.php @@ -7358,7 +7358,7 @@ function get_posts_by_author_sql( $post_type, $full = true, $post_author = null, $id = get_current_user_id(); if ( null === $post_author || ! $full ) { $post_status_sql .= " OR post_status = 'private' AND post_author = $id"; - } elseif ( $id == (int) $post_author ) { + } elseif ( $id === (int) $post_author ) { $post_status_sql .= " OR post_status = 'private'"; } // Else none. } // Else none. From 4051e31bec3a61ac6293387580cae7e655d26a52 Mon Sep 17 00:00:00 2001 From: Sergey Biryukov Date: Sat, 11 Jan 2025 00:35:45 +0000 Subject: [PATCH 093/117] Coding Standards: Use strict comparison in `wp_check_post_hierarchy_for_loops()`. Follow-up to [10129], [15806]. Props aristath, poena, afercia, SergeyBiryukov. See #62279. git-svn-id: https://develop.svn.wordpress.org/trunk@59597 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/post.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wp-includes/post.php b/src/wp-includes/post.php index ebf7c7f3a9e40..74cedc40e1766 100644 --- a/src/wp-includes/post.php +++ b/src/wp-includes/post.php @@ -7934,7 +7934,7 @@ function wp_check_post_hierarchy_for_loops( $post_parent, $post_id ) { } // Can't be its own parent. - if ( $post_parent == $post_id ) { + if ( $post_parent === $post_id ) { return 0; } From c0d073d62d32d424d9149619a7fcae48ddb82c26 Mon Sep 17 00:00:00 2001 From: Pascal Birchler Date: Sat, 11 Jan 2025 13:42:46 +0000 Subject: [PATCH 094/117] Embeds: Add Canva to oEmbed provider allowlist. Props swissspidy. Fixes #58840. git-svn-id: https://develop.svn.wordpress.org/trunk@59598 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/class-wp-oembed.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/wp-includes/class-wp-oembed.php b/src/wp-includes/class-wp-oembed.php index 5b699e9362c64..2d59c2217dc3e 100644 --- a/src/wp-includes/class-wp-oembed.php +++ b/src/wp-includes/class-wp-oembed.php @@ -110,6 +110,7 @@ public function __construct() { '#https?://pca\.st/.+#i' => array( 'https://pca.st/oembed.json', true ), '#https?://((play|www)\.)?anghami\.com/.*#i' => array( 'https://api.anghami.com/rest/v1/oembed.view', true ), '#https?://bsky.app/profile/.*/post/.*#i' => array( 'https://embed.bsky.app/oembed', true ), + '#https?://(www\.)?canva\.com/design/.*/view.*#i' => array( 'https://canva.com/_oembed', true ), ); if ( ! empty( self::$early_providers['add'] ) ) { @@ -190,6 +191,7 @@ public function __construct() { * | Crowdsignal | crowdsignal.net | 6.2.0 | * | Anghami | anghami.com | 6.3.0 | * | Bluesky | bsky.app | 6.6.0 | + * | Canva | canva.com | 6.8.0 | * * No longer supported providers: * From 88796678fd838ab0e790d22558f258c906262400 Mon Sep 17 00:00:00 2001 From: Sergey Biryukov Date: Sun, 12 Jan 2025 18:12:14 +0000 Subject: [PATCH 095/117] Coding Standards: Use strict comparison in `get_page_by_path()`. Follow-up to [3511], [18541], [19075], [21845]. Props aristath, poena, afercia, SergeyBiryukov. See #62279. git-svn-id: https://develop.svn.wordpress.org/trunk@59599 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/post.php | 23 +++++++++++++---------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/src/wp-includes/post.php b/src/wp-includes/post.php index 74cedc40e1766..8cb7287289b41 100644 --- a/src/wp-includes/post.php +++ b/src/wp-includes/post.php @@ -6061,9 +6061,9 @@ function get_page_by_path( $page_path, $output = OBJECT, $post_type = 'page' ) { $revparts = array_reverse( $parts ); - $foundid = 0; + $found_id = 0; foreach ( (array) $pages as $page ) { - if ( $page->post_name == $revparts[0] ) { + if ( $page->post_name === $revparts[0] ) { $count = 0; $p = $page; @@ -6071,18 +6071,21 @@ function get_page_by_path( $page_path, $output = OBJECT, $post_type = 'page' ) { * Loop through the given path parts from right to left, * ensuring each matches the post ancestry. */ - while ( 0 != $p->post_parent && isset( $pages[ $p->post_parent ] ) ) { + while ( 0 !== (int) $p->post_parent && isset( $pages[ $p->post_parent ] ) ) { ++$count; $parent = $pages[ $p->post_parent ]; - if ( ! isset( $revparts[ $count ] ) || $parent->post_name != $revparts[ $count ] ) { + if ( ! isset( $revparts[ $count ] ) || $parent->post_name !== $revparts[ $count ] ) { break; } $p = $parent; } - if ( 0 == $p->post_parent && count( $revparts ) === $count + 1 && $p->post_name == $revparts[ $count ] ) { - $foundid = $page->ID; - if ( $page->post_type == $post_type ) { + if ( 0 === (int) $p->post_parent + && count( $revparts ) === $count + 1 + && $p->post_name === $revparts[ $count ] + ) { + $found_id = $page->ID; + if ( $page->post_type === $post_type ) { break; } } @@ -6090,10 +6093,10 @@ function get_page_by_path( $page_path, $output = OBJECT, $post_type = 'page' ) { } // We cache misses as well as hits. - wp_cache_set( $cache_key, $foundid, 'post-queries' ); + wp_cache_set( $cache_key, $found_id, 'post-queries' ); - if ( $foundid ) { - return get_post( $foundid, $output ); + if ( $found_id ) { + return get_post( $found_id, $output ); } return null; From 062df4cd8825c3a44de4c05fe612bf3172ede84b Mon Sep 17 00:00:00 2001 From: Jonathan Desrosiers Date: Mon, 13 Jan 2025 14:55:09 +0000 Subject: [PATCH 096/117] Coding Standards: Add missing space for self-closing tags. Props laxman-prajapati, sabernhardt. Fixes #62799. git-svn-id: https://develop.svn.wordpress.org/trunk@59600 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-admin/network/settings.php | 2 +- src/wp-admin/options-discussion.php | 2 +- src/wp-admin/options-media.php | 2 +- src/wp-admin/setup-config.php | 2 +- src/wp-includes/widgets.php | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/wp-admin/network/settings.php b/src/wp-admin/network/settings.php index c93d98a169849..82543f6219f85 100644 --- a/src/wp-admin/network/settings.php +++ b/src/wp-admin/network/settings.php @@ -405,7 +405,7 @@
    -
    - diff --git a/src/wp-includes/widgets.php b/src/wp-includes/widgets.php index 32d8a95e1b984..aa17656507a4f 100644 --- a/src/wp-includes/widgets.php +++ b/src/wp-includes/widgets.php @@ -1746,7 +1746,7 @@ function wp_widget_rss_form( $args, $inputs = null ) { />
    - /> + />

    From 9d9d73cd9e5d243e4841fe9567ef388e3fb65932 Mon Sep 17 00:00:00 2001 From: Sergey Biryukov Date: Mon, 13 Jan 2025 22:20:03 +0000 Subject: [PATCH 097/117] Docs: Correct `@return` value for `update_attached_file()`. Follow-up to [4612], [21967], [24490], [47611], [48214]. Props arnoutblueshell, karthickmurugan, SergeyBiryukov. Fixes #62803. git-svn-id: https://develop.svn.wordpress.org/trunk@59602 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/post.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/wp-includes/post.php b/src/wp-includes/post.php index 8cb7287289b41..98b9092f16f1f 100644 --- a/src/wp-includes/post.php +++ b/src/wp-includes/post.php @@ -852,13 +852,15 @@ function get_attached_file( $attachment_id, $unfiltered = false ) { * Updates attachment file path based on attachment ID. * * Used to update the file path of the attachment, which uses post meta name - * '_wp_attached_file' to store the path of the attachment. + * `_wp_attached_file` to store the path of the attachment. * * @since 2.1.0 * * @param int $attachment_id Attachment ID. * @param string $file File path for the attachment. - * @return bool True on success, false on failure. + * @return int|bool Meta ID if the `_wp_attached_file` key didn't exist for the attachment. + * True on successful update, false on failure or if the `$file` value passed + * to the function is the same as the one that is already in the database. */ function update_attached_file( $attachment_id, $file ) { if ( ! get_post( $attachment_id ) ) { From 47774776112815b1b997a68fc51cf3dabd3f44c2 Mon Sep 17 00:00:00 2001 From: John Blackbourn Date: Tue, 14 Jan 2025 11:37:00 +0000 Subject: [PATCH 098/117] Docs: Correct a translator comment that was added in [59578]. See #62005 git-svn-id: https://develop.svn.wordpress.org/trunk@59603 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/pluggable.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wp-includes/pluggable.php b/src/wp-includes/pluggable.php index 42a63fa63ddf7..f4a8d8412e88c 100644 --- a/src/wp-includes/pluggable.php +++ b/src/wp-includes/pluggable.php @@ -2605,7 +2605,7 @@ function wp_hash( $data, $scheme = 'auth', $algo = 'md5' ) { if ( ! in_array( $algo, hash_hmac_algos(), true ) ) { throw new InvalidArgumentException( sprintf( - /** translators: 1: Name of a cryptographic hash algorithm. 2: List of supported algorithms. */ + /* translators: 1: Name of a cryptographic hash algorithm. 2: List of supported algorithms. */ __( 'Unsupported hashing algorithm: %1$s. Supported algorithms are: %2$s' ), $algo, implode( ', ', hash_hmac_algos() ) From 83718be6851597c68ba085b120c892616443698d Mon Sep 17 00:00:00 2001 From: Sergey Biryukov Date: Tue, 14 Jan 2025 15:35:18 +0000 Subject: [PATCH 099/117] Tests: Restore the environment before performing assertions in `download_url()` tests. This aims to avoid affecting other tests in case of failure. Follow-up to [42773], [51939]. See #62280. git-svn-id: https://develop.svn.wordpress.org/trunk@59604 602fd350-edb4-49c9-b593-d223f7449a82 --- tests/phpunit/tests/admin/includesFile.php | 26 ++++++++++++++-------- 1 file changed, 17 insertions(+), 9 deletions(-) diff --git a/tests/phpunit/tests/admin/includesFile.php b/tests/phpunit/tests/admin/includesFile.php index 4bfe80db6fc5d..943cabb7c09c1 100644 --- a/tests/phpunit/tests/admin/includesFile.php +++ b/tests/phpunit/tests/admin/includesFile.php @@ -43,6 +43,7 @@ public function test_download_url_non_200_response_code() { add_filter( 'pre_http_request', array( $this, '_fake_download_url_non_200_response_code' ), 10, 3 ); $error = download_url( 'test_download_url_non_200' ); + $this->assertWPError( $error ); $this->assertSame( array( @@ -55,6 +56,10 @@ public function test_download_url_non_200_response_code() { add_filter( 'download_url_error_max_body_size', array( $this, '__return_5' ) ); $error = download_url( 'test_download_url_non_200' ); + + remove_filter( 'download_url_error_max_body_size', array( $this, '__return_5' ) ); + remove_filter( 'pre_http_request', array( $this, '_fake_download_url_non_200_response_code' ) ); + $this->assertWPError( $error ); $this->assertSame( array( @@ -63,9 +68,6 @@ public function test_download_url_non_200_response_code() { ), $error->get_error_data() ); - - remove_filter( 'download_url_error_max_body_size', array( $this, '__return_5' ) ); - remove_filter( 'pre_http_request', array( $this, '_fake_download_url_non_200_response_code' ) ); } public function _fake_download_url_non_200_response_code( $response, $parsed_args, $url ) { @@ -94,11 +96,13 @@ public function test_download_url_should_respect_filename_from_content_dispositi add_filter( 'pre_http_request', array( $this, $filter ), 10, 3 ); $filename = download_url( 'url_with_content_disposition_header' ); - $this->assertStringContainsString( 'filename-from-content-disposition-header', $filename ); + + remove_filter( 'pre_http_request', array( $this, $filter ) ); + $this->assertFileExists( $filename ); $this->unlink( $filename ); - remove_filter( 'pre_http_request', array( $this, $filter ) ); + $this->assertStringContainsString( 'filename-from-content-disposition-header', $filename ); } /** @@ -126,10 +130,12 @@ public function test_save_to_temp_directory_when_getting_filename_from_content_d add_filter( 'pre_http_request', array( $this, $filter ), 10, 3 ); $filename = download_url( 'url_with_content_disposition_header' ); - $this->assertStringContainsString( get_temp_dir(), $filename ); - $this->unlink( $filename ); remove_filter( 'pre_http_request', array( $this, $filter ) ); + + $this->unlink( $filename ); + + $this->assertStringContainsString( get_temp_dir(), $filename ); } /** @@ -209,10 +215,12 @@ public function test_download_url_should_reject_filename_from_invalid_content_di add_filter( 'pre_http_request', array( $this, $filter ), 10, 3 ); $filename = download_url( 'url_with_content_disposition_header' ); - $this->assertStringContainsString( 'url_with_content_disposition_header', $filename ); - $this->unlink( $filename ); remove_filter( 'pre_http_request', array( $this, $filter ) ); + + $this->unlink( $filename ); + + $this->assertStringContainsString( 'url_with_content_disposition_header', $filename ); } /** From 48ba7a364d581decc6ba7c2b84c3d72e84b0fe73 Mon Sep 17 00:00:00 2001 From: Pascal Birchler Date: Wed, 15 Jan 2025 12:44:43 +0000 Subject: [PATCH 100/117] REST API: Improve autosave and revision endpoints for templates and template parts. Fixes those endpoints for file-based templates and template parts, as templates based on theme files can't be revisioned or autosaved. Props antonvlasenko, swissspidy, spacedmonkey, kadamwhite. Fixes #61970. git-svn-id: https://develop.svn.wordpress.org/trunk@59605 602fd350-edb4-49c9-b593-d223f7449a82 --- ...-wp-rest-template-revisions-controller.php | 12 +- .../wpRestTemplateAutosavesController.php | 414 +++++++++-- .../wpRestTemplateRevisionsController.php | 688 +++++++++++++++--- 3 files changed, 973 insertions(+), 141 deletions(-) diff --git a/src/wp-includes/rest-api/endpoints/class-wp-rest-template-revisions-controller.php b/src/wp-includes/rest-api/endpoints/class-wp-rest-template-revisions-controller.php index 22cdc268fa8c6..c0bc7663e1f8b 100644 --- a/src/wp-includes/rest-api/endpoints/class-wp-rest-template-revisions-controller.php +++ b/src/wp-includes/rest-api/endpoints/class-wp-rest-template-revisions-controller.php @@ -170,7 +170,17 @@ protected function get_parent( $parent_template_id ) { return new WP_Error( 'rest_post_invalid_parent', __( 'Invalid template parent ID.' ), - array( 'status' => 404 ) + array( 'status' => WP_Http::NOT_FOUND ) + ); + } + + $parent_post_id = isset( $template->wp_id ) ? (int) $template->wp_id : 0; + + if ( $parent_post_id <= 0 ) { + return new WP_Error( + 'rest_invalid_template', + __( 'Templates based on theme files can\'t have revisions.' ), + array( 'status' => WP_Http::BAD_REQUEST ) ); } diff --git a/tests/phpunit/tests/rest-api/wpRestTemplateAutosavesController.php b/tests/phpunit/tests/rest-api/wpRestTemplateAutosavesController.php index 550eb8e5fe999..e2da442e7d874 100644 --- a/tests/phpunit/tests/rest-api/wpRestTemplateAutosavesController.php +++ b/tests/phpunit/tests/rest-api/wpRestTemplateAutosavesController.php @@ -22,7 +22,17 @@ class Tests_REST_wpRestTemplateAutosavesController extends WP_Test_REST_Controll /** * @var string */ - const PARENT_POST_TYPE = 'wp_template'; + const TEMPLATE_PART_NAME = 'my_template_part'; + + /** + * @var string + */ + const TEMPLATE_POST_TYPE = 'wp_template'; + + /** + * @var string + */ + const TEMPLATE_PART_POST_TYPE = 'wp_template_part'; /** * Admin user ID. @@ -52,7 +62,16 @@ class Tests_REST_wpRestTemplateAutosavesController extends WP_Test_REST_Controll private static $template_post; /** - * Create fake data before our tests run. + * Template part post. + * + * @since 6.7.0 + * + * @var WP_Post + */ + private static $template_part_post; + + /** + * Create fake data before the tests run. * * @param WP_UnitTest_Factory $factory Helper that lets us create fake data. */ @@ -73,9 +92,9 @@ public static function wpSetUpBeforeClass( WP_UnitTest_Factory $factory ) { // Set up template post. self::$template_post = $factory->post->create_and_get( array( - 'post_type' => self::PARENT_POST_TYPE, + 'post_type' => self::TEMPLATE_POST_TYPE, 'post_name' => self::TEMPLATE_NAME, - 'post_title' => 'My Template', + 'post_title' => 'My template', 'post_content' => 'Content', 'post_excerpt' => 'Description of my template', 'tax_input' => array( @@ -86,6 +105,27 @@ public static function wpSetUpBeforeClass( WP_UnitTest_Factory $factory ) { ) ); wp_set_post_terms( self::$template_post->ID, self::TEST_THEME, 'wp_theme' ); + + // Set up template part post. + self::$template_part_post = $factory->post->create_and_get( + array( + 'post_type' => self::TEMPLATE_PART_POST_TYPE, + 'post_name' => self::TEMPLATE_PART_NAME, + 'post_title' => 'My template part', + 'post_content' => 'Content', + 'post_excerpt' => 'Description of my template part', + 'tax_input' => array( + 'wp_theme' => array( + self::TEST_THEME, + ), + 'wp_template_part_area' => array( + WP_TEMPLATE_PART_AREA_HEADER, + ), + ), + ) + ); + wp_set_post_terms( self::$template_part_post->ID, self::TEST_THEME, 'wp_theme' ); + wp_set_post_terms( self::$template_part_post->ID, WP_TEMPLATE_PART_AREA_HEADER, 'wp_template_part_area' ); } /** @@ -117,12 +157,26 @@ public function test_register_routes() { } /** - * @covers WP_REST_Template_Autosaves_Controller::get_context_param + * @coversNothing * @ticket 56922 */ public function test_context_param() { + // A proper data provider cannot be used because this method's signature must match the parent method. + // Therefore, actual tests are performed in the test_context_param_with_data_provider method. + $this->assertTrue( true ); + } + + /** + * @dataProvider data_context_param_with_data_provider + * @covers WP_REST_Template_Autosaves_Controller::get_context_param + * @ticket 56922 + * + * @param string $rest_base Base part of the REST API endpoint to test. + * @param string $template_id Template ID to use in the test. + */ + public function test_context_param_with_data_provider( $rest_base, $template_id ) { // Collection. - $request = new WP_REST_Request( 'OPTIONS', '/wp/v2/templates/' . self::TEST_THEME . '/' . self::TEMPLATE_NAME . '/autosaves' ); + $request = new WP_REST_Request( 'OPTIONS', '/wp/v2/' . $rest_base . '/' . $template_id . '/autosaves' ); $response = rest_get_server()->dispatch( $request ); $data = $response->get_data(); @@ -144,7 +198,7 @@ public function test_context_param() { ); // Single. - $request = new WP_REST_Request( 'OPTIONS', '/wp/v2/templates/' . self::TEST_THEME . '/' . self::TEMPLATE_NAME . '/autosaves/1' ); + $request = new WP_REST_Request( 'OPTIONS', '/wp/v2/' . $rest_base . '/' . $template_id . '/autosaves/1' ); $response = rest_get_server()->dispatch( $request ); $data = $response->get_data(); $this->assertCount( @@ -165,25 +219,55 @@ public function test_context_param() { } /** - * @covers WP_REST_Template_Autosaves_Controller::get_items + * Data provider for test_context_param_with_data_provider. + * + * @return array + */ + public function data_context_param_with_data_provider() { + return array( + 'templates' => array( 'templates', self::TEST_THEME . '//' . self::TEMPLATE_NAME ), + 'template parts' => array( 'template-parts', self::TEST_THEME . '//' . self::TEMPLATE_PART_NAME ), + ); + } + + /** + * @coversNothing * @ticket 56922 */ public function test_get_items() { + // A proper data provider cannot be used because this method's signature must match the parent method. + // Therefore, actual tests are performed in the test_get_items_with_data_provider method. + $this->assertTrue( true ); + } + + /** + * @dataProvider data_get_items_with_data_provider + * @covers WP_REST_Template_Autosaves_Controller::get_items + * @ticket 56922 + * + * @param string $parent_post_property_name A class property name that contains the parent post object. + * @param string $rest_base Base part of the REST API endpoint to test. + * @param string $template_id Template ID to use in the test. + */ + public function test_get_items_with_data_provider( $parent_post_property_name, $rest_base, $template_id ) { wp_set_current_user( self::$admin_id ); + // Cannot access this property in the data provider because it is not initialized at the time of execution. + $parent_post = self::$$parent_post_property_name; $autosave_post_id = wp_create_post_autosave( array( 'post_content' => 'Autosave content.', - 'post_ID' => self::$template_post->ID, - 'post_type' => self::PARENT_POST_TYPE, + 'post_ID' => $parent_post->ID, + 'post_type' => $parent_post->post_type, ) ); $request = new WP_REST_Request( 'GET', - '/wp/v2/templates/' . self::TEST_THEME . '/' . self::TEMPLATE_NAME . '/autosaves' + '/wp/v2/' . $rest_base . '/' . $template_id . '/autosaves' ); $response = rest_get_server()->dispatch( $request ); $autosaves = $response->get_data(); + $this->assertSame( WP_Http::OK, $response->get_status(), 'Response is expected to have a status code of 200.' ); $this->assertCount( 1, @@ -197,7 +281,7 @@ public function test_get_items() { 'Failed asserting that the ID of the autosave matches the expected autosave post ID.' ); $this->assertSame( - self::$template_post->ID, + $parent_post->ID, $autosaves[0]['parent'], 'Failed asserting that the parent ID of the autosave matches the template post ID.' ); @@ -209,22 +293,121 @@ public function test_get_items() { } /** - * @covers WP_REST_Template_Autosaves_Controller::get_item + * Data provider for test_get_items_with_data_provider. + * + * @return array + */ + public function data_get_items_with_data_provider() { + return array( + 'templates' => array( 'template_post', 'templates', self::TEST_THEME . '//' . self::TEMPLATE_NAME ), + 'template parts' => array( 'template_part_post', 'template-parts', self::TEST_THEME . '//' . self::TEMPLATE_PART_NAME ), + ); + } + + /** + * @dataProvider data_get_items_for_templates_based_on_theme_files_should_return_bad_response_status + * @ticket 61970 + * + * @param string $rest_base Base part of the REST API endpoint to test. + * @param string $template_id Template ID to use in the test. + */ + public function test_get_items_for_templates_based_on_theme_files_should_return_bad_response_status( $rest_base, $template_id ) { + wp_set_current_user( self::$admin_id ); + switch_theme( 'block-theme' ); + + $request = new WP_REST_Request( 'GET', '/wp/v2/' . $rest_base . '/' . $template_id . '/autosaves' ); + + $response = rest_get_server()->dispatch( $request ); + $this->assertErrorResponse( + 'rest_invalid_template', + $response, + WP_Http::BAD_REQUEST, + sprintf( 'Response is expected to have a status code of %d.', WP_Http::BAD_REQUEST ) + ); + } + + /** + * Data provider for test_get_items_for_templates_based_on_theme_files_should_return_bad_response_status. + * + * @return array + */ + public function data_get_items_for_templates_based_on_theme_files_should_return_bad_response_status() { + return array( + 'templates' => array( 'templates', self::TEST_THEME . '//page-home' ), + 'template parts' => array( 'template-parts', self::TEST_THEME . '//small-header' ), + ); + } + + /** + * @dataProvider data_get_item_for_templates_based_on_theme_files_should_return_bad_response_status + * @ticket 56922 + * + * @param string $rest_base Base part of the REST API endpoint to test. + * @param string $template_id Template ID to use in the test. + */ + public function test_get_item_for_templates_based_on_theme_files_should_return_bad_response_status( $rest_base, $template_id ) { + wp_set_current_user( self::$admin_id ); + switch_theme( 'block-theme' ); + + $request = new WP_REST_Request( 'GET', '/wp/v2/' . $rest_base . '/' . $template_id . '/autosaves/1' ); + + $response = rest_get_server()->dispatch( $request ); + $this->assertErrorResponse( + 'rest_invalid_template', + $response, + WP_Http::BAD_REQUEST, + sprintf( 'Response is expected to have a status code of %d.', WP_Http::BAD_REQUEST ) + ); + } + + /** + * Data provider for test_get_item_for_templates_based_on_theme_files_should_return_bad_response_status. + * + * @return array + */ + public function data_get_item_for_templates_based_on_theme_files_should_return_bad_response_status() { + return array( + 'templates' => array( 'templates', self::TEST_THEME . '//page-home' ), + 'template parts' => array( 'template-parts', self::TEST_THEME . '//small-header' ), + ); + } + + /** + * @coversNothing * @ticket 56922 */ public function test_get_item() { + // A proper data provider cannot be used because this method's signature must match the parent method. + // Therefore, actual tests are performed in the test_get_item_with_data_provider method. + $this->assertTrue( true ); + } + + /** + * @dataProvider data_get_item_with_data_provider + * @covers WP_REST_Template_Autosaves_Controller::get_item + * @ticket 56922 + * + * @param string $parent_post_property_name A class property name that contains the parent post object. + * @param string $rest_base Base part of the REST API endpoint to test. + * @param string $template_id Template ID to use in the test. + */ + public function test_get_item_with_data_provider( $parent_post_property_name, $rest_base, $template_id ) { wp_set_current_user( self::$admin_id ); + $parent_post = self::$$parent_post_property_name; + $autosave_post_id = wp_create_post_autosave( array( 'post_content' => 'Autosave content.', - 'post_ID' => self::$template_post->ID, - 'post_type' => self::PARENT_POST_TYPE, + 'post_ID' => $parent_post->ID, + 'post_type' => $parent_post->post_type, ) ); - $request = new WP_REST_Request( 'GET', '/wp/v2/templates/' . self::TEST_THEME . '/' . self::TEMPLATE_NAME . '/autosaves/' . $autosave_post_id ); + $request = new WP_REST_Request( 'GET', '/wp/v2/' . $rest_base . '/' . $template_id . '/autosaves/' . $autosave_post_id ); $response = rest_get_server()->dispatch( $request ); + + $this->assertSame( WP_Http::OK, $response->get_status(), 'Response is expected to have a status code of 200.' ); $autosave = $response->get_data(); $this->assertIsArray( $autosave, 'Failed asserting that the autosave is an array.' ); @@ -234,32 +417,59 @@ public function test_get_item() { "Failed asserting that the autosave id is the same as $autosave_post_id." ); $this->assertSame( - self::$template_post->ID, + $parent_post->ID, $autosave['parent'], sprintf( 'Failed asserting that the parent id of the autosave is the same as %s.', - self::$template_post->ID + $parent_post->ID ) ); } /** - * @covers WP_REST_Template_Autosaves_Controller::prepare_item_for_response + * Data provider for test_get_item_with_data_provider. + * + * @return array + */ + public function data_get_item_with_data_provider() { + return array( + 'templates' => array( 'template_post', 'templates', self::TEST_THEME . '//' . self::TEMPLATE_NAME ), + 'template parts' => array( 'template_part_post', 'template-parts', self::TEST_THEME . '//' . self::TEMPLATE_PART_NAME ), + ); + } + + /** + * @coversNothing * @ticket 56922 */ public function test_prepare_item() { + // A proper data provider cannot be used because this method's signature must match the parent method. + // Therefore, actual tests are performed in the test_prepare_item_with_data_provider method. + $this->assertTrue( true ); + } + + /** + * @dataProvider data_prepare_item_with_data_provider + * @covers WP_REST_Template_Autosaves_Controller::prepare_item_for_response + * @ticket 56922 + * + * @param string $parent_post_property_name A class property name that contains the parent post object. + * @param string $rest_base Base part of the REST API endpoint to test. + * @param string $template_id Template ID to use in the test. + */ + public function test_prepare_item_with_data_provider( $parent_post_property_name, $rest_base, $template_id ) { wp_set_current_user( self::$admin_id ); + $parent_post = self::$$parent_post_property_name; $autosave_post_id = wp_create_post_autosave( array( 'post_content' => 'Autosave content.', - 'post_ID' => self::$template_post->ID, - 'post_type' => self::PARENT_POST_TYPE, + 'post_ID' => $parent_post->ID, + 'post_type' => $parent_post->post_type, ) ); $autosave_db_post = get_post( $autosave_post_id ); - $template_id = self::TEST_THEME . '//' . self::TEMPLATE_NAME; - $request = new WP_REST_Request( 'GET', '/wp/v2/templates/' . $template_id . '/autosaves/' . $autosave_db_post->ID ); - $controller = new WP_REST_Template_Autosaves_Controller( self::PARENT_POST_TYPE ); + $request = new WP_REST_Request( 'GET', '/wp/v2/' . $rest_base . '/' . $template_id . '/autosaves/' . $autosave_db_post->ID ); + $controller = new WP_REST_Template_Autosaves_Controller( $parent_post->post_type ); $response = $controller->prepare_item_for_response( $autosave_db_post, $request ); $this->assertInstanceOf( WP_REST_Response::class, @@ -275,11 +485,11 @@ public function test_prepare_item() { "Failed asserting that the autosave id is the same as $autosave_db_post->ID." ); $this->assertSame( - self::$template_post->ID, + $parent_post->ID, $autosave['parent'], sprintf( 'Failed asserting that the parent id of the autosave is the same as %s.', - self::$template_post->ID + $parent_post->ID ) ); @@ -300,17 +510,45 @@ public function test_prepare_item() { } /** - * @covers WP_REST_Template_Autosaves_Controller::get_item_schema + * Data provider for test_prepare_item_with_data_provider. + * + * @return array + */ + public function data_prepare_item_with_data_provider() { + return array( + 'templates' => array( 'template_post', 'templates', self::TEST_THEME . '//' . self::TEMPLATE_NAME ), + 'template parts' => array( 'template_part_post', 'template-parts', self::TEST_THEME . '//' . self::TEMPLATE_PART_NAME ), + ); + } + + /** + * @coversNothing * @ticket 56922 */ public function test_get_item_schema() { - $request = new WP_REST_Request( 'OPTIONS', '/wp/v2/templates/' . self::TEST_THEME . '/' . self::TEMPLATE_NAME . '/autosaves' ); + // A proper data provider cannot be used because this method's signature must match the parent method. + // Therefore, actual tests are performed in the test_prepare_item_with_data_provider method. + $this->assertTrue( true ); + } + + /** + * @dataProvider data_get_item_schema_with_data_provider + * @covers WP_REST_Template_Autosaves_Controller::get_item_schema + * @ticket 56922 + * + * @param string $rest_base Base part of the REST API endpoint to test. + * @param string $template_id Template ID to use in the test. + * @param int $properties_count Number of properties to check for in the schema. + * @param array $additional_properties Additional properties to check for in the schema. + */ + public function test_get_item_schema_with_data_provider( $rest_base, $template_id, $properties_count, $additional_properties = array() ) { + $request = new WP_REST_Request( 'OPTIONS', '/wp/v2/' . $rest_base . '/' . $template_id . '/autosaves' ); $response = rest_get_server()->dispatch( $request ); $data = $response->get_data(); $properties = $data['schema']['properties']; - $this->assertCount( 19, $properties ); + $this->assertCount( $properties_count, $properties ); $this->assertArrayHasKey( 'id', $properties, 'ID key should exist in properties.' ); $this->assertArrayHasKey( 'slug', $properties, 'Slug key should exist in properties.' ); $this->assertArrayHasKey( 'theme', $properties, 'Theme key should exist in properties.' ); @@ -324,22 +562,58 @@ public function test_get_item_schema() { $this->assertArrayHasKey( 'has_theme_file', $properties, 'has_theme_file key should exist in properties.' ); $this->assertArrayHasKey( 'author', $properties, 'author key should exist in properties.' ); $this->assertArrayHasKey( 'modified', $properties, 'modified key should exist in properties.' ); - $this->assertArrayHasKey( 'is_custom', $properties, 'is_custom key should exist in properties.' ); $this->assertArrayHasKey( 'parent', $properties, 'Parent key should exist in properties.' ); $this->assertArrayHasKey( 'author_text', $properties, 'author_text key should exist in properties.' ); $this->assertArrayHasKey( 'original_source', $properties, 'original_source key should exist in properties.' ); - $this->assertArrayHasKey( 'plugin', $properties, 'plugin key should exist in properties.' ); + foreach ( $additional_properties as $additional_property ) { + $this->assertArrayHasKey( $additional_property, $properties, $additional_property . ' key should exist in properties.' ); + } } /** - * @covers WP_REST_Template_Autosaves_Controller::create_item + * Data provider for test_get_item_schema_with_data_provider. + * + * @return array + */ + public function data_get_item_schema_with_data_provider() { + return array( + 'templates' => array( + 'templates', + self::TEST_THEME . '//' . self::TEMPLATE_NAME, + 19, + array( 'is_custom', 'plugin' ), + ), + 'template parts' => array( + 'template-parts', + self::TEST_THEME . '//' . self::TEMPLATE_PART_NAME, + 18, + array( 'area' ), + ), + ); + } + + /** + * @coversNothing * @ticket 56922 */ public function test_create_item() { + // A proper data provider cannot be used because this method's signature must match the parent method. + // Therefore, actual tests are performed in the test_create_item_with_data_provider method. + $this->assertTrue( true ); + } + + /** + * @dataProvider data_create_item_with_data_provider + * @covers WP_REST_Template_Autosaves_Controller::create_item + * @ticket 56922 + * + * @param string $rest_base Base part of the REST API endpoint to test. + * @param string $template_id Template ID to use in the test. + */ + public function test_create_item_with_data_provider( $rest_base, $template_id ) { wp_set_current_user( self::$admin_id ); - $template_id = self::TEST_THEME . '/' . self::TEMPLATE_NAME; - $request = new WP_REST_Request( 'POST', '/wp/v2/templates/' . $template_id . '/autosaves' ); + $request = new WP_REST_Request( 'POST', '/wp/v2/' . $rest_base . '/' . $template_id . '/autosaves' ); $request->add_header( 'Content-Type', 'application/x-www-form-urlencoded' ); $request_parameters = array( @@ -353,41 +627,83 @@ public function test_create_item() { $request->set_body_params( $request_parameters ); $response = rest_get_server()->dispatch( $request ); - $this->assertNotWPError( $response, 'The response from this request should not return a WP_Error object' ); + $this->assertNotWPError( $response, 'The response from this request should not return a WP_Error object.' ); $response = rest_ensure_response( $response ); $data = $response->get_data(); - $this->assertArrayHasKey( 'content', $data, 'Response should contain a key called content' ); - $this->assertSame( $request_parameters['content'], $data['content']['raw'], 'Response data should match for field content' ); + $this->assertArrayHasKey( 'content', $data, 'Response should contain a key called content.' ); + $this->assertSame( $request_parameters['content'], $data['content']['raw'], 'Response data should match for field content.' ); - $this->assertArrayHasKey( 'title', $data, 'Response should contain a key called title' ); - $this->assertSame( $request_parameters['title'], $data['title']['raw'], 'Response data should match for field title' ); + $this->assertArrayHasKey( 'title', $data, 'Response should contain a key called title.' ); + $this->assertSame( $request_parameters['title'], $data['title']['raw'], 'Response data should match for field title.' ); } /** - * @covers WP_REST_Template_Autosaves_Controller::delete_item + * Data provider for test_create_item_with_data_provider. + * + * @return array + */ + public function data_create_item_with_data_provider() { + return array( + 'templates' => array( 'templates', self::TEST_THEME . '//' . self::TEMPLATE_NAME ), + 'template part' => array( 'template-parts', self::TEST_THEME . '//' . self::TEMPLATE_PART_NAME ), + ); + } + + /** + * @dataProvider data_create_item_incorrect_permission + * @covers WP_REST_Template_Autosaves_Controller::create_item_permissions_check * @ticket 56922 + * + * @param string $rest_base Base part of the REST API endpoint to test. + * @param string $template_id Template ID to use in the test. */ - public function test_create_item_incorrect_permission() { + public function test_create_item_incorrect_permission( $rest_base, $template_id ) { wp_set_current_user( self::$contributor_id ); - $template_id = self::TEST_THEME . '/' . self::TEMPLATE_NAME; - $request = new WP_REST_Request( 'POST', '/wp/v2/templates/' . $template_id . '/autosaves' ); - $response = rest_get_server()->dispatch( $request ); + $request = new WP_REST_Request( 'POST', '/wp/v2/' . $rest_base . '/' . $template_id . '/autosaves' ); + $response = rest_get_server()->dispatch( $request ); $this->assertErrorResponse( 'rest_cannot_manage_templates', $response, WP_Http::FORBIDDEN ); } /** - * @covers WP_REST_Template_Autosaves_Controller::delete_item + * Data provider for test_create_item_incorrect_permission. + * + * @return array + */ + public function data_create_item_incorrect_permission() { + return array( + 'template' => array( 'templates', self::TEST_THEME . '//' . self::TEMPLATE_NAME ), + 'template part' => array( 'template-parts', self::TEST_THEME . '//' . self::TEMPLATE_PART_NAME ), + ); + } + + /** + * @dataProvider data_create_item_no_permission + * @covers WP_REST_Template_Autosaves_Controller::create_item_permissions_check * @ticket 56922 + * + * @param string $rest_base Base part of the REST API endpoint to test. + * @param string $template_id Template ID to use in the test. */ - public function test_create_item_no_permission() { + public function test_create_item_no_permission( $rest_base, $template_id ) { wp_set_current_user( 0 ); - $template_id = self::TEST_THEME . '/' . self::TEMPLATE_NAME; - $request = new WP_REST_Request( 'POST', '/wp/v2/templates/' . $template_id . '/autosaves' ); - $response = rest_get_server()->dispatch( $request ); + $request = new WP_REST_Request( 'POST', '/wp/v2/' . $rest_base . '/' . $template_id . '/autosaves' ); + $response = rest_get_server()->dispatch( $request ); $this->assertErrorResponse( 'rest_cannot_manage_templates', $response, WP_Http::UNAUTHORIZED ); } + /** + * Data provider for test_create_item_no_permission. + * + * @return array + */ + public function data_create_item_no_permission() { + return array( + 'template' => array( 'templates', self::TEST_THEME . '//' . self::TEMPLATE_NAME ), + 'template part' => array( 'template-parts', self::TEST_THEME . '//' . self::TEMPLATE_PART_NAME ), + ); + } + /** * @coversNothing * @ticket 56922 diff --git a/tests/phpunit/tests/rest-api/wpRestTemplateRevisionsController.php b/tests/phpunit/tests/rest-api/wpRestTemplateRevisionsController.php index 014a191f0a13f..2391a92478ede 100644 --- a/tests/phpunit/tests/rest-api/wpRestTemplateRevisionsController.php +++ b/tests/phpunit/tests/rest-api/wpRestTemplateRevisionsController.php @@ -27,7 +27,22 @@ class Tests_REST_wpRestTemplateRevisionsController extends WP_Test_REST_Controll /** * @var string */ - const PARENT_POST_TYPE = 'wp_template'; + const TEMPLATE_PART_NAME = 'my_template_part'; + + /** + * @var string + */ + const TEMPLATE_PART_NAME_2 = 'my_template_part_2'; + + /** + * @var string + */ + const TEMPLATE_POST_TYPE = 'wp_template'; + + /** + * @var string + */ + const TEMPLATE_PART_POST_TYPE = 'wp_template_part'; /** * Admin user ID. @@ -65,10 +80,33 @@ class Tests_REST_wpRestTemplateRevisionsController extends WP_Test_REST_Controll */ private static $template_post_2; + /** + * Template part post. + * + * @since 6.7.0 + * + * @var WP_Post + */ + private static $template_part_post; + + /** + * Template part post. + * + * @since 6.7.0 + * + * @var WP_Post + */ + private static $template_part_post_2; + /** * @var array */ - private static $revisions = array(); + private static $template_revisions = array(); + + /** + * @var array + */ + private static $template_part_revisions = array(); /** * Create fake data before our tests run. @@ -92,7 +130,7 @@ public static function wpSetUpBeforeClass( WP_UnitTest_Factory $factory ) { // Set up template post. self::$template_post = $factory->post->create_and_get( array( - 'post_type' => self::PARENT_POST_TYPE, + 'post_type' => self::TEMPLATE_POST_TYPE, 'post_name' => self::TEMPLATE_NAME, 'post_title' => 'My Template', 'post_content' => 'Content', @@ -106,54 +144,84 @@ public static function wpSetUpBeforeClass( WP_UnitTest_Factory $factory ) { ); wp_set_post_terms( self::$template_post->ID, self::TEST_THEME, 'wp_theme' ); - // Update post to create a new revisions. - self::$revisions[] = _wp_put_post_revision( - array( - 'ID' => self::$template_post->ID, - 'post_content' => 'Content revision #2', - ) - ); + // Update post to create new revisions. + foreach ( range( 2, 5 ) as $revision_index ) { + self::$template_revisions[] = _wp_put_post_revision( + array( + 'ID' => self::$template_post->ID, + 'post_content' => 'Content revision #' . $revision_index, + ) + ); + } - // Update post to create a new revisions. - self::$revisions[] = _wp_put_post_revision( + // Create a new template post to test the get_item method. + self::$template_post_2 = $factory->post->create_and_get( array( - 'ID' => self::$template_post->ID, - 'post_content' => 'Content revision #3', + 'post_type' => self::TEMPLATE_POST_TYPE, + 'post_name' => self::TEMPLATE_NAME_2, + 'post_title' => 'My Template 2', + 'post_content' => 'Content 2', + 'post_excerpt' => 'Description of my template 2', + 'tax_input' => array( + 'wp_theme' => array( + self::TEST_THEME, + ), + ), ) ); + wp_set_post_terms( self::$template_post_2->ID, self::TEST_THEME, 'wp_theme' ); - // Update post to create a new revisions. - self::$revisions[] = _wp_put_post_revision( + // Set up template part post. + self::$template_part_post = $factory->post->create_and_get( array( - 'ID' => self::$template_post->ID, - 'post_content' => 'Content revision #4', + 'post_type' => self::TEMPLATE_PART_POST_TYPE, + 'post_name' => self::TEMPLATE_PART_NAME, + 'post_title' => 'My template part', + 'post_content' => 'Content', + 'post_excerpt' => 'Description of my template part', + 'tax_input' => array( + 'wp_theme' => array( + self::TEST_THEME, + ), + 'wp_template_part_area' => array( + WP_TEMPLATE_PART_AREA_HEADER, + ), + ), ) ); + wp_set_post_terms( self::$template_part_post->ID, self::TEST_THEME, 'wp_theme' ); + wp_set_post_terms( self::$template_part_post->ID, WP_TEMPLATE_PART_AREA_HEADER, 'wp_template_part_area' ); - // Update post to create a new revisions. - self::$revisions[] = _wp_put_post_revision( - array( - 'ID' => self::$template_post->ID, - 'post_content' => 'Content revision #5', - ) - ); + // Update post to create new revisions. + foreach ( range( 2, 5 ) as $revision_index ) { + self::$template_part_revisions[] = _wp_put_post_revision( + array( + 'ID' => self::$template_part_post->ID, + 'post_content' => 'Content revision #' . $revision_index, + ) + ); + } - // Create a new template post to test the get_item method. - self::$template_post_2 = $factory->post->create_and_get( + // Set up template part post. + self::$template_part_post_2 = $factory->post->create_and_get( array( - 'post_type' => self::PARENT_POST_TYPE, - 'post_name' => self::TEMPLATE_NAME_2, - 'post_title' => 'My Template 2', + 'post_type' => self::TEMPLATE_PART_POST_TYPE, + 'post_name' => self::TEMPLATE_PART_NAME_2, + 'post_title' => 'My template part 2', 'post_content' => 'Content 2', - 'post_excerpt' => 'Description of my template 2', + 'post_excerpt' => 'Description of my template part 2', 'tax_input' => array( - 'wp_theme' => array( + 'wp_theme' => array( self::TEST_THEME, ), + 'wp_template_part_area' => array( + WP_TEMPLATE_PART_AREA_HEADER, + ), ), ) ); - wp_set_post_terms( self::$template_post_2->ID, self::TEST_THEME, 'wp_theme' ); + wp_set_post_terms( self::$template_part_post_2->ID, self::TEST_THEME, 'wp_theme' ); + wp_set_post_terms( self::$template_part_post_2->ID, WP_TEMPLATE_PART_AREA_HEADER, 'wp_template_part_area' ); } /** @@ -161,8 +229,12 @@ public static function wpSetUpBeforeClass( WP_UnitTest_Factory $factory ) { */ public static function wpTearDownAfterClass() { // Also deletes revisions. - foreach ( self::$revisions as $revision ) { - wp_delete_post( $revision, true ); + foreach ( self::$template_revisions as $template_revision ) { + wp_delete_post( $template_revision, true ); + } + + foreach ( self::$template_part_revisions as $template_part_revision ) { + wp_delete_post( $template_part_revision, true ); } } @@ -195,12 +267,26 @@ public function test_register_routes() { } /** - * @covers WP_REST_Template_Revisions_Controller::get_context_param + * @coversNothing * @ticket 56922 */ public function test_context_param() { + // A proper data provider cannot be used because this method's signature must match the parent method. + // Therefore, actual tests are performed in the test_context_param_with_data_provider method. + $this->assertTrue( true ); + } + + /** + * @dataProvider data_context_param_with_data_provider + * @covers WP_REST_Template_Revisions_Controller::get_context_param + * @ticket 56922 + * + * @param string $rest_base Base part of the REST API endpoint to test. + * @param string $template_id Template ID to use in the test. + */ + public function test_context_param_with_data_provider( $rest_base, $template_id ) { // Collection. - $request = new WP_REST_Request( 'OPTIONS', '/wp/v2/templates/' . self::TEST_THEME . '/' . self::TEMPLATE_NAME . '/revisions' ); + $request = new WP_REST_Request( 'OPTIONS', '/wp/v2/' . $rest_base . '/' . $template_id . '/revisions' ); $response = rest_get_server()->dispatch( $request ); $data = $response->get_data(); $this->assertSame( @@ -215,7 +301,7 @@ public function test_context_param() { ); // Single. - $request = new WP_REST_Request( 'OPTIONS', '/wp/v2/templates/' . self::TEST_THEME . '/' . self::TEMPLATE_NAME . '/revisions/1' ); + $request = new WP_REST_Request( 'OPTIONS', '/wp/v2/' . $rest_base . '/' . $template_id . '/revisions/1' ); $response = rest_get_server()->dispatch( $request ); $data = $response->get_data(); $this->assertCount( @@ -236,17 +322,47 @@ public function test_context_param() { } /** - * @covers WP_REST_Template_Revisions_Controller::get_items + * Data provider for test_context_param. + * + * @return array + */ + public function data_context_param_with_data_provider() { + return array( + 'templates' => array( 'templates', self::TEST_THEME . '//' . self::TEMPLATE_NAME ), + 'template parts' => array( 'template-parts', self::TEST_THEME . '//' . self::TEMPLATE_PART_NAME ), + ); + } + + /** + * @coversNothing * @ticket 56922 */ public function test_get_items() { + // A proper data provider cannot be used because this method's signature must match the parent method. + // Therefore, actual tests are performed in the test_get_items_with_data_provider method. + $this->assertTrue( true ); + } + + /** + * @dataProvider data_get_items_with_data_provider + * @covers WP_REST_Template_Revisions_Controller::get_items + * @ticket 56922 + * + * @param string $parent_post_property_name A class property name that contains the parent post object. + * @param string $rest_base Base part of the REST API endpoint to test. + * @param string $template_id Template ID to use in the test. + */ + public function test_get_items_with_data_provider( $parent_post_property_name, $rest_base, $template_id ) { wp_set_current_user( self::$admin_id ); + $parent_post = self::$$parent_post_property_name; + $request = new WP_REST_Request( 'GET', - '/wp/v2/templates/' . self::TEST_THEME . '/' . self::TEMPLATE_NAME . '/revisions' + '/wp/v2/' . $rest_base . '/' . $template_id . '/revisions' ); $response = rest_get_server()->dispatch( $request ); $revisions = $response->get_data(); + $this->assertSame( WP_Http::OK, $response->get_status(), 'Response is expected to have a status code of 200.' ); $this->assertCount( 4, @@ -255,7 +371,7 @@ public function test_get_items() { ); $this->assertSame( - self::$template_post->ID, + $parent_post->ID, $revisions[0]['parent'], 'Failed asserting that the parent ID of the revision matches the template post ID.' ); @@ -266,7 +382,7 @@ public function test_get_items() { ); $this->assertSame( - self::$template_post->ID, + $parent_post->ID, $revisions[1]['parent'], 'Failed asserting that the parent ID of the revision matches the template post ID.' ); @@ -277,7 +393,7 @@ public function test_get_items() { ); $this->assertSame( - self::$template_post->ID, + $parent_post->ID, $revisions[2]['parent'], 'Failed asserting that the parent ID of the revision matches the template post ID.' ); @@ -288,7 +404,7 @@ public function test_get_items() { ); $this->assertSame( - self::$template_post->ID, + $parent_post->ID, $revisions[3]['parent'], 'Failed asserting that the parent ID of the revision matches the template post ID.' ); @@ -299,40 +415,168 @@ public function test_get_items() { ); } + /** + * Data provider for test_get_items_with_data_provider. + * + * @return array + */ + public function data_get_items_with_data_provider() { + return array( + 'templates' => array( 'template_post', 'templates', self::TEST_THEME . '//' . self::TEMPLATE_NAME ), + 'template parts' => array( 'template_part_post', 'template-parts', self::TEST_THEME . '//' . self::TEMPLATE_PART_NAME ), + ); + } /** + * @dataProvider data_get_items_endpoint_should_return_unauthorized_https_status_code_for_unauthorized_request * @covers WP_REST_Template_Revisions_Controller::get_items_permissions_check * @ticket 56922 + * + * @param string $rest_base Base part of the REST API endpoint to test. + * @param string $template_id Template ID to use in the test. */ - public function test_get_items_endpoint_should_return_unauthorized_https_status_code_for_unauthorized_request() { + public function test_get_items_endpoint_should_return_unauthorized_https_status_code_for_unauthorized_request( $rest_base, $template_id ) { wp_set_current_user( 0 ); - $request = new WP_REST_Request( 'GET', '/wp/v2/templates/' . self::TEST_THEME . '/' . self::TEMPLATE_NAME . '/revisions' ); + $request = new WP_REST_Request( 'GET', '/wp/v2/' . $rest_base . '/' . $template_id . '/revisions' ); $response = rest_get_server()->dispatch( $request ); $this->assertErrorResponse( 'rest_cannot_read', $response, WP_Http::UNAUTHORIZED ); } /** + * Data provider for test_get_items_endpoint_should_return_unauthorized_https_status_code_for_unauthorized_request. + * + * @return array + */ + public function data_get_items_endpoint_should_return_unauthorized_https_status_code_for_unauthorized_request() { + return array( + 'templates' => array( 'templates', self::TEST_THEME . '//' . self::TEMPLATE_NAME ), + 'template parts' => array( 'template-parts', self::TEST_THEME . '//' . self::TEMPLATE_PART_NAME ), + ); + } + + /** + * @dataProvider data_get_items_endpoint_should_return_forbidden_https_status_code_for_users_with_insufficient_permissions * @covers WP_REST_Template_Revisions_Controller::get_items_permissions_check * @ticket 56922 + * + * @param string $rest_base Base part of the REST API endpoint to test. + * @param string $template_id Template ID to use in the test. */ - public function test_get_items_endpoint_should_return_forbidden_https_status_code_for_users_with_insufficient_permissions() { + public function test_get_items_endpoint_should_return_forbidden_https_status_code_for_users_with_insufficient_permissions( $rest_base, string $template_id ) { wp_set_current_user( self::$contributor_id ); - $request = new WP_REST_Request( 'GET', '/wp/v2/templates/' . self::TEST_THEME . '/' . self::TEMPLATE_NAME . '/revisions' ); + $request = new WP_REST_Request( 'GET', '/wp/v2/' . $rest_base . '/' . $template_id . '/revisions' ); $response = rest_get_server()->dispatch( $request ); $this->assertErrorResponse( 'rest_cannot_read', $response, WP_Http::FORBIDDEN ); } /** - * @covers WP_REST_Template_Revisions_Controller::get_item + * Data provider for test_get_items_endpoint_should_return_unauthorized_https_status_code_for_unauthorized_request. + * + * @return array + */ + public function data_get_items_endpoint_should_return_forbidden_https_status_code_for_users_with_insufficient_permissions() { + return array( + 'templates' => array( 'templates', self::TEST_THEME . '//' . self::TEMPLATE_NAME ), + 'template parts' => array( 'template-parts', self::TEST_THEME . '//' . self::TEMPLATE_PART_NAME ), + ); + } + + /** + * @dataProvider data_get_items_for_templates_based_on_theme_files_should_return_bad_response_status + * @ticket 61970 + * + * @param string $rest_base Base part of the REST API endpoint to test. + * @param string $template_id Template ID to use in the test. + */ + public function test_get_items_for_templates_based_on_theme_files_should_return_bad_response_status( $rest_base, $template_id ) { + wp_set_current_user( self::$admin_id ); + switch_theme( 'block-theme' ); + + $request = new WP_REST_Request( 'GET', '/wp/v2/' . $rest_base . '/' . $template_id . '/revisions' ); + + $response = rest_get_server()->dispatch( $request ); + $this->assertErrorResponse( + 'rest_invalid_template', + $response, + WP_Http::BAD_REQUEST, + sprintf( 'Response is expected to have a status code of %d.', WP_Http::BAD_REQUEST ) + ); + } + + /** + * Data provider for test_get_items_for_templates_based_on_theme_files_should_return_bad_response_status. + * + * @return array + */ + public function data_get_items_for_templates_based_on_theme_files_should_return_bad_response_status() { + return array( + 'templates' => array( 'templates', self::TEST_THEME . '//page-home' ), + 'template parts' => array( 'template-parts', self::TEST_THEME . '//small-header' ), + ); + } + + /** + * @dataProvider data_get_item_for_templates_based_on_theme_files_should_return_bad_response_status + * @ticket 56922 + * + * @param string $rest_base Base part of the REST API endpoint to test. + * @param string $template_id Template ID to use in the test. + */ + public function test_get_item_for_templates_based_on_theme_files_should_return_bad_response_status( $rest_base, $template_id ) { + wp_set_current_user( self::$admin_id ); + switch_theme( 'block-theme' ); + + $request = new WP_REST_Request( 'GET', '/wp/v2/' . $rest_base . '/' . $template_id . '/revisions/1' ); + + $response = rest_get_server()->dispatch( $request ); + $this->assertErrorResponse( + 'rest_invalid_template', + $response, + WP_Http::BAD_REQUEST, + sprintf( 'Response is expected to have a status code of %d.', WP_Http::BAD_REQUEST ) + ); + } + + /** + * Data provider for test_get_item_for_templates_based_on_theme_files_should_return_bad_response_status. + * + * @return array + */ + public function data_get_item_for_templates_based_on_theme_files_should_return_bad_response_status() { + return array( + 'templates' => array( 'templates', self::TEST_THEME . '//page-home' ), + 'template parts' => array( 'template-parts', self::TEST_THEME . '//small-header' ), + ); + } + + /** + * @coversNothing * @ticket 56922 */ public function test_get_item() { + // A proper data provider cannot be used because this method's signature must match the parent method. + // Therefore, actual tests are performed in the test_get_item_with_data_provider method. + $this->assertTrue( true ); + } + + /** + * @dataProvider data_get_item_with_data_provider + * @covers WP_REST_Template_Revisions_Controller::get_item + * @ticket 56922 + * + * @param string $parent_post_property_name A class property name that contains the parent post object. + * @param string $rest_base Base part of the REST API endpoint to test. + * @param string $template_id Template ID to use in the test. + */ + public function test_get_item_with_data_provider( $parent_post_property_name, $rest_base, $template_id ) { wp_set_current_user( self::$admin_id ); - $revisions = wp_get_post_revisions( self::$template_post, array( 'fields' => 'ids' ) ); + $parent_post = self::$$parent_post_property_name; + + $revisions = wp_get_post_revisions( $parent_post, array( 'fields' => 'ids' ) ); $revision_id = array_shift( $revisions ); - $request = new WP_REST_Request( 'GET', '/wp/v2/templates/' . self::TEST_THEME . '/' . self::TEMPLATE_NAME . '/revisions/' . $revision_id ); + $request = new WP_REST_Request( 'GET', '/wp/v2/' . $rest_base . '/' . $template_id . '/revisions/' . $revision_id ); $response = rest_get_server()->dispatch( $request ); $revision = $response->get_data(); @@ -343,7 +587,7 @@ public function test_get_item() { "Failed asserting that the revision id is the same as $revision_id" ); $this->assertSame( - self::$template_post->ID, + $parent_post->ID, $revision['parent'], sprintf( 'Failed asserting that the parent id of the revision is the same as %s.', @@ -353,47 +597,125 @@ public function test_get_item() { } /** + * Data provider for test_get_item_with_data_provider. + * + * @return array + */ + public function data_get_item_with_data_provider() { + return array( + 'templates' => array( 'template_post', 'templates', self::TEST_THEME . '//' . self::TEMPLATE_NAME ), + 'template parts' => array( 'template_part_post', 'template-parts', self::TEST_THEME . '//' . self::TEMPLATE_PART_NAME ), + ); + } + + /** + * @dataProvider data_get_item_not_found * @covers WP_REST_Template_Revisions_Controller::get_item * @ticket 56922 + * + * @param string $parent_post_property_name A class property name that contains the parent post object. + * @param string $rest_base Base part of the REST API endpoint to test. */ - public function test_get_item_not_found() { + public function test_get_item_not_found( $parent_post_property_name, $rest_base ) { wp_set_current_user( self::$admin_id ); - $revisions = wp_get_post_revisions( self::$template_post, array( 'fields' => 'ids' ) ); + $parent_post = self::$$parent_post_property_name; + + $revisions = wp_get_post_revisions( $parent_post, array( 'fields' => 'ids' ) ); $revision_id = array_shift( $revisions ); - $request = new WP_REST_Request( 'GET', '/wp/v2/templates/invalid//parent/revisions/' . $revision_id ); + $request = new WP_REST_Request( 'GET', '/wp/v2/' . $rest_base . '/invalid//parent/revisions/' . $revision_id ); $response = rest_get_server()->dispatch( $request ); $this->assertErrorResponse( 'rest_post_invalid_parent', $response, WP_Http::NOT_FOUND ); } /** + * Data provider for test_get_item_not_found. + * + * @return array + */ + public function data_get_item_not_found() { + return array( + 'templates' => array( 'template_post', 'templates' ), + 'template parts' => array( 'template_part_post', 'template-parts' ), + ); + } + + /** + * @dataProvider data_get_item_invalid_parent_id + * @covers WP_REST_Template_Revisions_Controller::get_item * @ticket 59875 + * + * @param string $parent_post_property_name A class property name that contains the parent post object. + * @param string $actual_parent_post_property_name A class property name that contains the parent post object. + * @param string $rest_base Base part of the REST API endpoint to test. + * @param string $template_id Template ID to use in the test. */ - public function test_get_item_invalid_parent_id() { + public function test_get_item_invalid_parent_id( $parent_post_property_name, $actual_parent_post_property_name, $rest_base, $template_id ) { wp_set_current_user( self::$admin_id ); - $revisions = wp_get_post_revisions( self::$template_post, array( 'fields' => 'ids' ) ); - $revision_id = array_shift( $revisions ); - $request = new WP_REST_Request( 'GET', '/wp/v2/templates/' . self::TEST_THEME . '/' . self::TEMPLATE_NAME_2 . '/revisions/' . $revision_id ); + $parent_post = self::$$parent_post_property_name; + $actual_parent_post = self::$$actual_parent_post_property_name; + $revisions = wp_get_post_revisions( $parent_post, array( 'fields' => 'ids' ) ); + $revision_id = array_shift( $revisions ); + + $request = new WP_REST_Request( 'GET', '/wp/v2/' . $rest_base . '/' . $template_id . '/revisions/' . $revision_id ); $response = rest_get_server()->dispatch( $request ); $this->assertErrorResponse( 'rest_revision_parent_id_mismatch', $response, 404 ); - $expected_message = 'The revision does not belong to the specified parent with id of "' . self::$template_post_2->ID . '"'; + $expected_message = 'The revision does not belong to the specified parent with id of "' . $actual_parent_post->ID . '"'; $this->assertSame( $expected_message, $response->as_error()->get_error_messages()[0], 'The message must contain the correct parent ID.' ); } /** - * @covers WP_REST_Template_Revisions_Controller::prepare_item_for_response + * Data provider for test_get_item_invalid_parent_id. + * + * @return array + */ + public function data_get_item_invalid_parent_id() { + return array( + 'templates' => array( + 'template_post', + 'template_post_2', + 'templates', + self::TEST_THEME . '//' . self::TEMPLATE_NAME_2, + ), + 'template parts' => array( + 'template_part_post', + 'template_part_post_2', + 'template-parts', + self::TEST_THEME . '//' . self::TEMPLATE_PART_NAME_2, + ), + ); + } + + /** + * @coversNothing * @ticket 56922 */ public function test_prepare_item() { - $revisions = wp_get_post_revisions( self::$template_post, array( 'fields' => 'ids' ) ); + // A proper data provider cannot be used because this method's signature must match the parent method. + // Therefore, actual tests are performed in the test_prepare_item_with_data_provider method. + $this->assertTrue( true ); + } + + /** + * @dataProvider data_prepare_item_with_data_provider + * @covers WP_REST_Template_Revisions_Controller::prepare_item_for_response + * @ticket 56922 + * + * @param string $parent_post_property_name A class property name that contains the parent post object. + * @param string $rest_base Base part of the REST API endpoint to test. + * @param string $template_id Template ID to use in the test. + */ + public function test_prepare_item_with_data_provider( $parent_post_property_name, $rest_base, $template_id ) { + $parent_post = self::$$parent_post_property_name; + $revisions = wp_get_post_revisions( $parent_post, array( 'fields' => 'ids' ) ); $revision_id = array_shift( $revisions ); $post = get_post( $revision_id ); - $request = new WP_REST_Request( 'GET', '/wp/v2/templates/' . self::TEST_THEME . '/' . self::TEMPLATE_NAME . '/revisions/' . $revision_id ); - $controller = new WP_REST_Template_Revisions_Controller( self::PARENT_POST_TYPE ); + $request = new WP_REST_Request( 'GET', '/wp/v2/' . $rest_base . '/' . $template_id . '/revisions/' . $revision_id ); + $controller = new WP_REST_Template_Revisions_Controller( $parent_post->post_type ); $response = $controller->prepare_item_for_response( $post, $request ); $this->assertInstanceOf( WP_REST_Response::class, @@ -409,11 +731,11 @@ public function test_prepare_item() { "Failed asserting that the revision id is the same as $revision_id." ); $this->assertSame( - self::$template_post->ID, + $parent_post->ID, $revision['parent'], sprintf( 'Failed asserting that the parent id of the revision is the same as %s.', - self::$template_post->ID + $parent_post->ID ) ); @@ -421,35 +743,63 @@ public function test_prepare_item() { $this->assertIsArray( $links, 'Failed asserting that the links are an array.' ); $this->assertStringEndsWith( - self::TEST_THEME . '//' . self::TEMPLATE_NAME . '/revisions/' . $revision_id, + $template_id . '/revisions/' . $revision_id, $links['self'][0]['href'], sprintf( 'Failed asserting that the self link ends with %s.', - self::TEST_THEME . '//' . self::TEMPLATE_NAME . '/revisions/' . $revision_id + $template_id . '/revisions/' . $revision_id ) ); $this->assertStringEndsWith( - self::TEST_THEME . '//' . self::TEMPLATE_NAME, + $template_id, $links['parent'][0]['href'], sprintf( 'Failed asserting that the parent link ends with %s.', - self::TEST_THEME . '//' . self::TEMPLATE_NAME + $template_id ) ); } /** - * @covers WP_REST_Template_Revisions_Controller::get_item_schema + * Data provider for test_prepare_item_with_data_provider. + * + * @return array + */ + public function data_prepare_item_with_data_provider() { + return array( + 'templates' => array( 'template_post', 'templates', self::TEST_THEME . '//' . self::TEMPLATE_NAME ), + 'template parts' => array( 'template_part_post', 'template-parts', self::TEST_THEME . '//' . self::TEMPLATE_PART_NAME ), + ); + } + + /** + * @coversNothing * @ticket 56922 */ public function test_get_item_schema() { - $request = new WP_REST_Request( 'OPTIONS', '/wp/v2/templates/' . self::TEST_THEME . '/' . self::TEMPLATE_NAME . '/revisions' ); + // A proper data provider cannot be used because this method's signature must match the parent method. + // Therefore, actual tests are performed in the test_prepare_item_with_data_provider method. + $this->assertTrue( true ); + } + + /** + * @dataProvider data_get_item_schema_with_data_provider + * @covers WP_REST_Template_Revisions_Controller::get_item_schema + * @ticket 56922 + * + * @param string $rest_base Base part of the REST API endpoint to test. + * @param string $template_id Template ID to use in the test. + * @param int $properties_count Number of properties to check for in the schema. + * @param array $additional_properties Additional properties to check for in the schema. + */ + public function test_get_item_schema_with_data_provider( $rest_base, $template_id, $properties_count, $additional_properties = array() ) { + $request = new WP_REST_Request( 'OPTIONS', '/wp/v2/' . $rest_base . '/' . $template_id . '/revisions' ); $response = rest_get_server()->dispatch( $request ); $data = $response->get_data(); $properties = $data['schema']['properties']; - $this->assertCount( 19, $properties ); + $this->assertCount( $properties_count, $properties ); $this->assertArrayHasKey( 'id', $properties, 'ID key should exist in properties.' ); $this->assertArrayHasKey( 'slug', $properties, 'Slug key should exist in properties.' ); $this->assertArrayHasKey( 'theme', $properties, 'Theme key should exist in properties.' ); @@ -463,11 +813,35 @@ public function test_get_item_schema() { $this->assertArrayHasKey( 'has_theme_file', $properties, 'has_theme_file key should exist in properties.' ); $this->assertArrayHasKey( 'author', $properties, 'author key should exist in properties.' ); $this->assertArrayHasKey( 'modified', $properties, 'modified key should exist in properties.' ); - $this->assertArrayHasKey( 'is_custom', $properties, 'is_custom key should exist in properties.' ); $this->assertArrayHasKey( 'parent', $properties, 'Parent key should exist in properties.' ); $this->assertArrayHasKey( 'author_text', $properties, 'author_text key should exist in properties.' ); $this->assertArrayHasKey( 'original_source', $properties, 'original_source key should exist in properties.' ); - $this->assertArrayHasKey( 'plugin', $properties, 'plugin key should exist in properties.' ); + + foreach ( $additional_properties as $additional_property ) { + $this->assertArrayHasKey( $additional_property, $properties, $additional_property . ' key should exist in properties.' ); + } + } + + /** + * Data provider for data_get_item_schema_with_data_provider. + * + * @return array + */ + public function data_get_item_schema_with_data_provider() { + return array( + 'templates' => array( + 'templates', + self::TEST_THEME . '//' . self::TEMPLATE_NAME, + 19, + array( 'is_custom', 'plugin' ), + ), + 'template parts' => array( + 'template-parts', + self::TEST_THEME . '//' . self::TEMPLATE_PART_NAME, + 18, + array( 'area' ), + ), + ); } /** @@ -497,16 +871,35 @@ public function test_update_item() { } /** - * @covers WP_REST_Templates_Controller::delete_item + * @coversNothing * @ticket 56922 */ public function test_delete_item() { + // A proper data provider cannot be used because this method's signature must match the parent method. + // Therefore, actual tests are performed in the test_delete_item_with_data_provider method. + $this->assertTrue( true ); + } + + /** + * @dataProvider data_delete_item_with_data_provider + * @covers WP_REST_Templates_Controller::delete_item + * @ticket 56922 + * + * @param string $parent_post_property_name A class property name that contains the parent post object. + * @param string $revisions_property_name A class property name that contains the revisions array. + * @param string $rest_base Base part of the REST API endpoint to test. + * @param string $template_id Template ID to use in the test. + */ + public function test_delete_item_with_data_provider( $parent_post_property_name, $revisions_property_name, $rest_base, $template_id ) { wp_set_current_user( self::$admin_id ); - $revision_id = _wp_put_post_revision( self::$template_post ); - self::$revisions[] = $revision_id; + $parent_post = self::$$parent_post_property_name; + $revisions = self::$$revisions_property_name; + + $revision_id = _wp_put_post_revision( $parent_post ); + $revisions[] = $revision_id; - $request = new WP_REST_Request( 'DELETE', '/wp/v2/templates/' . self::TEST_THEME . '/' . self::TEMPLATE_NAME . '/revisions/' . $revision_id ); + $request = new WP_REST_Request( 'DELETE', '/wp/v2/' . $rest_base . '/' . $template_id . '/revisions/' . $revision_id ); $request->set_param( 'force', true ); $response = rest_get_server()->dispatch( $request ); @@ -515,48 +908,161 @@ public function test_delete_item() { } /** + * Data provider for test_delete_item_with_data_provider. + * + * @return array + */ + public function data_delete_item_with_data_provider() { + return array( + 'templates' => array( + 'template_post', + 'template_revisions', + 'templates', + self::TEST_THEME . '//' . self::TEMPLATE_NAME, + ), + 'template parts' => array( + 'template_part_post', + 'template_part_revisions', + 'template-parts', + self::TEST_THEME . '//' . self::TEMPLATE_PART_NAME, + ), + ); + } + + /** + * @dataProvider data_delete_item_incorrect_permission * @covers WP_REST_Templates_Controller::delete_item * @ticket 56922 + * + * @param string $parent_post_property_name A class property name that contains the parent post object. + * @param string $revisions_property_name A class property name that contains the revisions array. + * @param string $rest_base Base part of the REST API endpoint to test. + * @param string $template_id Template ID to use in the test. */ - public function test_delete_item_incorrect_permission() { + public function test_delete_item_incorrect_permission( $parent_post_property_name, $revisions_property_name, $rest_base, $template_id ) { wp_set_current_user( self::$contributor_id ); - $revision_id = _wp_put_post_revision( self::$template_post ); - self::$revisions[] = $revision_id; + $parent_post = self::$$parent_post_property_name; + $revisions = self::$$revisions_property_name; + + $revision_id = _wp_put_post_revision( $parent_post ); + $revisions[] = $revision_id; - $request = new WP_REST_Request( 'DELETE', '/wp/v2/templates/' . self::TEST_THEME . '/' . self::TEMPLATE_NAME . '/revisions/' . $revision_id ); + $request = new WP_REST_Request( 'DELETE', '/wp/v2/' . $rest_base . '/' . $template_id . '/revisions/' . $revision_id ); $request->set_param( 'force', true ); $response = rest_get_server()->dispatch( $request ); $this->assertErrorResponse( 'rest_cannot_delete', $response, WP_Http::FORBIDDEN ); } /** + * Data provider for test_delete_item_with_data_provider. + * + * @return array + */ + public function data_delete_item_incorrect_permission() { + return array( + 'templates' => array( + 'template_post', + 'template_revisions', + 'templates', + self::TEST_THEME . '//' . self::TEMPLATE_NAME, + ), + 'template parts' => array( + 'template_part_post', + 'template_part_revisions', + 'template-parts', + self::TEST_THEME . '//' . self::TEMPLATE_PART_NAME, + ), + ); + } + + /** + * @dataProvider data_delete_item_no_permission * @covers WP_REST_Templates_Controller::delete_item * @ticket 56922 + * + * @param string $parent_post_property_name A class property name that contains the parent post object. + * @param string $revisions_property_name A class property name that contains the revisions array. + * @param string $rest_base Base part of the REST API endpoint to test. + * @param string $template_id Template ID to use in the test. */ - public function test_delete_item_no_permission() { + public function test_delete_item_no_permission( $parent_post_property_name, $revisions_property_name, $rest_base, $template_id ) { wp_set_current_user( 0 ); - $revision_id = _wp_put_post_revision( self::$template_post ); - self::$revisions[] = $revision_id; - $request = new WP_REST_Request( 'DELETE', '/wp/v2/templates/' . self::TEST_THEME . '/' . self::TEMPLATE_NAME . '/revisions/' . $revision_id ); + $parent_post = self::$$parent_post_property_name; + $revisions = self::$$revisions_property_name; + + $revision_id = _wp_put_post_revision( $parent_post ); + $revisions[] = $revision_id; + + $request = new WP_REST_Request( 'DELETE', '/wp/v2/' . $rest_base . '/' . $template_id . '/revisions/' . $revision_id ); $request->set_param( 'force', true ); $response = rest_get_server()->dispatch( $request ); $this->assertErrorResponse( 'rest_cannot_delete', $response, WP_Http::UNAUTHORIZED ); } /** + * Data provider for test_delete_item_no_permission. + * + * @return array + */ + public function data_delete_item_no_permission() { + return array( + 'templates' => array( + 'template_post', + 'template_revisions', + 'templates', + self::TEST_THEME . '//' . self::TEMPLATE_NAME, + ), + 'template parts' => array( + 'template_part_post', + 'template_part_revisions', + 'template-parts', + self::TEST_THEME . '//' . self::TEMPLATE_PART_NAME, + ), + ); + } + + /** + * @dataProvider data_delete_item_not_found * @covers WP_REST_Template_Revisions_Controller::get_item * @ticket 56922 + * + * @param string $parent_post_property_name A class property name that contains the parent post object. + * @param string $revisions_property_name A class property name that contains the revisions array. + * @param string $rest_base Base part of the REST API endpoint to test. */ - public function test_delete_item_not_found() { + public function test_delete_item_not_found( $parent_post_property_name, $revisions_property_name, $rest_base ) { wp_set_current_user( self::$admin_id ); - $revision_id = _wp_put_post_revision( self::$template_post ); - self::$revisions[] = $revision_id; + $parent_post = self::$$parent_post_property_name; + $revisions = self::$$revisions_property_name; - $request = new WP_REST_Request( 'DELETE', '/wp/v2/templates/invalid//parent/revisions/' . $revision_id ); + $revision_id = _wp_put_post_revision( $parent_post ); + $revisions[] = $revision_id; + + $request = new WP_REST_Request( 'DELETE', '/wp/v2/' . $rest_base . '/invalid//parent/revisions/' . $revision_id ); $request->set_param( 'force', true ); $response = rest_get_server()->dispatch( $request ); $this->assertErrorResponse( 'rest_post_invalid_parent', $response, WP_Http::NOT_FOUND ); } + + /** + * Data provider for test_delete_item_not_found. + * + * @return array + */ + public function data_delete_item_not_found() { + return array( + 'templates' => array( + 'template_post', + 'template_revisions', + 'templates', + ), + 'template parts' => array( + 'template_part_post', + 'template_part_revisions', + 'template-parts', + ), + ); + } } From 9342553d5e403c651775be20d959d2779c4c3a2a Mon Sep 17 00:00:00 2001 From: Sergey Biryukov Date: Wed, 15 Jan 2025 12:50:48 +0000 Subject: [PATCH 101/117] Coding Standards: Use strict comparison in `paginate_links()`. Follow-up to [4275], [28785]. Props aristath, poena, afercia, SergeyBiryukov. See #62279. git-svn-id: https://develop.svn.wordpress.org/trunk@59606 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/general-template.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/wp-includes/general-template.php b/src/wp-includes/general-template.php index e96f0f7c37429..11dffac4b3270 100644 --- a/src/wp-includes/general-template.php +++ b/src/wp-includes/general-template.php @@ -4579,7 +4579,7 @@ function paginate_links( $args = '' ) { $dots = false; if ( $args['prev_next'] && $current && 1 < $current ) : - $link = str_replace( '%_%', 2 == $current ? '' : $args['format'], $args['base'] ); + $link = str_replace( '%_%', 2 === $current ? '' : $args['format'], $args['base'] ); $link = str_replace( '%#%', $current - 1, $link ); if ( $add_args ) { $link = add_query_arg( $add_args, $link ); @@ -4601,7 +4601,7 @@ function paginate_links( $args = '' ) { endif; for ( $n = 1; $n <= $total; $n++ ) : - if ( $n == $current ) : + if ( $n === $current ) : $page_links[] = sprintf( '%s', esc_attr( $args['aria_current'] ), @@ -4611,7 +4611,7 @@ function paginate_links( $args = '' ) { $dots = true; else : if ( $args['show_all'] || ( $n <= $end_size || ( $current && $n >= $current - $mid_size && $n <= $current + $mid_size ) || $n > $total - $end_size ) ) : - $link = str_replace( '%_%', 1 == $n ? '' : $args['format'], $args['base'] ); + $link = str_replace( '%_%', 1 === $n ? '' : $args['format'], $args['base'] ); $link = str_replace( '%#%', $n, $link ); if ( $add_args ) { $link = add_query_arg( $add_args, $link ); From aaf760cbdc5d1175b0a9adc9a2c9ca7beeeea068 Mon Sep 17 00:00:00 2001 From: Pascal Birchler Date: Wed, 15 Jan 2025 12:53:30 +0000 Subject: [PATCH 102/117] Undo accidental `svn:mergeinfo` property change in [59605]. See #61970. git-svn-id: https://develop.svn.wordpress.org/trunk@59607 602fd350-edb4-49c9-b593-d223f7449a82 From d2630e00cd6f2300bcd9f161051c255b1c60b3bb Mon Sep 17 00:00:00 2001 From: Felix Arntz Date: Wed, 15 Jan 2025 18:34:35 +0000 Subject: [PATCH 103/117] REST API: Fix PHP warning about undefined `paged` argument in various REST API endpoints. This bug could occur in `WP_REST_Posts_Controller`, `WP_REST_Global_Styles_Revisions_Controller`, `WP_REST_Revisions_Controller`, and any of their child classes. This changeset fixes it throughout. Props apermo, pbearne, hemant-ahir, flixos90. Fixes #62292. git-svn-id: https://develop.svn.wordpress.org/trunk@59630 602fd350-edb4-49c9-b593-d223f7449a82 --- ...est-global-styles-revisions-controller.php | 2 +- .../class-wp-rest-posts-controller.php | 2 +- .../class-wp-rest-revisions-controller.php | 2 +- ...est-global-styles-revisions-controller.php | 41 +++++++++++++++++++ .../tests/rest-api/rest-posts-controller.php | 39 ++++++++++++++++++ .../rest-api/rest-revisions-controller.php | 40 ++++++++++++++++++ .../wpRestTemplateRevisionsController.php | 40 ++++++++++++++++++ 7 files changed, 163 insertions(+), 3 deletions(-) diff --git a/src/wp-includes/rest-api/endpoints/class-wp-rest-global-styles-revisions-controller.php b/src/wp-includes/rest-api/endpoints/class-wp-rest-global-styles-revisions-controller.php index 54285fa560bee..4108f9711c8a7 100644 --- a/src/wp-includes/rest-api/endpoints/class-wp-rest-global-styles-revisions-controller.php +++ b/src/wp-includes/rest-api/endpoints/class-wp-rest-global-styles-revisions-controller.php @@ -189,7 +189,7 @@ public function get_items( $request ) { $revisions_query = new WP_Query(); $revisions = $revisions_query->query( $query_args ); $offset = isset( $query_args['offset'] ) ? (int) $query_args['offset'] : 0; - $page = (int) $query_args['paged']; + $page = isset( $query_args['paged'] ) ? (int) $query_args['paged'] : 0; $total_revisions = $revisions_query->found_posts; if ( $total_revisions < 1 ) { diff --git a/src/wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php b/src/wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php index 95851199c6e4d..6f872be3dfd78 100644 --- a/src/wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php +++ b/src/wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php @@ -457,7 +457,7 @@ static function ( $format ) { remove_filter( 'post_password_required', array( $this, 'check_password_required' ) ); } - $page = (int) $query_args['paged']; + $page = isset( $query_args['paged'] ) ? (int) $query_args['paged'] : 0; $total_posts = $posts_query->found_posts; if ( $total_posts < 1 && $page > 1 ) { diff --git a/src/wp-includes/rest-api/endpoints/class-wp-rest-revisions-controller.php b/src/wp-includes/rest-api/endpoints/class-wp-rest-revisions-controller.php index fb5fa29231a4f..1dbc611631b9b 100644 --- a/src/wp-includes/rest-api/endpoints/class-wp-rest-revisions-controller.php +++ b/src/wp-includes/rest-api/endpoints/class-wp-rest-revisions-controller.php @@ -294,7 +294,7 @@ public function get_items( $request ) { $revisions_query = new WP_Query(); $revisions = $revisions_query->query( $query_args ); $offset = isset( $query_args['offset'] ) ? (int) $query_args['offset'] : 0; - $page = (int) $query_args['paged']; + $page = isset( $query_args['paged'] ) ? (int) $query_args['paged'] : 0; $total_revisions = $revisions_query->found_posts; if ( $total_revisions < 1 ) { diff --git a/tests/phpunit/tests/rest-api/rest-global-styles-revisions-controller.php b/tests/phpunit/tests/rest-api/rest-global-styles-revisions-controller.php index b01ada9be28ff..5fd97a7a71abf 100644 --- a/tests/phpunit/tests/rest-api/rest-global-styles-revisions-controller.php +++ b/tests/phpunit/tests/rest-api/rest-global-styles-revisions-controller.php @@ -826,6 +826,47 @@ public function test_get_items_out_of_bounds_page_should_not_error_if_offset() { $this->assertCount( $expected_count, $response->get_data() ); } + + /** + * Tests for the pagination. + * + * @ticket 62292 + * + * @covers WP_REST_Global_Styles_Controller::get_items + */ + public function test_get_global_styles_revisions_pagination() { + wp_set_current_user( self::$admin_id ); + + // Test offset + $request = new WP_REST_Request( 'GET', '/wp/v2/global-styles/' . self::$global_styles_id . '/revisions' ); + $request->set_param( 'offset', 1 ); + $request->set_param( 'per_page', 1 ); + $response = rest_get_server()->dispatch( $request ); + $this->assertEquals( 200, $response->get_status() ); + $data = $response->get_data(); + $this->assertCount( 1, $data ); + $this->assertEquals( 3, $response->get_headers()['X-WP-Total'] ); + $this->assertEquals( 3, $response->get_headers()['X-WP-TotalPages'] ); + + // Test paged + $request = new WP_REST_Request( 'GET', '/wp/v2/global-styles/' . self::$global_styles_id . '/revisions' ); + $request->set_param( 'page', 2 ); + $request->set_param( 'per_page', 2 ); + $response = rest_get_server()->dispatch( $request ); + $this->assertEquals( 200, $response->get_status() ); + $data = $response->get_data(); + $this->assertCount( 1, $data ); + $this->assertEquals( 3, $response->get_headers()['X-WP-Total'] ); + $this->assertEquals( 2, $response->get_headers()['X-WP-TotalPages'] ); + + // Test out of bounds + $request = new WP_REST_Request( 'GET', '/wp/v2/global-styles/' . self::$global_styles_id . '/revisions' ); + $request->set_param( 'page', 4 ); + $request->set_param( 'per_page', 6 ); + $response = rest_get_server()->dispatch( $request ); + $this->assertErrorResponse( 'rest_revision_invalid_page_number', $response, 400 ); + } + /** * @doesNotPerformAssertions */ diff --git a/tests/phpunit/tests/rest-api/rest-posts-controller.php b/tests/phpunit/tests/rest-api/rest-posts-controller.php index e2fd7139f3f54..a1b8de0474359 100644 --- a/tests/phpunit/tests/rest-api/rest-posts-controller.php +++ b/tests/phpunit/tests/rest-api/rest-posts-controller.php @@ -5676,6 +5676,45 @@ public function test_multiple_post_format_support() { $this->assertCount( 2, $response->get_data(), 'Two posts are expected to be returned' ); } + /** + * Tests for the pagination. + * + * @ticket 62292 + * + * @covers WP_REST_Posts_Controller::get_items + */ + public function test_get_posts_with_pagination() { + + // Test offset + $request = new WP_REST_Request( 'GET', '/wp/v2/posts' ); + $request->set_param( 'offset', 1 ); + $request->set_param( 'per_page', 1 ); + $response = rest_get_server()->dispatch( $request ); + $this->assertEquals( 200, $response->get_status() ); + $data = $response->get_data(); + $this->assertCount( 1, $data ); + $this->assertEquals( 30, $response->get_headers()['X-WP-Total'] ); + $this->assertEquals( 30, $response->get_headers()['X-WP-TotalPages'] ); + + // Test paged + $request = new WP_REST_Request( 'GET', '/wp/v2/posts' ); + $request->set_param( 'page', 2 ); + $request->set_param( 'per_page', 2 ); + $response = rest_get_server()->dispatch( $request ); + $this->assertEquals( 200, $response->get_status() ); + $data = $response->get_data(); + $this->assertCount( 2, $data ); + $this->assertEquals( 30, $response->get_headers()['X-WP-Total'] ); + $this->assertEquals( 15, $response->get_headers()['X-WP-TotalPages'] ); + + // Test out of bounds + $request = new WP_REST_Request( 'GET', '/wp/v2/posts' ); + $request->set_param( 'page', 4 ); + $request->set_param( 'per_page', 10 ); + $response = rest_get_server()->dispatch( $request ); + $this->assertErrorResponse( 'rest_post_invalid_page_number', $response, 400 ); + } + /** * Internal function used to disable an insert query which * will trigger a wpdb error for testing purposes. diff --git a/tests/phpunit/tests/rest-api/rest-revisions-controller.php b/tests/phpunit/tests/rest-api/rest-revisions-controller.php index d2650d31fa852..cdb886c4e47e6 100644 --- a/tests/phpunit/tests/rest-api/rest-revisions-controller.php +++ b/tests/phpunit/tests/rest-api/rest-revisions-controller.php @@ -864,4 +864,44 @@ public function test_get_items_out_of_bounds_page_should_not_error_if_offset() { $response = rest_get_server()->dispatch( $request ); $this->assertCount( $expected_count, $response->get_data() ); } + + /** + * Tests for the pagination. + * + * @ticket 62292 + * + * @covers WP_REST_Revisions_Controller::get_items + */ + public function test_get_template_revisions_pagination() { + wp_set_current_user( self::$editor_id ); + + // Test offset + $request = new WP_REST_Request( 'GET', '/wp/v2/posts/' . self::$post_id . '/revisions' ); + $request->set_param( 'offset', 1 ); + $request->set_param( 'per_page', 1 ); + $response = rest_get_server()->dispatch( $request ); + $this->assertEquals( 200, $response->get_status() ); + $data = $response->get_data(); + $this->assertCount( 1, $data ); + $this->assertEquals( $this->total_revisions, $response->get_headers()['X-WP-Total'] ); + $this->assertEquals( $this->total_revisions, $response->get_headers()['X-WP-TotalPages'] ); + + // Test paged + $request = new WP_REST_Request( 'GET', '/wp/v2/posts/' . self::$post_id . '/revisions' ); + $request->set_param( 'page', 2 ); + $request->set_param( 'per_page', 2 ); + $response = rest_get_server()->dispatch( $request ); + $this->assertEquals( 200, $response->get_status() ); + $data = $response->get_data(); + $this->assertCount( 1, $data ); + $this->assertEquals( $this->total_revisions, $response->get_headers()['X-WP-Total'] ); + $this->assertEquals( (int) ceil( $this->total_revisions / 2 ), $response->get_headers()['X-WP-TotalPages'] ); + + // Test out of bounds + $request = new WP_REST_Request( 'GET', '/wp/v2/posts/' . self::$post_id . '/revisions' ); + $request->set_param( 'page', $this->total_revisions + 1 ); + $request->set_param( 'per_page', 1 ); + $response = rest_get_server()->dispatch( $request ); + $this->assertErrorResponse( 'rest_revision_invalid_page_number', $response, 400 ); + } } diff --git a/tests/phpunit/tests/rest-api/wpRestTemplateRevisionsController.php b/tests/phpunit/tests/rest-api/wpRestTemplateRevisionsController.php index 2391a92478ede..23352879f3cfe 100644 --- a/tests/phpunit/tests/rest-api/wpRestTemplateRevisionsController.php +++ b/tests/phpunit/tests/rest-api/wpRestTemplateRevisionsController.php @@ -1065,4 +1065,44 @@ public function data_delete_item_not_found() { ), ); } + + /** + * Tests for the pagination. + * + * @ticket 62292 + * + * @covers WP_REST_Template_Revisions_Controller::get_items + */ + public function test_get_template_revisions_pagination() { + wp_set_current_user( self::$admin_id ); + + // Test offset + $request = new WP_REST_Request( 'GET', '/wp/v2/templates/' . self::TEST_THEME . '/' . self::TEMPLATE_NAME . '/revisions' ); + $request->set_param( 'offset', 1 ); + $request->set_param( 'per_page', 1 ); + $response = rest_get_server()->dispatch( $request ); + $this->assertEquals( 200, $response->get_status() ); + $data = $response->get_data(); + $this->assertCount( 1, $data ); + $this->assertEquals( 4, $response->get_headers()['X-WP-Total'] ); + $this->assertEquals( 4, $response->get_headers()['X-WP-TotalPages'] ); + + // Test paged + $request = new WP_REST_Request( 'GET', '/wp/v2/templates/' . self::TEST_THEME . '/' . self::TEMPLATE_NAME . '/revisions' ); + $request->set_param( 'page', 2 ); + $request->set_param( 'per_page', 2 ); + $response = rest_get_server()->dispatch( $request ); + $this->assertEquals( 200, $response->get_status() ); + $data = $response->get_data(); + $this->assertCount( 2, $data ); + $this->assertEquals( 4, $response->get_headers()['X-WP-Total'] ); + $this->assertEquals( 2, $response->get_headers()['X-WP-TotalPages'] ); + + // Test out of bounds + $request = new WP_REST_Request( 'GET', '/wp/v2/templates/' . self::TEST_THEME . '/' . self::TEMPLATE_NAME . '/revisions' ); + $request->set_param( 'page', 4 ); + $request->set_param( 'per_page', 6 ); + $response = rest_get_server()->dispatch( $request ); + $this->assertErrorResponse( 'rest_revision_invalid_page_number', $response, 400 ); + } } From 5b01d24d8c5f2cfa4b96349967a9759e52888d03 Mon Sep 17 00:00:00 2001 From: Peter Wilson Date: Wed, 15 Jan 2025 22:11:15 +0000 Subject: [PATCH 104/117] Options/Meta APIs: Optimize cache hits for non-existent options. Optimize the order of checking the various options caches in `get_option()` to prevent hitting external caches each time it is called for a known non-existent option. The caches are checked in the following order when getting an option: 1. Check the `alloptions` cache first to prioritize existing loaded options. 2. Check the `notoptions` cache before a cache lookup or DB hit. 3. Check the `options` cache prior to a DB hit. Follow up to [56595]. Props adamsilverstein, flixos90, ivankristianto, joemcgill, rmccue, siliconforks, spacedmonkey. Fixes #62692. See #58277. git-svn-id: https://develop.svn.wordpress.org/trunk@59631 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/option.php | 59 ++++++++------ tests/phpunit/tests/option/option.php | 111 ++++++++++++++++++++------ 2 files changed, 122 insertions(+), 48 deletions(-) diff --git a/src/wp-includes/option.php b/src/wp-includes/option.php index c84f1660f931b..4b26504b76356 100644 --- a/src/wp-includes/option.php +++ b/src/wp-includes/option.php @@ -162,37 +162,46 @@ function get_option( $option, $default_value = false ) { if ( ! wp_installing() ) { $alloptions = wp_load_alloptions(); - + /* + * When getting an option value, we check in the following order for performance: + * + * 1. Check the 'alloptions' cache first to prioritize existing loaded options. + * 2. Check the 'notoptions' cache before a cache lookup or DB hit. + * 3. Check the 'options' cache prior to a DB hit. + * 4. Check the DB for the option and cache it in either the 'options' or 'notoptions' cache. + */ if ( isset( $alloptions[ $option ] ) ) { $value = $alloptions[ $option ]; } else { + // Check for non-existent options first to avoid unnecessary object cache lookups and DB hits. + $notoptions = wp_cache_get( 'notoptions', 'options' ); + + if ( ! is_array( $notoptions ) ) { + $notoptions = array(); + wp_cache_set( 'notoptions', $notoptions, 'options' ); + } + + if ( isset( $notoptions[ $option ] ) ) { + /** + * Filters the default value for an option. + * + * The dynamic portion of the hook name, `$option`, refers to the option name. + * + * @since 3.4.0 + * @since 4.4.0 The `$option` parameter was added. + * @since 4.7.0 The `$passed_default` parameter was added to distinguish between a `false` value and the default parameter value. + * + * @param mixed $default_value The default value to return if the option does not exist + * in the database. + * @param string $option Option name. + * @param bool $passed_default Was `get_option()` passed a default value? + */ + return apply_filters( "default_option_{$option}", $default_value, $option, $passed_default ); + } + $value = wp_cache_get( $option, 'options' ); if ( false === $value ) { - // Prevent non-existent options from triggering multiple queries. - $notoptions = wp_cache_get( 'notoptions', 'options' ); - - // Prevent non-existent `notoptions` key from triggering multiple key lookups. - if ( ! is_array( $notoptions ) ) { - $notoptions = array(); - wp_cache_set( 'notoptions', $notoptions, 'options' ); - } elseif ( isset( $notoptions[ $option ] ) ) { - /** - * Filters the default value for an option. - * - * The dynamic portion of the hook name, `$option`, refers to the option name. - * - * @since 3.4.0 - * @since 4.4.0 The `$option` parameter was added. - * @since 4.7.0 The `$passed_default` parameter was added to distinguish between a `false` value and the default parameter value. - * - * @param mixed $default_value The default value to return if the option does not exist - * in the database. - * @param string $option Option name. - * @param bool $passed_default Was `get_option()` passed a default value? - */ - return apply_filters( "default_option_{$option}", $default_value, $option, $passed_default ); - } $row = $wpdb->get_row( $wpdb->prepare( "SELECT option_value FROM $wpdb->options WHERE option_name = %s LIMIT 1", $option ) ); diff --git a/tests/phpunit/tests/option/option.php b/tests/phpunit/tests/option/option.php index 36a40d9a2f495..9a2f061aa369c 100644 --- a/tests/phpunit/tests/option/option.php +++ b/tests/phpunit/tests/option/option.php @@ -112,8 +112,8 @@ public function test_get_option_notoptions_cache() { wp_cache_set( 'notoptions', $notoptions, 'options' ); $before = get_num_queries(); - $value = get_option( 'invalid' ); - $after = get_num_queries(); + get_option( 'invalid' ); + $after = get_num_queries(); $this->assertSame( 0, $after - $before ); } @@ -127,8 +127,8 @@ public function test_get_option_notoptions_set_cache() { get_option( 'invalid' ); $before = get_num_queries(); - $value = get_option( 'invalid' ); - $after = get_num_queries(); + get_option( 'invalid' ); + $after = get_num_queries(); $notoptions = wp_cache_get( 'notoptions', 'options' ); @@ -137,25 +137,6 @@ public function test_get_option_notoptions_set_cache() { $this->assertArrayHasKey( 'invalid', $notoptions, 'The "invalid" option should be in the notoptions cache.' ); } - /** - * @ticket 58277 - * - * @covers ::get_option - */ - public function test_get_option_notoptions_do_not_load_cache() { - add_option( 'foo', 'bar', '', false ); - wp_cache_delete( 'notoptions', 'options' ); - - $before = get_num_queries(); - $value = get_option( 'foo' ); - $after = get_num_queries(); - - $notoptions = wp_cache_get( 'notoptions', 'options' ); - - $this->assertSame( 0, $after - $before, 'The options cache was not hit on the second call to `get_option()`.' ); - $this->assertFalse( $notoptions, 'The notoptions cache should not be set.' ); - } - /** * @covers ::get_option * @covers ::add_option @@ -548,4 +529,88 @@ public function test_add_option_clears_the_notoptions_cache() { $updated_notoptions = wp_cache_get( 'notoptions', 'options' ); $this->assertArrayNotHasKey( $option_name, $updated_notoptions, 'The "foobar" option should not be in the notoptions cache after adding it.' ); } + + /** + * Test that get_option() does not hit the external cache multiple times for the same option. + * + * @ticket 62692 + * + * @covers ::get_option + * + * @dataProvider data_get_option_does_not_hit_the_external_cache_multiple_times_for_the_same_option + * + * @param int $expected_connections Expected number of connections to the memcached server. + * @param bool $option_exists Whether the option should be set. Default true. + * @param string $autoload Whether the option should be auto loaded. Default true. + */ + public function test_get_option_does_not_hit_the_external_cache_multiple_times_for_the_same_option( $expected_connections, $option_exists = true, $autoload = true ) { + if ( ! wp_using_ext_object_cache() ) { + $this->markTestSkipped( 'This test requires an external object cache.' ); + } + + if ( false === $this->helper_object_cache_stats_cmd_get() ) { + $this->markTestSkipped( 'This test requires access to the number of get requests to the external object cache.' ); + } + + if ( $option_exists ) { + add_option( 'ticket-62692', 'value', '', $autoload ); + } + + wp_cache_delete_multiple( array( 'ticket-62692', 'notoptions', 'alloptions' ), 'options' ); + + $connections_start = $this->helper_object_cache_stats_cmd_get(); + + $call_getter = 10; + while ( $call_getter-- ) { + get_option( 'ticket-62692' ); + } + + $connections_end = $this->helper_object_cache_stats_cmd_get(); + + $this->assertSame( $expected_connections, $connections_end - $connections_start ); + } + + /** + * Data provider. + * + * @return array[] + */ + public function data_get_option_does_not_hit_the_external_cache_multiple_times_for_the_same_option() { + return array( + 'exists, autoload' => array( 1, true, true ), + 'exists, not autoloaded' => array( 3, true, false ), + 'does not exist' => array( 3, false ), + ); + } + + /** + * Helper function to get the number of get commands from the external object cache. + * + * @return int|false Number of get command calls, false if unavailable. + */ + public function helper_object_cache_stats_cmd_get() { + if ( ! wp_using_ext_object_cache() || ! function_exists( 'wp_cache_get_stats' ) ) { + return false; + } + + $stats = wp_cache_get_stats(); + + // Check the shape of the stats. + if ( ! is_array( $stats ) ) { + return false; + } + + // Get the first server's stats. + $stats = array_shift( $stats ); + + if ( ! is_array( $stats ) ) { + return false; + } + + if ( ! array_key_exists( 'cmd_get', $stats ) ) { + return false; + } + + return $stats['cmd_get']; + } } From 8aea1ba5eee51bfef59beb0ba976333690bb0c89 Mon Sep 17 00:00:00 2001 From: Sergey Biryukov Date: Thu, 16 Jan 2025 12:02:24 +0000 Subject: [PATCH 105/117] Coding Standards: Use strict comparison in `wp_xmlrpc_server::_multisite_getUsersBlogs()`. Follow-up to [https://mu.trac.wordpress.org/changeset/1218 mu:1218], [12852]. Props aristath, poena, afercia, SergeyBiryukov. See #62279. git-svn-id: https://develop.svn.wordpress.org/trunk@59632 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/class-wp-xmlrpc-server.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wp-includes/class-wp-xmlrpc-server.php b/src/wp-includes/class-wp-xmlrpc-server.php index 2141f21e59662..527bf23966be2 100644 --- a/src/wp-includes/class-wp-xmlrpc-server.php +++ b/src/wp-includes/class-wp-xmlrpc-server.php @@ -4883,7 +4883,7 @@ protected function _multisite_getUsersBlogs( $args ) { return $blogs; } - if ( $_SERVER['HTTP_HOST'] == $domain && $_SERVER['REQUEST_URI'] == $path ) { + if ( $_SERVER['HTTP_HOST'] === $domain && $_SERVER['REQUEST_URI'] === $path ) { return $blogs; } else { foreach ( (array) $blogs as $blog ) { From 964c5d3857957045f892cf646750dcb3a66ca441 Mon Sep 17 00:00:00 2001 From: John Blackbourn Date: Thu, 16 Jan 2025 15:33:31 +0000 Subject: [PATCH 106/117] Users: Retain the current session when a user changes their password. Prior to this change a new session was unnecessarily created when a user changed their own password. Existing authentication cookies for the user will still be invalidated regardless of whether they share the same session token because session cookie keys contain a substring of the password hash. Props snicco, narenin, johnbillion Fixes #61366 git-svn-id: https://develop.svn.wordpress.org/trunk@59633 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/user.php | 11 ++++-- tests/phpunit/tests/user.php | 72 ++++++++++++++++++++++++++++++++++++ 2 files changed, 80 insertions(+), 3 deletions(-) diff --git a/src/wp-includes/user.php b/src/wp-includes/user.php index 6222e932a9015..635f82c5ed353 100644 --- a/src/wp-includes/user.php +++ b/src/wp-includes/user.php @@ -2780,8 +2780,6 @@ function wp_update_user( $userdata ) { $current_user = wp_get_current_user(); if ( $current_user->ID === $user_id ) { if ( isset( $plaintext_pass ) ) { - wp_clear_auth_cookie(); - /* * Here we calculate the expiration length of the current auth cookie and compare it to the default expiration. * If it's greater than this, then we know the user checked 'Remember Me' when they logged in. @@ -2790,13 +2788,20 @@ function wp_update_user( $userdata ) { /** This filter is documented in wp-includes/pluggable.php */ $default_cookie_life = apply_filters( 'auth_cookie_expiration', ( 2 * DAY_IN_SECONDS ), $user_id, false ); + wp_clear_auth_cookie(); + $remember = false; + $token = ''; + + if ( false !== $logged_in_cookie ) { + $token = $logged_in_cookie['token']; + } if ( false !== $logged_in_cookie && ( (int) $logged_in_cookie['expiration'] - time() ) > $default_cookie_life ) { $remember = true; } - wp_set_auth_cookie( $user_id, $remember ); + wp_set_auth_cookie( $user_id, $remember, '', $token ); } } diff --git a/tests/phpunit/tests/user.php b/tests/phpunit/tests/user.php index 884200530f1d9..9e1faa2dca3f0 100644 --- a/tests/phpunit/tests/user.php +++ b/tests/phpunit/tests/user.php @@ -63,9 +63,37 @@ public static function wpSetUpBeforeClass( WP_UnitTest_Factory $factory ) { public function set_up() { parent::set_up(); + add_action( 'set_auth_cookie', array( $this, 'action_set_auth_cookie' ), 10, 6 ); + add_action( 'set_logged_in_cookie', array( $this, 'action_set_logged_in_cookie' ), 10 ); + add_action( 'clear_auth_cookie', array( $this, 'action_clear_auth_cookie' ) ); + + $_COOKIE = array(); + $this->author = clone self::$_author; } + final public function action_set_auth_cookie( + string $cookie, + int $expire, + int $expiration, + int $user_id, + string $scheme, + string $token + ): void { + $_COOKIE[ SECURE_AUTH_COOKIE ] = $cookie; + $_COOKIE[ AUTH_COOKIE ] = $cookie; + } + + final public function action_set_logged_in_cookie( string $cookie ): void { + $_COOKIE[ LOGGED_IN_COOKIE ] = $cookie; + } + + final public function action_clear_auth_cookie(): void { + unset( $_COOKIE[ LOGGED_IN_COOKIE ] ); + unset( $_COOKIE[ SECURE_AUTH_COOKIE ] ); + unset( $_COOKIE[ AUTH_COOKIE ] ); + } + public function test_get_users_of_blog() { // Add one of each user role. $nusers = array( @@ -1122,6 +1150,50 @@ public function test_changing_password_invalidates_password_reset_key() { $this->assertEmpty( $user->user_activation_key ); } + /** + * @ticket 61366 + * @dataProvider data_remember_user + */ + public function test_changing_own_password_retains_current_session( bool $remember ) { + $user = $this->author; + $manager = WP_Session_Tokens::get_instance( $user->ID ); + $expiry = $remember ? ( 2 * WEEK_IN_SECONDS ) : ( 2 * DAY_IN_SECONDS ); + $token = $manager->create( time() + $expiry ); + $pass = $user->user_pass; + + wp_set_current_user( $user->ID ); + wp_set_auth_cookie( $user->ID, $remember, '', $token ); + + $cookie = $_COOKIE[ AUTH_COOKIE ]; + $userdata = array( + 'ID' => $user->ID, + 'user_pass' => 'my_new_password', + ); + $updated = wp_update_user( $userdata, $manager ); + $parsed = wp_parse_auth_cookie(); + + // Check the prerequisites: + $this->assertNotWPError( $updated ); + $this->assertNotSame( $pass, get_userdata( $user->ID )->user_pass ); + + // Check the session token: + $this->assertSame( $token, $parsed['token'] ); + $this->assertCount( 1, $manager->get_all() ); + + // Check that the newly set auth cookie is valid: + $this->assertSame( $user->ID, wp_validate_auth_cookie() ); + + // Check that, despite the session token reuse, the old auth cookie should now be invalid because the password changed: + $this->assertFalse( wp_validate_auth_cookie( $cookie ) ); + } + + public function data_remember_user() { + return array( + array( true ), + array( false ), + ); + } + public function test_search_users_login() { $users = get_users( array( From e114dfb79cab98a0446ef96dc96f2646ab7a3a24 Mon Sep 17 00:00:00 2001 From: Sergey Biryukov Date: Thu, 16 Jan 2025 16:16:15 +0000 Subject: [PATCH 107/117] Upload: Remove redundant check for `ABSPATH` in `wp-admin/async-upload.php`. This aims to bring consistency with a similar fragment in other files, since relocating `wp-admin` or `wp-load.php` is not supported at this time. Follow-up to [6659], [7971], [8315]. Props hussain896, swissspidy, knutsp, SergeyBiryukov. Fixes #62809. git-svn-id: https://develop.svn.wordpress.org/trunk@59634 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-admin/admin-post.php | 7 ++----- src/wp-admin/admin.php | 1 + src/wp-admin/async-upload.php | 7 ++----- src/wp-includes/ms-files.php | 2 ++ 4 files changed, 7 insertions(+), 10 deletions(-) diff --git a/src/wp-admin/admin-post.php b/src/wp-admin/admin-post.php index be32e0710ac92..f880c41ac26a0 100644 --- a/src/wp-admin/admin-post.php +++ b/src/wp-admin/admin-post.php @@ -13,11 +13,8 @@ define( 'WP_ADMIN', true ); } -if ( defined( 'ABSPATH' ) ) { - require_once ABSPATH . 'wp-load.php'; -} else { - require_once dirname( __DIR__ ) . '/wp-load.php'; -} +/** Load WordPress Bootstrap */ +require_once dirname( __DIR__ ) . '/wp-load.php'; /** Allow for cross-domain requests (from the front end). */ send_origin_headers(); diff --git a/src/wp-admin/admin.php b/src/wp-admin/admin.php index 630765f77d03a..dac51ba1aa21e 100644 --- a/src/wp-admin/admin.php +++ b/src/wp-admin/admin.php @@ -31,6 +31,7 @@ define( 'WP_LOAD_IMPORTERS', true ); } +/** Load WordPress Bootstrap */ require_once dirname( __DIR__ ) . '/wp-load.php'; nocache_headers(); diff --git a/src/wp-admin/async-upload.php b/src/wp-admin/async-upload.php index a146f6a48a71b..683fd83248fd0 100644 --- a/src/wp-admin/async-upload.php +++ b/src/wp-admin/async-upload.php @@ -14,11 +14,8 @@ define( 'WP_ADMIN', true ); } -if ( defined( 'ABSPATH' ) ) { - require_once ABSPATH . 'wp-load.php'; -} else { - require_once dirname( __DIR__ ) . '/wp-load.php'; -} +/** Load WordPress Bootstrap */ +require_once dirname( __DIR__ ) . '/wp-load.php'; require_once ABSPATH . 'wp-admin/admin.php'; diff --git a/src/wp-includes/ms-files.php b/src/wp-includes/ms-files.php index 2efe452faf37e..42826ede61c6f 100644 --- a/src/wp-includes/ms-files.php +++ b/src/wp-includes/ms-files.php @@ -10,6 +10,8 @@ define( 'MS_FILES_REQUEST', true ); define( 'SHORTINIT', true ); + +/** Load WordPress Bootstrap */ require_once dirname( __DIR__ ) . '/wp-load.php'; if ( ! is_multisite() ) { From fc9aabbc898c359bdf169411e6f0b0b37a2b1607 Mon Sep 17 00:00:00 2001 From: Jonathan Desrosiers Date: Thu, 16 Jan 2025 20:19:28 +0000 Subject: [PATCH 108/117] Build/Test Tools: Add input for disabling AppArmor. Old branches requiring outdated versions of Chromium to run JavaScript tests have recently started failing as a result of the `ubuntu-latest` container being updated to point to `ubuntu-24`. This introduces a new input to the reusable JavaScript testing workflow to allow a fix to be used without having to update Chromium or tests in these branches. Props swissspidy. See #62808. git-svn-id: https://develop.svn.wordpress.org/trunk@59635 602fd350-edb4-49c9-b593-d223f7449a82 --- .github/workflows/reusable-javascript-tests.yml | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/.github/workflows/reusable-javascript-tests.yml b/.github/workflows/reusable-javascript-tests.yml index 842bb034352ed..e88f510cdfdf3 100644 --- a/.github/workflows/reusable-javascript-tests.yml +++ b/.github/workflows/reusable-javascript-tests.yml @@ -5,6 +5,12 @@ name: JavaScript tests on: workflow_call: + inputs: + disable-apparmor: + description: 'Whether to disable AppArmor.' + required: false + type: 'boolean' + default: false jobs: # Runs the QUnit test suite. @@ -44,6 +50,15 @@ jobs: - name: Install npm Dependencies run: npm ci + # Older branches using outdated versions of Puppeteer fail on newer versions of the `ubuntu-24` image. + # This disables AppArmor in order to work around those failures. + # + # See https://issues.chromium.org/issues/373753919 + # and https://chromium.googlesource.com/chromium/src/+/main/docs/security/apparmor-userns-restrictions.md + - name: Disable AppArmor + if: ${{ inputs.disable-apparmor }} + run: echo 0 | sudo tee /proc/sys/kernel/apparmor_restrict_unprivileged_userns + - name: Run QUnit tests run: npm run grunt qunit:compiled From ab4b4eb55d14feb74d34647c7aa4eb370dbd87a8 Mon Sep 17 00:00:00 2001 From: Jonathan Desrosiers Date: Thu, 16 Jan 2025 21:03:12 +0000 Subject: [PATCH 109/117] Administration: Modernize admin color scheme SASS files. This updates the admin color scheme `.sass` files to address some deprecated notices caused by upstream changes. - `string` and `colors` are no longer globally available functions. - `@import` is deprecated in favor of `@use`. There are still a few notices that are output, however this will require an update to the `grunt-sass` package to resolve. Props MattyRob. Fixes #62323. git-svn-id: https://develop.svn.wordpress.org/trunk@59656 602fd350-edb4-49c9-b593-d223f7449a82 --- package-lock.json | 30 +- package.json | 2 +- src/wp-admin/css/colors/_admin.scss | 308 +++++++++--------- src/wp-admin/css/colors/_mixins.scss | 2 + src/wp-admin/css/colors/_variables.scss | 8 +- src/wp-admin/css/colors/blue/colors.scss | 24 +- src/wp-admin/css/colors/coffee/colors.scss | 16 +- src/wp-admin/css/colors/ectoplasm/colors.scss | 16 +- src/wp-admin/css/colors/light/colors.scss | 41 +-- src/wp-admin/css/colors/midnight/colors.scss | 10 +- src/wp-admin/css/colors/modern/colors.scss | 18 +- src/wp-admin/css/colors/ocean/colors.scss | 18 +- src/wp-admin/css/colors/sunrise/colors.scss | 12 +- 13 files changed, 266 insertions(+), 239 deletions(-) diff --git a/package-lock.json b/package-lock.json index ed9e1b4410f35..8175a44ff0880 100644 --- a/package-lock.json +++ b/package-lock.json @@ -144,7 +144,7 @@ "prettier": "npm:wp-prettier@2.6.2", "qunit": "~2.23.1", "react-refresh": "0.14.0", - "sass": "1.79.6", + "sass": "1.83.4", "sinon": "16.1.3", "sinon-test": "~3.1.6", "source-map-loader": "5.0.0", @@ -3727,6 +3727,7 @@ "dev": true, "hasInstallScript": true, "license": "MIT", + "optional": true, "dependencies": { "detect-libc": "^1.0.3", "is-glob": "^4.0.3", @@ -4035,6 +4036,7 @@ "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, "license": "MIT", + "optional": true, "dependencies": { "fill-range": "^7.1.1" }, @@ -4048,6 +4050,7 @@ "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, "license": "MIT", + "optional": true, "dependencies": { "to-regex-range": "^5.0.1" }, @@ -4061,6 +4064,7 @@ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, "license": "MIT", + "optional": true, "engines": { "node": ">=0.12.0" } @@ -4071,6 +4075,7 @@ "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, "license": "MIT", + "optional": true, "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" @@ -4085,6 +4090,7 @@ "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, "license": "MIT", + "optional": true, "dependencies": { "is-number": "^7.0.0" }, @@ -14205,6 +14211,7 @@ "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", "dev": true, "license": "Apache-2.0", + "optional": true, "bin": { "detect-libc": "bin/detect-libc.js" }, @@ -20090,9 +20097,9 @@ "integrity": "sha512-jQ5Ql18hdCQ4qS+RCrbLfz1n+Pags27q5TwMKvZyhp5hh2UULUYZUy1keqj6k6SYsdqIYjnmz7xyyEY0V67B8Q==" }, "node_modules/immutable": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.7.tgz", - "integrity": "sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw==", + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.0.3.tgz", + "integrity": "sha512-P8IdPQHq3lA1xVeBRi5VPqUm5HDgKnx0Ru51wZz5mjxHr5n3RWhjIpOFU7ybkUxfB+5IToy+OLaHYDBIWsv+uw==", "dev": true, "license": "MIT" }, @@ -26229,7 +26236,8 @@ "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", "dev": true, - "license": "MIT" + "license": "MIT", + "optional": true }, "node_modules/node-domexception": { "version": "1.0.0", @@ -30910,15 +30918,14 @@ } }, "node_modules/sass": { - "version": "1.79.6", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.79.6.tgz", - "integrity": "sha512-PVVjeeiUGx6Nj4PtEE/ecwu8ltwfPKzHxbbVmmLj4l1FYHhOyfA0scuVF8sVaa+b+VY4z7BVKjKq0cPUQdUU3g==", + "version": "1.83.4", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.83.4.tgz", + "integrity": "sha512-B1bozCeNQiOgDcLd33e2Cs2U60wZwjUUXzh900ZyQF5qUasvMdDZYbQ566LJu7cqR+sAHlAfO6RMkaID5s6qpA==", "dev": true, "license": "MIT", "dependencies": { - "@parcel/watcher": "^2.4.1", "chokidar": "^4.0.0", - "immutable": "^4.0.0", + "immutable": "^5.0.2", "source-map-js": ">=0.6.2 <2.0.0" }, "bin": { @@ -30926,6 +30933,9 @@ }, "engines": { "node": ">=14.0.0" + }, + "optionalDependencies": { + "@parcel/watcher": "^2.4.1" } }, "node_modules/sass-loader": { diff --git a/package.json b/package.json index fe2afcf572122..98e26ff06eaff 100644 --- a/package.json +++ b/package.json @@ -66,7 +66,7 @@ "prettier": "npm:wp-prettier@2.6.2", "qunit": "~2.23.1", "react-refresh": "0.14.0", - "sass": "1.79.6", + "sass": "1.83.4", "sinon": "16.1.3", "sinon-test": "~3.1.6", "source-map-loader": "5.0.0", diff --git a/src/wp-admin/css/colors/_admin.scss b/src/wp-admin/css/colors/_admin.scss index 5431da789d9f0..49126269fb4c0 100644 --- a/src/wp-admin/css/colors/_admin.scss +++ b/src/wp-admin/css/colors/_admin.scss @@ -1,29 +1,31 @@ - -@import 'variables'; -@import 'mixins'; +@use 'sass:color'; +@use 'sass:string'; +@forward 'variables' show $scheme-name, $base-color, $body-background, $button-color, $custom-welcome-panel, $dashboard-accent-1, $dashboard-accent-2, $dashboard-icon-background, $form-checked, $highlight-color, $icon-color, $link, $link-focus, $low-contrast-theme, $menu-bubble-text, $menu-collapse-focus-icon, $menu-collapse-text, $menu-highlight-background, $menu-highlight-icon, $menu-highlight-text, $menu-submenu-text, $menu-submenu-focus-text, $menu-submenu-background, $notification-color, $text-color; +@use 'variables'; +@use 'mixins'; /** * This function name uses British English to maintain backward compatibility, as developers * may use the function in their own admin CSS files. See #56811. */ @function url-friendly-colour( $color ) { - @return '%23' + str-slice( '#{ $color }', 2, -1 ); + @return '%23' + string.slice( '#{ $color }', 2, -1 ); } body { - background: $body-background; + background: variables.$body-background; } /* Links */ a { - color: $link; + color: variables.$link; &:hover, &:active, &:focus { - color: $link-focus; + color: variables.$link-focus; } } @@ -36,12 +38,12 @@ span.wp-media-buttons-icon:before { } .wp-core-ui .button-link { - color: $link; + color: variables.$link; &:hover, &:active, &:focus { - color: $link-focus; + color: variables.$link-focus; } } @@ -66,16 +68,16 @@ span.wp-media-buttons-icon:before { /* Forms */ input[type=checkbox]:checked::before { - content: url("data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M14.83%204.89l1.34.94-5.81%208.38H9.02L5.78%209.67l1.34-1.25%202.57%202.4z%27%20fill%3D%27#{url-friendly-colour($form-checked)}%27%2F%3E%3C%2Fsvg%3E"); + content: url("data:image/svg+xml;utf8,%3Csvg%20xmlns%3D%27http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%27%20viewBox%3D%270%200%2020%2020%27%3E%3Cpath%20d%3D%27M14.83%204.89l1.34.94-5.81%208.38H9.02L5.78%209.67l1.34-1.25%202.57%202.4z%27%20fill%3D%27#{url-friendly-colour(variables.$form-checked)}%27%2F%3E%3C%2Fsvg%3E"); } input[type=radio]:checked::before { - background: $form-checked; + background: variables.$form-checked; } .wp-core-ui input[type="reset"]:hover, .wp-core-ui input[type="reset"]:active { - color: $link-focus; + color: variables.$link-focus; } input[type="text"]:focus, @@ -97,8 +99,8 @@ input[type="checkbox"]:focus, input[type="radio"]:focus, select:focus, textarea:focus { - border-color: $highlight-color; - box-shadow: 0 0 0 1px $highlight-color; + border-color: variables.$highlight-color; + box-shadow: 0 0 0 1px variables.$highlight-color; } @@ -135,35 +137,35 @@ textarea:focus { .button.active, .button.active:focus, .button.active:hover { - border-color: $button-color; + border-color: variables.$button-color; color: color.adjust(#32373c, $lightness: -5%); - box-shadow: inset 0 2px 5px -3px $button-color; + box-shadow: inset 0 2px 5px -3px variables.$button-color; } .button.active:focus { box-shadow: 0 0 0 1px #32373c; } - @if ( $low-contrast-theme != "true" ) { + @if ( variables.$low-contrast-theme != "true" ) { .button, .button-secondary { - color: $highlight-color; - border-color: $highlight-color; + color: variables.$highlight-color; + border-color: variables.$highlight-color; } .button.hover, .button:hover, .button-secondary:hover{ - border-color: color.adjust($highlight-color, $lightness: -10%); - color: color.adjust($highlight-color, $lightness: -10%); + border-color: color.adjust(variables.$highlight-color, $lightness: -10%); + color: color.adjust(variables.$highlight-color, $lightness: -10%); } .button.focus, .button:focus, .button-secondary:focus { - border-color: color.adjust($highlight-color, $lightness: 10%); - color: color.adjust($highlight-color, $lightness: -20%); - box-shadow: 0 0 0 1px color.adjust($highlight-color, $lightness: 10%); + border-color: color.adjust(variables.$highlight-color, $lightness: 10%); + color: color.adjust(variables.$highlight-color, $lightness: -20%); + box-shadow: 0 0 0 1px color.adjust(variables.$highlight-color, $lightness: 10%); } .button-primary { @@ -174,74 +176,74 @@ textarea:focus { } .button-primary { - @include button( $button-color ); + @include mixins.button( variables.$button-color ); } .button-group > .button.active { - border-color: $button-color; + border-color: variables.$button-color; } .wp-ui-primary { - color: $text-color; - background-color: $base-color; + color: variables.$text-color; + background-color: variables.$base-color; } .wp-ui-text-primary { - color: $base-color; + color: variables.$base-color; } .wp-ui-highlight { - color: $menu-highlight-text; - background-color: $menu-highlight-background; + color: variables.$menu-highlight-text; + background-color: variables.$menu-highlight-background; } .wp-ui-text-highlight { - color: $menu-highlight-background; + color: variables.$menu-highlight-background; } .wp-ui-notification { - color: $menu-bubble-text; - background-color: $menu-bubble-background; + color: variables.$menu-bubble-text; + background-color: variables.$menu-bubble-background; } .wp-ui-text-notification { - color: $menu-bubble-background; + color: variables.$menu-bubble-background; } .wp-ui-text-icon { - color: $menu-icon; + color: variables.$menu-icon; } } /* List tables */ -@if $low-contrast-theme == "true" { +@if variables.$low-contrast-theme == "true" { .wrap .page-title-action:hover { - color: $menu-text; - background-color: $menu-background; + color: variables.$menu-text; + background-color: variables.$menu-background; } } @else { .wrap .page-title-action, .wrap .page-title-action:active { - border: 1px solid $highlight-color; - color: $highlight-color; + border: 1px solid variables.$highlight-color; + color: variables.$highlight-color; } .wrap .page-title-action:hover { - color: color.adjust($highlight-color, $lightness: -10%); - border-color: color.adjust($highlight-color, $lightness: -10%); + color: color.adjust(variables.$highlight-color, $lightness: -10%); + border-color: color.adjust(variables.$highlight-color, $lightness: -10%); } .wrap .page-title-action:focus { - border-color: color.adjust($highlight-color, $lightness: 10%); - color: color.adjust($highlight-color, $lightness: -20%); - box-shadow: 0 0 0 1px color.adjust($highlight-color, $lightness: 10%); + border-color: color.adjust(variables.$highlight-color, $lightness: 10%); + color: color.adjust(variables.$highlight-color, $lightness: -20%); + box-shadow: 0 0 0 1px color.adjust(variables.$highlight-color, $lightness: 10%); } } .view-switch a.current:before { - color: $menu-background; + color: variables.$menu-background; } .view-switch a:hover:before { - color: $menu-bubble-background; + color: variables.$menu-bubble-background; } @@ -250,28 +252,28 @@ textarea:focus { #adminmenuback, #adminmenuwrap, #adminmenu { - background: $menu-background; + background: variables.$menu-background; } #adminmenu a { - color: $menu-text; + color: variables.$menu-text; } #adminmenu div.wp-menu-image:before { - color: $menu-icon; + color: variables.$menu-icon; } #adminmenu a:hover, #adminmenu li.menu-top:hover, #adminmenu li.opensub > a.menu-top, #adminmenu li > a.menu-top:focus { - color: $menu-highlight-text; - background-color: $menu-highlight-background; + color: variables.$menu-highlight-text; + background-color: variables.$menu-highlight-background; } #adminmenu li.menu-top:hover div.wp-menu-image:before, #adminmenu li.opensub > a.menu-top div.wp-menu-image:before { - color: $menu-highlight-icon; + color: variables.$menu-highlight-icon; } @@ -280,8 +282,8 @@ textarea:focus { .about-wrap .nav-tab-active, .nav-tab-active, .nav-tab-active:hover { - background-color: $body-background; - border-bottom-color: $body-background; + background-color: variables.$body-background; + border-bottom-color: variables.$body-background; } @@ -291,26 +293,26 @@ textarea:focus { #adminmenu .wp-has-current-submenu .wp-submenu, #adminmenu .wp-has-current-submenu.opensub .wp-submenu, #adminmenu a.wp-has-current-submenu:focus + .wp-submenu { - background: $menu-submenu-background; + background: variables.$menu-submenu-background; } #adminmenu li.wp-has-submenu.wp-not-current-submenu.opensub:hover:after, #adminmenu li.wp-has-submenu.wp-not-current-submenu:focus-within:after { - border-right-color: $menu-submenu-background; + border-right-color: variables.$menu-submenu-background; } #adminmenu .wp-submenu .wp-submenu-head { - color: $menu-submenu-text; + color: variables.$menu-submenu-text; } #adminmenu .wp-submenu a, #adminmenu .wp-has-current-submenu .wp-submenu a, #adminmenu a.wp-has-current-submenu:focus + .wp-submenu a, #adminmenu .wp-has-current-submenu.opensub .wp-submenu a { - color: $menu-submenu-text; + color: variables.$menu-submenu-text; &:focus, &:hover { - color: $menu-submenu-focus-text; + color: variables.$menu-submenu-focus-text; } } @@ -320,24 +322,24 @@ textarea:focus { #adminmenu .wp-submenu li.current a, #adminmenu a.wp-has-current-submenu:focus + .wp-submenu li.current a, #adminmenu .wp-has-current-submenu.opensub .wp-submenu li.current a { - color: $menu-submenu-current-text; + color: variables.$menu-submenu-current-text; &:hover, &:focus { - color: $menu-submenu-focus-text; + color: variables.$menu-submenu-focus-text; } } ul#adminmenu a.wp-has-current-submenu:after, ul#adminmenu > li.current > a.current:after { - border-right-color: $body-background; + border-right-color: variables.$body-background; } #adminmenu li.current a.menu-top, #adminmenu li.wp-has-current-submenu a.wp-has-current-submenu, #adminmenu li.wp-has-current-submenu .wp-submenu .wp-submenu-head, .folded #adminmenu li.current.menu-top { - color: $menu-current-text; - background: $menu-current-background; + color: variables.$menu-current-text; + background: variables.$menu-current-background; } #adminmenu li.wp-has-current-submenu div.wp-menu-image:before, @@ -348,7 +350,7 @@ ul#adminmenu > li.current > a.current:after { #adminmenu li:hover div.wp-menu-image:before, #adminmenu li a:focus div.wp-menu-image:before, #adminmenu li.opensub div.wp-menu-image:before { - color: $menu-current-icon; + color: variables.$menu-current-icon; } @@ -357,49 +359,49 @@ ul#adminmenu > li.current > a.current:after { #adminmenu .menu-counter, #adminmenu .awaiting-mod, #adminmenu .update-plugins { - color: $menu-bubble-text; - background: $menu-bubble-background; + color: variables.$menu-bubble-text; + background: variables.$menu-bubble-background; } #adminmenu li.current a .awaiting-mod, #adminmenu li a.wp-has-current-submenu .update-plugins, #adminmenu li:hover a .awaiting-mod, #adminmenu li.menu-top:hover > a .update-plugins { - color: $menu-bubble-current-text; - background: $menu-bubble-current-background; + color: variables.$menu-bubble-current-text; + background: variables.$menu-bubble-current-background; } /* Admin Menu: collapse button */ #collapse-button { - color: $menu-collapse-text; + color: variables.$menu-collapse-text; } #collapse-button:hover, #collapse-button:focus { - color: $menu-submenu-focus-text; + color: variables.$menu-submenu-focus-text; } /* Admin Bar */ #wpadminbar { - color: $menu-text; - background: $menu-background; + color: variables.$menu-text; + background: variables.$menu-background; } #wpadminbar .ab-item, #wpadminbar a.ab-item, #wpadminbar > #wp-toolbar span.ab-label, #wpadminbar > #wp-toolbar span.noticon { - color: $menu-text; + color: variables.$menu-text; } #wpadminbar .ab-icon, #wpadminbar .ab-icon:before, #wpadminbar .ab-item:before, #wpadminbar .ab-item:after { - color: $menu-icon; + color: variables.$menu-icon; } #wpadminbar:not(.mobile) .ab-top-menu > li:hover > .ab-item, @@ -407,45 +409,45 @@ ul#adminmenu > li.current > a.current:after { #wpadminbar.nojq .quicklinks .ab-top-menu > li > .ab-item:focus, #wpadminbar.nojs .ab-top-menu > li.menupop:hover > .ab-item, #wpadminbar .ab-top-menu > li.menupop.hover > .ab-item { - color: $menu-submenu-focus-text; - background: $menu-submenu-background; + color: variables.$menu-submenu-focus-text; + background: variables.$menu-submenu-background; } #wpadminbar:not(.mobile) > #wp-toolbar li:hover span.ab-label, #wpadminbar:not(.mobile) > #wp-toolbar li.hover span.ab-label, #wpadminbar:not(.mobile) > #wp-toolbar a:focus span.ab-label { - color: $menu-submenu-focus-text; + color: variables.$menu-submenu-focus-text; } #wpadminbar:not(.mobile) li:hover .ab-icon:before, #wpadminbar:not(.mobile) li:hover .ab-item:before, #wpadminbar:not(.mobile) li:hover .ab-item:after, #wpadminbar:not(.mobile) li:hover #adminbarsearch:before { - color: $menu-submenu-focus-text; + color: variables.$menu-submenu-focus-text; } /* Admin Bar: submenu */ #wpadminbar .menupop .ab-sub-wrapper { - background: $menu-submenu-background; + background: variables.$menu-submenu-background; } #wpadminbar .quicklinks .menupop ul.ab-sub-secondary, #wpadminbar .quicklinks .menupop ul.ab-sub-secondary .ab-submenu { - background: $menu-submenu-background-alt; + background: variables.$menu-submenu-background-alt; } #wpadminbar .ab-submenu .ab-item, #wpadminbar .quicklinks .menupop ul li a, #wpadminbar .quicklinks .menupop.hover ul li a, #wpadminbar.nojs .quicklinks .menupop:hover ul li a { - color: $menu-submenu-text; + color: variables.$menu-submenu-text; } #wpadminbar .quicklinks li .blavatar, #wpadminbar .menupop .menupop > .ab-item:before { - color: $menu-icon; + color: variables.$menu-icon; } #wpadminbar .quicklinks .menupop ul li a:hover, @@ -466,7 +468,7 @@ ul#adminmenu > li.current > a.current:after { #wpadminbar li.hover .ab-item:before, #wpadminbar li:hover #adminbarsearch:before, #wpadminbar li #adminbarsearch.adminbar-focused:before { - color: $menu-submenu-focus-text; + color: variables.$menu-submenu-focus-text; } #wpadminbar .quicklinks li a:hover .blavatar, @@ -475,82 +477,82 @@ ul#adminmenu > li.current > a.current:after { #wpadminbar .menupop .menupop > .ab-item:hover:before, #wpadminbar.mobile .quicklinks .ab-icon:before, #wpadminbar.mobile .quicklinks .ab-item:before { - color: $menu-submenu-focus-text; + color: variables.$menu-submenu-focus-text; } #wpadminbar.mobile .quicklinks .hover .ab-icon:before, #wpadminbar.mobile .quicklinks .hover .ab-item:before { - color: $menu-icon; + color: variables.$menu-icon; } /* Admin Bar: search */ #wpadminbar #adminbarsearch:before { - color: $menu-icon; + color: variables.$menu-icon; } #wpadminbar > #wp-toolbar > #wp-admin-bar-top-secondary > #wp-admin-bar-search #adminbarsearch input.adminbar-input:focus { - color: $menu-text; - background: $adminbar-input-background; + color: variables.$menu-text; + background: variables.$adminbar-input-background; } /* Admin Bar: recovery mode */ #wpadminbar #wp-admin-bar-recovery-mode { - color: $adminbar-recovery-exit-text; - background-color: $adminbar-recovery-exit-background; + color: variables.$adminbar-recovery-exit-text; + background-color: variables.$adminbar-recovery-exit-background; } #wpadminbar #wp-admin-bar-recovery-mode .ab-item, #wpadminbar #wp-admin-bar-recovery-mode a.ab-item { - color: $adminbar-recovery-exit-text; + color: variables.$adminbar-recovery-exit-text; } #wpadminbar .ab-top-menu > #wp-admin-bar-recovery-mode.hover >.ab-item, #wpadminbar.nojq .quicklinks .ab-top-menu > #wp-admin-bar-recovery-mode > .ab-item:focus, #wpadminbar:not(.mobile) .ab-top-menu > #wp-admin-bar-recovery-mode:hover > .ab-item, #wpadminbar:not(.mobile) .ab-top-menu > #wp-admin-bar-recovery-mode > .ab-item:focus { - color: $adminbar-recovery-exit-text; - background-color: $adminbar-recovery-exit-background-alt; + color: variables.$adminbar-recovery-exit-text; + background-color: variables.$adminbar-recovery-exit-background-alt; } /* Admin Bar: my account */ #wpadminbar .quicklinks li#wp-admin-bar-my-account.with-avatar > a img { - border-color: $adminbar-avatar-frame; - background-color: $adminbar-avatar-frame; + border-color: variables.$adminbar-avatar-frame; + background-color: variables.$adminbar-avatar-frame; } #wpadminbar #wp-admin-bar-user-info .display-name { - color: $menu-text; + color: variables.$menu-text; } #wpadminbar #wp-admin-bar-user-info a:hover .display-name { - color: $menu-submenu-focus-text; + color: variables.$menu-submenu-focus-text; } #wpadminbar #wp-admin-bar-user-info .username { - color: $menu-submenu-text; + color: variables.$menu-submenu-text; } /* Pointers */ .wp-pointer .wp-pointer-content h3 { - background-color: $highlight-color; - border-color: color.adjust($highlight-color, $lightness: -5%); + background-color: variables.$highlight-color; + border-color: color.adjust(variables.$highlight-color, $lightness: -5%); } .wp-pointer .wp-pointer-content h3:before { - color: $highlight-color; + color: variables.$highlight-color; } .wp-pointer.wp-pointer-top .wp-pointer-arrow, .wp-pointer.wp-pointer-top .wp-pointer-arrow-inner, .wp-pointer.wp-pointer-undefined .wp-pointer-arrow, .wp-pointer.wp-pointer-undefined .wp-pointer-arrow-inner { - border-bottom-color: $highlight-color; + border-bottom-color: variables.$highlight-color; } @@ -558,22 +560,22 @@ ul#adminmenu > li.current > a.current:after { .media-item .bar, .media-progress-bar div { - background-color: $highlight-color; + background-color: variables.$highlight-color; } .details.attachment { box-shadow: inset 0 0 0 3px #fff, - inset 0 0 0 7px $highlight-color; + inset 0 0 0 7px variables.$highlight-color; } .attachment.details .check { - background-color: $highlight-color; - box-shadow: 0 0 0 1px #fff, 0 0 0 2px $highlight-color; + background-color: variables.$highlight-color; + box-shadow: 0 0 0 1px #fff, 0 0 0 2px variables.$highlight-color; } .media-selection .attachment.selection.details .thumbnail { - box-shadow: 0 0 0 1px #fff, 0 0 0 3px $highlight-color; + box-shadow: 0 0 0 1px #fff, 0 0 0 3px variables.$highlight-color; } @@ -582,49 +584,49 @@ ul#adminmenu > li.current > a.current:after { .theme-browser .theme.active .theme-name, .theme-browser .theme.add-new-theme a:hover:after, .theme-browser .theme.add-new-theme a:focus:after { - background: $highlight-color; + background: variables.$highlight-color; } .theme-browser .theme.add-new-theme a:hover span:after, .theme-browser .theme.add-new-theme a:focus span:after { - color: $highlight-color; + color: variables.$highlight-color; } .theme-section.current, .theme-filter.current { - border-bottom-color: $menu-background; + border-bottom-color: variables.$menu-background; } body.more-filters-opened .more-filters { - color: $menu-text; - background-color: $menu-background; + color: variables.$menu-text; + background-color: variables.$menu-background; } body.more-filters-opened .more-filters:before { - color: $menu-text; + color: variables.$menu-text; } body.more-filters-opened .more-filters:hover, body.more-filters-opened .more-filters:focus { - background-color: $menu-highlight-background; - color: $menu-highlight-text; + background-color: variables.$menu-highlight-background; + color: variables.$menu-highlight-text; } body.more-filters-opened .more-filters:hover:before, body.more-filters-opened .more-filters:focus:before { - color: $menu-highlight-text; + color: variables.$menu-highlight-text; } /* Widgets */ .widgets-chooser li.widgets-chooser-selected { - background-color: $menu-highlight-background; - color: $menu-highlight-text; + background-color: variables.$menu-highlight-background; + color: variables.$menu-highlight-text; } .widgets-chooser li.widgets-chooser-selected:before, .widgets-chooser li.widgets-chooser-selected:focus:before { - color: $menu-highlight-text; + color: variables.$menu-highlight-text; } @@ -632,29 +634,29 @@ body.more-filters-opened .more-filters:focus:before { .nav-menus-php .item-edit:focus:before { box-shadow: - 0 0 0 1px color.adjust($button-color, $lightness: 10%), - 0 0 2px 1px $button-color; + 0 0 0 1px color.adjust(variables.$button-color, $lightness: 10%), + 0 0 2px 1px variables.$button-color; } /* Responsive Component */ div#wp-responsive-toggle a:before { - color: $menu-icon; + color: variables.$menu-icon; } .wp-responsive-open div#wp-responsive-toggle a { // ToDo: make inset border border-color: transparent; - background: $menu-highlight-background; + background: variables.$menu-highlight-background; } .wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle a { - background: $menu-submenu-background; + background: variables.$menu-submenu-background; } .wp-responsive-open #wpadminbar #wp-admin-bar-menu-toggle .ab-icon:before { - color: $menu-icon; + color: variables.$menu-icon; } /* TinyMCE */ @@ -664,7 +666,7 @@ div#wp-responsive-toggle a:before { .mce-container.mce-menu .mce-menu-item:focus, .mce-container.mce-menu .mce-menu-item-normal.mce-active, .mce-container.mce-menu .mce-menu-item-preview.mce-active { - background: $highlight-color; + background: variables.$highlight-color; } /* Customizer */ @@ -673,24 +675,24 @@ div#wp-responsive-toggle a:before { #customize-controls .control-section .accordion-section-title:hover, #customize-controls .control-section.open .accordion-section-title, #customize-controls .control-section .accordion-section-title:focus { - color: $link; - border-left-color: $button-color; + color: variables.$link; + border-left-color: variables.$button-color; } .customize-controls-close:focus, .customize-controls-close:hover, .customize-controls-preview-toggle:focus, .customize-controls-preview-toggle:hover { - color: $link; - border-top-color: $button-color; + color: variables.$link; + border-top-color: variables.$button-color; } .customize-panel-back:hover, .customize-panel-back:focus, .customize-section-back:hover, .customize-section-back:focus { - color: $link; - border-left-color: $button-color; + color: variables.$link; + border-left-color: variables.$button-color; } .customize-screen-options-toggle:hover, @@ -700,7 +702,7 @@ div#wp-responsive-toggle a:before { #customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:hover, #customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:active, #customize-controls .customize-info.open.active-menu-screen-options .customize-help-toggle:focus { - color: $link; + color: variables.$link; } .customize-screen-options-toggle:focus:before, @@ -711,28 +713,28 @@ div#wp-responsive-toggle a:before { #customize-save-button-wrapper .save:focus, #publish-settings:focus { box-shadow: - 0 0 0 1px color.adjust($button-color, $lightness: 10%), - 0 0 2px 1px $button-color; + 0 0 0 1px color.adjust(variables.$button-color, $lightness: 10%), + 0 0 2px 1px variables.$button-color; } #customize-controls .customize-info.open .customize-help-toggle, #customize-controls .customize-info .customize-help-toggle:focus, #customize-controls .customize-info .customize-help-toggle:hover { - color: $link; + color: variables.$link; } .control-panel-themes .customize-themes-section-title:focus, .control-panel-themes .customize-themes-section-title:hover { - border-left-color: $button-color; - color: $link; + border-left-color: variables.$button-color; + color: variables.$link; } .control-panel-themes .theme-section .customize-themes-section-title.selected:after { - background: $button-color; + background: variables.$button-color; } .control-panel-themes .customize-themes-section-title.selected { - color: $link; + color: variables.$link; } #customize-theme-controls .control-section:hover > .accordion-section-title:after, @@ -743,37 +745,37 @@ div#wp-responsive-toggle a:before { #customize-outer-theme-controls .control-section .accordion-section-title:hover:after, #customize-outer-theme-controls .control-section.open .accordion-section-title:after, #customize-outer-theme-controls .control-section .accordion-section-title:focus:after { - color: $link; + color: variables.$link; } .customize-control .attachment-media-view .button-add-media:focus { background-color: #fbfbfc; - border-color: $button-color; + border-color: variables.$button-color; border-style: solid; - box-shadow: 0 0 0 1px $button-color; + box-shadow: 0 0 0 1px variables.$button-color; outline: 2px solid transparent; } .wp-full-overlay-footer .devices button:focus, .wp-full-overlay-footer .devices button.active:hover { - border-bottom-color: $button-color; + border-bottom-color: variables.$button-color; } .wp-full-overlay-footer .devices button:hover:before, .wp-full-overlay-footer .devices button:focus:before { - color: $button-color; + color: variables.$button-color; } .wp-full-overlay .collapse-sidebar:hover, .wp-full-overlay .collapse-sidebar:focus { - color: $button-color; + color: variables.$button-color; } .wp-full-overlay .collapse-sidebar:hover .collapse-sidebar-arrow, .wp-full-overlay .collapse-sidebar:focus .collapse-sidebar-arrow { box-shadow: - 0 0 0 1px color.adjust($button-color, $lightness: 10%), - 0 0 2px 1px $button-color; + 0 0 0 1px color.adjust(variables.$button-color, $lightness: 10%), + 0 0 2px 1px variables.$button-color; } &.wp-customizer .theme-overlay .theme-header .close:focus, @@ -782,7 +784,7 @@ div#wp-responsive-toggle a:before { &.wp-customizer .theme-overlay .theme-header .right:hover, &.wp-customizer .theme-overlay .theme-header .left:focus, &.wp-customizer .theme-overlay .theme-header .left:hover { - border-bottom-color: $button-color; - color: $link; + border-bottom-color: variables.$button-color; + color: variables.$link; } } diff --git a/src/wp-admin/css/colors/_mixins.scss b/src/wp-admin/css/colors/_mixins.scss index a84d7d58abcf3..d33cf3bb2d854 100644 --- a/src/wp-admin/css/colors/_mixins.scss +++ b/src/wp-admin/css/colors/_mixins.scss @@ -1,3 +1,5 @@ +@use 'sass:color'; + /* * Button mixin- creates a button effect with correct * highlights/shadows, based on a base color. diff --git a/src/wp-admin/css/colors/_variables.scss b/src/wp-admin/css/colors/_variables.scss index b16601657be02..8a073f830e4b6 100644 --- a/src/wp-admin/css/colors/_variables.scss +++ b/src/wp-admin/css/colors/_variables.scss @@ -1,3 +1,5 @@ +@use "sass:color"; + // assign default value to all undefined variables $scheme-name: "default" !default; @@ -37,7 +39,7 @@ $menu-current-text: $menu-highlight-text !default; $menu-current-icon: $menu-highlight-icon !default; $menu-current-background: $menu-highlight-background !default; -$menu-submenu-text: mix( $base-color, $text-color, 30% ) !default; +$menu-submenu-text: color.mix( $base-color, $text-color, 30% ) !default; $menu-submenu-background: color.adjust($base-color, $lightness: -7%) !default; $menu-submenu-background-alt: color.adjust(color.adjust($menu-background, $lightness: 7%), $saturation: -7%) !default; @@ -59,9 +61,9 @@ $adminbar-input-background: color.adjust($menu-background, $lightness: 7%) !defa $adminbar-recovery-exit-text: $menu-bubble-text !default; $adminbar-recovery-exit-background: $menu-bubble-background !default; -$adminbar-recovery-exit-background-alt: mix(black, $adminbar-recovery-exit-background, 10%) !default; +$adminbar-recovery-exit-background-alt: color.mix(black, $adminbar-recovery-exit-background, 10%) !default; -$menu-customizer-text: mix( $base-color, $text-color, 40% ) !default; +$menu-customizer-text: color.mix( $base-color, $text-color, 40% ) !default; // Dashboard Colors diff --git a/src/wp-admin/css/colors/blue/colors.scss b/src/wp-admin/css/colors/blue/colors.scss index 805338d0f0097..1fca84c12bbc3 100644 --- a/src/wp-admin/css/colors/blue/colors.scss +++ b/src/wp-admin/css/colors/blue/colors.scss @@ -1,16 +1,16 @@ -@use "sass:color"; - -$scheme-name: "blue"; -$base-color: #52accc; -$icon-color: #e5f8ff; $highlight-color: #096484; -$notification-color: #e1a948; -$button-color: #e1a948; -$menu-submenu-text: #e2ecf1; -$menu-submenu-focus-text: #fff; -$menu-submenu-background: #4796b3; +@use "../_admin.scss" with ( + $scheme-name: "blue", + $base-color: #52accc, + $icon-color: #e5f8ff, + $highlight-color: $highlight-color, + $notification-color: #e1a948, + $button-color: #e1a948, -$dashboard-icon-background: $highlight-color; + $menu-submenu-text: #e2ecf1, + $menu-submenu-focus-text: #fff, + $menu-submenu-background: #4796b3, -@import "../_admin.scss"; + $dashboard-icon-background: $highlight-color +); diff --git a/src/wp-admin/css/colors/coffee/colors.scss b/src/wp-admin/css/colors/coffee/colors.scss index ff6fb162bd960..80f846ae67195 100644 --- a/src/wp-admin/css/colors/coffee/colors.scss +++ b/src/wp-admin/css/colors/coffee/colors.scss @@ -1,11 +1,11 @@ -@use "sass:color"; - -$scheme-name: "coffee"; $base-color: #59524c; -$highlight-color: #c7a589; -$notification-color: #9ea476; -$low-contrast-theme: "true"; -$form-checked: $base-color; +@use "../_admin.scss" with ( + $scheme-name: "coffee", + $base-color: $base-color, + $highlight-color: #c7a589, + $notification-color: #9ea476, + $form-checked: $base-color, -@import "../_admin.scss"; + $low-contrast-theme: "true" +); diff --git a/src/wp-admin/css/colors/ectoplasm/colors.scss b/src/wp-admin/css/colors/ectoplasm/colors.scss index 9c54d7bfd0ae4..a38736a9a24d5 100644 --- a/src/wp-admin/css/colors/ectoplasm/colors.scss +++ b/src/wp-admin/css/colors/ectoplasm/colors.scss @@ -1,11 +1,11 @@ -@use "sass:color"; - -$scheme-name: "ectoplasm"; $base-color: #523f6d; -$icon-color: #ece6f6; -$highlight-color: #a3b745; -$notification-color: #d46f15; -$form-checked: $base-color; +@use "../_admin.scss" with ( + $scheme-name: "ectoplasm", + $base-color: $base-color, + $icon-color: #ece6f6, + $highlight-color: #a3b745, + $notification-color: #d46f15, -@import "../_admin.scss"; + $form-checked: $base-color, +); diff --git a/src/wp-admin/css/colors/light/colors.scss b/src/wp-admin/css/colors/light/colors.scss index 3dc2e67b04a9a..e9fde92e32a7b 100644 --- a/src/wp-admin/css/colors/light/colors.scss +++ b/src/wp-admin/css/colors/light/colors.scss @@ -1,33 +1,36 @@ @use "sass:color"; -$scheme-name: "light"; -$base-color: #e5e5e5; -$icon-color: #999; -$text-color: #333; $highlight-color: #04a4cc; -$notification-color: #d64e07; +$text-color: #333; +$menu-avatar-frame: #aaa; -$body-background: #f5f5f5; +@use "../_admin.scss" with ( + $scheme-name: "light", + $base-color: #e5e5e5, + $icon-color: #999, + $text-color: $text-color, + $highlight-color: $highlight-color, + $notification-color: #d64e07, -$menu-highlight-text: #fff; -$menu-highlight-icon: #ccc; -$menu-highlight-background: #888; + $body-background: #f5f5f5, -$menu-bubble-text: #fff; -$menu-avatar-frame: #aaa; -$menu-submenu-background: #fff; + $menu-highlight-text: #fff, + $menu-highlight-icon: #ccc, + $menu-highlight-background: #888, -$menu-collapse-text: #777; -$menu-collapse-focus-icon: #555; + $menu-bubble-text: #fff, + $menu-submenu-background: #fff, -$dashboard-accent-1: $highlight-color; -$dashboard-accent-2: color.adjust(color.adjust($highlight-color, $lightness: 7%), $saturation: -15%); -$dashboard-icon-background: $text-color; + $menu-collapse-text: #777, + $menu-collapse-focus-icon: #555, -@import "../_admin.scss"; + $dashboard-accent-1: $highlight-color, + $dashboard-accent-2: color.adjust(color.adjust($highlight-color, $lightness: 7%), $saturation: -15%), + $dashboard-icon-background: $text-color +); /* Override the theme filter highlight color for this scheme */ .theme-section.current, .theme-filter.current { - border-bottom-color: $highlight-color; + border-bottom-color: admin.$highlight-color; } diff --git a/src/wp-admin/css/colors/midnight/colors.scss b/src/wp-admin/css/colors/midnight/colors.scss index 529598ac5046e..21e9f2364020a 100644 --- a/src/wp-admin/css/colors/midnight/colors.scss +++ b/src/wp-admin/css/colors/midnight/colors.scss @@ -1,10 +1,14 @@ @use "sass:color"; -$scheme-name: "midnight"; $base-color: #363b3f; $highlight-color: #e14d43; $notification-color: #69a8bb; -$dashboard-accent-2: mix($base-color, $notification-color, 90%); +@use "../_admin.scss" with ( + $scheme-name: "midnight", + $base-color: $base-color, + $highlight-color: $highlight-color, + $notification-color: $notification-color, -@import "../_admin.scss"; + $dashboard-accent-2: color.mix($base-color, $notification-color, 90%), +); diff --git a/src/wp-admin/css/colors/modern/colors.scss b/src/wp-admin/css/colors/modern/colors.scss index a66855729fbd4..45c750c0f583a 100644 --- a/src/wp-admin/css/colors/modern/colors.scss +++ b/src/wp-admin/css/colors/modern/colors.scss @@ -1,14 +1,16 @@ @use "sass:color"; -$scheme-name: "modern"; -$base-color: #1e1e1e; $highlight-color: #3858e9; -$menu-submenu-focus-text: #7b90ff; -$notification-color: $highlight-color; -$link: $highlight-color; -$link-focus: color.adjust($highlight-color, $lightness: -10%); +@use "../_admin.scss" with ( + $scheme-name: "modern", + $base-color: #1e1e1e, + $highlight-color: #3858e9, + $menu-submenu-focus-text: #7b90ff, + $notification-color: $highlight-color, -$custom-welcome-panel: "false"; + $link: $highlight-color, + $link-focus: color.adjust($highlight-color, $lightness: -10%), -@import "../_admin.scss"; + $custom-welcome-panel: "false" +); diff --git a/src/wp-admin/css/colors/ocean/colors.scss b/src/wp-admin/css/colors/ocean/colors.scss index e9bd47689c36e..d0ad861c94524 100644 --- a/src/wp-admin/css/colors/ocean/colors.scss +++ b/src/wp-admin/css/colors/ocean/colors.scss @@ -1,12 +1,12 @@ -@use "sass:color"; - -$scheme-name: "ocean"; $base-color: #738e96; -$icon-color: #f2fcff; -$highlight-color: #9ebaa0; -$notification-color: #aa9d88; -$low-contrast-theme: "true"; -$form-checked: $base-color; +@use "../_admin.scss" with ( + $scheme-name: "ocean", + $base-color: $base-color, + $icon-color: #f2fcff, + $highlight-color: #9ebaa0, + $notification-color: #aa9d88, + $form-checked: $base-color, -@import "../_admin.scss"; + $low-contrast-theme: "true" +); diff --git a/src/wp-admin/css/colors/sunrise/colors.scss b/src/wp-admin/css/colors/sunrise/colors.scss index 4094eb26be1f3..146fd1196028b 100644 --- a/src/wp-admin/css/colors/sunrise/colors.scss +++ b/src/wp-admin/css/colors/sunrise/colors.scss @@ -1,9 +1,11 @@ @use "sass:color"; -$scheme-name: "sunrise"; -$base-color: #cf4944; $highlight-color: #dd823b; -$notification-color: #ccaf0b; -$menu-submenu-focus-text: color.adjust($highlight-color, $lightness: 35%); -@import "../_admin.scss"; +@use "../_admin.scss" with ( + $scheme-name: "sunrise", + $base-color: #cf4944, + $highlight-color: $highlight-color, + $notification-color: #ccaf0b, + $menu-submenu-focus-text: color.adjust($highlight-color, $lightness: 35%) +); From bc3fdb4648d850b03d9a2e12cffdbe43cd91741b Mon Sep 17 00:00:00 2001 From: Peter Wilson Date: Fri, 17 Jan 2025 00:10:08 +0000 Subject: [PATCH 110/117] Options/Meta APIs: Document type juggling of meta data. Document that unserialised data types are stored as strings in the database and returned as such by the meta data functions. For example, setting meta data to the integer value `1` will be returned as `"1"` when subsequently queried via `get_metadata()` and the related functions. Props sukhendu2002, azaozz, jrf, rodrigosprimo. Fixes ticket:61950. git-svn-id: https://develop.svn.wordpress.org/trunk@59657 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/comment.php | 13 ++++++++++++- src/wp-includes/meta.php | 13 ++++++++++++- src/wp-includes/ms-site.php | 13 ++++++++++++- src/wp-includes/post.php | 13 ++++++++++++- src/wp-includes/taxonomy.php | 13 ++++++++++++- src/wp-includes/user.php | 13 ++++++++++++- 6 files changed, 72 insertions(+), 6 deletions(-) diff --git a/src/wp-includes/comment.php b/src/wp-includes/comment.php index 2762b77593308..00bda2615d930 100644 --- a/src/wp-includes/comment.php +++ b/src/wp-includes/comment.php @@ -432,7 +432,13 @@ function get_comment_count( $post_id = 0 ) { * * @param int $comment_id Comment ID. * @param string $meta_key Metadata name. - * @param mixed $meta_value Metadata value. Must be serializable if non-scalar. + * @param mixed $meta_value Metadata value. Arrays and objects are stored as serialized data and + * will be returned as the same type when retrieved. Other data types will + * be stored as strings in the database: + * - false is stored and retrieved as an empty string ('') + * - true is stored and retrieved as '1' + * - numbers (both integer and float) are stored and retrieved as strings + * Must be serializable if non-scalar. * @param bool $unique Optional. Whether the same key should not be added. * Default false. * @return int|false Meta ID on success, false on failure. @@ -481,6 +487,11 @@ function delete_comment_meta( $comment_id, $meta_key, $meta_value = '' ) { * False for an invalid `$comment_id` (non-numeric, zero, or negative value). * An empty array if a valid but non-existing comment ID is passed and `$single` is false. * An empty string if a valid but non-existing comment ID is passed and `$single` is true. + * Note: Non-serialized values are returned as strings: + * - false values are returned as empty strings ('') + * - true values are returned as '1' + * - numbers are returned as strings + * Arrays and objects retain their original type. */ function get_comment_meta( $comment_id, $key = '', $single = false ) { return get_metadata( 'comment', $comment_id, $key, $single ); diff --git a/src/wp-includes/meta.php b/src/wp-includes/meta.php index 6f6dd928e0498..4d8c49bfd11dd 100644 --- a/src/wp-includes/meta.php +++ b/src/wp-includes/meta.php @@ -23,7 +23,13 @@ * or any other object type with an associated meta table. * @param int $object_id ID of the object metadata is for. * @param string $meta_key Metadata key. - * @param mixed $meta_value Metadata value. Must be serializable if non-scalar. + * @param mixed $meta_value Metadata value. Arrays and objects are stored as serialized data and + * will be returned as the same type when retrieved. Other data types will + * be stored as strings in the database: + * - false is stored and retrieved as an empty string ('') + * - true is stored and retrieved as '1' + * - numbers (both integer and float) are stored and retrieved as strings + * Must be serializable if non-scalar. * @param bool $unique Optional. Whether the specified metadata key should be unique for the object. * If true, and the object already has a value for the specified metadata key, * no change will be made. Default false. @@ -570,6 +576,11 @@ function delete_metadata( $meta_type, $object_id, $meta_key, $meta_value = '', $ * or if `$meta_type` is not specified. * An empty array if a valid but non-existing object ID is passed and `$single` is false. * An empty string if a valid but non-existing object ID is passed and `$single` is true. + * Note: Non-serialized values are returned as strings: + * - false values are returned as empty strings ('') + * - true values are returned as '1' + * - numbers (both integer and float) are returned as strings + * Arrays and objects retain their original type. */ function get_metadata( $meta_type, $object_id, $meta_key = '', $single = false ) { $value = get_metadata_raw( $meta_type, $object_id, $meta_key, $single ); diff --git a/src/wp-includes/ms-site.php b/src/wp-includes/ms-site.php index b1d50940a245b..2a2b1474c5d61 100644 --- a/src/wp-includes/ms-site.php +++ b/src/wp-includes/ms-site.php @@ -1026,7 +1026,13 @@ function clean_blog_cache( $blog ) { * * @param int $site_id Site ID. * @param string $meta_key Metadata name. - * @param mixed $meta_value Metadata value. Must be serializable if non-scalar. + * @param mixed $meta_value Metadata value. Arrays and objects are stored as serialized data and + * will be returned as the same type when retrieved. Other data types will + * be stored as strings in the database: + * - false is stored and retrieved as an empty string ('') + * - true is stored and retrieved as '1' + * - numbers (both integer and float) are stored and retrieved as strings + * Must be serializable if non-scalar. * @param bool $unique Optional. Whether the same key should not be added. * Default false. * @return int|false Meta ID on success, false on failure. @@ -1071,6 +1077,11 @@ function delete_site_meta( $site_id, $meta_key, $meta_value = '' ) { * False for an invalid `$site_id` (non-numeric, zero, or negative value). * An empty array if a valid but non-existing site ID is passed and `$single` is false. * An empty string if a valid but non-existing site ID is passed and `$single` is true. + * Note: Non-serialized values are returned as strings: + * - false values are returned as empty strings ('') + * - true values are returned as '1' + * - numbers (both integer and float) are returned as strings + * Arrays and objects retain their original type. */ function get_site_meta( $site_id, $key = '', $single = false ) { return get_metadata( 'blog', $site_id, $key, $single ); diff --git a/src/wp-includes/post.php b/src/wp-includes/post.php index 98b9092f16f1f..009287916d7bb 100644 --- a/src/wp-includes/post.php +++ b/src/wp-includes/post.php @@ -2558,7 +2558,13 @@ function get_posts( $args = null ) { * * @param int $post_id Post ID. * @param string $meta_key Metadata name. - * @param mixed $meta_value Metadata value. Must be serializable if non-scalar. + * @param mixed $meta_value Metadata value. Arrays and objects are stored as serialized data and + * will be returned as the same type when retrieved. Other data types will + * be stored as strings in the database: + * - false is stored and retrieved as an empty string ('') + * - true is stored and retrieved as '1' + * - numbers (both integer and float) are stored and retrieved as strings + * Must be serializable if non-scalar. * @param bool $unique Optional. Whether the same key should not be added. * Default false. * @return int|false Meta ID on success, false on failure. @@ -2615,6 +2621,11 @@ function delete_post_meta( $post_id, $meta_key, $meta_value = '' ) { * False for an invalid `$post_id` (non-numeric, zero, or negative value). * An empty array if a valid but non-existing post ID is passed and `$single` is false. * An empty string if a valid but non-existing post ID is passed and `$single` is true. + * Note: Non-serialized values are returned as strings: + * - false values are returned as empty strings ('') + * - true values are returned as '1' + * - numbers (both integer and float) are returned as strings + * Arrays and objects retain their original type. */ function get_post_meta( $post_id, $key = '', $single = false ) { return get_metadata( 'post', $post_id, $key, $single ); diff --git a/src/wp-includes/taxonomy.php b/src/wp-includes/taxonomy.php index bebf55ec79bfa..1af1b5a76b70d 100644 --- a/src/wp-includes/taxonomy.php +++ b/src/wp-includes/taxonomy.php @@ -1386,7 +1386,13 @@ function get_terms( $args = array(), $deprecated = '' ) { * * @param int $term_id Term ID. * @param string $meta_key Metadata name. - * @param mixed $meta_value Metadata value. Must be serializable if non-scalar. + * @param mixed $meta_value Metadata value. Arrays and objects are stored as serialized data and + * will be returned as the same type when retrieved. Other data types will + * be stored as strings in the database: + * - false is stored and retrieved as an empty string ('') + * - true is stored and retrieved as '1' + * - numbers (both integer and float) are stored and retrieved as strings + * Must be serializable if non-scalar. * @param bool $unique Optional. Whether the same key should not be added. * Default false. * @return int|false|WP_Error Meta ID on success, false on failure. @@ -1432,6 +1438,11 @@ function delete_term_meta( $term_id, $meta_key, $meta_value = '' ) { * False for an invalid `$term_id` (non-numeric, zero, or negative value). * An empty array if a valid but non-existing term ID is passed and `$single` is false. * An empty string if a valid but non-existing term ID is passed and `$single` is true. + * Note: Non-serialized values are returned as strings: + * - false values are returned as empty strings ('') + * - true values are returned as '1' + * - numbers are returned as strings + * Arrays and objects retain their original type. */ function get_term_meta( $term_id, $key = '', $single = false ) { return get_metadata( 'term', $term_id, $key, $single ); diff --git a/src/wp-includes/user.php b/src/wp-includes/user.php index 635f82c5ed353..e4e6f5b652744 100644 --- a/src/wp-includes/user.php +++ b/src/wp-includes/user.php @@ -1151,7 +1151,13 @@ function is_user_member_of_blog( $user_id = 0, $blog_id = 0 ) { * * @param int $user_id User ID. * @param string $meta_key Metadata name. - * @param mixed $meta_value Metadata value. Must be serializable if non-scalar. + * @param mixed $meta_value Metadata value. Arrays and objects are stored as serialized data and + * will be returned as the same type when retrieved. Other data types will + * be stored as strings in the database: + * - false is stored and retrieved as an empty string ('') + * - true is stored and retrieved as '1' + * - numbers (both integer and float) are stored and retrieved as strings + * Must be serializable if non-scalar. * @param bool $unique Optional. Whether the same key should not be added. * Default false. * @return int|false Meta ID on success, false on failure. @@ -1200,6 +1206,11 @@ function delete_user_meta( $user_id, $meta_key, $meta_value = '' ) { * False for an invalid `$user_id` (non-numeric, zero, or negative value). * An empty array if a valid but non-existing user ID is passed and `$single` is false. * An empty string if a valid but non-existing user ID is passed and `$single` is true. + * Note: Non-serialized values are returned as strings: + * - false values are returned as empty strings ('') + * - true values are returned as '1' + * - numbers (both integer and float) are returned as strings + * Arrays and objects retain their original type. */ function get_user_meta( $user_id, $key = '', $single = false ) { return get_metadata( 'user', $user_id, $key, $single ); From e8fc0d6ae5d936557f38d4187db5d47df0f1c835 Mon Sep 17 00:00:00 2001 From: John Blackbourn Date: Fri, 17 Jan 2025 10:32:22 +0000 Subject: [PATCH 111/117] Build/Test Tools: Use quiet pulls during local environment installation and WP-CLI commands. This reduces the noise of the output -- both locally and on CI -- when first pulling containers during local environment installation and the first time the cli container is pulled for WP-CLI commands. See #62280 git-svn-id: https://develop.svn.wordpress.org/trunk@59658 602fd350-edb4-49c9-b593-d223f7449a82 --- tools/local-env/scripts/install.js | 2 +- tools/local-env/scripts/start.js | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/local-env/scripts/install.js b/tools/local-env/scripts/install.js index 519fc37a0d258..d924ffc30deba 100644 --- a/tools/local-env/scripts/install.js +++ b/tools/local-env/scripts/install.js @@ -55,7 +55,7 @@ wait_on( { resources: [ `tcp:localhost:${process.env.LOCAL_PORT}`] } ) function wp_cli( cmd ) { const composeFiles = local_env_utils.get_compose_files(); - execSync( `docker compose ${composeFiles} run --rm cli ${cmd}`, { stdio: 'inherit' } ); + execSync( `docker compose ${composeFiles} run --quiet-pull --rm cli ${cmd}`, { stdio: 'inherit' } ); } /** diff --git a/tools/local-env/scripts/start.js b/tools/local-env/scripts/start.js index ef7fb7b7d4360..0dc8b9570063d 100644 --- a/tools/local-env/scripts/start.js +++ b/tools/local-env/scripts/start.js @@ -31,7 +31,7 @@ try { const containers = ( process.env.LOCAL_PHP_MEMCACHED === 'true' ) ? 'wordpress-develop memcached' : 'wordpress-develop'; -execSync( `docker compose ${composeFiles} up -d ${containers}`, { stdio: 'inherit' } ); +execSync( `docker compose ${composeFiles} up --quiet-pull -d ${containers}`, { stdio: 'inherit' } ); // If Docker Toolbox is being used, we need to manually forward LOCAL_PORT to the Docker VM. if ( process.env.DOCKER_TOOLBOX_INSTALL_PATH ) { From f1dc1916a0a3b13a9ace369e8bf850cc03c8690c Mon Sep 17 00:00:00 2001 From: John Blackbourn Date: Fri, 17 Jan 2025 10:35:41 +0000 Subject: [PATCH 112/117] Build/Test Tools: Hide the Node.js error message when a Docker command produces a non-zero exit code. When running a command that goes via docker.js and produces a non-zero exit code, the error message and stack trace from node an safely be hidden because the stack trace only points to the `execSync()` call and is of no use. Fixes #62814 git-svn-id: https://develop.svn.wordpress.org/trunk@59659 602fd350-edb4-49c9-b593-d223f7449a82 --- tools/local-env/scripts/docker.js | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/tools/local-env/scripts/docker.js b/tools/local-env/scripts/docker.js index daa6b8826237a..c1dc2b27e1673 100644 --- a/tools/local-env/scripts/docker.js +++ b/tools/local-env/scripts/docker.js @@ -12,5 +12,10 @@ if (process.argv.includes('--coverage-html')) { process.env.LOCAL_PHP_XDEBUG_MODE = 'coverage'; } -// Execute any docker compose command passed to this script. -execSync( 'docker compose ' + composeFiles + ' ' + process.argv.slice( 2 ).join( ' ' ), { stdio: 'inherit' } ); +// This try-catch prevents the superfluous Node.js debugging information from being shown if the command fails. +try { + // Execute any Docker compose command passed to this script. + execSync( 'docker compose ' + composeFiles + ' ' + process.argv.slice( 2 ).join( ' ' ), { stdio: 'inherit' } ); +} catch ( error ) { + process.exit( 1 ); +} From 6677425622ca570c0fb190295dd610150de33d17 Mon Sep 17 00:00:00 2001 From: Sergey Biryukov Date: Fri, 17 Jan 2025 10:36:41 +0000 Subject: [PATCH 113/117] Coding Standards: Use strict comparison in `wp_xmlrpc_server::wp_deleteCategory()`. Follow-up to [20157], [32733]. Props aristath, poena, afercia, SergeyBiryukov. See #62279. git-svn-id: https://develop.svn.wordpress.org/trunk@59660 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/class-wp-xmlrpc-server.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/wp-includes/class-wp-xmlrpc-server.php b/src/wp-includes/class-wp-xmlrpc-server.php index 527bf23966be2..84f64967a45ce 100644 --- a/src/wp-includes/class-wp-xmlrpc-server.php +++ b/src/wp-includes/class-wp-xmlrpc-server.php @@ -3504,7 +3504,7 @@ public function wp_deleteCategory( $args ) { $status = wp_delete_term( $category_id, 'category' ); - if ( true == $status ) { + if ( true === $status ) { /** * Fires after a category has been successfully deleted via XML-RPC. * @@ -3754,7 +3754,7 @@ public function wp_deleteComment( $args ) { $status = wp_delete_comment( $comment_id ); - if ( $status ) { + if ( true === $status ) { /** * Fires after a comment has been successfully deleted via XML-RPC. * From 5e74d3416f6ca7f204ab772cd0b836923bf1ad41 Mon Sep 17 00:00:00 2001 From: Jonathan Desrosiers Date: Fri, 17 Jan 2025 14:01:37 +0000 Subject: [PATCH 114/117] Build/Test Tools: Auto-close linked PRs on GitHub. There are currently ~2,000 open pull requests on GitHub for `wordpress-develop`. Many of these were for testing changes that have already been merged. To help prevent orphaned pull requests, this new workflow will search for any pull requests referencing the `Fixed` Trac tickets as noted in the commit message and close them out. For now, this only happens for `push` events. Props peterwilsoncc, swissspidy, johnbillion, davidbaumwald. Fixes #62817. git-svn-id: https://develop.svn.wordpress.org/trunk@59661 602fd350-edb4-49c9-b593-d223f7449a82 --- .github/workflows/cleanup-pull-requests.yml | 28 ++++++ .../reusable-cleanup-pull-requests.yml | 98 +++++++++++++++++++ 2 files changed, 126 insertions(+) create mode 100644 .github/workflows/cleanup-pull-requests.yml create mode 100644 .github/workflows/reusable-cleanup-pull-requests.yml diff --git a/.github/workflows/cleanup-pull-requests.yml b/.github/workflows/cleanup-pull-requests.yml new file mode 100644 index 0000000000000..578710dcf56ac --- /dev/null +++ b/.github/workflows/cleanup-pull-requests.yml @@ -0,0 +1,28 @@ +name: Cleanup Pull Requests + +on: + push: + branches: + - trunk + - '4.[1-9]' + - '[5-9].[0-9]' + +# Cancels all previous workflow runs for pull requests that have not completed. +concurrency: + # The concurrency group contains the workflow name and the branch name for pull requests + # or the commit hash for any other events. + group: ${{ github.workflow }}-${{ github.sha }} + cancel-in-progress: true + +# Disable permissions for all available scopes by default. +# Any needed permissions should be configured at the job level. +permissions: {} + +jobs: + # Runs pull request cleanup. + close-prs: + name: Clean up pull requests + permissions: + pull-requests: write + if: ${{ github.repository == 'WordPress/wordpress-develop' }} + uses: ./.github/workflows/reusable-cleanup-pull-requests.yml diff --git a/.github/workflows/reusable-cleanup-pull-requests.yml b/.github/workflows/reusable-cleanup-pull-requests.yml new file mode 100644 index 0000000000000..c63bab2d67751 --- /dev/null +++ b/.github/workflows/reusable-cleanup-pull-requests.yml @@ -0,0 +1,98 @@ +## +# A reusable workflow that finds and closes any pull requests that are linked to Trac +# tickets that are referenced as fixed in commit messages. +# +# More info about using GitHub pull requests for contributing to WordPress can be found in the handbook: https://make.wordpress.org/core/handbook/contribute/git/github-pull-requests-for-code-review/. +## +name: Run pull request cleanup + +on: + workflow_call: + +jobs: + # Finds and closes pull requests referencing fixed Trac tickets in commit messages using the + # documented expected format + # + # Commit message format is documented in the Core handbook: https://make.wordpress.org/core/handbook/best-practices/commit-messages/. + # + # Performs the following steps: + # - Parse fixed ticket numbers from the commit message. + # - Parse the SVN revision from the commit message. + # - Searches for pull requests referencing any fixed tickets. + # - Leaves a comment on each PR before closing. + close-prs: + name: Find and close PRs + runs-on: ubuntu-latest + permissions: + pull-requests: write + + steps: + - name: Find fixed ticket numbers + id: trac-tickets + run: | + COMMIT_MESSAGE=$(cat <<'EOF' | sed -n '/^Fixes #/,/\./p' + ${{ github.event.head_commit.message }} + EOF + ) + echo "fixed_list=$(echo \"$COMMIT_MESSAGE\" | sed -n 's/.*Fixes #\([0-9]\+\).*/\1/p' | tr '\n' ' ')" >> $GITHUB_OUTPUT + + - name: Get the SVN revision + id: git-svn-id + run: | + COMMIT_MESSAGE=$(cat <<'EOF' | sed -n '$p' + ${{ github.event.head_commit.message }} + EOF + ) + echo "svn_revision_number=$(echo \"$COMMIT_MESSAGE\" | sed -n 's/.*git-svn-id: https:\/\/develop.svn.wordpress.org\/[^@]*@\([0-9]*\) .*/\1/p')" >> $GITHUB_OUTPUT + + - name: Find pull requests + id: linked-prs + if: ${{ steps.trac-tickets.outputs.fixed_list != '' && steps.git-svn-id.outputs.svn_revision_number != '' }} + uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 + with: + script: | + const fixedList = "${{ steps.trac-tickets.outputs.fixed_list }}".split(' ').filter(Boolean); + + let prNumbers = []; + + for (const ticket of fixedList) { + const query = 'is:pr is:open repo:' + context.repo.owner + '/' + context.repo.repo + ' in:body https://core.trac.wordpress.org/ticket/' + ticket; + const result = await github.rest.search.issuesAndPullRequests({ q: query }); + + prNumbers = prNumbers.concat(result.data.items.map(pr => pr.number)); + } + + return prNumbers; + + - name: Comment and close pull requests + if: ${{ steps.trac-tickets.outputs.fixed_list != '' && steps.git-svn-id.outputs.svn_revision_number != '' }} + uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1 + with: + script: | + const prNumbers = ${{ steps.linked-prs.outputs.result }}; + + const commentBody = `A commit was made that fixes the Trac ticket referenced in the description of this pull request. + + SVN changeset: [${{ steps.git-svn-id.outputs.svn_revision_number }}](https://core.trac.wordpress.org/changeset/${{ steps.git-svn-id.outputs.svn_revision_number }}) + GitHub commit: https://github.com/WordPress/wordpress-develop/commit/${{ github.sha }} + + This PR will be closed, but please confirm the accuracy of this and reopen if there is more work to be done.`; + + // Update all matched pull requests. + for (const prNumber of prNumbers) { + // Comment on the pull request with details. + await github.rest.issues.createComment({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: prNumber, + body: commentBody + }); + + // Close the pull request. + await github.rest.pulls.update({ + owner: context.repo.owner, + repo: context.repo.repo, + pull_number: prNumber, + state: 'closed' + }); + } From 2f654881e494424634d5821d1ef37c06edb8923a Mon Sep 17 00:00:00 2001 From: Joe McGill Date: Fri, 17 Jan 2025 21:35:50 +0000 Subject: [PATCH 115/117] Editor: Improve consistency of `render_block_context` filter. This ensures that when block context is filtered via `render_block_context`, the filtered value is provided as available context to inner blocks. For backwards compatibility reasons, filtered context is added to inner block context regardless of whether that block has declared support via the `uses_context` property. Props mukesh27, flixos90, gziolo, dlh, joemcgill, santosguillamot. Fixes #62046. git-svn-id: https://develop.svn.wordpress.org/trunk@59662 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/class-wp-block.php | 65 +++++++++-- tests/phpunit/tests/blocks/renderBlock.php | 128 +++++++++++++++++++++ 2 files changed, 185 insertions(+), 8 deletions(-) diff --git a/src/wp-includes/class-wp-block.php b/src/wp-includes/class-wp-block.php index a1c52019c29a5..2533379fcdf7a 100644 --- a/src/wp-includes/class-wp-block.php +++ b/src/wp-includes/class-wp-block.php @@ -56,7 +56,7 @@ class WP_Block { * @var array * @access protected */ - protected $available_context; + protected $available_context = array(); /** * Block type registry. @@ -140,6 +140,28 @@ public function __construct( $block, $available_context = array(), $registry = n $this->available_context = $available_context; + $this->refresh_context_dependents(); + } + + /** + * Updates the context for the current block and its inner blocks. + * + * The method updates the context of inner blocks, if any, by passing down + * any context values the block provides (`provides_context`). + * + * If the block has inner blocks, the method recursively processes them by creating new instances of `WP_Block` + * for each inner block and updating their context based on the block's `provides_context` property. + * + * @since 6.8.0 + */ + public function refresh_context_dependents() { + /* + * Merging the `$context` property here is not ideal, but for now needs to happen because of backward compatibility. + * Ideally, the `$context` property itself would not be filterable directly and only the `$available_context` would be filterable. + * However, this needs to be separately explored whether it's possible without breakage. + */ + $this->available_context = array_merge( $this->available_context, $this->context ); + if ( ! empty( $this->block_type->uses_context ) ) { foreach ( $this->block_type->uses_context as $context_name ) { if ( array_key_exists( $context_name, $this->available_context ) ) { @@ -148,7 +170,23 @@ public function __construct( $block, $available_context = array(), $registry = n } } - if ( ! empty( $block['innerBlocks'] ) ) { + $this->refresh_parsed_block_dependents(); + } + + /** + * Updates the parsed block content for the current block and its inner blocks. + * + * This method sets the `inner_html` and `inner_content` properties of the block based on the parsed + * block content provided during initialization. It ensures that the block instance reflects the + * most up-to-date content for both the inner HTML and any string fragments around inner blocks. + * + * If the block has inner blocks, this method initializes a new `WP_Block_List` for them, ensuring the + * correct content and context are updated for each nested block. + * + * @since 6.8.0 + */ + public function refresh_parsed_block_dependents() { + if ( ! empty( $this->parsed_block['innerBlocks'] ) ) { $child_context = $this->available_context; if ( ! empty( $this->block_type->provides_context ) ) { @@ -159,15 +197,15 @@ public function __construct( $block, $available_context = array(), $registry = n } } - $this->inner_blocks = new WP_Block_List( $block['innerBlocks'], $child_context, $registry ); + $this->inner_blocks = new WP_Block_List( $this->parsed_block['innerBlocks'], $child_context, $this->registry ); } - if ( ! empty( $block['innerHTML'] ) ) { - $this->inner_html = $block['innerHTML']; + if ( ! empty( $this->parsed_block['innerHTML'] ) ) { + $this->inner_html = $this->parsed_block['innerHTML']; } - if ( ! empty( $block['innerContent'] ) ) { - $this->inner_content = $block['innerContent']; + if ( ! empty( $this->parsed_block['innerContent'] ) ) { + $this->inner_content = $this->parsed_block['innerContent']; } } @@ -506,7 +544,8 @@ public function render( $options = array() ) { if ( ! is_null( $pre_render ) ) { $block_content .= $pre_render; } else { - $source_block = $inner_block->parsed_block; + $source_block = $inner_block->parsed_block; + $inner_block_context = $inner_block->context; /** This filter is documented in wp-includes/blocks.php */ $inner_block->parsed_block = apply_filters( 'render_block_data', $inner_block->parsed_block, $source_block, $parent_block ); @@ -514,6 +553,16 @@ public function render( $options = array() ) { /** This filter is documented in wp-includes/blocks.php */ $inner_block->context = apply_filters( 'render_block_context', $inner_block->context, $inner_block->parsed_block, $parent_block ); + /* + * The `refresh_context_dependents()` method already calls `refresh_parsed_block_dependents()`. + * Therefore the second condition is irrelevant if the first one is satisfied. + */ + if ( $inner_block->context !== $inner_block_context ) { + $inner_block->refresh_context_dependents(); + } elseif ( $inner_block->parsed_block !== $source_block ) { + $inner_block->refresh_parsed_block_dependents(); + } + $block_content .= $inner_block->render(); } diff --git a/tests/phpunit/tests/blocks/renderBlock.php b/tests/phpunit/tests/blocks/renderBlock.php index 0c1c4ce10a1ee..be251692c5c62 100644 --- a/tests/phpunit/tests/blocks/renderBlock.php +++ b/tests/phpunit/tests/blocks/renderBlock.php @@ -192,4 +192,132 @@ public function test_default_context_is_filterable() { $this->assertSame( array( 'example' => 'ok' ), $provided_context[0] ); } + + /** + * Tests the behavior of the 'render_block_context' filter based on the location of the filtered block. + * + * @ticket 62046 + */ + public function test_render_block_context_inner_blocks() { + $provided_context = array(); + + register_block_type( + 'tests/context-provider', + array( + 'provides_context' => array( 'example' ), + ) + ); + + register_block_type( + 'tests/context-consumer', + array( + 'uses_context' => array( 'example' ), + 'render_callback' => static function ( $attributes, $content, $block ) use ( &$provided_context ) { + $provided_context = $block->context; + + return ''; + }, + ) + ); + + // Filter the context provided by the test block. + add_filter( + 'render_block_context', + function ( $context, $parsed_block ) { + if ( isset( $parsed_block['blockName'] ) && 'tests/context-provider' === $parsed_block['blockName'] ) { + $context['example'] = 'ok'; + } + + return $context; + }, + 10, + 2 + ); + + // Test inner block context when the provider block is a top-level block. + do_blocks( + << + + +HTML + ); + $this->assertArrayHasKey( 'example', $provided_context, 'Test block is top-level block: Context should include "example"' ); + $this->assertSame( 'ok', $provided_context['example'], 'Test block is top-level block: "example" in context should be "ok"' ); + + // Test inner block context when the provider block is an inner block. + do_blocks( + << + + + + +HTML + ); + $this->assertArrayHasKey( 'example', $provided_context, 'Test block is inner block: Block context should include "example"' ); + $this->assertSame( 'ok', $provided_context['example'], 'Test block is inner block: "example" in context should be "ok"' ); + } + + /** + * Tests that the 'render_block_context' filter arbitrary context. + * + * @ticket 62046 + */ + public function test_render_block_context_allowed_context() { + $provided_context = array(); + + register_block_type( + 'tests/context-consumer', + array( + 'uses_context' => array( 'example' ), + 'render_callback' => static function ( $attributes, $content, $block ) use ( &$provided_context ) { + $provided_context = $block->context; + + return ''; + }, + ) + ); + + // Filter the context provided to the test block. + add_filter( + 'render_block_context', + function ( $context, $parsed_block ) { + if ( isset( $parsed_block['blockName'] ) && 'tests/context-consumer' === $parsed_block['blockName'] ) { + $context['arbitrary'] = 'ok'; + } + + return $context; + }, + 10, + 2 + ); + + do_blocks( + << +HTML + ); + $this->assertArrayNotHasKey( 'arbitrary', $provided_context, 'Test block is top-level block: Block context should not include "arbitrary"' ); + + do_blocks( + << + + +HTML + ); + + /* + * These assertions assert something that ideally should not be the case: Inner blocks should respect the + * `uses_context` value just like top-level blocks do. However, due to logic in `WP_Block::render()`, the + * `context` property value itself is filterable when it should rather only apply to the `available_context` + * property. + * However, changing this behavior now would be a backward compatibility break, hence the assertion here. + * Potentially it can be reconsidered in the future, so that these two assertions could be replaced with an + * `assertArrayNotHasKey( 'arbitrary', $provided_context )`. + */ + $this->assertArrayHasKey( 'arbitrary', $provided_context, 'Test block is inner block: Block context should include "arbitrary"' ); + $this->assertSame( 'ok', $provided_context['arbitrary'], 'Test block is inner block: "arbitrary" in context should be "ok"' ); + } } From f33ee44c8c51b8f7a8d9cd8c647f9a85d2bebcd4 Mon Sep 17 00:00:00 2001 From: Sergey Biryukov Date: Sat, 18 Jan 2025 23:41:46 +0000 Subject: [PATCH 116/117] Coding Standards: Use strict comparison in `wp_xmlrpc_server::pingback_ping()`. Follow-up to [2983], [55365]. Props aristath, poena, afercia, SergeyBiryukov. See #62279. git-svn-id: https://develop.svn.wordpress.org/trunk@59663 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/class-wp-xmlrpc-server.php | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/wp-includes/class-wp-xmlrpc-server.php b/src/wp-includes/class-wp-xmlrpc-server.php index 84f64967a45ce..cbcf0a9b52fdc 100644 --- a/src/wp-includes/class-wp-xmlrpc-server.php +++ b/src/wp-includes/class-wp-xmlrpc-server.php @@ -6885,6 +6885,7 @@ public function pingback_ping( $args ) { */ $urltest = parse_url( $pagelinkedto ); $post_id = url_to_postid( $pagelinkedto ); + if ( $post_id ) { // $way } elseif ( isset( $urltest['path'] ) && preg_match( '#p/[0-9]{1,}#', $urltest['path'], $match ) ) { @@ -6917,15 +6918,15 @@ public function pingback_ping( $args ) { // TODO: Attempt to extract a post ID from the given URL. return $this->pingback_error( 33, __( 'The specified target URL cannot be used as a target. It either does not exist, or it is not a pingback-enabled resource.' ) ); } - $post_id = (int) $post_id; - $post = get_post( $post_id ); + $post_id = (int) $post_id; + $post = get_post( $post_id ); if ( ! $post ) { // Post not found. return $this->pingback_error( 33, __( 'The specified target URL cannot be used as a target. It either does not exist, or it is not a pingback-enabled resource.' ) ); } - if ( url_to_postid( $pagelinkedfrom ) == $post_id ) { + if ( url_to_postid( $pagelinkedfrom ) === $post_id ) { return $this->pingback_error( 0, __( 'The source URL and the target URL cannot both point to the same resource.' ) ); } From 7fe8f1cc6f2722d773c738bbe0811bef2a07756e Mon Sep 17 00:00:00 2001 From: Sergey Biryukov Date: Sun, 19 Jan 2025 16:55:20 +0000 Subject: [PATCH 117/117] Coding Standards: Rename the `$dateCreated` variable in `wp_xmlrpc_server` methods. This resolves a few WPCS warnings: {{{ Variable "$dateCreated" is not in valid snake_case format, try "$date_created" }}} Follow-up to [1563], [1659], [5888], [6691], [8543], [19848]. See #62279. git-svn-id: https://develop.svn.wordpress.org/trunk@59664 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-includes/class-wp-xmlrpc-server.php | 37 +++++++++++----------- 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/src/wp-includes/class-wp-xmlrpc-server.php b/src/wp-includes/class-wp-xmlrpc-server.php index cbcf0a9b52fdc..458ffbb0a59f7 100644 --- a/src/wp-includes/class-wp-xmlrpc-server.php +++ b/src/wp-includes/class-wp-xmlrpc-server.php @@ -1513,17 +1513,17 @@ protected function _insert_post( $user, $content_struct ) { // Do some timestamp voodoo. if ( ! empty( $post_data['post_date_gmt'] ) ) { // We know this is supposed to be GMT, so we're going to slap that Z on there by force. - $dateCreated = rtrim( $post_data['post_date_gmt']->getIso(), 'Z' ) . 'Z'; + $date_created = rtrim( $post_data['post_date_gmt']->getIso(), 'Z' ) . 'Z'; } elseif ( ! empty( $post_data['post_date'] ) ) { - $dateCreated = $post_data['post_date']->getIso(); + $date_created = $post_data['post_date']->getIso(); } // Default to not flagging the post date to be edited unless it's intentional. $post_data['edit_date'] = false; - if ( ! empty( $dateCreated ) ) { - $post_data['post_date'] = iso8601_to_datetime( $dateCreated ); - $post_data['post_date_gmt'] = iso8601_to_datetime( $dateCreated, 'gmt' ); + if ( ! empty( $date_created ) ) { + $post_data['post_date'] = iso8601_to_datetime( $date_created ); + $post_data['post_date_gmt'] = iso8601_to_datetime( $date_created, 'gmt' ); // Flag the post date to be edited. $post_data['edit_date'] = true; @@ -3837,9 +3837,10 @@ public function wp_editComment( $args ) { // Do some timestamp voodoo. if ( ! empty( $content_struct['date_created_gmt'] ) ) { // We know this is supposed to be GMT, so we're going to slap that Z on there by force. - $dateCreated = rtrim( $content_struct['date_created_gmt']->getIso(), 'Z' ) . 'Z'; - $comment['comment_date'] = get_date_from_gmt( $dateCreated ); - $comment['comment_date_gmt'] = iso8601_to_datetime( $dateCreated, 'gmt' ); + $date_created = rtrim( $content_struct['date_created_gmt']->getIso(), 'Z' ) . 'Z'; + + $comment['comment_date'] = get_date_from_gmt( $date_created ); + $comment['comment_date_gmt'] = iso8601_to_datetime( $date_created, 'gmt' ); } if ( isset( $content_struct['content'] ) ) { @@ -5571,16 +5572,16 @@ public function mw_newPost( $args ) { // Do some timestamp voodoo. if ( ! empty( $content_struct['date_created_gmt'] ) ) { // We know this is supposed to be GMT, so we're going to slap that Z on there by force. - $dateCreated = rtrim( $content_struct['date_created_gmt']->getIso(), 'Z' ) . 'Z'; + $date_created = rtrim( $content_struct['date_created_gmt']->getIso(), 'Z' ) . 'Z'; } elseif ( ! empty( $content_struct['dateCreated'] ) ) { - $dateCreated = $content_struct['dateCreated']->getIso(); + $date_created = $content_struct['dateCreated']->getIso(); } $post_date = ''; $post_date_gmt = ''; - if ( ! empty( $dateCreated ) ) { - $post_date = iso8601_to_datetime( $dateCreated ); - $post_date_gmt = iso8601_to_datetime( $dateCreated, 'gmt' ); + if ( ! empty( $date_created ) ) { + $post_date = iso8601_to_datetime( $date_created ); + $post_date_gmt = iso8601_to_datetime( $date_created, 'gmt' ); } $post_category = array(); @@ -5958,17 +5959,17 @@ public function mw_editPost( $args ) { // Do some timestamp voodoo. if ( ! empty( $content_struct['date_created_gmt'] ) ) { // We know this is supposed to be GMT, so we're going to slap that Z on there by force. - $dateCreated = rtrim( $content_struct['date_created_gmt']->getIso(), 'Z' ) . 'Z'; + $date_created = rtrim( $content_struct['date_created_gmt']->getIso(), 'Z' ) . 'Z'; } elseif ( ! empty( $content_struct['dateCreated'] ) ) { - $dateCreated = $content_struct['dateCreated']->getIso(); + $date_created = $content_struct['dateCreated']->getIso(); } // Default to not flagging the post date to be edited unless it's intentional. $edit_date = false; - if ( ! empty( $dateCreated ) ) { - $post_date = iso8601_to_datetime( $dateCreated ); - $post_date_gmt = iso8601_to_datetime( $dateCreated, 'gmt' ); + if ( ! empty( $date_created ) ) { + $post_date = iso8601_to_datetime( $date_created ); + $post_date_gmt = iso8601_to_datetime( $date_created, 'gmt' ); // Flag the post date to be edited. $edit_date = true;