diff --git a/.mockoon/beyondwords-api.json b/.mockoon/beyondwords-api.json index 1a971c8e..2cd4134a 100644 --- a/.mockoon/beyondwords-api.json +++ b/.mockoon/beyondwords-api.json @@ -119,13 +119,6 @@ "filePath": "", "sendFileAsBody": false, "rules": [ - { - "target": "header", - "modifier": "Content-Type", - "value": "application/json", - "operator": "equals", - "invert": false - }, { "target": "header", "modifier": "X-Api-Key", @@ -276,7 +269,7 @@ }, { "uuid": "ecdb7657-8a38-4380-937e-54204529d2e5", - "body": "{\n \"id\": \"9279c9e0-e0b5-4789-9040-f44478ed3e9e\",\n \"title\": \"{{body 'title' 'Title'}}\",\n \"type\": \"auto_segment\",\n \"source_id\": \"{{body 'source_id' '90e4cbff-6382-4a88-adc5-1eb3ffa16c6d'}}\",\n \"source_url\": \"{{body 'source_url' 'https://example.com'}}\",\n \"author\": \"{{body 'author' 'Jane Smith'}}\",\n \"image_url\": \"{{body 'image' 'https://example.com/image.jpg'}}\",\n \"audio\": [\n {\n \"id\": 12192819,\n \"content_type\": \"application/x-mpegURL\",\n \"url\": \"https://beyondwords-cdn-b7fyckdeejejb6dj.a03.azurefd.net/audio/projects/9969/podcasts/3161419/media/e8219ee2f3465d6834984f9ae607a81e.m3u8\",\n \"duration\": 2685,\n \"base64_file\": null,\n \"variant\": \"article\"\n },\n {\n \"id\": 12192811,\n \"content_type\": \"audio/mpeg\",\n \"url\": \"https://beyondwords-cdn-b7fyckdeejejb6dj.a03.azurefd.net/audio/projects/9969/podcasts/3161419/media/fd7108e13a7c7fee6820a1b07bb676e0_compiled.mp3\",\n \"duration\": 2712,\n \"base64_file\": null,\n \"variant\": \"article\"\n }\n ],\n \"video\": [],\n \"ads_enabled\": true,\n \"is_copy\": false,\n \"title_voice_id\": 2517,\n \"summary_voice_id\": 2517,\n \"body_voice_id\": 2517,\n \"title_enabled\": true,\n \"body_enabled\": true,\n \"summary_enabled\": true,\n \"summary_title_enabled\": false,\n \"summarization\": {\n \"audio\": [],\n \"video\": []\n },\n \"background_track\": null,\n \"language\": \"{{body 'language' 'en_US'}}\",\n \"preview_token\": \"d9ce36ea-ddc4-4611-b60c-4f90ed0fc082\",\n \"status\": \"processed\",\n \"metadata\": {\n \"categories\": [\n \"News\", \n \"Audio\"\n ]\n },\n \"created\": \"2022-01-02T23:59:59Z\",\n \"updated\": \"2022-03-04T00:00:00Z\",\n \"published\": true,\n \"publish_date\": \"2099-12-31T23:59:59Z\",\n \"auto_segment_updates_enabled\": false,\n \"ai_summary_updates_enabled\": true,\n \"summary\": \"{{body 'summary' 'Summary'}}\",\n \"body\": \"

Test.

\",\n \"summarization_settings\": null,\n \"video_settings\": null\n}", + "body": "{\n \"id\": \"9279c9e0-e0b5-4789-9040-f44478ed3e9e\",\n \"title\": \"{{body 'title' 'Title'}}\",\n \"type\": \"auto_segment\",\n \"source_id\": \"{{body 'source_id' '90e4cbff-6382-4a88-adc5-1eb3ffa16c6d'}}\",\n \"source_url\": \"{{body 'source_url' 'https://example.com'}}\",\n \"author\": \"{{body 'author' 'Jane Smith'}}\",\n \"image_url\": \"{{body 'image' 'https://example.com/image.jpg'}}\",\n \"audio\": [\n {\n \"id\": 12192819,\n \"content_type\": \"application/x-mpegURL\",\n \"url\": \"https://beyondwords-cdn-b7fyckdeejejb6dj.a03.azurefd.net/audio/projects/9969/podcasts/3161419/media/e8219ee2f3465d6834984f9ae607a81e.m3u8\",\n \"duration\": 2685,\n \"base64_file\": null,\n \"variant\": \"article\"\n },\n {\n \"id\": 12192811,\n \"content_type\": \"audio/mpeg\",\n \"url\": \"https://beyondwords-cdn-b7fyckdeejejb6dj.a03.azurefd.net/audio/projects/9969/podcasts/3161419/media/fd7108e13a7c7fee6820a1b07bb676e0_compiled.mp3\",\n \"duration\": 2712,\n \"base64_file\": null,\n \"variant\": \"article\"\n }\n ],\n \"video\": [],\n \"ads_enabled\": true,\n \"is_copy\": false,\n \"title_voice_id\": 2517,\n \"summary_voice_id\": 2517,\n \"body_voice_id\": 2517,\n \"title_enabled\": true,\n \"body_enabled\": true,\n \"summary_enabled\": true,\n \"summary_title_enabled\": false,\n \"summarization\": {\n \"audio\": [],\n \"video\": []\n },\n \"background_track\": null,\n \"language\": \"{{body 'language' 'en_US'}}\",\n \"preview_token\": \"d9ce36ea-ddc4-4611-b60c-4f90ed0fc082\",\n \"status\": \"processed\",\n \"metadata\": {\n \"categories\": [\n \"News\", \n \"Audio\"\n ]\n },\n \"created\": \"2022-01-02T23:59:59Z\",\n \"updated\": \"2022-03-04T00:00:00Z\",\n \"published\": true,\n \"publish_date\": \"2099-12-31T23:59:59Z\",\n \"auto_segment_updates_enabled\": true,\n \"ai_summary_updates_enabled\": true,\n \"summary\": \"{{body 'summary' 'Summary'}}\",\n \"body\": \"

Test.

\",\n \"summarization_settings\": null,\n \"video_settings\": null\n}", "latency": 0, "statusCode": 200, "label": "OK", @@ -414,7 +407,7 @@ }, { "uuid": "52762211-f2da-4e53-a68f-74883e69e862", - "body": "{\n \"id\": \"9279c9e0-e0b5-4789-9040-f44478ed3e9e\",\n \"title\": \"{{body 'title' 'Title'}}\",\n \"type\": \"auto_segment\",\n \"source_id\": \"{{body 'source_id' '90e4cbff-6382-4a88-adc5-1eb3ffa16c6d'}}\",\n \"source_url\": \"{{body 'source_url' 'https://example.com'}}\",\n \"author\": \"{{body 'author' 'Jane Smith'}}\",\n \"image_url\": \"{{body 'image' 'https://example.com/image.jpg'}}\",\n \"audio\": [\n {\n \"id\": 12192819,\n \"content_type\": \"application/x-mpegURL\",\n \"url\": \"https://beyondwords-cdn-b7fyckdeejejb6dj.a03.azurefd.net/audio/projects/9969/podcasts/3161419/media/e8219ee2f3465d6834984f9ae607a81e.m3u8\",\n \"duration\": 2685,\n \"base64_file\": null,\n \"variant\": \"article\"\n },\n {\n \"id\": 12192811,\n \"content_type\": \"audio/mpeg\",\n \"url\": \"https://beyondwords-cdn-b7fyckdeejejb6dj.a03.azurefd.net/audio/projects/9969/podcasts/3161419/media/fd7108e13a7c7fee6820a1b07bb676e0_compiled.mp3\",\n \"duration\": 2712,\n \"base64_file\": null,\n \"variant\": \"article\"\n }\n ],\n \"video\": [],\n \"ads_enabled\": true,\n \"is_copy\": false,\n \"title_voice_id\": 2517,\n \"summary_voice_id\": 2517,\n \"body_voice_id\": 2517,\n \"title_enabled\": true,\n \"body_enabled\": true,\n \"summary_enabled\": true,\n \"summary_title_enabled\": false,\n \"summarization\": {\n \"audio\": [],\n \"video\": []\n },\n \"background_track\": null,\n \"language\": \"{{body 'language' 'en_US'}}\",\n \"preview_token\": \"d9ce36ea-ddc4-4611-b60c-4f90ed0fc082\",\n \"status\": \"processed\",\n \"metadata\": {\n \"categories\": [\n \"News\", \n \"Audio\"\n ]\n },\n \"created\": \"2022-01-02T23:59:59Z\",\n \"updated\": \"2022-03-04T00:00:00Z\",\n \"published\": true,\n \"publish_date\": \"2099-12-31T23:59:59Z\",\n \"auto_segment_updates_enabled\": false,\n \"ai_summary_updates_enabled\": true,\n \"summary\": \"{{body 'summary' 'Summary'}}\",\n \"body\": \"

Test.

\",\n \"summarization_settings\": null,\n \"video_settings\": null\n}", + "body": "{\n \"id\": \"9279c9e0-e0b5-4789-9040-f44478ed3e9e\",\n \"title\": \"{{body 'title' 'Title'}}\",\n \"type\": \"auto_segment\",\n \"source_id\": \"{{body 'source_id' '90e4cbff-6382-4a88-adc5-1eb3ffa16c6d'}}\",\n \"source_url\": \"{{body 'source_url' 'https://example.com'}}\",\n \"author\": \"{{body 'author' 'Jane Smith'}}\",\n \"image_url\": \"{{body 'image' 'https://example.com/image.jpg'}}\",\n \"audio\": [\n {\n \"id\": 12192819,\n \"content_type\": \"application/x-mpegURL\",\n \"url\": \"https://beyondwords-cdn-b7fyckdeejejb6dj.a03.azurefd.net/audio/projects/9969/podcasts/3161419/media/e8219ee2f3465d6834984f9ae607a81e.m3u8\",\n \"duration\": 2685,\n \"base64_file\": null,\n \"variant\": \"article\"\n },\n {\n \"id\": 12192811,\n \"content_type\": \"audio/mpeg\",\n \"url\": \"https://beyondwords-cdn-b7fyckdeejejb6dj.a03.azurefd.net/audio/projects/9969/podcasts/3161419/media/fd7108e13a7c7fee6820a1b07bb676e0_compiled.mp3\",\n \"duration\": 2712,\n \"base64_file\": null,\n \"variant\": \"article\"\n }\n ],\n \"video\": [],\n \"ads_enabled\": true,\n \"is_copy\": false,\n \"title_voice_id\": 2517,\n \"summary_voice_id\": 2517,\n \"body_voice_id\": 2517,\n \"title_enabled\": true,\n \"body_enabled\": true,\n \"summary_enabled\": true,\n \"summary_title_enabled\": false,\n \"summarization\": {\n \"audio\": [],\n \"video\": []\n },\n \"background_track\": null,\n \"language\": \"{{body 'language' 'en_US'}}\",\n \"preview_token\": \"d9ce36ea-ddc4-4611-b60c-4f90ed0fc082\",\n \"status\": \"processed\",\n \"metadata\": {\n \"categories\": [\n \"News\", \n \"Audio\"\n ]\n },\n \"created\": \"2022-01-02T23:59:59Z\",\n \"updated\": \"2022-03-04T00:00:00Z\",\n \"published\": true,\n \"publish_date\": \"2099-12-31T23:59:59Z\",\n \"auto_segment_updates_enabled\": true,\n \"ai_summary_updates_enabled\": true,\n \"summary\": \"{{body 'summary' 'Summary'}}\",\n \"body\": \"

Test.

\",\n \"summarization_settings\": null,\n \"video_settings\": null\n}", "latency": 0, "statusCode": 200, "label": "OK", @@ -720,13 +713,6 @@ "filePath": "", "sendFileAsBody": false, "rules": [ - { - "target": "header", - "modifier": "Content-Type", - "value": "application/json", - "operator": "equals", - "invert": false - }, { "target": "header", "modifier": "X-Api-Key", @@ -962,13 +948,6 @@ "filePath": "", "sendFileAsBody": false, "rules": [ - { - "target": "header", - "modifier": "Content-Type", - "value": "application/json", - "operator": "equals", - "invert": false - }, { "target": "header", "modifier": "X-Api-Key", diff --git a/doc/wp-config.md b/doc/wp-config.md index 67733a3c..f7ae08f4 100644 --- a/doc/wp-config.md +++ b/doc/wp-config.md @@ -20,13 +20,3 @@ Defaults to `true`. ```php define('BEYONDWORDS_AUTOREGENERATE', false); ``` - -## BEYONDWORDS_PLAYER_INLINE_SCRIPT_TAG - -Use the recommended BeyondWords inline player script. -Defaults to `false`. -From plugin version `6.0` this will default to `true`. - -```php -define('BEYONDWORDS_PLAYER_INLINE_SCRIPT_TAG', true); -``` diff --git a/package.json b/package.json index 41359825..9dda72ce 100644 --- a/package.json +++ b/package.json @@ -17,7 +17,7 @@ "@wordpress/eslint-plugin": "^22.5.1", "@wordpress/scripts": "^30.12.1", "badge-maker": "^4.1.0", - "cypress": "14.3.3", + "cypress": "15.1.0", "cypress-fail-fast": "^7.1.1", "cypress-map": "^1.45.0", "cypress-multi-reporters": "^2.0.5", diff --git a/readme.txt b/readme.txt index a842ab65..87ec9dfd 100755 --- a/readme.txt +++ b/readme.txt @@ -86,7 +86,11 @@ Release date: TBC **Enhancements and Features:** -* Make PHP methods static. +* [#449](https://github.com/beyondwords-io/wordpress-plugin/pull/449) Magic Embed for WordPress. + * An **Integration method** plugin setting has been added in the *Content* tab. + * The default is **REST API**. This method will continue to send post content and metadata to BeyondWords using REST API calls. + * If **Magic Embed** is selected then [Client-Side Integration](https://github.com/beyondwords-io/player/blob/main/doc/client-side-integration.md) will be enabed for new posts. With this method BeyondWords handles the extraction and delivery of audio content using the rendered HTML for the post. +* [#447](https://github.com/beyondwords-io/wordpress-plugin/pull/447) Make PHP methods static. = 5.5.0 = diff --git a/src/Compatibility/WPGraphQL/WPGraphQL.php b/src/Compatibility/WPGraphQL/WPGraphQL.php index e13bbff9..1d67fae0 100644 --- a/src/Compatibility/WPGraphQL/WPGraphQL.php +++ b/src/Compatibility/WPGraphQL/WPGraphQL.php @@ -34,13 +34,17 @@ public static function init() * @since 3.6.0 * @since 4.0.0 Register contentId field, and contentId/podcastId are now String, not Int * @since 4.7.0 Moved graphqlRegisterTypes() from Beyondwords\Wordpress\Core to here. - * @since 6.0.0 Make static. + * @since 6.0.0 Make static, add sourceId field. */ public static function graphqlRegisterTypes() { register_graphql_object_type('Beyondwords', [ 'description' => __('BeyondWords audio details. Use this data to embed an audio player using the BeyondWords JavaScript SDK.', 'speechkit'), // phpcs:ignore Generic.Files.LineLength.TooLong 'fields' => [ + 'sourceId' => [ + 'description' => __('BeyondWords source ID', 'speechkit'), + 'type' => 'String' + ], 'projectId' => [ 'description' => __('BeyondWords project ID', 'speechkit'), 'type' => 'Int' @@ -70,22 +74,24 @@ public static function graphqlRegisterTypes() 'type' => 'Beyondwords', 'description' => __('BeyondWords audio details', 'speechkit'), 'resolve' => function (WPGraphQLPlugin\Model\Post $post) { - $beyondwords = []; + $fields = [ + 'sourceId' => (string) $post->ID, + ]; - $contentId = PostMetaUtils::getContentId($post->ID); + $projectId = PostMetaUtils::getProjectId($post->ID); - if (! empty($contentId)) { - $beyondwords['contentId'] = $contentId; - $beyondwords['podcastId'] = $contentId; // legacy + if (! empty($projectId)) { + $fields['projectId'] = $projectId; } - $projectId = PostMetaUtils::getProjectId($post->ID); + $contentId = PostMetaUtils::getContentId($post->ID); - if (! empty($projectId)) { - $beyondwords['projectId'] = $projectId; + if (! empty($contentId)) { + $fields['contentId'] = $contentId; + $fields['podcastId'] = $contentId; // legacy } - return ! empty($beyondwords) ? $beyondwords : null; + return $fields; } ]); } diff --git a/src/Component/Post/BlockAttributes/BlockAttributes.php b/src/Component/Post/BlockAttributes/BlockAttributes.php index aa2bc699..7f8b9a5d 100644 --- a/src/Component/Post/BlockAttributes/BlockAttributes.php +++ b/src/Component/Post/BlockAttributes/BlockAttributes.php @@ -90,7 +90,7 @@ public static function registerMarkerAttribute($args) * * @since 4.0.0 * @since 4.2.2 Rename method to renderBlock. - * @since 6.0.0 Make static. + * @since 6.0.0 Make static and update for Magic Embed. * * @param string $blockContent The block content (HTML). * @param string $block The full block, including name and attributes. @@ -100,12 +100,12 @@ public static function registerMarkerAttribute($args) public static function renderBlock($blockContent, $block) { // Skip adding marker if player UI is disabled - if (get_option('beyondwords_player_ui', PlayerUI::ENABLED) === PlayerUI::DISABLED) { + if (get_option(PlayerUI::OPTION_NAME) === PlayerUI::DISABLED) { return $blockContent; } - // Skip adding marker if no content ID exists - if (! PostMetaUtils::getContentId(get_the_ID())) { + // Skip adding marker if no content exists + if (! PostMetaUtils::hasContent(get_the_ID())) { return $blockContent; } diff --git a/src/Component/Post/DisplayPlayer/DisplayPlayer.php b/src/Component/Post/DisplayPlayer/DisplayPlayer.php index e223f627..61f7119c 100644 --- a/src/Component/Post/DisplayPlayer/DisplayPlayer.php +++ b/src/Component/Post/DisplayPlayer/DisplayPlayer.php @@ -79,7 +79,7 @@ public static function save($postId) * * @since 6.0.0 Make static. * - * @param WP_Post $post The post object. + * @param \WP_Post $post The post object. */ public static function element($post) { diff --git a/src/Component/Post/GenerateAudio/GenerateAudio.php b/src/Component/Post/GenerateAudio/GenerateAudio.php index 93ccd5ce..dee180a2 100644 --- a/src/Component/Post/GenerateAudio/GenerateAudio.php +++ b/src/Component/Post/GenerateAudio/GenerateAudio.php @@ -44,6 +44,8 @@ public static function init() /** * Check whether the post type should preselect the "Generate audio" checkbox. * + * @param \WP_Post|int $post The post object or ID. + * * @todo move this function to somewhere reusable for the Block editor. * * @since 6.0.0 Make static. @@ -73,22 +75,13 @@ public static function shouldPreselectGenerateAudio($post) /** * Render the element. * - * @since 6.0.0 Make static. + * @since 6.0.0 Make static and refactor generate audio check. */ public static function element($post) { wp_nonce_field('beyondwords_generate_audio', 'beyondwords_generate_audio_nonce'); $generateAudio = PostMetaUtils::hasGenerateAudio($post->ID); - - if (! $generateAudio) { - // Check whether "0" has explicitly been saved - $generateAudioMeta = PostMetaUtils::getRenamedPostMeta($post->ID, 'generate_audio', true); - - if ($generateAudioMeta !== '0' && self::shouldPreselectGenerateAudio($post)) { - $generateAudio = true; - } - } ?>

diff --git a/src/Component/Post/GenerateAudio/index.js b/src/Component/Post/GenerateAudio/index.js index e06fed73..f98ceada 100644 --- a/src/Component/Post/GenerateAudio/index.js +++ b/src/Component/Post/GenerateAudio/index.js @@ -73,17 +73,13 @@ export default compose( [ beyondwords_generate_audio, /* eslint-disable-next-line camelcase */ speechkit_generate_audio, - /* eslint-disable-next-line camelcase */ - publish_post_to_speechkit, } = getCurrentPostAttribute( 'meta' ); if ( /* eslint-disable-next-line camelcase */ beyondwords_generate_audio === '1' || /* eslint-disable-next-line camelcase */ - speechkit_generate_audio === '1' || - /* eslint-disable-next-line camelcase */ - publish_post_to_speechkit === '1' + speechkit_generate_audio === '1' ) { return true; } @@ -92,9 +88,7 @@ export default compose( [ /* eslint-disable-next-line camelcase */ beyondwords_generate_audio === '0' || /* eslint-disable-next-line camelcase */ - speechkit_generate_audio === '0' || - /* eslint-disable-next-line camelcase */ - publish_post_to_speechkit === '0' + speechkit_generate_audio === '0' ) { return false; } diff --git a/src/Component/Post/Metabox/Metabox.php b/src/Component/Post/Metabox/Metabox.php index b68ce753..ef43c7c3 100644 --- a/src/Component/Post/Metabox/Metabox.php +++ b/src/Component/Post/Metabox/Metabox.php @@ -96,7 +96,7 @@ public static function addMetaBox($postType) * @since 3.7.0 Show "Pending review" notice for posts with status of "pending" * @since 4.0.0 Content ID is no longer an int * @since 4.1.0 Add "Player style" and update component display conditions - * @since 6.0.0 Make static. + * @since 6.0.0 Make static and add Magic Embed support. */ public static function renderMetaBoxContent($post) { @@ -109,9 +109,9 @@ public static function renderMetaBoxContent($post) // Show errors for posts with/without audio self::errors($post); - $contentId = PostMetaUtils::getContentId($post->ID); + $hasContent = PostMetaUtils::hasContent($post->ID); - if ($contentId) { + if ($hasContent) { // Enable these components for posts with audio if (get_post_status($post) === 'pending') { self::pendingReviewNotice($post); @@ -181,7 +181,7 @@ public static function pendingReviewNotice($post) * * @since 3.x Introduced * @since 4.0.1 Admin player init is now all in this one function. - * @since 6.0.0 Make static. + * @since 6.0.0 Make static and add Magic Embed support. */ public static function playerEmbed($post = null) { @@ -191,21 +191,28 @@ public static function playerEmbed($post = null) return; } - $projectId = PostMetaUtils::getProjectId($post->ID); - $contentId = PostMetaUtils::getContentId($post->ID); - $previewToken = PostMetaUtils::getPreviewToken($post->ID); + $projectId = PostMetaUtils::getProjectId($post->ID); + $hasContent = PostMetaUtils::hasContent($post->ID); - if (! $projectId || ! $contentId) { + if (! $projectId || ! $hasContent) { return; } + $contentId = PostMetaUtils::getContentId($post->ID); + $previewToken = PostMetaUtils::getPreviewToken($post->ID); + + // phpcs:disable WordPress.WP.EnqueuedResources.NonEnqueuedScript ?> - ID); - $contentId = PostMetaUtils::getContentId($post->ID); - - $params = [ - 'projectId' => is_numeric($projectId) ? (int)$projectId : $projectId, - 'contentId' => is_numeric($contentId) ? (int)$contentId : $contentId, - ]; - - // Set initial SDK params from plugin settings - $params = self::addPluginSettingsToSdkParams($params); - - // Player UI - $playerUI = get_option('beyondwords_player_ui', PlayerUI::ENABLED); - if ($playerUI === PlayerUI::HEADLESS) { - $params['showUserInterface'] = false; - } - - // Player Style - // @todo overwrite global styles with post settings - $playerStyle = PostMetaUtils::getPlayerStyle($post->ID); - if (!empty($playerStyle)) { - $params['playerStyle'] = $playerStyle; - } - - // Player Content - $playerContent = get_post_meta($post->ID, 'beyondwords_player_content', true); - if (!empty($playerContent)) { - $params['loadContentAs'] = [ $playerContent ]; - } - - /** - * Filters the BeyondWords JavaScript SDK parameters. - * - * @since 4.0.0 - * - * @param array $params The default JS SDK params. - * @param int $postId The Post ID. - */ - $params = apply_filters('beyondwords_player_sdk_params', $params, $post->ID); - - // Cast assoc array to object - return (object)$params; - } - - /** - * Add plugin settings to SDK params. - * - * @since 5.0.0 - * @since 6.0.0 Make static. - * - * @param array $params BeyondWords Player SDK params. - * - * @return array Modified SDK params. - */ - public static function addPluginSettingsToSdkParams($params) - { - $mapping = [ - 'beyondwords_player_style' => 'playerStyle', - 'beyondwords_player_call_to_action' => 'callToAction', - 'beyondwords_player_highlight_sections' => 'highlightSections', - 'beyondwords_player_widget_style' => 'widgetStyle', - 'beyondwords_player_widget_position' => 'widgetPosition', - 'beyondwords_player_skip_button_style' => 'skipButtonStyle', - ]; - - foreach ($mapping as $wpOption => $sdkParam) { - $val = get_option($wpOption); - if (!empty($val)) { - $params[$sdkParam] = $val; - } - } - - // Special case for clickableSections - $val = get_option('beyondwords_player_clickable_sections'); - if (!empty($val)) { - $params['clickableSections'] = 'body'; - } - - return $params; - } - - /** - * Use Player JS SDK? - * - * @since 3.0.7 - * @since 6.0.0 Make static. - * - * @return string - */ - public static function usePlayerJsSdk() - { - // AMP requests don't use the Player JS SDK - if (self::useAmpPlayer()) { - return false; - } - - // Both Gutenberg/Classic editors have their own player scripts - if (CoreUtils::isGutenbergPage() || CoreUtils::isEditScreen()) { - return false; - } - - // Disable audio player in Preview, because we have not sent updates to BeyondWords API yet - if (function_exists('is_preview') && is_preview()) { - return false; - } - - $post = get_post(); - - if (! $post) { - return false; - } - - $projectId = PostMetaUtils::getProjectId($post->ID); - if (! $projectId) { - return false; - } - - $contentId = PostMetaUtils::getContentId($post->ID); - if (! $contentId) { - return false; - } - - return true; - } -} \ No newline at end of file +} diff --git a/src/Core/Player/PlayerInline.php b/src/Core/Player/PlayerInline.php deleted file mode 100644 index a7a7cfd3..00000000 --- a/src/Core/Player/PlayerInline.php +++ /dev/null @@ -1,537 +0,0 @@ -ID); - - if (! $projectId) { - return ''; - } - - $contentId = PostMetaUtils::getContentId($post->ID); - - if (! $contentId) { - return ''; - } - - // AMP or JS Player? - if (self::useAmpPlayer()) { - $html = self::ampPlayerHtml($post->ID, $projectId, $contentId); - } else { - $html = self::jsPlayerHtml($post->ID, $projectId, $contentId); - } - - /** - * Filters the HTML of the BeyondWords Player. - * - * @since 4.0.0 - * @since 4.3.0 Applied to both AMP and no-AMP content. - * - * @param string $html The HTML for the JS audio player. The audio player JavaScript may - * fail to locate the target element if you remove or replace the - * default contents of this parameter. - * @param int $postId WordPress post ID. - * @param int $projectId BeyondWords project ID. - * @param int $contentId BeyondWords content ID. - */ - $html = apply_filters('beyondwords_player_html', $html, $post->ID, $projectId, $contentId); - - return $html; - } - - /** - * Has custom player? - * - * Checks the post content to see whether a custom player has been added. - * - * @since 3.2.0 - * @since 4.2.0 Pass $content as a parameter, check for [beyondwords_player] shortcode - * @since 4.2.4 Check $content is a string - * @since 6.0.0 Make static. - * - * @param string $content WordPress content. - * - * @return boolean - */ - public static function hasCustomPlayer($content) - { - if (! is_string($content)) { - return false; - } - - if (strpos($content, '[beyondwords_player]') !== false) { - return true; - } - - $crawler = new Crawler($content); - - return count($crawler->filterXPath('//div[@data-beyondwords-player="true"]')) > 0; - } - - /** - * JS Player HTML. - * - * Displays the HTML required for the JS player. - * - * @SuppressWarnings(PHPMD.UnusedFormalParameter) - * - * @param int $postId WordPress Post ID. - * @param int $projectId BeyondWords Project ID. - * @param int $contentId BeyondWords Content ID. - * - * @since 3.0.0 - * @since 3.1.0 Added speechkit_js_player_html filter - * @since 4.2.0 Remove hasCustomPlayer() check from here. - * @since 5.2.0 Replace div[data-beyondwords-player] with script[onload] - * @since 5.3.0 Use new jsPlayerParams() object return. - * @since 6.0.0 Make static. - * - * @return string - */ - public static function jsPlayerHtml($postId, $projectId, $contentId) - { - if (! self::usePlayerJsSdk()) { - return ''; - } - - $post = get_post($postId); - $params = self::jsPlayerParams($post); - - $playerUI = get_option('beyondwords_player_ui', PlayerUI::ENABLED); - - $params->projectId = $projectId; - $params->contentId = $contentId; - - $jsonParams = wp_json_encode($params, JSON_UNESCAPED_SLASHES); - - // Headless instantiates a player without a target - if ($playerUI !== PlayerUI::HEADLESS) { - $jsonParams = sprintf('{...%s, target:this}', $jsonParams); - } - - $onload = sprintf('new BeyondWords.Player(%s);', $jsonParams); - - /** - * Filters the onload attribute of the BeyondWords Player script. - * - * Note that to support multiple players on one page, the - * default script uses `document.querySelectorAll() to target all - * instances of `div[data-beyondwords-player]` in the HTML source. - * If this approach is removed then multiple occurrences of the - * BeyondWords player in one page may not work as expected. - * - * @link https://github.com/beyondwords-io/player/blob/main/doc/getting-started.md#how-to-configure-it - * - * @since 4.0.0 - * - * @param string $script The string value of the onload script. - * @param array $params The SDK params for the current post, including - * `projectId` and `contentId`. - */ - $onload = apply_filters('beyondwords_player_script_onload', $onload, $params); - - $html = sprintf( - // phpcs:ignore WordPress.WP.EnqueuedResources.NonEnqueuedScript - '', - Environment::getJsSdkUrl(), - $onload - ); - - return $html; - } - - /** - * AMP Player HTML. - * - * Displays the HTML required for the AMP player. - * - * @param int $postId WordPress Post ID. - * @param int $projectId BeyondWords Project ID. - * @param int $contentId BeyondWords Content ID. - * - * @since 3.0.0 - * @since 3.1.0 Added speechkit_amp_player_html filter - * @since 6.0.0 Make static. - * - * @return string - */ - public static function ampPlayerHtml($postId, $projectId, $contentId) - { - $src = sprintf(Environment::getAmpPlayerUrl(), $projectId, $contentId); - - // Turn on output buffering - ob_start(); - - ?> - - - - ID)) { - $enabled = false; - } - - // Is the player ui enabled in plugin settings? - if ($enabled) { - $enabled = get_option('beyondwords_player_ui', PlayerUI::ENABLED) === PlayerUI::ENABLED; - } - - return $enabled; - } - - /** - * Use the AMP player? - * - * There are multiple AMP plugins for WordPress, so multiple checks are performed. - * - * @since 3.0.7 - * @since 6.0.0 Make static. - * @since 6.0.0 Make static. - * - * @return bool - */ - public static function useAmpPlayer() - { - // https://amp-wp.org/reference/function/amp_is_request/ - if (function_exists('amp_is_request')) { - return \amp_is_request(); - } - - // https://ampforwp.com/tutorials/article/detect-amp-page-function/ - if (function_exists('ampforwp_is_amp_endpoint')) { - return \ampforwp_is_amp_endpoint(); - } - - // https://amp-wp.org/reference/function/is_amp_endpoint/ - if (function_exists('is_amp_endpoint')) { - return \is_amp_endpoint(); - } - - return false; - } - - /** - * Use Player JS SDK? - * - * @since 3.0.7 - * @since 6.0.0 Make static. - * - * @return string - */ - public static function usePlayerJsSdk() - { - // AMP requests don't use the Player JS SDK - if (self::useAmpPlayer()) { - return false; - } - - // Both Gutenberg/Classic editors have their own player scripts - if (CoreUtils::isGutenbergPage() || CoreUtils::isEditScreen()) { - return false; - } - - // Disable audio player in Preview, because we have not sent updates to BeyondWords API yet - if (function_exists('is_preview') && is_preview()) { - return false; - } - - $post = get_post(); - - if (! $post) { - return false; - } - - $projectId = PostMetaUtils::getProjectId($post->ID); - $contentId = PostMetaUtils::getContentId($post->ID); - - if ($projectId && $contentId) { - return true; - } - - return false; - } - - /** - * JavaScript SDK parameters. - * - * @since 3.1.0 - * @since 4.0.0 Use new JS SDK params format. - * @since 5.3.0 Prioritise post-specific player settings, falling-back to the - * values of the "Player" tab in the plugin settings. - * @since 5.3.0 Support loadContentAs param and return an object. - * @since 6.0.0 Make static. - * - * @param WP_Post $post WordPress Post. - * - * @return object - */ - public static function jsPlayerParams($post) - { - if (!($post instanceof \WP_Post)) { - return []; - } - - $projectId = PostMetaUtils::getProjectId($post->ID); - $contentId = PostMetaUtils::getContentId($post->ID); - - $params = [ - 'projectId' => is_numeric($projectId) ? (int)$projectId : $projectId, - 'contentId' => is_numeric($contentId) ? (int)$contentId : $contentId, - ]; - - // Set initial SDK params from plugin settings - $params = self::addPluginSettingsToSdkParams($params); - - // Player UI - $playerUI = get_option('beyondwords_player_ui', PlayerUI::ENABLED); - if ($playerUI === PlayerUI::HEADLESS) { - $params['showUserInterface'] = false; - } - - // Player Style - // @todo overwrite global styles with post settings - $playerStyle = PostMetaUtils::getPlayerStyle($post->ID); - if (!empty($playerStyle)) { - $params['playerStyle'] = $playerStyle; - } - - // Player content - $playerContent = get_post_meta($post->ID, 'beyondwords_player_content', true); - if (!empty($playerContent)) { - $params['loadContentAs'] = [ $playerContent ]; - } - - /** - * Filters the BeyondWords JavaScript SDK parameters. - * - * @since 4.0.0 - * - * @param array $params The default JS SDK params. - * @param int $postId The Post ID. - */ - $params = apply_filters('beyondwords_player_sdk_params', $params, $post->ID); - - // Cast assoc array to object - return (object)$params; - } - - /** - * Add plugin settings to SDK params. - * - * @since 5.0.0 - * @since 6.0.0 Make static. - * - * @param array $params BeyondWords Player SDK params. - * - * @return array Modified SDK params. - */ - public static function addPluginSettingsToSdkParams($params) - { - $mapping = [ - 'beyondwords_player_style' => 'playerStyle', - 'beyondwords_player_call_to_action' => 'callToAction', - 'beyondwords_player_highlight_sections' => 'highlightSections', - 'beyondwords_player_widget_style' => 'widgetStyle', - 'beyondwords_player_widget_position' => 'widgetPosition', - 'beyondwords_player_skip_button_style' => 'skipButtonStyle', - ]; - - foreach ($mapping as $wpOption => $sdkParam) { - $val = get_option($wpOption); - if (!empty($val)) { - $params[$sdkParam] = $val; - } - } - - // Special case for clickableSections - $val = get_option('beyondwords_player_clickable_sections'); - if (!empty($val)) { - $params['clickableSections'] = 'body'; - } - - return $params; - } -} diff --git a/src/Core/Player/Renderer/Amp.php b/src/Core/Player/Renderer/Amp.php new file mode 100644 index 00000000..ee5c9616 --- /dev/null +++ b/src/Core/Player/Renderer/Amp.php @@ -0,0 +1,93 @@ +ID); + + if (! $hasProjectId) { + return false; + } + + $integrationMethod = get_post_meta($post->ID, 'beyondwords_integration_method', true); + + if ($integrationMethod === IntegrationMethod::CLIENT_SIDE) { + return true; + } + + $hasContentId = (bool) PostMetaUtils::getContentId($post->ID, true); + + return $hasContentId; + } + + /** + * Render AMP player HTML. + * + * @param \WP_Post $post + * + * @return string HTML markup for AMP player. + */ + public static function render(\WP_Post $post): string + { + $projectId = PostMetaUtils::getProjectId($post->ID); + $contentId = PostMetaUtils::getContentId($post->ID, true); // Fallback to Post ID if Content ID is not set + + $src = sprintf(Environment::getAmpPlayerUrl(), $projectId, $contentId); + + ob_start(); + ?> + + + + ID, $projectId, $contentId); + } +} \ No newline at end of file diff --git a/src/Core/Player/Renderer/Javascript.php b/src/Core/Player/Renderer/Javascript.php new file mode 100644 index 00000000..8bf78ba7 --- /dev/null +++ b/src/Core/Player/Renderer/Javascript.php @@ -0,0 +1,76 @@ +ID); + + if (! $projectId) { + return false; + } + + $contentId = PostMetaUtils::getContentId($post->ID); + $method = IntegrationMethod::getIntegrationMethod($post); + + return $method === IntegrationMethod::CLIENT_SIDE || + ($method === IntegrationMethod::REST_API && $contentId); + } + + /** + * Render the JavaScript player HTML. + * + * @param \WP_Post $post + * @return string HTML output. + */ + public static function render($post): string + { + if (PlayerUI::DISABLED === get_option(PlayerUI::OPTION_NAME)) { + return ''; + } + + $params = ConfigBuilder::build($post); + + $jsonParams = wp_json_encode($params, JSON_UNESCAPED_SLASHES); + $jsonParams = sprintf('{target:this, ...%s}', $jsonParams); + + $onload = sprintf('new BeyondWords.Player(%s);', $jsonParams); + $onload = apply_filters('beyondwords_player_script_onload', $onload, $params); + + return sprintf( + // phpcs:ignore WordPress.WP.EnqueuedResources.NonEnqueuedScript + '', + Environment::getJsSdkUrl(), + $onload + ); + } +} diff --git a/src/Core/Request.php b/src/Core/Request.php index 25b1ac43..0fa7f21a 100644 --- a/src/Core/Request.php +++ b/src/Core/Request.php @@ -7,106 +7,158 @@ class Request { public const AUTH_HEADER_NAME = 'X-Api-Key'; + public const CONTENT_TYPE_HEADER_NAME = 'Content-Type'; + public const CONTENT_TYPE_HEADER_VALUE = 'application/json'; - private $method; - private $url; - private $body; - private $headers; + private string $method = ''; + + private string $url = ''; + + private string $body = ''; + + private array $headers = []; /** + * Request constructor. + * * @param string $method * @param string $url * @param mixed $body + * @param array $headers + * + * @return void */ - public function __construct($method, $url, $body = null, $headers = null) - { + public function __construct( + string $method, + string $url, + string $body = '', + array $headers = [] + ) { $this->setMethod($method); $this->setUrl($url); $this->setBody($body); - if ($headers === null) { - $headers = $this->getDefaultHeaders(); + // Add API key header to all requests. + $this->addHeaders([ + self::AUTH_HEADER_NAME => get_option('beyondwords_api_key'), + ]); + + // Add Content-Type header for non-GET requests. + if (in_array($method, ['POST', 'PUT', 'DELETE'])) { + // Default headers. + $this->addHeaders([ + self::CONTENT_TYPE_HEADER_NAME => self::CONTENT_TYPE_HEADER_VALUE, + ]); } - $this->setHeaders($headers); + // Add custom headers. + $this->addHeaders($headers); } /** - * @return mixed + * Get the HTTP method for the request. + * + * @return string */ - public function getMethod() + public function getMethod(): string { return $this->method; } /** - * @param mixed $method + * Set the HTTP method for the request. + * + * @param string $method + * + * @return void */ - public function setMethod($method) + public function setMethod(string $method): void { $this->method = strtoupper($method); } /** - * @return mixed + * Get the URL for the request. + * + * @return string */ - public function getUrl() + public function getUrl(): string { return $this->url; } /** - * @param mixed $url + * Set the URL for the request. + * + * @param string $url + * + * @return void */ - public function setUrl($url) + public function setUrl(string $url): void { $this->url = $url; } /** - * @return mixed + * Get the body for the request. + * + * @return string */ - public function getBody() + public function getBody(): string { return $this->body; } /** - * @param mixed $body + * Set the body for the request. + * + * @param string $body + * + * @return void */ - public function setBody($body) + public function setBody(string $body): void { $this->body = $body; } /** - * Get default headers (Authorization & Content-Type). + * Get the headers for the request. * - * @return mixed + * @return array */ - public function getDefaultHeaders() + public function getHeaders(): array { - return [ - self::AUTH_HEADER_NAME => get_option('beyondwords_api_key'), - self::CONTENT_TYPE_HEADER_NAME => self::CONTENT_TYPE_HEADER_VALUE, - ]; + return $this->headers; } /** - * @return mixed + * Set the headers to the request. + * + * @param array $headers + * + * @return void */ - public function getHeaders() + public function setHeaders(array $headers): void { - return $this->headers; + $this->headers = $headers; } /** - * @param mixed $headers + * Add extra headers to the request. + * + * @since 6.0.0 Introduced. + * + * @param array $headers + * + * @return void */ - public function setHeaders($headers) + public function addHeaders(array $headers): void { - $this->headers = $headers; + $this->setHeaders(array_merge( + (array) $this->getHeaders(), + $headers + )); } } diff --git a/src/Plugin.php b/src/Plugin.php index 7e87db05..bfe4c810 100644 --- a/src/Plugin.php +++ b/src/Plugin.php @@ -6,9 +6,7 @@ use Beyondwords\Wordpress\Compatibility\WPGraphQL\WPGraphQL; use Beyondwords\Wordpress\Core\Core; -use Beyondwords\Wordpress\Core\Environment; use Beyondwords\Wordpress\Core\Player\Player; -use Beyondwords\Wordpress\Core\Player\PlayerInline; use Beyondwords\Wordpress\Core\Updater; use Beyondwords\Wordpress\Component\Post\AddPlayer\AddPlayer; use Beyondwords\Wordpress\Component\Post\BlockAttributes\BlockAttributes; @@ -53,12 +51,8 @@ public static function init() // Site health SiteHealth::init(); - // Player (inline or not) - if (Environment::hasPlayerInlineScriptTag()) { - PlayerInline::init(); - } else { - Player::init(); - } + // Player + Player::init(); // Settings Settings::init(); diff --git a/tests/cypress/e2e/block-editor/add-post.cy.js b/tests/cypress/e2e/block-editor/add-post.cy.js index 13d2bded..c4d5d10b 100644 --- a/tests/cypress/e2e/block-editor/add-post.cy.js +++ b/tests/cypress/e2e/block-editor/add-post.cy.js @@ -17,21 +17,11 @@ context( 'Block Editor: Add Post', () => { .filter( ( x ) => x.supported ) .forEach( ( postType ) => { it( `can add a ${ postType.name } without audio`, () => { - cy.createPost( { + cy.publishPostWithoutAudio( { postType, title: `I can add a ${ postType.name } without audio`, } ); - cy.openBeyondwordsEditorPanel(); - - cy.uncheckGenerateAudio( postType ); - - cy.publishWithConfirmation(); - - cy.getLabel( 'Generate audio' ).should( 'exist' ); - - cy.hasPlayerInstances( 0 ); - // "View post" cy.viewPostViaSnackbar(); @@ -62,7 +52,7 @@ context( 'Block Editor: Add Post', () => { // "View post" cy.viewPostViaSnackbar(); - cy.getEnqueuedPlayerScriptTag().should( 'exist' ); + cy.getPlayerScriptTag().should( 'exist' ); cy.hasPlayerInstances( 1 ); cy.visit( @@ -93,7 +83,7 @@ context( 'Block Editor: Add Post', () => { cy.get( '.editor-post-publish-button__button' ).click(); - cy.hasPlayerInstances( 0 ); + cy.hasAdminPlayerInstances( 0 ); // "Generate Audio" is replaced by "Pending" message' cy.get( 'input#beyondwords_generate_audio' ).should( diff --git a/tests/cypress/e2e/block-editor/display-player.cy.js b/tests/cypress/e2e/block-editor/display-player.cy.js index 524bc557..1945f94b 100644 --- a/tests/cypress/e2e/block-editor/display-player.cy.js +++ b/tests/cypress/e2e/block-editor/display-player.cy.js @@ -32,7 +32,7 @@ context( 'Block Editor: Display Player', () => { // "View post" cy.viewPostViaSnackbar(); - cy.getEnqueuedPlayerScriptTag().should( 'exist' ); + cy.getPlayerScriptTag().should( 'exist' ); cy.hasPlayerInstances( 1 ); cy.visit( @@ -67,8 +67,6 @@ context( 'Block Editor: Display Player', () => { // "View post" cy.viewPostViaSnackbar(); - // @todo the script should not be enqueued if the player is not displayed - // cy.getEnqueuedPlayerScriptTag().should( 'not.exist' ) cy.hasPlayerInstances( 0 ); cy.visit( @@ -104,7 +102,7 @@ context( 'Block Editor: Display Player', () => { // "View post" cy.viewPostViaSnackbar(); - cy.getEnqueuedPlayerScriptTag().should( 'exist' ); + cy.getPlayerScriptTag().should( 'exist' ); cy.hasPlayerInstances( 1 ); } ); } ); diff --git a/tests/cypress/e2e/block-editor/insert-beyondwords-player.cy.js b/tests/cypress/e2e/block-editor/insert-beyondwords-player.cy.js index 0465a292..4dddc842 100644 --- a/tests/cypress/e2e/block-editor/insert-beyondwords-player.cy.js +++ b/tests/cypress/e2e/block-editor/insert-beyondwords-player.cy.js @@ -77,7 +77,7 @@ context( 'Block Editor: Insert BeyondWords Player', () => { // "View post" cy.viewPostViaSnackbar(); - cy.getEnqueuedPlayerScriptTag().should( 'exist' ); + cy.getPlayerScriptTag().should( 'exist' ); cy.hasPlayerInstances( 1 ); } ); @@ -117,7 +117,7 @@ context( 'Block Editor: Insert BeyondWords Player', () => { // "View post" cy.viewPostViaSnackbar(); - cy.getEnqueuedPlayerScriptTag().should( 'exist' ); + cy.getPlayerScriptTag().should( 'exist' ); cy.hasPlayerInstances( 1 ); } ); } ); diff --git a/tests/cypress/e2e/block-editor/player-content.cy.js b/tests/cypress/e2e/block-editor/player-content.cy.js index 275128db..2136c544 100644 --- a/tests/cypress/e2e/block-editor/player-content.cy.js +++ b/tests/cypress/e2e/block-editor/player-content.cy.js @@ -64,19 +64,9 @@ context( 'Block Editor: Player Content', () => { cy.viewPostViaSnackbar(); // Check Player appears frontend - cy.getEnqueuedPlayerScriptTag().should( 'exist' ); - cy.hasPlayerInstances( 1 ); - - // window.BeyondWords should contain 1 player instance - cy.window().then( ( win ) => { - // eslint-disable-next-line no-unused-expressions - expect( win.BeyondWords ).to.exist; - expect( win.BeyondWords.Player.instances() ).to.have.length( - 1 - ); - expect( - win.BeyondWords.Player.instances()[ 0 ].summary - ).to.eq( false ); + cy.getPlayerScriptTag().should( 'exist' ); + cy.hasPlayerInstances( 1, { + loadContentAs: undefined, } ); // Check Player content has also been saved in admin @@ -108,19 +98,9 @@ context( 'Block Editor: Player Content', () => { cy.viewPostViaSnackbar(); // Check Player appears frontend - cy.getEnqueuedPlayerScriptTag().should( 'exist' ); - cy.hasPlayerInstances( 1 ); - - // window.BeyondWords should contain 1 player instance - cy.window().then( ( win ) => { - // eslint-disable-next-line no-unused-expressions - expect( win.BeyondWords ).to.exist; - expect( win.BeyondWords.Player.instances() ).to.have.length( - 1 - ); - expect( - win.BeyondWords.Player.instances()[ 0 ].summary - ).to.eq( true ); + cy.getPlayerScriptTag().should( 'exist' ); + cy.hasPlayerInstances( 1, { + loadContentAs: [ 'summary' ], } ); // Check Player content has also been saved in admin diff --git a/tests/cypress/e2e/block-editor/player-style.cy.js b/tests/cypress/e2e/block-editor/player-style.cy.js index 9f6aebe0..a831cb40 100644 --- a/tests/cypress/e2e/block-editor/player-style.cy.js +++ b/tests/cypress/e2e/block-editor/player-style.cy.js @@ -111,19 +111,9 @@ context( 'Block Editor: Player Style', () => { cy.viewPostViaSnackbar(); // Check Player has video player in frontend - cy.getEnqueuedPlayerScriptTag().should( 'exist' ); - cy.hasPlayerInstances( 1 ); - - // window.BeyondWords should contain 1 player instance - cy.window().then( ( win ) => { - // eslint-disable-next-line no-unused-expressions - expect( win.BeyondWords ).to.exist; - expect( win.BeyondWords.Player.instances() ).to.have.length( - 1 - ); - expect( - win.BeyondWords.Player.instances()[ 0 ].playerStyle - ).to.eq( 'large' ); + cy.getPlayerScriptTag().should( 'exist' ); + cy.hasPlayerInstances( 1, { + playerStyle: 'large', } ); // Check Player style has also been saved in admin @@ -155,19 +145,9 @@ context( 'Block Editor: Player Style', () => { cy.viewPostViaSnackbar(); // Check Player has video player in frontend - cy.getEnqueuedPlayerScriptTag().should( 'exist' ); - cy.hasPlayerInstances( 1 ); - - // window.BeyondWords should contain 1 player instance - cy.window().then( ( win ) => { - // eslint-disable-next-line no-unused-expressions - expect( win.BeyondWords ).to.exist; - expect( win.BeyondWords.Player.instances() ).to.have.length( - 1 - ); - expect( - win.BeyondWords.Player.instances()[ 0 ].playerStyle - ).to.eq( 'video' ); + cy.getPlayerScriptTag().should( 'exist' ); + cy.hasPlayerInstances( 1, { + playerStyle: 'video', } ); // Check Player style has also been saved in admin diff --git a/tests/cypress/e2e/block-editor/segment-markers.cy.js b/tests/cypress/e2e/block-editor/segment-markers.cy.js index 757e78ec..9c118f61 100644 --- a/tests/cypress/e2e/block-editor/segment-markers.cy.js +++ b/tests/cypress/e2e/block-editor/segment-markers.cy.js @@ -55,7 +55,7 @@ context( 'Block Editor: Segment markers', () => { // "View post" cy.viewPostViaSnackbar(); - cy.getEnqueuedPlayerScriptTag().should( 'not.exist' ); + cy.getPlayerScriptTag().should( 'not.exist' ); cy.hasNoBeyondwordsWindowObject(); cy.contains( 'p', 'One.' ).should( @@ -123,7 +123,7 @@ context( 'Block Editor: Segment markers', () => { // "View post" cy.viewPostViaSnackbar(); - cy.getEnqueuedPlayerScriptTag().should( 'exist' ); + cy.getPlayerScriptTag().should( 'exist' ); cy.hasPlayerInstances( 1 ); testCases.forEach( ( testCase ) => { @@ -185,7 +185,7 @@ context( 'Block Editor: Segment markers', () => { // "View post" cy.viewPostViaSnackbar(); - cy.getEnqueuedPlayerScriptTag().should( 'exist' ); + cy.getPlayerScriptTag().should( 'exist' ); cy.hasPlayerInstances( 1 ); cy.get( '.entry-content p:not(:empty)' ) @@ -233,7 +233,7 @@ context( 'Block Editor: Segment markers', () => { // "View post" cy.viewPostViaSnackbar(); - cy.getEnqueuedPlayerScriptTag().should( 'exist' ); + cy.getPlayerScriptTag().should( 'exist' ); cy.hasPlayerInstances( 1 ); cy.get( '.entry-content p:not(:empty)' ) @@ -279,7 +279,7 @@ context( 'Block Editor: Segment markers', () => { // "View post" cy.viewPostViaSnackbar(); - cy.getEnqueuedPlayerScriptTag().should( 'exist' ); + cy.getPlayerScriptTag().should( 'exist' ); cy.hasPlayerInstances( 1 ); cy.get( '.entry-content p:not(:empty)' ) @@ -339,7 +339,7 @@ context( 'Block Editor: Segment markers', () => { // "View post" cy.viewPostViaSnackbar(); - cy.getEnqueuedPlayerScriptTag().should( 'exist' ); + cy.getPlayerScriptTag().should( 'exist' ); cy.hasPlayerInstances( 1 ); cy.get( '.entry-content p:not(:empty)' ) diff --git a/tests/cypress/e2e/classic-editor/add-post.cy.js b/tests/cypress/e2e/classic-editor/add-post.cy.js index 73f6b1c1..02bcbaec 100644 --- a/tests/cypress/e2e/classic-editor/add-post.cy.js +++ b/tests/cypress/e2e/classic-editor/add-post.cy.js @@ -55,9 +55,7 @@ context( 'Classic Editor: Add Post', () => { cy.get( '#sample-permalink' ).click(); - cy.get( 'div[data-beyondwords-player="true"]' ).should( - 'not.exist' - ); + cy.hasPlayerInstances( 0 ); cy.visit( `/wp-admin/edit.php?post_type=${ postType.slug }&orderby=date&order=desc` @@ -84,9 +82,7 @@ context( 'Classic Editor: Add Post', () => { cy.get( 'a.row-title' ).click(); } ); - cy.get( 'div[data-beyondwords-player="true"]' ).should( - 'not.exist' - ); + cy.hasPlayerInstances( 0 ); cy.get( 'input#beyondwords_generate_audio' ).should( 'not.be.checked' @@ -99,9 +95,7 @@ context( 'Classic Editor: Add Post', () => { cy.get( '#sample-permalink' ).click(); - cy.get( 'div[data-beyondwords-player="true"]' ).should( - 'not.exist' - ); + cy.hasPlayerInstances( 0 ); cy.visit( `/wp-admin/edit.php?post_type=${ postType.slug }&orderby=date&order=desc` @@ -128,9 +122,7 @@ context( 'Classic Editor: Add Post', () => { cy.get( 'a.row-title' ).click(); } ); - cy.get( 'div[data-beyondwords-player="true"]' ).should( - 'not.exist' - ); + cy.hasPlayerInstances( 0 ); cy.get( 'input#beyondwords_generate_audio' ).check(); @@ -141,9 +133,7 @@ context( 'Classic Editor: Add Post', () => { cy.get( '#sample-permalink' ).click(); - cy.get( 'div[data-beyondwords-player="true"]' ).should( - 'exist' - ); + cy.hasPlayerInstances( 1 ); } ); it( `can add a new ${ postType.name } with audio`, () => { @@ -178,9 +168,7 @@ context( 'Classic Editor: Add Post', () => { cy.get( '#sample-permalink' ).click(); - cy.get( 'div[data-beyondwords-player="true"]' ).should( - 'exist' - ); + cy.hasPlayerInstances( 1 ); // See a [tick] in the BeyondWords column' ) cy.visit( @@ -197,8 +185,7 @@ context( 'Classic Editor: Add Post', () => { } ); } ); - // @todo this skipped pending review test passes locally but fails in CI. - it.skip( `can add a ${ postType.name } with "Pending review" audio `, () => { + it( `can add a ${ postType.name } with "Pending review" audio `, () => { cy.createPost( { postType, } ); @@ -227,16 +214,13 @@ context( 'Classic Editor: Add Post', () => { ); // Click "OK" - cy.get( 'a.save-post-status' ).click(); - - // Wait for Permalink to be generated - cy.get( 'a#sample-permalink', { timeout: 20000 } ); + cy.get( 'a.save-post-status', { timeout: 20000 } ).click(); // Click "Save as Pending" button cy.get( 'input[value="Save as Pending"]' ).click(); // Wait for success message - cy.get( 'div#message.notice-success', { timeout: 20000 } ); + cy.get( 'div#message.notice-success' ); // "Generate Audio" should be replaced by custom "Pending" message cy.get( 'input#beyondwords_generate_audio' ).should( @@ -272,9 +256,7 @@ context( 'Classic Editor: Add Post', () => { cy.get( 'a.row-title' ).click(); } ); - cy.get( 'div[data-beyondwords-player="true"]' ).should( - 'not.exist' - ); + cy.hasPlayerInstances( 0 ); } ); } ); diff --git a/tests/cypress/e2e/classic-editor/display-player.cy.js b/tests/cypress/e2e/classic-editor/display-player.cy.js index e203a499..700421e3 100644 --- a/tests/cypress/e2e/classic-editor/display-player.cy.js +++ b/tests/cypress/e2e/classic-editor/display-player.cy.js @@ -47,9 +47,7 @@ context( 'Classic Editor: Display Player', () => { cy.get( '#sample-permalink' ).click(); - cy.get( 'div[data-beyondwords-player="true"]' ).should( - 'not.exist' - ); + cy.hasPlayerInstances( 0 ); cy.visit( `/wp-admin/edit.php?post_type=${ postType.slug }&orderby=date&order=desc` @@ -81,9 +79,7 @@ context( 'Classic Editor: Display Player', () => { cy.get( '#sample-permalink' ).click(); - cy.get( 'div[data-beyondwords-player="true"]' ).should( - 'exist' - ); + cy.hasPlayerInstances( 1 ); } ); } ); } ); diff --git a/tests/cypress/e2e/classic-editor/insert-beyondwords-player.cy.js b/tests/cypress/e2e/classic-editor/insert-beyondwords-player.cy.js index df4572a1..4d0cc232 100644 --- a/tests/cypress/e2e/classic-editor/insert-beyondwords-player.cy.js +++ b/tests/cypress/e2e/classic-editor/insert-beyondwords-player.cy.js @@ -55,9 +55,7 @@ context( 'Classic Editor: Insert BeyondWords Player', () => { cy.get( '#sample-permalink' ).click(); // Count 3x players in frontend - cy.get( - 'div[data-beyondwords-player="true"][contenteditable="false"]' - ).should( 'have.length', 3 ); + cy.hasPlayerInstances( 3 ); } ); it( `can add shortcodes into a ${ postType.name }`, () => { @@ -84,9 +82,7 @@ context( 'Classic Editor: Insert BeyondWords Player', () => { cy.get( '#sample-permalink' ).click(); // Count 3x players in frontend - cy.get( - 'div[data-beyondwords-player="true"][contenteditable="false"]' - ).should( 'have.length', 3 ); + cy.hasPlayerInstances( 3 ); } ); } ); } ); diff --git a/tests/cypress/e2e/classic-editor/player-content.cy.js b/tests/cypress/e2e/classic-editor/player-content.cy.js index c103546a..57fe40f6 100644 --- a/tests/cypress/e2e/classic-editor/player-content.cy.js +++ b/tests/cypress/e2e/classic-editor/player-content.cy.js @@ -65,19 +65,9 @@ context( 'Classic Editor: Player Content', () => { cy.get( '#sample-permalink' ).click(); // Check Player appears frontend - cy.getEnqueuedPlayerScriptTag().should( 'exist' ); - cy.hasPlayerInstances( 1 ); - - // window.BeyondWords should contain 1 player instance - cy.window().then( ( win ) => { - // eslint-disable-next-line no-unused-expressions - expect( win.BeyondWords ).to.exist; - expect( win.BeyondWords.Player.instances() ).to.have.length( - 1 - ); - expect( - win.BeyondWords.Player.instances()[ 0 ].summary - ).to.eq( false ); + cy.getPlayerScriptTag().should( 'exist' ); + cy.hasPlayerInstances( 1, { + loadContentAs: undefined, } ); // Check Player content has also been saved in admin @@ -118,19 +108,9 @@ context( 'Classic Editor: Player Content', () => { cy.get( '#sample-permalink' ).click(); // Check Player appears frontend - cy.getEnqueuedPlayerScriptTag().should( 'exist' ); - cy.hasPlayerInstances( 1 ); - - // window.BeyondWords should contain 1 player instance - cy.window().then( ( win ) => { - // eslint-disable-next-line no-unused-expressions - expect( win.BeyondWords ).to.exist; - expect( win.BeyondWords.Player.instances() ).to.have.length( - 1 - ); - expect( - win.BeyondWords.Player.instances()[ 0 ].summary - ).to.eq( true ); + cy.getPlayerScriptTag().should( 'exist' ); + cy.hasPlayerInstances( 1, { + loadContentAs: [ 'summary' ], } ); // Check Player content has also been saved in admin diff --git a/tests/cypress/e2e/classic-editor/player-style.cy.js b/tests/cypress/e2e/classic-editor/player-style.cy.js index 054ffe11..2dadc22b 100644 --- a/tests/cypress/e2e/classic-editor/player-style.cy.js +++ b/tests/cypress/e2e/classic-editor/player-style.cy.js @@ -115,19 +115,9 @@ context( 'Classic Editor: Player Style', () => { cy.get( '#sample-permalink' ).click(); // Check Player has large player in frontend - cy.getEnqueuedPlayerScriptTag().should( 'exist' ); - cy.hasPlayerInstances( 1 ); - - // window.BeyondWords should contain 1 player instance - cy.window().then( ( win ) => { - // eslint-disable-next-line no-unused-expressions - expect( win.BeyondWords ).to.exist; - expect( win.BeyondWords.Player.instances() ).to.have.length( - 1 - ); - expect( - win.BeyondWords.Player.instances()[ 0 ].playerStyle - ).to.eq( 'large' ); + cy.getPlayerScriptTag().should( 'exist' ); + cy.hasPlayerInstances( 1, { + playerStyle: 'large', } ); // Check Player style has also been saved in admin @@ -166,19 +156,9 @@ context( 'Classic Editor: Player Style', () => { cy.get( '#sample-permalink' ).click(); // Check Player has video player in frontend - cy.getEnqueuedPlayerScriptTag().should( 'exist' ); - cy.hasPlayerInstances( 1 ); - - // window.BeyondWords should contain 1 player instance - cy.window().then( ( win ) => { - // eslint-disable-next-line no-unused-expressions - expect( win.BeyondWords ).to.exist; - expect( win.BeyondWords.Player.instances() ).to.have.length( - 1 - ); - expect( - win.BeyondWords.Player.instances()[ 0 ].playerStyle - ).to.eq( 'video' ); + cy.getPlayerScriptTag().should( 'exist' ); + cy.hasPlayerInstances( 1, { + playerStyle: 'video', } ); // Check Player style has also been saved in admin diff --git a/tests/cypress/e2e/filters.cy.js b/tests/cypress/e2e/filters.cy.js index cd8abc52..7ae64957 100644 --- a/tests/cypress/e2e/filters.cy.js +++ b/tests/cypress/e2e/filters.cy.js @@ -25,41 +25,16 @@ describe( 'WordPress Filters', () => { title: `I can filter Player SDK params for a ${ postType.name }`, } ); - // Admin should have latest player - cy.hasPlayerInstances( 1 ); - - // Frontend should have a player div - cy.viewPostViaSnackbar(); - cy.getEnqueuedPlayerScriptTag().should( 'exist' ); - cy.hasPlayerInstances( 1 ); - - // window.BeyondWords should contain desired SDK params from + // Frontend should have a player div with expected SDK params from // tests/fixtures/wp-content/plugins/beyondwords-filter-player-sdk-params - cy.window().then( ( win ) => { - // eslint-disable-next-line no-unused-expressions - expect( win.BeyondWords ).to.exist; - expect( win.BeyondWords.Player.instances() ).to.have.length( - 1 - ); - expect( - win.BeyondWords.Player.instances()[ 0 ].iconColor - ).to.eq( 'rgb(234, 75, 151)' ); - expect( - win.BeyondWords.Player.instances()[ 0 ] - .highlightSections - ).to.eq( 'all-none' ); - expect( - win.BeyondWords.Player.instances()[ 0 ] - .clickableSections - ).to.eq( 'none' ); - expect( - win.BeyondWords.Player.instances()[ 0 ] - .segmentWidgetSections - ).to.eq( 'body' ); - expect( - win.BeyondWords.Player.instances()[ 0 ] - .segmentWidgetPosition - ).to.eq( '10-oclock' ); + cy.viewPostViaSnackbar(); + cy.getPlayerScriptTag().should( 'exist' ); + cy.hasPlayerInstances( 1, { + iconColor: 'rgb(234, 75, 151)', + highlightSections: 'all-none', + clickableSections: 'none', + segmentWidgetSections: 'body', + segmentWidgetPosition: '10-oclock', } ); cy.deactivatePlugin( 'beyondwords-filter-player-sdk-params' ); @@ -73,12 +48,9 @@ describe( 'WordPress Filters', () => { title: `I can filter Player script onload for a ${ postType.name }`, } ); - // Admin should have latest player - cy.hasPlayerInstances( 1 ); - // Frontend should have a player div cy.viewPostViaSnackbar(); - cy.getEnqueuedPlayerScriptTag().should( 'exist' ); + cy.getPlayerScriptTag().should( 'exist' ); cy.hasPlayerInstances( 1 ); // Check we have called console.log with expected values from testing plugin @@ -98,38 +70,5 @@ describe( 'WordPress Filters', () => { cy.deactivatePlugin( 'beyondwords-filter-player-sdk-params' ); } ); - - it( `can filter Player inline script tag for a ${ postType.name }`, () => { - cy.activatePlugin( - 'beyondwords-filter-player-inline-script-tag' - ); - - cy.publishPostWithAudio( { - postType, - title: `I see the inline player script for a ${ postType.name }`, - } ); - - // Admin should have latest player - cy.hasPlayerInstances( 1 ); - - // Frontend SHOULD NOT have enqueued player script - cy.viewPostViaSnackbar(); - cy.getEnqueuedPlayerScriptTag().should( 'not.exist' ); - cy.hasPlayerInstances( 1 ); - - cy.deactivatePlugin( - 'beyondwords-filter-player-inline-script-tag' - ); - - cy.publishPostWithAudio( { - postType, - title: `I see the legacy player script for a ${ postType.name }`, - } ); - - // Frontend SHOULD have enqueued player script - cy.viewPostViaSnackbar(); - cy.getEnqueuedPlayerScriptTag().should( 'exist' ); - cy.hasPlayerInstances( 1 ); - } ); } ); } ); diff --git a/tests/cypress/e2e/plugins/amp.cy.js b/tests/cypress/e2e/plugins/amp.cy.js index 189a40ee..5a710a1b 100644 --- a/tests/cypress/e2e/plugins/amp.cy.js +++ b/tests/cypress/e2e/plugins/amp.cy.js @@ -23,27 +23,17 @@ context( 'Plugins: AMP', () => { .filter( ( x ) => [ 'post', 'page' ].includes( x.slug ) ) .forEach( ( postType ) => { it( `${ postType.name } shows an player for AMP requests`, () => { - cy.createPost( { + cy.publishPostWithAudio( { postType, title: `A ${ postType.slug } has an AMP iframe player`, } ); - // cy.closeWelcomeToBlockEditorTips() - - cy.openBeyondwordsEditorPanel(); - - cy.checkGenerateAudio( postType ); - - cy.publishWithConfirmation(); - - cy.hasPlayerInstances( 1 ); - // "View post" cy.viewPostViaSnackbar(); // Non-AMP requests have a JS player. - cy.get( 'amp-iframe' ).should( 'not.exist' ); - cy.getEnqueuedPlayerScriptTag().should( 'exist' ); + cy.get( 'amp-iframe' ).should( 'not.exist' ); + cy.getPlayerScriptTag().should( 'exist' ); cy.hasPlayerInstances( 1 ); cy.url().then( ( url ) => { @@ -52,7 +42,7 @@ context( 'Plugins: AMP', () => { } ); cy.get( 'amp-iframe' ).should( 'exist' ); - cy.getEnqueuedPlayerScriptTag().should( 'not.exist' ); + cy.getPlayerScriptTag().should( 'not.exist' ); cy.hasNoBeyondwordsWindowObject(); } ); } ); diff --git a/tests/cypress/e2e/settings/player/player-ui.cy.js b/tests/cypress/e2e/settings/player/player-ui.cy.js index 4547d97b..502bcf64 100644 --- a/tests/cypress/e2e/settings/player/player-ui.cy.js +++ b/tests/cypress/e2e/settings/player/player-ui.cy.js @@ -20,22 +20,11 @@ context( 'Settings > Player UI', () => { cy.publishPostWithAudio( { title: '"Enabled" Player UI' } ); - // Admin should have latest player - cy.hasPlayerInstances( 1 ); - // Frontend should have a player div cy.viewPostViaSnackbar(); - cy.getEnqueuedPlayerScriptTag().should( 'exist' ); - cy.hasPlayerInstances( 1 ); - - // window.BeyondWords should contain 1 player instance - cy.window().then( ( win ) => { - // eslint-disable-next-line no-unused-expressions - expect( win.BeyondWords ).to.exist; - expect( win.BeyondWords.Player.instances() ).to.have.length( 1 ); - expect( - win.BeyondWords.Player.instances()[ 0 ].showUserInterface - ).to.eq( true ); + + cy.hasPlayerInstances( 1, { + showUserInterface: undefined, } ); } ); @@ -48,22 +37,11 @@ context( 'Settings > Player UI', () => { cy.publishPostWithAudio( { title: '"Headless" Player UI' } ); - // Admin should have latest player - cy.hasPlayerInstances( 1 ); - - // Frontend should have a player div without a UI cy.viewPostViaSnackbar(); - cy.get( '.beyondwords-player.bwp' ).should( 'exist' ); - cy.get( '.beyondwords-player .user-interface' ).should( 'not.exist' ); - - // window.BeyondWords should contain 1 player instance - cy.window().then( ( win ) => { - // eslint-disable-next-line no-unused-expressions - expect( win.BeyondWords ).to.exist; - expect( win.BeyondWords.Player.instances() ).to.have.length( 1 ); - expect( - win.BeyondWords.Player.instances()[ 0 ].showUserInterface - ).to.eq( false ); + + // Frontend should have a player with showUserInterface set to false + cy.hasPlayerInstances( 1, { + showUserInterface: false, } ); } ); @@ -76,17 +54,8 @@ context( 'Settings > Player UI', () => { cy.publishPostWithAudio( { title: '"Disabled" Player UI' } ); - // Admin should have latest player - cy.hasPlayerInstances( 1 ); - // Frontend should not have a player div cy.viewPostViaSnackbar(); - cy.get( '.beyondwords-player' ).should( 'not.exist' ); - - // window.BeyondWords should be undefined - cy.window().then( ( win ) => { - // eslint-disable-next-line no-unused-expressions - expect( win.BeyondWords ).to.not.exist; - } ); + cy.hasPlayerInstances( 0 ); } ); } ); diff --git a/tests/cypress/e2e/site-health.cy.js b/tests/cypress/e2e/site-health.cy.js index 1b913d6a..511cb0ac 100644 --- a/tests/cypress/e2e/site-health.cy.js +++ b/tests/cypress/e2e/site-health.cy.js @@ -78,9 +78,16 @@ context( 'Site Health', () => { ); cy.get( 'td' ).should( 'have.text', 'cpt_unsupported' ); } ); - // API Key + // Integration method cy.get( 'tr' ) .eq( 5 ) + .within( () => { + cy.get( 'th' ).should( 'have.text', 'Integration method' ); + cy.get( 'td' ).should( 'have.text', 'rest-api' ); + } ); + // API Key + cy.get( 'tr' ) + .eq( 6 ) .within( () => { cy.get( 'th' ).should( 'have.text', 'API Key' ); cy.get( 'td' ) @@ -97,7 +104,7 @@ context( 'Site Health', () => { } ); // Project ID cy.get( 'tr' ) - .eq( 6 ) + .eq( 7 ) .within( () => { cy.get( 'th' ).should( 'have.text', 'Project ID' ); cy.get( 'td' ).should( @@ -107,7 +114,7 @@ context( 'Site Health', () => { } ); // Include title in audio cy.get( 'tr' ) - .eq( 7 ) + .eq( 8 ) .within( () => { cy.get( 'th' ).should( 'have.text', @@ -117,14 +124,14 @@ context( 'Site Health', () => { } ); // Include excerpts in audio cy.get( 'tr' ) - .eq( 8 ) + .eq( 9 ) .within( () => { cy.get( 'th' ).should( 'have.text', 'Auto-publish audio' ); cy.get( 'td' ).should( 'have.text', 'Yes' ); } ); // Include excerpts in audio cy.get( 'tr' ) - .eq( 9 ) + .eq( 10 ) .within( () => { cy.get( 'th' ).should( 'have.text', @@ -134,7 +141,7 @@ context( 'Site Health', () => { } ); // Preselect ‘Generate audio’ cy.get( 'tr' ) - .eq( 10 ) + .eq( 11 ) .within( () => { cy.get( 'th' ).should( 'have.text', @@ -147,7 +154,7 @@ context( 'Site Health', () => { } ); // Default language code cy.get( 'tr' ) - .eq( 11 ) + .eq( 12 ) .within( () => { cy.get( 'th' ).should( 'have.text', @@ -157,21 +164,21 @@ context( 'Site Health', () => { } ); // Default language ID cy.get( 'tr' ) - .eq( 12 ) + .eq( 13 ) .within( () => { cy.get( 'th' ).should( 'have.text', 'Default language ID' ); cy.get( 'td' ).should( 'have.text', '' ); } ); // Title voice ID cy.get( 'tr' ) - .eq( 13 ) + .eq( 14 ) .within( () => { cy.get( 'th' ).should( 'have.text', 'Title voice ID' ); cy.get( 'td' ).should( 'have.text', '2517' ); } ); // Title voice speaking rate cy.get( 'tr' ) - .eq( 14 ) + .eq( 15 ) .within( () => { cy.get( 'th' ).should( 'have.text', @@ -181,14 +188,14 @@ context( 'Site Health', () => { } ); // Body voice ID cy.get( 'tr' ) - .eq( 15 ) + .eq( 16 ) .within( () => { cy.get( 'th' ).should( 'have.text', 'Body voice ID' ); cy.get( 'td' ).should( 'have.text', '2517' ); } ); // Body voice speaking rate cy.get( 'tr' ) - .eq( 16 ) + .eq( 17 ) .within( () => { cy.get( 'th' ).should( 'have.text', @@ -198,28 +205,28 @@ context( 'Site Health', () => { } ); // Player UI cy.get( 'tr' ) - .eq( 17 ) + .eq( 18 ) .within( () => { cy.get( 'th' ).should( 'have.text', 'Player UI' ); cy.get( 'td' ).should( 'have.text', 'enabled' ); } ); // Player style cy.get( 'tr' ) - .eq( 18 ) + .eq( 19 ) .within( () => { cy.get( 'th' ).should( 'have.text', 'Player style' ); cy.get( 'td' ).should( 'have.text', 'standard' ); } ); // Player theme cy.get( 'tr' ) - .eq( 19 ) + .eq( 20 ) .within( () => { cy.get( 'th' ).should( 'have.text', 'Player theme' ); cy.get( 'td' ).should( 'have.text', 'light' ); } ); // Light theme cy.get( 'tr' ) - .eq( 20 ) + .eq( 21 ) .within( () => { cy.get( 'th' ).should( 'have.text', 'Light theme' ); cy.get( 'td' ).should( @@ -230,7 +237,7 @@ context( 'Site Health', () => { } ); // Dark theme cy.get( 'tr' ) - .eq( 21 ) + .eq( 22 ) .within( () => { cy.get( 'th' ).should( 'have.text', 'Dark theme' ); cy.get( 'td' ).should( @@ -241,7 +248,7 @@ context( 'Site Health', () => { } ); // Video theme cy.get( 'tr' ) - .eq( 22 ) + .eq( 23 ) .within( () => { cy.get( 'th' ).should( 'have.text', 'Video theme' ); cy.get( 'td' ).should( @@ -252,7 +259,7 @@ context( 'Site Health', () => { } ); // Call-to-action cy.get( 'tr' ) - .eq( 23 ) + .eq( 24 ) .within( () => { cy.get( 'th' ).should( 'have.text', 'Call-to-action' ); cy.get( 'td' ).should( @@ -262,14 +269,14 @@ context( 'Site Health', () => { } ); // Text highlighting cy.get( 'tr' ) - .eq( 24 ) + .eq( 25 ) .within( () => { cy.get( 'th' ).should( 'have.text', 'Text highlighting' ); cy.get( 'td' ).should( 'have.text', 'No' ); } ); // Playback from segments cy.get( 'tr' ) - .eq( 25 ) + .eq( 26 ) .within( () => { cy.get( 'th' ).should( 'have.text', @@ -279,35 +286,35 @@ context( 'Site Health', () => { } ); // Widget style cy.get( 'tr' ) - .eq( 26 ) + .eq( 27 ) .within( () => { cy.get( 'th' ).should( 'have.text', 'Widget style' ); cy.get( 'td' ).should( 'have.text', 'standard' ); } ); // Widget position cy.get( 'tr' ) - .eq( 27 ) + .eq( 28 ) .within( () => { cy.get( 'th' ).should( 'have.text', 'Widget position' ); cy.get( 'td' ).should( 'have.text', 'auto' ); } ); // Skip button style cy.get( 'tr' ) - .eq( 28 ) + .eq( 29 ) .within( () => { cy.get( 'th' ).should( 'have.text', 'Skip button style' ); cy.get( 'td' ).should( 'have.text', 'auto' ); } ); // Registered filters cy.get( 'tr' ) - .eq( 29 ) + .eq( 30 ) .within( () => { cy.get( 'th' ).should( 'have.text', 'Registered filters' ); cy.get( 'td' ).should( 'have.text', 'None' ); } ); // Registered deprecated filters cy.get( 'tr' ) - .eq( 30 ) + .eq( 31 ) .within( () => { cy.get( 'th' ).should( 'have.text', @@ -317,7 +324,7 @@ context( 'Site Health', () => { } ); // Review Notice Dismissed cy.get( 'tr' ) - .eq( 31 ) + .eq( 32 ) .within( () => { cy.get( 'th' ).should( 'have.text', 'Date Activated' ); cy.get( 'td' ).should( @@ -327,7 +334,7 @@ context( 'Site Health', () => { } ); // Review Notice Dismissed cy.get( 'tr' ) - .eq( 32 ) + .eq( 33 ) .within( () => { cy.get( 'th' ).should( 'have.text', @@ -337,7 +344,7 @@ context( 'Site Health', () => { } ); // BEYONDWORDS_AUTO_SYNC_SETTINGS cy.get( 'tr' ) - .eq( 33 ) + .eq( 34 ) .within( () => { cy.get( 'th' ).should( 'have.text', @@ -346,22 +353,12 @@ context( 'Site Health', () => { cy.get( 'td' ).should( 'have.text', 'False' ); } ); // BEYONDWORDS_AUTOREGENERATE - cy.get( 'tr' ) - .eq( 34 ) - .within( () => { - cy.get( 'th' ).should( - 'have.text', - 'BEYONDWORDS_AUTOREGENERATE' - ); - cy.get( 'td' ).should( 'have.text', 'Undefined' ); - } ); - // BEYONDWORDS_AUTOREGENERATE cy.get( 'tr' ) .eq( 35 ) .within( () => { cy.get( 'th' ).should( 'have.text', - 'BEYONDWORDS_PLAYER_INLINE_SCRIPT_TAG' + 'BEYONDWORDS_AUTOREGENERATE' ); cy.get( 'td' ).should( 'have.text', 'Undefined' ); } ); diff --git a/tests/cypress/support/commands.js b/tests/cypress/support/commands.js index 781546d6..6a55810a 100644 --- a/tests/cypress/support/commands.js +++ b/tests/cypress/support/commands.js @@ -1,4 +1,4 @@ -/* global cy, Cypress, DataTransfer, ClipboardEvent */ +/* global cy, Cypress, DataTransfer, expect, ClipboardEvent */ // *********************************************** // This example commands.js shows you how to @@ -346,7 +346,7 @@ Cypress.Commands.add( 'publishPostWithAudio', ( options = {} ) => { cy.publishWithConfirmation(); - cy.hasPlayerInstances( 1 ); + cy.hasAdminPlayerInstances( 1 ); } ); Cypress.Commands.add( 'publishPostWithoutAudio', ( options = {} ) => { @@ -360,7 +360,7 @@ Cypress.Commands.add( 'publishPostWithoutAudio', ( options = {} ) => { cy.getBlockEditorCheckbox( 'Generate audio' ).should( 'exist' ); - cy.hasPlayerInstances( 0 ); + cy.hasAdminPlayerInstances( 0 ); } ); /** @@ -467,31 +467,68 @@ Cypress.Commands.add( 'getLabel', ( text, ...args ) => { return cy.get( 'label', ...args ).contains( text ); } ); +// Check for a number of admin player instances. +Cypress.Commands.add( 'hasAdminPlayerInstances', ( num = 1 ) => { + if ( num < 0 ) { + throw new Error( 'Number of player instances cannot be negative.' ); + } + + if ( num === 0 ) { + cy.get( '.beyondwords-player-box-wrapper' ).should( 'not.exist' ); + return; + } + + cy.get( '.beyondwords-player-box-wrapper' ).should( 'exist' ); +} ); + // Check for a number of player instances. -Cypress.Commands.add( 'hasPlayerInstances', ( num = 1 ) => { - cy.window( { timeout: 10000 } ).should( ( win ) => { - if ( ! win.BeyondWords ) { - throw new Error( - 'BeyondWords is not available on the window object.' - ); - } +Cypress.Commands.add( 'hasPlayerInstances', ( num = 1, params = {} ) => { + // Ensure the player script tag count matches the expected number of instances. + if ( num < 0 ) { + throw new Error( 'Number of player instances cannot be negative.' ); + } + + if ( num === 0 ) { + cy.getPlayerScriptTag().should( 'not.exist' ); + return; + } - if ( - ! win.BeyondWords.Player || - typeof win.BeyondWords.Player.instances !== 'function' - ) { + cy.getPlayerScriptTag().should( 'have.length', num ); + + if ( _.isEmpty( params ) ) { + // eslint-disable-next-line no-useless-return + return; + } + + // Check params exist in the params of the player script tag's onload init object. + cy.getPlayerScriptTag().each( ( $el ) => { + const onload = $el.attr( 'onload' ); + const match = onload.match( /\{target:this, \.\.\.(.+)\}\)/ ); + console.log( 'onload', onload ); + console.log( 'match', match ); + + if ( ! match ) { throw new Error( - 'BeyondWords.Player.instances is not a function.' + 'Could not find params object in onload attribute.' ); } - const instances = win.BeyondWords.Player.instances(); + const paramsStr = match[ 1 ]; - if ( instances.length !== num ) { - throw new Error( - `Expected ${ num } player instance(s), but found ${ instances.length }.` - ); + let paramsObj = JSON.parse( paramsStr ); + + // Parse double-encoded JSON strings again. + if ( typeof paramsObj === 'string' ) { + paramsObj = JSON.parse( paramsObj ); } + + Object.entries( params ).forEach( ( [ key, value ] ) => { + if ( value === undefined ) { + expect( paramsObj ).to.not.have.property( key, value ); + } else { + expect( paramsObj ).to.have.property( key ).that.eql( value ); + } + } ); } ); } ); @@ -506,9 +543,13 @@ Cypress.Commands.add( 'hasNoBeyondwordsWindowObject', () => { } ); } ); -// Get frontend audio player element (standard) -Cypress.Commands.add( 'getEnqueuedPlayerScriptTag', ( ...args ) => { - return cy.get( 'script[data-beyondwords-sdk]', ...args ); +// Get frontend audio player script tag. +Cypress.Commands.add( 'getPlayerScriptTag', ( ...args ) => { + return cy.get( + // eslint-disable-next-line max-len + 'body script[async][defer][src="https://proxy.beyondwords.io/npm/@beyondwords/player@latest/dist/umd.js"]', + ...args + ); } ); /** diff --git a/tests/fixtures/wp-content/plugins/beyondwords-filter-player-inline-script-tag.php b/tests/fixtures/wp-content/plugins/beyondwords-filter-player-inline-script-tag.php deleted file mode 100644 index 0223cac8..00000000 --- a/tests/fixtures/wp-content/plugins/beyondwords-filter-player-inline-script-tag.php +++ /dev/null @@ -1,19 +0,0 @@ - - * @since 3.0.0 - */ - use Beyondwords\Wordpress\Component\Post\AddPlayer\AddPlayer; class AddPlayerTest extends WP_UnitTestCase diff --git a/tests/phpunit/Component/Post/BlockAttributes/BlockAttributesTest.php b/tests/phpunit/Component/Post/BlockAttributes/BlockAttributesTest.php index 4401c562..5b61ba2c 100644 --- a/tests/phpunit/Component/Post/BlockAttributes/BlockAttributesTest.php +++ b/tests/phpunit/Component/Post/BlockAttributes/BlockAttributesTest.php @@ -191,7 +191,7 @@ public function registerMarkerAttributeProvider($args) { */ public function renderBlockWithUiDisabled() { - update_option('beyondwords_player_ui', PlayerUI::DISABLED); + update_option(PlayerUI::OPTION_NAME, PlayerUI::DISABLED); $this->assertSame( '

Test

', @@ -202,7 +202,7 @@ public function renderBlockWithUiDisabled() ]) ); - delete_option('beyondwords_player_ui'); + delete_option(PlayerUI::OPTION_NAME); } /** diff --git a/tests/phpunit/Component/Post/Metabox/MetaboxTest.php b/tests/phpunit/Component/Post/Metabox/MetaboxTest.php index 4873a531..ee5de3da 100644 --- a/tests/phpunit/Component/Post/Metabox/MetaboxTest.php +++ b/tests/phpunit/Component/Post/Metabox/MetaboxTest.php @@ -102,7 +102,7 @@ public function renderMetaBoxContent($expectPlayer, $postArgs) $this->assertCount(1, $crawler->filter('p#beyondwords-metabox-help')); $this->assertCount(0, $crawler->filter('div#beyondwords-metabox-errors')); - wp_delete_post($postId); + wp_delete_post($postId, true); } public function renderMetaBoxContentProvider() diff --git a/tests/phpunit/Component/Post/Panel/Inspect/InspectTest.php b/tests/phpunit/Component/Post/Panel/Inspect/InspectTest.php index ad4ade01..ad11fce9 100644 --- a/tests/phpunit/Component/Post/Panel/Inspect/InspectTest.php +++ b/tests/phpunit/Component/Post/Panel/Inspect/InspectTest.php @@ -65,7 +65,6 @@ public function renderMetaBoxContent() 'beyondwords_summary_voice_id' => '303', 'beyondwords_disabled' => '0', 'beyondwords_error_message' => 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.', - 'publish_post_to_speechkit' => 'Value 1', 'speechkit_info' => ["foo" => ["bar" => "baz"]], 'speechkit_response' => 'Value 7', 'speechkit_retries' => '1', diff --git a/tests/phpunit/Component/Posts/Column/ColumnTest.php b/tests/phpunit/Component/Posts/Column/ColumnTest.php index 2d6819c1..b6cce5f8 100644 --- a/tests/phpunit/Component/Posts/Column/ColumnTest.php +++ b/tests/phpunit/Component/Posts/Column/ColumnTest.php @@ -64,11 +64,11 @@ public function testRenderColumnsContent(string $expect, array $postArgs) { $this->expectOutputString($expect); - $post = self::factory()->post->create_and_get($postArgs); + $postId = self::factory()->post->create($postArgs); - Column::renderColumnsContent('beyondwords', $post->ID); + Column::renderColumnsContent('beyondwords', $postId); - wp_delete_post($post->ID, true); + wp_delete_post($postId, true); } public function renderColumnsContentProvider() diff --git a/tests/phpunit/Core/ApiClientTest.php b/tests/phpunit/Core/ApiClientTest.php index 0d038520..b2e382ed 100644 --- a/tests/phpunit/Core/ApiClientTest.php +++ b/tests/phpunit/Core/ApiClientTest.php @@ -155,7 +155,7 @@ public function batchDeleteAudio() $this->assertEquals($deleted, array_values($postIds)); foreach ($deleted as $postId) { - wp_delete_post($postId); + wp_delete_post($postId, true); } delete_option('beyondwords_api_key'); @@ -362,6 +362,7 @@ public function callApiWithoutAuthHeader() unset($headers['X-Api-Key']); $request->setHeaders($headers); + $response = ApiClient::callApi($request, $postId); $this->assertSame(401, wp_remote_retrieve_response_code($response)); @@ -391,6 +392,7 @@ public function callApiWithEmptyAuthHeader() $headers['X-Api-Key'] = 'AN INVALID API KEY'; $request->setHeaders($headers); + $response = ApiClient::callApi($request, $postId); $this->assertSame(401, wp_remote_retrieve_response_code($response)); diff --git a/tests/phpunit/Core/CoreTest.php b/tests/phpunit/Core/CoreTest.php index 961b576b..438a5e1b 100644 --- a/tests/phpunit/Core/CoreTest.php +++ b/tests/phpunit/Core/CoreTest.php @@ -30,7 +30,6 @@ public function init() Core::init(); $this->assertEquals(1, has_action('enqueue_block_editor_assets', array(Core::class, 'enqueueBlockEditorAssets'))); - $this->assertEquals(10, has_action('init', array(Core::class, 'loadPluginTextdomain'))); $this->assertEquals(99, has_action('init', array(Core::class, 'registerMeta'))); $this->assertEquals(99, has_action('wp_after_insert_post', array(Core::class, 'onAddOrUpdatePost'))); $this->assertEquals(10, has_action('before_delete_post', array(Core::class, 'onDeletePost'))); @@ -76,6 +75,7 @@ public function metaContentIdAndMetaProjectIdWillUpdateAudio($response) $postId = $this->factory->post->create([ 'post_title' => 'CoreTest::metaContentIdAndMetaProjectIdWillUpdateAudio', 'meta_input' => [ + 'beyondwords_generate_audio' => '1', 'beyondwords_project_id' => BEYONDWORDS_TESTS_PROJECT_ID, 'beyondwords_content_id' => BEYONDWORDS_TESTS_CONTENT_ID, ], @@ -101,6 +101,7 @@ public function metaContentIdAndSettingsProjectIdWillUpdateAudio($response) $postId = $this->factory->post->create([ 'post_title' => 'CoreTest::metaContentIdAndSettingsProjectIdWillUpdateAudio', 'meta_input' => [ + 'beyondwords_generate_audio' => '1', 'beyondwords_content_id' => BEYONDWORDS_TESTS_CONTENT_ID, ], ]); @@ -240,6 +241,69 @@ public function revisionWillNotCreateAudio() delete_option('beyondwords_project_id'); } + /** + * @test + * @group post-statuses + * + * @dataProvider shouldProcessPostStatusProvider + */ + public function shouldProcessPostStatus($expect, $status) + { + update_option('beyondwords_api_key', BEYONDWORDS_TESTS_API_KEY); + update_option('beyondwords_project_id', BEYONDWORDS_TESTS_PROJECT_ID); + + // Add 'my_custom_status' to the list of statuses we process + $filter = function($statuses) { + array_push($statuses, 'my_custom_status'); + return array_unique($statuses); + }; + + add_filter('beyondwords_settings_post_statuses', $filter); + + $this->assertEquals($expect, Core::shouldProcessPostStatus($status)); + + remove_filter('beyondwords_settings_post_statuses', $filter); + + delete_option('beyondwords_api_key'); + delete_option('beyondwords_project_id'); + } + + /** + * + */ + public function shouldProcessPostStatusProvider() { + return [ + 'draft' => [ + 'expect' => false, + 'status' => 'draft' + ], + 'pending' => [ + 'expect' => true, + 'status' => 'pending' + ], + 'publish' => [ + 'expect' => true, + 'status' => 'publish' + ], + 'private' => [ + 'expect' => true, + 'status' => 'private' + ], + 'future' => [ + 'expect' => true, + 'status' => 'future' + ], + 'trash' => [ + 'expect' => false, + 'status' => 'trash' + ], + 'my_custom_status' => [ + 'expect' => true, + 'status' => 'my_custom_status' + ], + ]; + } + /** * @test * @@ -284,7 +348,7 @@ public function onDeletePost() Core::onDeletePost($postId); - wp_delete_post($postId); + wp_delete_post($postId, true); $this->assertSame('', get_post_meta($postId, 'beyondwords_error_message', true)); $this->assertSame('', get_post_meta($postId, 'beyondwords_project_id', true)); @@ -480,7 +544,6 @@ public function registerMeta() 'beyondwords_podcast_id' => 'beyondwords_podcast_id', 'beyondwords_preview_token' => 'beyondwords_preview_token', 'beyondwords_project_id' => 'beyondwords_project_id', - 'publish_post_to_speechkit' => 'publish_post_to_speechkit', 'speechkit_info' => 'speechkit_info', 'speechkit_response' => 'speechkit_response', 'speechkit_retries' => 'speechkit_retries', @@ -513,9 +576,6 @@ public function registerMeta() $this->assertArrayHasKey('beyondwords_project_id', $meta); $this->assertSame('beyondwords_project_id', get_post_meta($postId, 'beyondwords_project_id', true)); - $this->assertArrayHasKey('publish_post_to_speechkit', $meta); - $this->assertSame('publish_post_to_speechkit', get_post_meta($postId, 'publish_post_to_speechkit', true)); - $this->assertArrayHasKey('speechkit_info', $meta); $this->assertSame('speechkit_info', get_post_meta($postId, 'speechkit_info', true)); @@ -588,4 +648,73 @@ public function langCodes() ], ]; } + + /** + * @test + * @group generateAudio + * @dataProvider shouldGenerateAudioForPostProvider + */ + public function shouldGenerateAudioForPost($expect, $post_status, $meta_input) { + update_option('beyondwords_api_key', BEYONDWORDS_TESTS_API_KEY); + update_option('beyondwords_project_id', BEYONDWORDS_TESTS_PROJECT_ID); + + $postId = self::factory()->post->create([ + 'post_title' => 'CoreTest::shouldGenerateAudioForPost', + 'post_status' => $post_status, + 'meta_input' => $meta_input, + ]); + + $this->assertSame($expect, Core::shouldGenerateAudioForPost($postId)); + + delete_option('beyondwords_api_key'); + delete_option('beyondwords_project_id'); + + wp_delete_post($postId, true); + } + + public function shouldGenerateAudioForPostProvider() + { + return [ + 'no post meta' => [ + 'expect' => false, + 'post_status' => 'publish', + 'meta_input' => [], + ], + 'beyondwords_generate_audio = ""' => [ + 'expect' => false, + 'post_status' => 'publish', + 'meta_input' => [ + 'beyondwords_generate_audio' => '', + ], + ], + 'beyondwords_generate_audio = 0' => [ + 'expect' => false, + 'post_status' => 'publish', + 'meta_input' => [ + 'beyondwords_generate_audio' => '0', + ], + ], + 'beyondwords_generate_audio = 1' => [ + 'expect' => true, + 'post_status' => 'publish', + 'meta_input' => [ + 'beyondwords_generate_audio' => '1', + ], + ], + 'draft' => [ + 'expect' => false, + 'post_status' => 'draft', + 'meta_input' => [ + 'beyondwords_generate_audio' => '1', + ], + ], + 'trash' => [ + 'expect' => false, + 'post_status' => 'trash', + 'meta_input' => [ + 'beyondwords_generate_audio' => '1', + ], + ], + ]; + } } diff --git a/tests/phpunit/Core/CoreUtilsTest.php b/tests/phpunit/Core/CoreUtilsTest.php index 307c23a3..9f30ac53 100644 --- a/tests/phpunit/Core/CoreUtilsTest.php +++ b/tests/phpunit/Core/CoreUtilsTest.php @@ -60,6 +60,7 @@ public function getPostMetaKeys() $keys = [ // Current 'beyondwords_generate_audio', + 'beyondwords_integration_method', 'beyondwords_project_id', 'beyondwords_content_id', 'beyondwords_preview_token', @@ -125,6 +126,7 @@ public function getPostMetaKeysAll() $keys = [ // Current 'beyondwords_generate_audio', + 'beyondwords_integration_method', 'beyondwords_project_id', 'beyondwords_content_id', 'beyondwords_preview_token', diff --git a/tests/phpunit/Core/Player/ConfigBuilderTest.php b/tests/phpunit/Core/Player/ConfigBuilderTest.php new file mode 100644 index 00000000..4c828026 --- /dev/null +++ b/tests/phpunit/Core/Player/ConfigBuilderTest.php @@ -0,0 +1,102 @@ +markTestIncomplete('This test needs to be implemented.'); + } + + /** + * @test + */ + public function mergePluginSettings() + { + $this->markTestIncomplete('This test needs to be implemented.'); + } + + /** + * @test + */ + public function mergePostSettings() + { + $this->markTestIncomplete('This test needs to be implemented.'); + } + + // /** + // * @test + // */ + // public function jsPlayerParams() + // { + // $post = self::factory()->post->create_and_get([ + // 'post_title' => 'PlayerTest::jsPlayerParams', + // 'meta_input' => [ + // 'beyondwords_project_id' => BEYONDWORDS_TESTS_PROJECT_ID, + // 'beyondwords_podcast_id' => BEYONDWORDS_TESTS_CONTENT_ID, + // ], + // ]); + + // $params = Player::jsPlayerParams($post); + + // $this->assertEquals($params->projectId, BEYONDWORDS_TESTS_PROJECT_ID); + // $this->assertEquals($params->contentId, BEYONDWORDS_TESTS_CONTENT_ID); + // $this->assertEquals($params->playerStyle, 'standard'); + + // $this->assertObjectNotHasProperty('playerType', $params); + // $this->assertObjectNotHasProperty('skBackend', $params); + // $this->assertObjectNotHasProperty('processingStatus', $params); + // $this->assertObjectNotHasProperty('apiWriteKey', $params); + + // wp_delete_post($post->ID, true); + // } + + // /** + // * @test + // */ + // public function playerSdkParamsFilter() + // { + // $post = self::factory()->post->create_and_get([ + // 'post_title' => 'PlayerTest::playerSdkParamsFilter', + // 'meta_input' => [ + // 'beyondwords_project_id' => BEYONDWORDS_TESTS_PROJECT_ID, + // 'beyondwords_podcast_id' => BEYONDWORDS_TESTS_CONTENT_ID, + // ], + // ]); + + // $filter = function($params) { + // $params['projectId'] = 4321; + // $params['contentId'] = 87654321; + // $params['playerStyle'] = 'screen'; + // $params['playerContent'] = 'custom content value'; + // $params['myCustomParam'] = 'my custom value'; + + // return $params; + // }; + + // add_filter('beyondwords_player_sdk_params', $filter, 10); + + // $params = Player::jsPlayerParams($post); + + // remove_filter('beyondwords_player_sdk_params', $filter, 10); + + // $this->assertEquals($params->projectId, 4321); + // $this->assertEquals($params->contentId, 87654321); + // $this->assertEquals($params->playerStyle, 'screen'); + // $this->assertEquals($params->playerContent, 'custom content value'); + // $this->assertEquals($params->myCustomParam, 'my custom value'); + + // wp_delete_post($post->ID, true); + // } +} diff --git a/tests/phpunit/Core/Player/Renderer/AmpTest.php b/tests/phpunit/Core/Player/Renderer/AmpTest.php new file mode 100644 index 00000000..2382322a --- /dev/null +++ b/tests/phpunit/Core/Player/Renderer/AmpTest.php @@ -0,0 +1,79 @@ +post->create_and_get([ + 'post_title' => 'Amp::check::1', + ]); + + $this->assertFalse(Amp::check($post)); + + $post = self::factory()->post->create_and_get([ + 'post_title' => 'Amp::check::2', + 'meta_input' => [ + 'beyondwords_project_id' => BEYONDWORDS_TESTS_PROJECT_ID, + 'beyondwords_podcast_id' => BEYONDWORDS_TESTS_CONTENT_ID, + ], + ]); + + $this->markTestIncomplete('Needs updates for Amp renderer.'); + + $this->assertTrue(Amp::check($post)); + } + + /** + * @test + */ + public function render() { + + $post = self::factory()->post->create_and_get([ + 'post_title' => 'AmpTest::render', + 'meta_input' => [ + 'beyondwords_project_id' => BEYONDWORDS_TESTS_PROJECT_ID, + 'beyondwords_podcast_id' => BEYONDWORDS_TESTS_CONTENT_ID, + ], + ]); + + $src = "https://audio.beyondwords.io/amp/" . BEYONDWORDS_TESTS_PROJECT_ID . "?podcast_id=" . BEYONDWORDS_TESTS_CONTENT_ID; + + $html = Amp::render($post); + + $crawler = new Crawler($html); + + // + $iframe = $crawler->filter('amp-iframe'); + $this->assertCount(1, $iframe); + $this->assertSame('0', $iframe->attr('frameborder')); + $this->assertSame('43', $iframe->attr('height')); + $this->assertSame('responsive', $iframe->attr('layout')); + $this->assertSame('allow-scripts allow-same-origin allow-popups', $iframe->attr('sandbox')); + $this->assertSame('no', $iframe->attr('scrolling')); + $this->assertSame($src, $iframe->attr('src')); + $this->assertSame('295', $iframe->attr('width')); + + // + $img = $iframe->filter('amp-img'); + $this->assertCount(1, $img); + $this->assertSame('150', $img->attr('height')); + $this->assertSame('responsive', $img->attr('layout')); + $this->assertSame('', $img->attr('placeholder')); + $this->assertSame(Environment::getAmpImgUrl(), $img->attr('src')); + $this->assertSame('643', $img->attr('width')); + + wp_delete_post($post->ID, true); + } +} \ No newline at end of file diff --git a/tests/phpunit/Core/Player/Renderer/JavascriptTest.php b/tests/phpunit/Core/Player/Renderer/JavascriptTest.php new file mode 100644 index 00000000..ffd69e40 --- /dev/null +++ b/tests/phpunit/Core/Player/Renderer/JavascriptTest.php @@ -0,0 +1,107 @@ +post->create_and_get([ + 'post_title' => 'Javascript::check::1', + ]); + + $this->assertFalse(Javascript::check($post)); + + $post = self::factory()->post->create_and_get([ + 'post_title' => 'Javascript::check::2', + 'meta_input' => [ + 'beyondwords_project_id' => BEYONDWORDS_TESTS_PROJECT_ID, + 'beyondwords_podcast_id' => BEYONDWORDS_TESTS_CONTENT_ID, + ], + ]); + + $this->markTestIncomplete('Needs updates for JavaScript renderer.'); + + $this->assertTrue(Javascript::check($post)); + } + + /** + * @test + */ + public function render() + { + $post = self::factory()->post->create_and_get([ + 'post_title' => 'JavascriptTest::render', + 'meta_input' => [ + 'beyondwords_project_id' => BEYONDWORDS_TESTS_PROJECT_ID, + 'beyondwords_podcast_id' => BEYONDWORDS_TESTS_CONTENT_ID, + ], + ]); + + $html = Javascript::render($post); + + $this->assertNotEmpty($html); + + setup_postdata($post); + + $crawler = new Crawler($html); + + $this->assertCount(1, $crawler->filter('div[data-beyondwords-player="true"][contenteditable="false"]')); + + wp_reset_postdata(); + + wp_delete_post($post->ID, true); + } + + /** + * @test + */ + public function renderWithFilter() + { + $post = self::factory()->post->create_and_get([ + 'post_title' => 'JavascriptTest::renderWithFilter', + 'meta_input' => [ + 'beyondwords_project_id' => BEYONDWORDS_TESTS_PROJECT_ID, + 'beyondwords_podcast_id' => BEYONDWORDS_TESTS_CONTENT_ID, + ], + ]); + + $filter = function($html, $postId, $projectId, $contentId) { + return sprintf( + '
%s
', + $postId, + $projectId, + $contentId, + $html + ); + }; + + add_filter('beyondwords_player_html', $filter, 10, 4); + + $html = Javascript::render($post); + + remove_filter('beyondwords_player_html', $filter, 10, 4); + + $crawler = new Crawler($html); + + //
+ $wrapper = $crawler->filter('#wrapper'); + $this->assertCount(1, $wrapper); + $this->assertSame("$post->ID", $wrapper->attr('data-post-id')); + $this->assertSame(BEYONDWORDS_TESTS_PROJECT_ID, $wrapper->attr('data-project-id')); + $this->assertSame(BEYONDWORDS_TESTS_CONTENT_ID, $wrapper->attr('data-podcast-id')); + + $this->assertCount(1, $wrapper->filter('div[data-beyondwords-player="true"][contenteditable="false"]')); + + wp_delete_post($post->ID, true); + } +} diff --git a/tests/phpunit/Core/PlayerTest.php b/tests/phpunit/Core/PlayerTest.php index cd84fd1c..9d329c54 100644 --- a/tests/phpunit/Core/PlayerTest.php +++ b/tests/phpunit/Core/PlayerTest.php @@ -2,35 +2,16 @@ declare(strict_types=1); -use Beyondwords\Wordpress\Core\Environment; +use Beyondwords\Wordpress\Component\Settings\Fields\PlayerUI\PlayerUI; use Beyondwords\Wordpress\Core\Player\Player; -use \Symfony\Component\DomCrawler\Crawler; class PlayerTest extends WP_UnitTestCase { - /** - * @var \Beyondwords\Wordpress\Core\Player\Player - */ - private $_instance; - - public function setUp(): void - { - // Before... - parent::setUp(); - - // Your set up methods here. - } - - public function tearDown(): void - { - // Your tear down methods here. - - // Then... - parent::tearDown(); - } + public const PLAYER_HTML = ''; /** * @test + * @group player */ public function init() { @@ -40,7 +21,6 @@ public function init() // Actions $this->assertEquals(10, has_action('init', array(Player::class, 'registerShortcodes'))); - $this->assertEquals(10, has_action('wp_enqueue_scripts', array(Player::class, 'enqueueScripts'))); // Filters $this->assertEquals(1000000, has_filter('the_content', array(Player::class, 'autoPrependPlayer'))); @@ -49,6 +29,7 @@ public function init() /** * @test + * @group player */ public function addShortcode() { @@ -69,7 +50,7 @@ public function addShortcode() \the_content(); $content = trim(ob_get_clean()); - $this->assertSame("

Before

\n
\n

After

", $content); + $this->assertSame("

Before

\n" . self::PLAYER_HTML . "\n

After

", $content); wp_reset_postdata(); @@ -78,6 +59,7 @@ public function addShortcode() /** * @test + * @group player */ public function autoPrependPlayer() { @@ -105,7 +87,7 @@ public function autoPrependPlayer() $output = Player::autoPrependPlayer($content); // We are now is_singular() so player should be prepended - $this->assertSame('
' . $content, $output); + $this->assertSame(self::PLAYER_HTML . $content, $output); wp_reset_postdata(); @@ -114,357 +96,125 @@ public function autoPrependPlayer() /** * @test + * @group player */ - public function jsPlayerHtml() + public function replaceLegacyCustomPlayer() { - $postId = self::factory()->post->create([ - 'post_title' => 'PlayerTest::jsPlayerHtml', - 'meta_input' => [ - 'beyondwords_project_id' => BEYONDWORDS_TESTS_PROJECT_ID, - 'beyondwords_podcast_id' => BEYONDWORDS_TESTS_CONTENT_ID, - ], - ]); - - $html = Player::jsPlayerHtml($postId, BEYONDWORDS_TESTS_PROJECT_ID, BEYONDWORDS_TESTS_CONTENT_ID); - - $this->assertNotEmpty($html); - - setup_postdata($postId); - - $crawler = new Crawler($html); - - $this->assertCount(1, $crawler->filter('div[data-beyondwords-player="true"][contenteditable="false"]')); - - wp_reset_postdata(); + global $post; - wp_delete_post($postId, true); - } + $content = "

Before

\n
\n

After

"; - /** - * @test - */ - public function playerHtmlFilter() - { $post = self::factory()->post->create_and_get([ - 'post_title' => 'PlayerTest::playerHtmlFilter', + 'post_title' => 'PlayerTest::autoPrependPlayer', + 'post_content' => $content, 'meta_input' => [ 'beyondwords_project_id' => BEYONDWORDS_TESTS_PROJECT_ID, 'beyondwords_podcast_id' => BEYONDWORDS_TESTS_CONTENT_ID, ], ]); - $filter = function($html, $postId, $projectId, $contentId) { - return sprintf( - '
%s
', - $postId, - $projectId, - $contentId, - $html - ); - }; + setup_postdata($post); - add_filter('beyondwords_player_html', $filter, 10, 4); + $output = Player::replaceLegacyCustomPlayer($content); - $html = Player::playerHtml($post); + // Replacement only happens when is_singular() + $this->assertSame($content, $output); - remove_filter('beyondwords_player_html', $filter, 10, 4); + $this->go_to("/?p={$post->ID}"); - $crawler = new Crawler($html); + $output = Player::replaceLegacyCustomPlayer($content); - //
- $wrapper = $crawler->filter('#wrapper'); - $this->assertCount(1, $wrapper); - $this->assertSame("$post->ID", $wrapper->attr('data-post-id')); - $this->assertSame(BEYONDWORDS_TESTS_PROJECT_ID, $wrapper->attr('data-project-id')); - $this->assertSame(BEYONDWORDS_TESTS_CONTENT_ID, $wrapper->attr('data-podcast-id')); + // We are now is_singular() so player div should be replaced with player shortcode + $this->assertSame("

Before

\n[beyondwords_player]\n

After

", $output); - $this->assertCount(1, $wrapper->filter('div[data-beyondwords-player="true"][contenteditable="false"]')); + wp_reset_postdata(); wp_delete_post($post->ID, true); } /** * @test + * @group player */ - public function ampPlayerHtml() { - - $postId = self::factory()->post->create([ - 'post_title' => 'PlayerTest::ampPlayerHtml', - 'meta_input' => [ - 'beyondwords_project_id' => BEYONDWORDS_TESTS_PROJECT_ID, - 'beyondwords_podcast_id' => BEYONDWORDS_TESTS_CONTENT_ID, - ], - ]); - - $src = "https://audio.beyondwords.io/amp/" . BEYONDWORDS_TESTS_PROJECT_ID . "?podcast_id=" . BEYONDWORDS_TESTS_CONTENT_ID; - - $html = Player::ampPlayerHtml($postId, BEYONDWORDS_TESTS_PROJECT_ID, BEYONDWORDS_TESTS_CONTENT_ID); - - $crawler = new Crawler($html); - - // - $iframe = $crawler->filter('amp-iframe'); - $this->assertCount(1, $iframe); - $this->assertSame('0', $iframe->attr('frameborder')); - $this->assertSame('43', $iframe->attr('height')); - $this->assertSame('responsive', $iframe->attr('layout')); - $this->assertSame('allow-scripts allow-same-origin allow-popups', $iframe->attr('sandbox')); - $this->assertSame('no', $iframe->attr('scrolling')); - $this->assertSame($src, $iframe->attr('src')); - $this->assertSame('295', $iframe->attr('width')); - - // - $img = $iframe->filter('amp-img'); - $this->assertCount(1, $img); - $this->assertSame('150', $img->attr('height')); - $this->assertSame('responsive', $img->attr('layout')); - $this->assertSame('', $img->attr('placeholder')); - $this->assertSame(Environment::getAmpImgUrl(), $img->attr('src')); - $this->assertSame('643', $img->attr('width')); - - wp_delete_post($postId, true); - } - - /** - * @test - */ - public function isPlayerEnabled() + public function renderPlayer() { - $post = self::factory()->post->create_and_get([ - 'post_title' => 'PlayerTest::isPlayerEnabled', - 'meta_input' => [ - 'beyondwords_project_id' => BEYONDWORDS_TESTS_PROJECT_ID, - 'beyondwords_podcast_id' => BEYONDWORDS_TESTS_CONTENT_ID, - ], - ]); - - $this->assertFalse(Player::isPlayerEnabled()); - $this->assertFalse(Player::isPlayerEnabled(0)); - $this->assertFalse(Player::isPlayerEnabled(false)); - - $this->assertTrue(Player::isPlayerEnabled($post)); - $this->assertTrue(Player::isPlayerEnabled($post->ID)); + global $post; - update_post_meta($post->ID, 'beyondwords_disabled', 1); + // Case 1: No post set, should return empty string + $this->assertSame('', Player::renderPlayer()); - $this->assertFalse(Player::isPlayerEnabled($post->ID)); + // Case 2: Post is not a WP_Post instance, should return empty string + $post = null; + $this->assertSame('', Player::renderPlayer()); - wp_delete_post($post->ID, true); - } - - /** - * @test - */ - public function jsPlayerParams() - { + // Case 3: Post exists but player is disabled via option $post = self::factory()->post->create_and_get([ - 'post_title' => 'PlayerTest::jsPlayerParams', + 'post_title' => 'PlayerTest::renderPlayer', 'meta_input' => [ 'beyondwords_project_id' => BEYONDWORDS_TESTS_PROJECT_ID, 'beyondwords_podcast_id' => BEYONDWORDS_TESTS_CONTENT_ID, ], ]); + update_option(PlayerUI::OPTION_NAME, PlayerUI::DISABLED); + setup_postdata($post); + $this->assertSame('', Player::renderPlayer()); - $params = Player::jsPlayerParams($post); - - $this->assertEquals($params->projectId, BEYONDWORDS_TESTS_PROJECT_ID); - $this->assertEquals($params->contentId, BEYONDWORDS_TESTS_CONTENT_ID); - $this->assertEquals($params->playerStyle, 'standard'); + // Case 4: Post exists but player is disabled via post meta + update_option(PlayerUI::OPTION_NAME, PlayerUI::ENABLED); + update_post_meta($post->ID, 'beyondwords_disabled', '1'); + $this->assertSame('', Player::renderPlayer()); - $this->assertObjectNotHasProperty('playerType', $params); - $this->assertObjectNotHasProperty('skBackend', $params); - $this->assertObjectNotHasProperty('processingStatus', $params); - $this->assertObjectNotHasProperty('apiWriteKey', $params); + // Case 5: Post exists, player enabled, should render player HTML + delete_post_meta($post->ID, 'beyondwords_disabled'); + $this->assertSame(self::PLAYER_HTML, Player::renderPlayer()); + wp_reset_postdata(); wp_delete_post($post->ID, true); } /** * @test + * @group player */ - public function playerSdkParamsFilter() + public function isEnabled() { - $post = self::factory()->post->create_and_get([ - 'post_title' => 'PlayerTest::playerSdkParamsFilter', - 'meta_input' => [ - 'beyondwords_project_id' => BEYONDWORDS_TESTS_PROJECT_ID, - 'beyondwords_podcast_id' => BEYONDWORDS_TESTS_CONTENT_ID, - ], - ]); + update_option(PlayerUI::OPTION_NAME, PlayerUI::DISABLED); - $filter = function($params) { - $params['projectId'] = 4321; - $params['contentId'] = 87654321; - $params['playerStyle'] = 'screen'; - $params['playerContent'] = 'custom content value'; - $params['myCustomParam'] = 'my custom value'; + $post = self::factory()->post->create_and_get(); - return $params; - }; + $this->assertFalse(Player::isEnabled($post)); - add_filter('beyondwords_player_sdk_params', $filter, 10); + delete_option(PlayerUI::OPTION_NAME); - $params = Player::jsPlayerParams($post); + $this->assertTrue(Player::isEnabled($post)); - remove_filter('beyondwords_player_sdk_params', $filter, 10); + update_post_meta($post->ID, 'beyondwords_disabled', '1'); - $this->assertEquals($params->projectId, 4321); - $this->assertEquals($params->contentId, 87654321); - $this->assertEquals($params->playerStyle, 'screen'); - $this->assertEquals($params->playerContent, 'custom content value'); - $this->assertEquals($params->myCustomParam, 'my custom value'); + $this->assertFalse(Player::isEnabled($post)); wp_delete_post($post->ID, true); } - /** - * @test - */ - public function enqueueScripts() - { - global $wp_scripts; - - $postId = self::factory()->post->create([ - 'post_title' => 'PlayerTest::enqueueScripts', - 'meta_input' => [ - 'beyondwords_project_id' => BEYONDWORDS_TESTS_PROJECT_ID, - 'beyondwords_podcast_id' => BEYONDWORDS_TESTS_CONTENT_ID, - ], - ]); - - $this->assertNull($wp_scripts); - - $this->go_to("/"); - Player::enqueueScripts( 'front.php' ); - $this->assertNull($wp_scripts); - - $this->go_to("/wp-admin/options.php"); - Player::enqueueScripts( 'options.php' ); - $this->assertNull($wp_scripts); - - $this->go_to("/wp-admin/post.php"); - Player::enqueueScripts( 'post.php' ); - $this->assertNull($wp_scripts); - - $this->go_to("/wp-admin/post-new.php"); - Player::enqueueScripts( 'post-new.php' ); - $this->assertNull($wp_scripts); - - $this->go_to("/?p={$postId}"); - Player::enqueueScripts( 'single.php' ); - $this->assertContains('beyondwords-sdk', $wp_scripts->queue); - - $wp_scripts = null; - - } /** * @test - * @dataProvider scriptLoaderTagProvider + * @group player + * + * @dataProvider contentProvider */ - public function scriptLoaderTag($postArgs, $tag, $handle, $src, $expect) + public function hasCustomPlayer($expect, $content) { - global $post; - - set_current_screen('/wp-admin/front'); - - $post = self::factory()->post->create_and_get($postArgs); - - setup_postdata($post); - - $output = Player::scriptLoaderTag($tag, $handle, $src); - $output = trim($output); - - // Trim new lines and whitespace - $output = trim(preg_replace('/\s\s+/', ' ', $output)); - - $this->assertEquals($expect, $output); - - wp_reset_postdata(); - - wp_delete_post($post->ID, true); + $this->assertEquals($expect, Player::hasCustomPlayer($content)); } - public function scriptLoaderTagProvider() + public function contentProvider() { - $tag = ''; - $handle = 'beyondwords-sdk'; - $src = 'https://proxy.beyondwords.io/npm/@beyondwords/beyondwords-audio-player-v2@latest/dist/module/index.js'; - - $playerScript = ''; - return [ - 'invalid handle' => [ - 'postArgs' => [ - 'post_title' => 'PlayerTest::scriptLoaderTag::1', - 'meta_input' => [ - 'beyondwords_project_id' => BEYONDWORDS_TESTS_PROJECT_ID, - 'beyondwords_podcast_id' => BEYONDWORDS_TESTS_CONTENT_ID, - ], - ], - 'tag' => $tag, - 'handle' => 'an-invalid-handle', - 'src' => $src, - 'expect' => $tag, - ], - 'no post' => [ - 'postArgs' => null, - 'tag' => $tag, - 'handle' => $handle, - 'src' => $src, - 'expect' => '', - ], - 'No Content ID' => [ - 'postArgs' => [ - 'post_title' => 'PlayerTest::scriptLoaderTag::2', - 'meta_input' => [ - 'beyondwords_project_id' => BEYONDWORDS_TESTS_PROJECT_ID, - ], - ], - 'tag' => $tag, - 'handle' => $handle, - 'src' => $src, - 'expect' => '', - ], - 'No Project ID' => [ - 'postArgs' => [ - 'post_title' => 'PlayerTest::scriptLoaderTag::3', - 'meta_input' => [ - 'beyondwords_podcast_id' => BEYONDWORDS_TESTS_CONTENT_ID, - ], - ], - 'tag' => $tag, - 'handle' => $handle, - 'src' => $src, - 'expect' => '', - ], - 'Post with everything we need' => [ - 'postArgs' => [ - 'post_title' => 'PlayerTest::scriptLoaderTag::4', - 'meta_input' => [ - 'beyondwords_project_id' => BEYONDWORDS_TESTS_PROJECT_ID, - 'beyondwords_podcast_id' => BEYONDWORDS_TESTS_CONTENT_ID, - ], - ], - 'tag' => $tag, - 'handle' => $handle, - 'src' => $src, - 'expect' => $playerScript, - ], - 'Page with everything we need' => [ - 'postArgs' => [ - 'post_title' => 'PlayerTest::scriptLoaderTag::5', - 'post_type' => 'page', - 'meta_input' => [ - 'beyondwords_project_id' => BEYONDWORDS_TESTS_PROJECT_ID, - 'beyondwords_podcast_id' => BEYONDWORDS_TESTS_CONTENT_ID, - ], - ], - 'tag' => $tag, - 'handle' => $handle, - 'src' => $src, - 'expect' => $playerScript, - ], + 'No player' => [false, '

No player.

'], + 'Legacy player' => [true, '

Before.

After.

'], + 'Legacy player with contenteditable attribute' => [true, '

Before.

After.

'], + 'New player shortcode' => [true, '

Before.

[beyondwords_player]

After.

'], + 'New player shortcode with project_id attribute' => [true, '

Before.

[beyondwords_player project_id="1234"]

After.

'], ]; } } diff --git a/tests/phpunit/Core/UninstallerTest.php b/tests/phpunit/Core/UninstallerTest.php index f0de4384..97756529 100644 --- a/tests/phpunit/Core/UninstallerTest.php +++ b/tests/phpunit/Core/UninstallerTest.php @@ -42,6 +42,8 @@ public function cleanupPluginOptions($name) public function optionNamesProvider() { return [ + // v6.0 Client-side integration + 'beyondwords_integration_method' => ['beyondwords_integration_method'], // v5.3 player content (loadContentAs) 'beyondwords_player_content' => ['beyondwords_player_content'], // v5.0 player settings @@ -106,6 +108,8 @@ public function cleanupCustomFields() $numPosts = 10; $customFields = [ + // v6.0 Client-side integration + 'beyondwords_integration_method' => 'beyondwords_integration_method', // v4.x New API 'beyondwords_content_id' => 'beyondwords_content_id', 'beyondwords_language_id' => 'beyondwords_language_id', @@ -164,7 +168,7 @@ public function cleanupCustomFields() $this->assertEquals('foo', get_post_meta($postId, 'beyondwords_prefixed_field', true)); $this->assertEquals('bar', get_post_meta($postId, 'another_custom_field', true)); - wp_delete_post($postId); + wp_delete_post($postId, true); } } } diff --git a/tests/phpunit/Settings/Fields/PlayerUI/PlayerUITest.php b/tests/phpunit/Settings/Fields/PlayerUI/PlayerUITest.php index 390dee33..878c78f0 100644 --- a/tests/phpunit/Settings/Fields/PlayerUI/PlayerUITest.php +++ b/tests/phpunit/Settings/Fields/PlayerUI/PlayerUITest.php @@ -85,11 +85,13 @@ public function render() $this->assertCount(3, $field->filter('option')); - $this->assertSame('enabled', $field->filter('option:nth-child(1)')->attr('value')); + $this->assertSame(PlayerUI::ENABLED, $field->filter('option:nth-child(1)')->attr('value')); $this->assertSame('Enabled', $field->filter('option:nth-child(1)')->text()); - $this->assertSame('headless', $field->filter('option:nth-child(2)')->attr('value')); + + $this->assertSame(PlayerUI::HEADLESS, $field->filter('option:nth-child(2)')->attr('value')); $this->assertSame('Headless', $field->filter('option:nth-child(2)')->text()); - $this->assertSame('disabled', $field->filter('option:nth-child(3)')->attr('value')); + + $this->assertSame(PlayerUI::DISABLED, $field->filter('option:nth-child(3)')->attr('value')); $this->assertSame('Disabled', $field->filter('option:nth-child(3)')->text()); } } diff --git a/yarn.lock b/yarn.lock index 0359c2d8..d78adb49 100644 --- a/yarn.lock +++ b/yarn.lock @@ -56,7 +56,7 @@ resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.8.tgz" integrity sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ== -"@babel/core@^7.0.0", "@babel/core@^7.0.0-0", "@babel/core@^7.0.0-0 || ^8.0.0-0 <8.0.0", "@babel/core@^7.11.0", "@babel/core@^7.12.0", "@babel/core@^7.13.0", "@babel/core@^7.4.0 || ^8.0.0-0 <8.0.0", "@babel/core@^7.8.0", "@babel/core@>=7", "@babel/core@7.25.7": +"@babel/core@7.25.7": version "7.25.7" resolved "https://registry.npmjs.org/@babel/core/-/core-7.25.7.tgz" integrity sha512-yJ474Zv3cwiSOO9nXJuqzvwEeM+chDuQ8GJirw+pZ91sCGCyOZ3dJkVE09fTV0VEVzXyLWhh3G/AolYTPX7Mow== @@ -77,70 +77,7 @@ json5 "^2.2.3" semver "^6.3.1" -"@babel/core@^7.11.6": - version "7.26.9" - resolved "https://registry.npmjs.org/@babel/core/-/core-7.26.9.tgz" - integrity sha512-lWBYIrF7qK5+GjY5Uy+/hEgp8OJWOD/rpy74GplYRhEauvbHDeFB8t5hPOZxCZ0Oxf4Cc36tK51/l3ymJysrKw== - dependencies: - "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.26.2" - "@babel/generator" "^7.26.9" - "@babel/helper-compilation-targets" "^7.26.5" - "@babel/helper-module-transforms" "^7.26.0" - "@babel/helpers" "^7.26.9" - "@babel/parser" "^7.26.9" - "@babel/template" "^7.26.9" - "@babel/traverse" "^7.26.9" - "@babel/types" "^7.26.9" - convert-source-map "^2.0.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.3" - semver "^6.3.1" - -"@babel/core@^7.12.3": - version "7.26.9" - resolved "https://registry.npmjs.org/@babel/core/-/core-7.26.9.tgz" - integrity sha512-lWBYIrF7qK5+GjY5Uy+/hEgp8OJWOD/rpy74GplYRhEauvbHDeFB8t5hPOZxCZ0Oxf4Cc36tK51/l3ymJysrKw== - dependencies: - "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.26.2" - "@babel/generator" "^7.26.9" - "@babel/helper-compilation-targets" "^7.26.5" - "@babel/helper-module-transforms" "^7.26.0" - "@babel/helpers" "^7.26.9" - "@babel/parser" "^7.26.9" - "@babel/template" "^7.26.9" - "@babel/traverse" "^7.26.9" - "@babel/types" "^7.26.9" - convert-source-map "^2.0.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.3" - semver "^6.3.1" - -"@babel/core@^7.21.3": - version "7.26.9" - resolved "https://registry.npmjs.org/@babel/core/-/core-7.26.9.tgz" - integrity sha512-lWBYIrF7qK5+GjY5Uy+/hEgp8OJWOD/rpy74GplYRhEauvbHDeFB8t5hPOZxCZ0Oxf4Cc36tK51/l3ymJysrKw== - dependencies: - "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.26.2" - "@babel/generator" "^7.26.9" - "@babel/helper-compilation-targets" "^7.26.5" - "@babel/helper-module-transforms" "^7.26.0" - "@babel/helpers" "^7.26.9" - "@babel/parser" "^7.26.9" - "@babel/template" "^7.26.9" - "@babel/traverse" "^7.26.9" - "@babel/types" "^7.26.9" - convert-source-map "^2.0.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.3" - semver "^6.3.1" - -"@babel/core@^7.23.9": +"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.21.3", "@babel/core@^7.23.9": version "7.26.9" resolved "https://registry.npmjs.org/@babel/core/-/core-7.26.9.tgz" integrity sha512-lWBYIrF7qK5+GjY5Uy+/hEgp8OJWOD/rpy74GplYRhEauvbHDeFB8t5hPOZxCZ0Oxf4Cc36tK51/l3ymJysrKw== @@ -844,17 +781,6 @@ dependencies: "@babel/plugin-transform-react-jsx" "^7.25.9" -"@babel/plugin-transform-react-jsx@^7.25.9": - version "7.25.9" - resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.9.tgz" - integrity sha512-s5XwpQYCqGerXl+Pu6VDL3x0j2d82eiV77UJ8a2mDHAW7j9SWRqQ2y1fNo1Z74CdcYipl5Z41zvjj4Nfzq36rw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.25.9" - "@babel/helper-module-imports" "^7.25.9" - "@babel/helper-plugin-utils" "^7.25.9" - "@babel/plugin-syntax-jsx" "^7.25.9" - "@babel/types" "^7.25.9" - "@babel/plugin-transform-react-jsx@7.25.7": version "7.25.7" resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.7.tgz" @@ -866,6 +792,17 @@ "@babel/plugin-syntax-jsx" "^7.25.7" "@babel/types" "^7.25.7" +"@babel/plugin-transform-react-jsx@^7.25.9": + version "7.25.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.25.9.tgz" + integrity sha512-s5XwpQYCqGerXl+Pu6VDL3x0j2d82eiV77UJ8a2mDHAW7j9SWRqQ2y1fNo1Z74CdcYipl5Z41zvjj4Nfzq36rw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.25.9" + "@babel/helper-module-imports" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/plugin-syntax-jsx" "^7.25.9" + "@babel/types" "^7.25.9" + "@babel/plugin-transform-react-pure-annotations@^7.25.9": version "7.25.9" resolved "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.25.9.tgz" @@ -987,81 +924,6 @@ "@babel/helper-create-regexp-features-plugin" "^7.25.9" "@babel/helper-plugin-utils" "^7.25.9" -"@babel/preset-env@^7.20.2": - version "7.26.9" - resolved "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.26.9.tgz" - integrity sha512-vX3qPGE8sEKEAZCWk05k3cpTAE3/nOYca++JA+Rd0z2NCNzabmYvEiSShKzm10zdquOIAVXsy2Ei/DTW34KlKQ== - dependencies: - "@babel/compat-data" "^7.26.8" - "@babel/helper-compilation-targets" "^7.26.5" - "@babel/helper-plugin-utils" "^7.26.5" - "@babel/helper-validator-option" "^7.25.9" - "@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^7.25.9" - "@babel/plugin-bugfix-safari-class-field-initializer-scope" "^7.25.9" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.25.9" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.25.9" - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.25.9" - "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2" - "@babel/plugin-syntax-import-assertions" "^7.26.0" - "@babel/plugin-syntax-import-attributes" "^7.26.0" - "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" - "@babel/plugin-transform-arrow-functions" "^7.25.9" - "@babel/plugin-transform-async-generator-functions" "^7.26.8" - "@babel/plugin-transform-async-to-generator" "^7.25.9" - "@babel/plugin-transform-block-scoped-functions" "^7.26.5" - "@babel/plugin-transform-block-scoping" "^7.25.9" - "@babel/plugin-transform-class-properties" "^7.25.9" - "@babel/plugin-transform-class-static-block" "^7.26.0" - "@babel/plugin-transform-classes" "^7.25.9" - "@babel/plugin-transform-computed-properties" "^7.25.9" - "@babel/plugin-transform-destructuring" "^7.25.9" - "@babel/plugin-transform-dotall-regex" "^7.25.9" - "@babel/plugin-transform-duplicate-keys" "^7.25.9" - "@babel/plugin-transform-duplicate-named-capturing-groups-regex" "^7.25.9" - "@babel/plugin-transform-dynamic-import" "^7.25.9" - "@babel/plugin-transform-exponentiation-operator" "^7.26.3" - "@babel/plugin-transform-export-namespace-from" "^7.25.9" - "@babel/plugin-transform-for-of" "^7.26.9" - "@babel/plugin-transform-function-name" "^7.25.9" - "@babel/plugin-transform-json-strings" "^7.25.9" - "@babel/plugin-transform-literals" "^7.25.9" - "@babel/plugin-transform-logical-assignment-operators" "^7.25.9" - "@babel/plugin-transform-member-expression-literals" "^7.25.9" - "@babel/plugin-transform-modules-amd" "^7.25.9" - "@babel/plugin-transform-modules-commonjs" "^7.26.3" - "@babel/plugin-transform-modules-systemjs" "^7.25.9" - "@babel/plugin-transform-modules-umd" "^7.25.9" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.25.9" - "@babel/plugin-transform-new-target" "^7.25.9" - "@babel/plugin-transform-nullish-coalescing-operator" "^7.26.6" - "@babel/plugin-transform-numeric-separator" "^7.25.9" - "@babel/plugin-transform-object-rest-spread" "^7.25.9" - "@babel/plugin-transform-object-super" "^7.25.9" - "@babel/plugin-transform-optional-catch-binding" "^7.25.9" - "@babel/plugin-transform-optional-chaining" "^7.25.9" - "@babel/plugin-transform-parameters" "^7.25.9" - "@babel/plugin-transform-private-methods" "^7.25.9" - "@babel/plugin-transform-private-property-in-object" "^7.25.9" - "@babel/plugin-transform-property-literals" "^7.25.9" - "@babel/plugin-transform-regenerator" "^7.25.9" - "@babel/plugin-transform-regexp-modifiers" "^7.26.0" - "@babel/plugin-transform-reserved-words" "^7.25.9" - "@babel/plugin-transform-shorthand-properties" "^7.25.9" - "@babel/plugin-transform-spread" "^7.25.9" - "@babel/plugin-transform-sticky-regex" "^7.25.9" - "@babel/plugin-transform-template-literals" "^7.26.8" - "@babel/plugin-transform-typeof-symbol" "^7.26.7" - "@babel/plugin-transform-unicode-escapes" "^7.25.9" - "@babel/plugin-transform-unicode-property-regex" "^7.25.9" - "@babel/plugin-transform-unicode-regex" "^7.25.9" - "@babel/plugin-transform-unicode-sets-regex" "^7.25.9" - "@babel/preset-modules" "0.1.6-no-external-plugins" - babel-plugin-polyfill-corejs2 "^0.4.10" - babel-plugin-polyfill-corejs3 "^0.11.0" - babel-plugin-polyfill-regenerator "^0.6.1" - core-js-compat "^3.40.0" - semver "^6.3.1" - "@babel/preset-env@7.25.7": version "7.25.7" resolved "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.25.7.tgz" @@ -1151,6 +1013,81 @@ core-js-compat "^3.38.1" semver "^6.3.1" +"@babel/preset-env@^7.20.2": + version "7.26.9" + resolved "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.26.9.tgz" + integrity sha512-vX3qPGE8sEKEAZCWk05k3cpTAE3/nOYca++JA+Rd0z2NCNzabmYvEiSShKzm10zdquOIAVXsy2Ei/DTW34KlKQ== + dependencies: + "@babel/compat-data" "^7.26.8" + "@babel/helper-compilation-targets" "^7.26.5" + "@babel/helper-plugin-utils" "^7.26.5" + "@babel/helper-validator-option" "^7.25.9" + "@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^7.25.9" + "@babel/plugin-bugfix-safari-class-field-initializer-scope" "^7.25.9" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.25.9" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.25.9" + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.25.9" + "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2" + "@babel/plugin-syntax-import-assertions" "^7.26.0" + "@babel/plugin-syntax-import-attributes" "^7.26.0" + "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" + "@babel/plugin-transform-arrow-functions" "^7.25.9" + "@babel/plugin-transform-async-generator-functions" "^7.26.8" + "@babel/plugin-transform-async-to-generator" "^7.25.9" + "@babel/plugin-transform-block-scoped-functions" "^7.26.5" + "@babel/plugin-transform-block-scoping" "^7.25.9" + "@babel/plugin-transform-class-properties" "^7.25.9" + "@babel/plugin-transform-class-static-block" "^7.26.0" + "@babel/plugin-transform-classes" "^7.25.9" + "@babel/plugin-transform-computed-properties" "^7.25.9" + "@babel/plugin-transform-destructuring" "^7.25.9" + "@babel/plugin-transform-dotall-regex" "^7.25.9" + "@babel/plugin-transform-duplicate-keys" "^7.25.9" + "@babel/plugin-transform-duplicate-named-capturing-groups-regex" "^7.25.9" + "@babel/plugin-transform-dynamic-import" "^7.25.9" + "@babel/plugin-transform-exponentiation-operator" "^7.26.3" + "@babel/plugin-transform-export-namespace-from" "^7.25.9" + "@babel/plugin-transform-for-of" "^7.26.9" + "@babel/plugin-transform-function-name" "^7.25.9" + "@babel/plugin-transform-json-strings" "^7.25.9" + "@babel/plugin-transform-literals" "^7.25.9" + "@babel/plugin-transform-logical-assignment-operators" "^7.25.9" + "@babel/plugin-transform-member-expression-literals" "^7.25.9" + "@babel/plugin-transform-modules-amd" "^7.25.9" + "@babel/plugin-transform-modules-commonjs" "^7.26.3" + "@babel/plugin-transform-modules-systemjs" "^7.25.9" + "@babel/plugin-transform-modules-umd" "^7.25.9" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.25.9" + "@babel/plugin-transform-new-target" "^7.25.9" + "@babel/plugin-transform-nullish-coalescing-operator" "^7.26.6" + "@babel/plugin-transform-numeric-separator" "^7.25.9" + "@babel/plugin-transform-object-rest-spread" "^7.25.9" + "@babel/plugin-transform-object-super" "^7.25.9" + "@babel/plugin-transform-optional-catch-binding" "^7.25.9" + "@babel/plugin-transform-optional-chaining" "^7.25.9" + "@babel/plugin-transform-parameters" "^7.25.9" + "@babel/plugin-transform-private-methods" "^7.25.9" + "@babel/plugin-transform-private-property-in-object" "^7.25.9" + "@babel/plugin-transform-property-literals" "^7.25.9" + "@babel/plugin-transform-regenerator" "^7.25.9" + "@babel/plugin-transform-regexp-modifiers" "^7.26.0" + "@babel/plugin-transform-reserved-words" "^7.25.9" + "@babel/plugin-transform-shorthand-properties" "^7.25.9" + "@babel/plugin-transform-spread" "^7.25.9" + "@babel/plugin-transform-sticky-regex" "^7.25.9" + "@babel/plugin-transform-template-literals" "^7.26.8" + "@babel/plugin-transform-typeof-symbol" "^7.26.7" + "@babel/plugin-transform-unicode-escapes" "^7.25.9" + "@babel/plugin-transform-unicode-property-regex" "^7.25.9" + "@babel/plugin-transform-unicode-regex" "^7.25.9" + "@babel/plugin-transform-unicode-sets-regex" "^7.25.9" + "@babel/preset-modules" "0.1.6-no-external-plugins" + babel-plugin-polyfill-corejs2 "^0.4.10" + babel-plugin-polyfill-corejs3 "^0.11.0" + babel-plugin-polyfill-regenerator "^0.6.1" + core-js-compat "^3.40.0" + semver "^6.3.1" + "@babel/preset-modules@0.1.6-no-external-plugins": version "0.1.6-no-external-plugins" resolved "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz" @@ -1172,6 +1109,17 @@ "@babel/plugin-transform-react-jsx-development" "^7.25.9" "@babel/plugin-transform-react-pure-annotations" "^7.25.9" +"@babel/preset-typescript@7.25.7": + version "7.25.7" + resolved "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.25.7.tgz" + integrity sha512-rkkpaXJZOFN45Fb+Gki0c+KMIglk4+zZXOoMJuyEK8y8Kkc8Jd3BDmP7qPsz0zQMJj+UD7EprF+AqAXcILnexw== + dependencies: + "@babel/helper-plugin-utils" "^7.25.7" + "@babel/helper-validator-option" "^7.25.7" + "@babel/plugin-syntax-jsx" "^7.25.7" + "@babel/plugin-transform-modules-commonjs" "^7.25.7" + "@babel/plugin-transform-typescript" "^7.25.7" + "@babel/preset-typescript@^7.21.0": version "7.26.0" resolved "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.26.0.tgz" @@ -1183,16 +1131,12 @@ "@babel/plugin-transform-modules-commonjs" "^7.25.9" "@babel/plugin-transform-typescript" "^7.25.9" -"@babel/preset-typescript@7.25.7": +"@babel/runtime@7.25.7": version "7.25.7" - resolved "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.25.7.tgz" - integrity sha512-rkkpaXJZOFN45Fb+Gki0c+KMIglk4+zZXOoMJuyEK8y8Kkc8Jd3BDmP7qPsz0zQMJj+UD7EprF+AqAXcILnexw== + resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz" + integrity sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w== dependencies: - "@babel/helper-plugin-utils" "^7.25.7" - "@babel/helper-validator-option" "^7.25.7" - "@babel/plugin-syntax-jsx" "^7.25.7" - "@babel/plugin-transform-modules-commonjs" "^7.25.7" - "@babel/plugin-transform-typescript" "^7.25.7" + regenerator-runtime "^0.14.0" "@babel/runtime@^7.8.4": version "7.26.9" @@ -1201,13 +1145,6 @@ dependencies: regenerator-runtime "^0.14.0" -"@babel/runtime@7.25.7": - version "7.25.7" - resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.7.tgz" - integrity sha512-FjoyLe754PMiYsFaN5C94ttGiOmBNYTf6pLr4xXHAT5uctHb092PBszndLDR5XA/jghQvn4n7JMHl7dmTgbm9w== - dependencies: - regenerator-runtime "^0.14.0" - "@babel/template@^7.25.7", "@babel/template@^7.25.9", "@babel/template@^7.26.9", "@babel/template@^7.3.3": version "7.26.9" resolved "https://registry.npmjs.org/@babel/template/-/template-7.26.9.tgz" @@ -1243,7 +1180,7 @@ resolved "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== -"@colors/colors@^1.6.0", "@colors/colors@1.6.0": +"@colors/colors@1.6.0", "@colors/colors@^1.6.0": version "1.6.0" resolved "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz" integrity sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA== @@ -1273,10 +1210,10 @@ resolved "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-5.0.0.tgz" integrity sha512-PCqQV3c4CoVm3kdPhyeZ07VmBRdH2EpMFA/pd9OASpOEC3aXNGoqPDAZ80D0cLpMBxnmk0+yNhGsEx31hq7Gtw== -"@cypress/request@^3.0.8": - version "3.0.8" - resolved "https://registry.npmjs.org/@cypress/request/-/request-3.0.8.tgz" - integrity sha512-h0NFgh1mJmm1nr4jCwkGHwKneVYKghUyWe6TMNrk0B9zsjAJxpg8C4/+BAcmLgCPa1vj1V8rNUaILl+zYRUWBQ== +"@cypress/request@^3.0.9": + version "3.0.9" + resolved "https://registry.yarnpkg.com/@cypress/request/-/request-3.0.9.tgz#8ed6e08fea0c62998b5552301023af7268f11625" + integrity sha512-I3l7FdGRXluAS44/0NguwWlO83J18p0vlr2FYHrJkWdNYhgVoiYo61IXPqaOsL+vNxU1ZqMACzItGK3/KKDsdw== dependencies: aws-sign2 "~0.7.0" aws4 "^1.8.0" @@ -1284,7 +1221,7 @@ combined-stream "~1.0.6" extend "~3.0.2" forever-agent "~0.6.1" - form-data "~4.0.0" + form-data "~4.0.4" http-signature "~1.4.0" is-typedarray "~1.0.0" isstream "~0.1.2" @@ -1314,7 +1251,7 @@ enabled "2.0.x" kuler "^2.0.0" -"@discoveryjs/json-ext@^0.5.0", "@discoveryjs/json-ext@0.5.7": +"@discoveryjs/json-ext@0.5.7", "@discoveryjs/json-ext@^0.5.0": version "0.5.7" resolved "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz" integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== @@ -1453,7 +1390,7 @@ ansi-escapes "^4.3.2" yoctocolors-cjs "^2.1.2" -"@inquirer/confirm@^5.1.6", "@inquirer/confirm@5.1.7": +"@inquirer/confirm@5.1.7", "@inquirer/confirm@^5.1.6": version "5.1.7" resolved "https://registry.npmjs.org/@inquirer/confirm/-/confirm-5.1.7.tgz" integrity sha512-Xrfbrw9eSiHb+GsesO8TQIeHSMTP0xyvTCeeYevgZ4sKW+iz9w/47bgfG9b0niQm+xaLY2EWPBINUPldLwvYiw== @@ -1964,7 +1901,7 @@ "@nodelib/fs.stat" "2.0.5" run-parallel "^1.1.9" -"@nodelib/fs.stat@^2.0.2", "@nodelib/fs.stat@2.0.5": +"@nodelib/fs.stat@2.0.5", "@nodelib/fs.stat@^2.0.2": version "2.0.5" resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== @@ -1977,7 +1914,7 @@ "@nodelib/fs.scandir" "2.1.5" fastq "^1.6.0" -"@oclif/core@^4", "@oclif/core@4.2.9": +"@oclif/core@4.2.9", "@oclif/core@^4": version "4.2.9" resolved "https://registry.npmjs.org/@oclif/core/-/core-4.2.9.tgz" integrity sha512-cIlvpefLtorcyvnvJiOmYBqn6J6qdp/06tk54p2MddGEr0gnA7EIaQXM2UtRjf4ryDVCbIo+8IFRsW8Flt0uGA== @@ -2008,11 +1945,71 @@ dependencies: "@oclif/core" "^4" +"@parcel/watcher-android-arm64@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.1.tgz#507f836d7e2042f798c7d07ad19c3546f9848ac1" + integrity sha512-KF8+j9nNbUN8vzOFDpRMsaKBHZ/mcjEjMToVMJOhTozkDonQFFrRcfdLWn6yWKCmJKmdVxSgHiYvTCef4/qcBA== + "@parcel/watcher-darwin-arm64@2.5.1": version "2.5.1" resolved "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.1.tgz" integrity sha512-eAzPv5osDmZyBhou8PoF4i6RQXAfeKL9tjb3QzYuccXFMQU0ruIc/POh30ePnaOyD1UXdlKguHBmsTs53tVoPw== +"@parcel/watcher-darwin-x64@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.1.tgz#99f3af3869069ccf774e4ddfccf7e64fd2311ef8" + integrity sha512-1ZXDthrnNmwv10A0/3AJNZ9JGlzrF82i3gNQcWOzd7nJ8aj+ILyW1MTxVk35Db0u91oD5Nlk9MBiujMlwmeXZg== + +"@parcel/watcher-freebsd-x64@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.1.tgz#14d6857741a9f51dfe51d5b08b7c8afdbc73ad9b" + integrity sha512-SI4eljM7Flp9yPuKi8W0ird8TI/JK6CSxju3NojVI6BjHsTyK7zxA9urjVjEKJ5MBYC+bLmMcbAWlZ+rFkLpJQ== + +"@parcel/watcher-linux-arm-glibc@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.1.tgz#43c3246d6892381db473bb4f663229ad20b609a1" + integrity sha512-RCdZlEyTs8geyBkkcnPWvtXLY44BCeZKmGYRtSgtwwnHR4dxfHRG3gR99XdMEdQ7KeiDdasJwwvNSF5jKtDwdA== + +"@parcel/watcher-linux-arm-musl@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.1.tgz#663750f7090bb6278d2210de643eb8a3f780d08e" + integrity sha512-6E+m/Mm1t1yhB8X412stiKFG3XykmgdIOqhjWj+VL8oHkKABfu/gjFj8DvLrYVHSBNC+/u5PeNrujiSQ1zwd1Q== + +"@parcel/watcher-linux-arm64-glibc@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.1.tgz#ba60e1f56977f7e47cd7e31ad65d15fdcbd07e30" + integrity sha512-LrGp+f02yU3BN9A+DGuY3v3bmnFUggAITBGriZHUREfNEzZh/GO06FF5u2kx8x+GBEUYfyTGamol4j3m9ANe8w== + +"@parcel/watcher-linux-arm64-musl@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.1.tgz#f7fbcdff2f04c526f96eac01f97419a6a99855d2" + integrity sha512-cFOjABi92pMYRXS7AcQv9/M1YuKRw8SZniCDw0ssQb/noPkRzA+HBDkwmyOJYp5wXcsTrhxO0zq1U11cK9jsFg== + +"@parcel/watcher-linux-x64-glibc@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.1.tgz#4d2ea0f633eb1917d83d483392ce6181b6a92e4e" + integrity sha512-GcESn8NZySmfwlTsIur+49yDqSny2IhPeZfXunQi48DMugKeZ7uy1FX83pO0X22sHntJ4Ub+9k34XQCX+oHt2A== + +"@parcel/watcher-linux-x64-musl@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.1.tgz#277b346b05db54f55657301dd77bdf99d63606ee" + integrity sha512-n0E2EQbatQ3bXhcH2D1XIAANAcTZkQICBPVaxMeaCVBtOpBZpWJuf7LwyWPSBDITb7In8mqQgJ7gH8CILCURXg== + +"@parcel/watcher-win32-arm64@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.1.tgz#7e9e02a26784d47503de1d10e8eab6cceb524243" + integrity sha512-RFzklRvmc3PkjKjry3hLF9wD7ppR4AKcWNzH7kXR7GUe0Igb3Nz8fyPwtZCSquGrhU5HhUNDr/mKBqj7tqA2Vw== + +"@parcel/watcher-win32-ia32@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.1.tgz#2d0f94fa59a873cdc584bf7f6b1dc628ddf976e6" + integrity sha512-c2KkcVN+NJmuA7CGlaGD1qJh1cLfDnQsHjE89E60vUEMlqduHGCdCLJCID5geFVM0dOtA3ZiIO8BoEQmzQVfpQ== + +"@parcel/watcher-win32-x64@2.5.1": + version "2.5.1" + resolved "https://registry.yarnpkg.com/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.1.tgz#ae52693259664ba6f2228fa61d7ee44b64ea0947" + integrity sha512-9lHBdJITeNR++EvSQVUcaZoWupyHfXe1jZvGZ06O/5MflPcuPLtEphScIBL+AiCWBO46tDSHzWyD0uDmmZqsgA== + "@parcel/watcher@^2.4.1": version "2.5.1" resolved "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.1.tgz" @@ -2054,13 +2051,6 @@ resolved "https://registry.npmjs.org/@pkgr/core/-/core-0.1.1.tgz" integrity sha512-cq8o4cWH0ibXh9VGi5P20Tu9XF/0fFXl9EUinr9QfTM7a7p0oTA4iJRCQWppXR1Pg8dSM0UCItCkPwsk9qWWYA== -"@playwright/test@^1.49.1", "@playwright/test@>=1": - version "1.54.2" - resolved "https://registry.npmjs.org/@playwright/test/-/test-1.54.2.tgz" - integrity sha512-A+znathYxPf+72riFd1r1ovOLqsIIB0jKIoPjyK2kqEIe30/6jF6BC7QNluHuwUmsD2tv1XZVugN8GqfTMOxsA== - dependencies: - playwright "1.54.2" - "@pmmmwh/react-refresh-webpack-plugin@^0.5.11": version "0.5.15" resolved "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.15.tgz" @@ -2270,7 +2260,7 @@ "@svgr/babel-plugin-transform-react-native-svg" "8.1.0" "@svgr/babel-plugin-transform-svg-component" "8.0.0" -"@svgr/core@*", "@svgr/core@8.1.0": +"@svgr/core@8.1.0": version "8.1.0" resolved "https://registry.npmjs.org/@svgr/core/-/core-8.1.0.tgz" integrity sha512-8QqtOQT5ACVlmsvKOJNEaWmRPmcojMOzCz4Hs2BGG/toAp/K38LcsMRyLp349glq5AzJbCEeimEoxaX6v/fLrA== @@ -2425,7 +2415,7 @@ "@types/eslint" "*" "@types/estree" "*" -"@types/eslint@*", "@types/eslint@>=8.0.0": +"@types/eslint@*": version "9.6.1" resolved "https://registry.npmjs.org/@types/eslint/-/eslint-9.6.1.tgz" integrity sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag== @@ -2577,7 +2567,7 @@ dependencies: "@types/node" "*" -"@types/node@*", "@types/node@>=18": +"@types/node@*": version "22.13.8" resolved "https://registry.npmjs.org/@types/node/-/node-22.13.8.tgz" integrity sha512-G3EfaZS+iOGYWLLRCEAXdWK9my08oHNZ+FHluRiggIYJPOXzhOiDgpVCUHaUvyIC5/fj7C/p637jdzC666AOKQ== @@ -2703,7 +2693,7 @@ "@types/source-list-map" "*" source-map "^0.7.3" -"@types/webpack@^4.4.31", "@types/webpack@4.x || 5.x": +"@types/webpack@^4.4.31": version "4.41.40" resolved "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.40.tgz" integrity sha512-u6kMFSBM9HcoTpUXnL6mt2HSzftqb3JgYV6oxIgL2dl6sX6aCa5k6SOkzv5DuZjBTPUE/dJltKtwwuqrkZHpfw== @@ -2741,7 +2731,7 @@ dependencies: "@types/node" "*" -"@typescript-eslint/eslint-plugin@^5.0.0 || ^6.0.0 || ^7.0.0", "@typescript-eslint/eslint-plugin@^6.4.1": +"@typescript-eslint/eslint-plugin@^6.4.1": version "6.21.0" resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.21.0.tgz" integrity sha512-oy9+hTPCUFpngkEZUSzbf9MxI65wbKFoQYsgPdILTfbUldp5ovUuphZVe4i30emU9M/kP+T64Di0mxl7dSw3MA== @@ -2758,7 +2748,7 @@ semver "^7.5.4" ts-api-utils "^1.0.1" -"@typescript-eslint/parser@^6.0.0 || ^6.0.0-alpha", "@typescript-eslint/parser@^6.4.1": +"@typescript-eslint/parser@^6.4.1": version "6.21.0" resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.21.0.tgz" integrity sha512-tbsV1jPne5CkFQCgPBcDOt30ItF7aJoZL997JSF7MhGQqOeT3svWRYxiqlfA5RUdlHN6Fi+EI9bxqbdyAUZjYQ== @@ -2832,6 +2822,19 @@ semver "^7.5.4" ts-api-utils "^1.0.1" +"@typescript-eslint/utils@6.21.0": + version "6.21.0" + resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz" + integrity sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ== + dependencies: + "@eslint-community/eslint-utils" "^4.4.0" + "@types/json-schema" "^7.0.12" + "@types/semver" "^7.5.0" + "@typescript-eslint/scope-manager" "6.21.0" + "@typescript-eslint/types" "6.21.0" + "@typescript-eslint/typescript-estree" "6.21.0" + semver "^7.5.4" + "@typescript-eslint/utils@^5.10.0": version "5.62.0" resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.62.0.tgz" @@ -2846,19 +2849,6 @@ eslint-scope "^5.1.1" semver "^7.3.7" -"@typescript-eslint/utils@6.21.0": - version "6.21.0" - resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.21.0.tgz" - integrity sha512-NfWVaC8HP9T8cbKQxHcsJBY5YE1O33+jpMwN45qzWWaPDZgLIbo12toGMWnmhvCpd3sIxkpDw3Wv1B3dYrbDQQ== - dependencies: - "@eslint-community/eslint-utils" "^4.4.0" - "@types/json-schema" "^7.0.12" - "@types/semver" "^7.5.0" - "@typescript-eslint/scope-manager" "6.21.0" - "@typescript-eslint/types" "6.21.0" - "@typescript-eslint/typescript-estree" "6.21.0" - semver "^7.5.4" - "@typescript-eslint/visitor-keys@5.62.0": version "5.62.0" resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.62.0.tgz" @@ -2880,7 +2870,7 @@ resolved "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz" integrity sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g== -"@webassemblyjs/ast@^1.14.1", "@webassemblyjs/ast@1.14.1": +"@webassemblyjs/ast@1.14.1", "@webassemblyjs/ast@^1.14.1": version "1.14.1" resolved "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz" integrity sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ== @@ -2981,7 +2971,7 @@ "@webassemblyjs/wasm-gen" "1.14.1" "@webassemblyjs/wasm-parser" "1.14.1" -"@webassemblyjs/wasm-parser@^1.14.1", "@webassemblyjs/wasm-parser@1.14.1": +"@webassemblyjs/wasm-parser@1.14.1", "@webassemblyjs/wasm-parser@^1.14.1": version "1.14.1" resolved "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz" integrity sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ== @@ -3016,7 +3006,7 @@ resolved "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.5.tgz" integrity sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ== -"@wordpress/babel-preset-default@^8.19.1", "@wordpress/babel-preset-default@^8.28.0": +"@wordpress/babel-preset-default@^8.19.1": version "8.28.0" resolved "https://registry.npmjs.org/@wordpress/babel-preset-default/-/babel-preset-default-8.28.0.tgz" integrity sha512-exC4p+V/uD2rsHl/hS1i12CYf5lVTGrxXlpLFVub9XHmnCc5MIjl//SbxQK6pu24woC96pYptqVJdQmco6EIzA== @@ -3132,7 +3122,7 @@ "@wordpress/base-styles" "^6.4.0" autoprefixer "^10.4.20" -"@wordpress/prettier-config@^4.19.1", "@wordpress/prettier-config@^4.28.0": +"@wordpress/prettier-config@^4.19.1": version "4.28.0" resolved "https://registry.npmjs.org/@wordpress/prettier-config/-/prettier-config-4.28.0.tgz" integrity sha512-Lp6pvFZ+XgdEgO/mhL88asL74GzbZ6xdik6Nb9LTsW8psXsIX3O2t4BbGJP81EjvBujJt94kljTHEfZrgAuB8g== @@ -3260,7 +3250,7 @@ acorn-walk@^8.0.0, acorn-walk@^8.0.2: dependencies: acorn "^8.11.0" -"acorn@^6.0.0 || ^7.0.0 || ^8.0.0", acorn@^8.0.4, acorn@^8.1.0, acorn@^8.11.0, acorn@^8.14.0, acorn@^8.8.1, acorn@^8.8.2, acorn@^8.9.0: +acorn@^8.0.4, acorn@^8.1.0, acorn@^8.11.0, acorn@^8.14.0, acorn@^8.8.1, acorn@^8.8.2, acorn@^8.9.0: version "8.14.0" resolved "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz" integrity sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA== @@ -3270,11 +3260,6 @@ adm-zip@^0.5.9: resolved "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.16.tgz" integrity sha512-TGw5yVi4saajsSEgz25grObGHEUaDrniwvA2qwSC060KfqGPdglhvPMA2lPIoxs3PQIItj2iag35fONcQqgUaQ== -agent-base@^7.1.0, agent-base@^7.1.2: - version "7.1.3" - resolved "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz" - integrity sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw== - agent-base@6: version "6.0.2" resolved "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz" @@ -3282,6 +3267,11 @@ agent-base@6: dependencies: debug "4" +agent-base@^7.1.0, agent-base@^7.1.2: + version "7.1.3" + resolved "https://registry.npmjs.org/agent-base/-/agent-base-7.1.3.tgz" + integrity sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw== + aggregate-error@^3.0.0: version "3.1.0" resolved "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz" @@ -3300,13 +3290,6 @@ ajv-errors@^1.0.1: resolved "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz" integrity sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ== -ajv-formats@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz" - integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== - dependencies: - ajv "^8.0.0" - ajv-formats@3.0.1: version "3.0.1" resolved "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz" @@ -3314,6 +3297,13 @@ ajv-formats@3.0.1: dependencies: ajv "^8.0.0" +ajv-formats@^2.1.1: + version "2.1.1" + resolved "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz" + integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== + dependencies: + ajv "^8.0.0" + ajv-keywords@^3.5.2: version "3.5.2" resolved "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz" @@ -3326,27 +3316,17 @@ ajv-keywords@^5.1.0: dependencies: fast-deep-equal "^3.1.3" -ajv@^6.12.4: - version "6.12.6" - resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== - dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" - -ajv@^6.12.5, ajv@^6.9.1: - version "6.12.6" - resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" - integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== +ajv@8.17.1, ajv@^8.0.0, ajv@^8.0.1, ajv@^8.17.1, ajv@^8.9.0: + version "8.17.1" + resolved "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz" + integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g== dependencies: - fast-deep-equal "^3.1.1" - fast-json-stable-stringify "^2.0.0" - json-schema-traverse "^0.4.1" - uri-js "^4.2.2" + fast-deep-equal "^3.1.3" + fast-uri "^3.0.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" -ajv@^6.12.6, ajv@>=5.0.0: +ajv@^6.12.4, ajv@^6.12.5, ajv@^6.12.6: version "6.12.6" resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -3356,16 +3336,6 @@ ajv@^6.12.6, ajv@>=5.0.0: json-schema-traverse "^0.4.1" uri-js "^4.2.2" -ajv@^8.0.0, ajv@^8.0.1, ajv@^8.17.1, ajv@^8.5.0, ajv@^8.8.2, ajv@^8.9.0, ajv@8.17.1: - version "8.17.1" - resolved "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz" - integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g== - dependencies: - fast-deep-equal "^3.1.3" - fast-uri "^3.0.1" - json-schema-traverse "^1.0.0" - require-from-string "^2.0.2" - anafanafo@2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/anafanafo/-/anafanafo-2.0.0.tgz" @@ -3606,7 +3576,7 @@ asn1@~0.2.3: dependencies: safer-buffer "~2.1.0" -assert-plus@^1.0.0, assert-plus@1.0.0: +assert-plus@1.0.0, assert-plus@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz" integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw== @@ -3633,7 +3603,7 @@ async-function@^1.0.0: resolved "https://registry.npmjs.org/async-function/-/async-function-1.0.0.tgz" integrity sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA== -async@^3.2.0, async@^3.2.3: +async@^3.2.3: version "3.2.6" resolved "https://registry.npmjs.org/async/-/async-3.2.6.tgz" integrity sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA== @@ -3701,7 +3671,7 @@ b4a@^1.6.4: resolved "https://registry.npmjs.org/b4a/-/b4a-1.6.7.tgz" integrity sha512-OnAYlL5b7LEkALw87fUVafQw5rVR9RjwGd4KUwNQ6DrrNmaVaUCgLipfVlzrPQ4tWOR9P0IXGNOx50jYCCdSJg== -babel-jest@^29.7.0, babel-jest@29.7.0: +babel-jest@29.7.0, babel-jest@^29.7.0: version "29.7.0" resolved "https://registry.npmjs.org/babel-jest/-/babel-jest-29.7.0.tgz" integrity sha512-BrvGY3xZSwEcCzKvKsCi2GgHqDqsYkOP4/by5xCgIwGXQxIEh+8ew3gmrE1y7XRR6LHZIj6yLYnUi/mm2KXKBg== @@ -3822,7 +3792,7 @@ balanced-match@^2.0.0: resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz" integrity sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA== -bare-events@*, bare-events@^2.0.0, bare-events@^2.2.0: +bare-events@^2.0.0, bare-events@^2.2.0: version "2.5.4" resolved "https://registry.npmjs.org/bare-events/-/bare-events-2.5.4.tgz" integrity sha512-+gFfDkR8pj4/TrWCGUGWmJIkBwuxPS5F+a5yWjOHQt2hHvNZd5YLzadjmDUtFmMM4y429bnKLa8bYBMHcYdnQA== @@ -3955,12 +3925,7 @@ braces@^3.0.3, braces@~3.0.2: dependencies: fill-range "^7.1.1" -browser-stdout@^1.3.1: - version "1.3.1" - resolved "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz" - integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== - -browserslist@^4.0.0, browserslist@^4.21.10, browserslist@^4.23.0, browserslist@^4.23.3, browserslist@^4.24.0, browserslist@^4.24.4, "browserslist@>= 4.21.0": +browserslist@^4.0.0, browserslist@^4.21.10, browserslist@^4.23.0, browserslist@^4.23.3, browserslist@^4.24.0, browserslist@^4.24.4: version "4.24.4" resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz" integrity sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A== @@ -4109,11 +4074,6 @@ camelcase@^5.3.1: resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== -camelcase@^6.0.0: - version "6.3.0" - resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz" - integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA== - camelcase@^6.2.0: version "6.3.0" resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz" @@ -4148,6 +4108,14 @@ caseless@~0.12.0: resolved "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz" integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw== +chalk@4.1.2, chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.2, chalk@~4.1.2: + version "4.1.2" + resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + chalk@^2.4.2: version "2.4.2" resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" @@ -4165,14 +4133,6 @@ chalk@^3.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" -chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.2, chalk@~4.1.2, chalk@4.1.2: - version "4.1.2" - resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - change-case@^4.1.2: version "4.1.2" resolved "https://registry.npmjs.org/change-case/-/change-case-4.1.2.tgz" @@ -4236,18 +4196,11 @@ chokidar@^3.5.3: is-binary-path "~2.1.0" is-glob "~4.0.1" normalize-path "~3.0.0" - readdirp "~3.6.0" - optionalDependencies: - fsevents "~2.3.2" - -chokidar@^4.0.0: - version "4.0.3" - resolved "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz" - integrity sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA== - dependencies: - readdirp "^4.0.1" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" -chokidar@^4.0.1: +chokidar@^4.0.0: version "4.0.3" resolved "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz" integrity sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA== @@ -4424,16 +4377,16 @@ color-convert@^2.0.1: dependencies: color-name "~1.1.4" -color-name@^1.0.0, color-name@^1.1.4, color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - color-name@1.1.3: version "1.1.3" resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz" integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== +color-name@^1.0.0, color-name@^1.1.4, color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + color-string@^1.6.0: version "1.9.1" resolved "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz" @@ -4665,16 +4618,16 @@ core-js@^3.31.0: resolved "https://registry.npmjs.org/core-js/-/core-js-3.41.0.tgz" integrity sha512-SJ4/EHwS36QMJd6h/Rg+GyR4A5xE0FSI3eZ+iBVpfqf1x0eTSg1smWLHrA+2jQThZSh97fmSgFSU8B61nxosxA== -core-util-is@~1.0.0: - version "1.0.3" - resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz" - integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== - core-util-is@1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz" integrity sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ== +core-util-is@~1.0.0: + version "1.0.3" + resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz" + integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== + cosmiconfig@^7.0.0: version "7.1.0" resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz" @@ -4686,17 +4639,7 @@ cosmiconfig@^7.0.0: path-type "^4.0.0" yaml "^1.10.0" -cosmiconfig@^8.0.0: - version "8.3.6" - resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz" - integrity sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA== - dependencies: - import-fresh "^3.3.0" - js-yaml "^4.1.0" - parse-json "^5.2.0" - path-type "^4.0.0" - -cosmiconfig@^8.1.3: +cosmiconfig@^8.0.0, cosmiconfig@^8.1.3: version "8.3.6" resolved "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.3.6.tgz" integrity sha512-kcZ6+W5QzcJ3P1Mt+83OUv/oHFqZHIx8DuxG6eZ5RGMERoLqp4BuGjhHLYGK+Kf5XVkQvqBSmAy/nGWN3qDgEA== @@ -4946,12 +4889,12 @@ cypress-terminal-report@^7.1.0: process "^0.11.10" superstruct "0.14.2" -cypress@>=10.0.0, cypress@>=12, cypress@>=8.0.0, cypress@14.3.3: - version "14.3.3" - resolved "https://registry.npmjs.org/cypress/-/cypress-14.3.3.tgz" - integrity sha512-1Rz7zc9iqLww6BysaESqUhtIuaFHS7nL3wREovAKYsNhLTfX3TbcBWHWgEz70YimH2NkSOsm4oIcJJ9HYHOlew== +cypress@15.1.0: + version "15.1.0" + resolved "https://registry.yarnpkg.com/cypress/-/cypress-15.1.0.tgz#594311611e054738e61f445d5f65e7143934793b" + integrity sha512-jS4EfyOa2W5KXCN02WBdmy4bpBBmLGe+INhZeCvzRksfJuzBSYp3rNg2G+hfOwPzM+wwMwOYCo/kEnH+5RsSjA== dependencies: - "@cypress/request" "^3.0.8" + "@cypress/request" "^3.0.9" "@cypress/xvfb" "^1.2.4" "@types/sinonjs__fake-timers" "8.1.1" "@types/sizzle" "^2.3.2" @@ -4976,7 +4919,7 @@ cypress@>=10.0.0, cypress@>=12, cypress@>=8.0.0, cypress@14.3.3: extract-zip "2.0.1" figures "^3.2.0" fs-extra "^9.1.0" - getos "^3.2.1" + hasha "5.2.2" is-installed-globally "~0.4.0" lazy-ass "^1.6.0" listr2 "^3.8.3" @@ -4990,7 +4933,8 @@ cypress@>=10.0.0, cypress@>=12, cypress@>=8.0.0, cypress@14.3.3: request-progress "^3.0.0" semver "^7.7.1" supports-color "^8.1.1" - tmp "~0.2.3" + systeminformation "5.27.7" + tmp "~0.2.4" tree-kill "1.2.2" untildify "^4.0.0" yauzl "^2.10.0" @@ -5068,40 +5012,26 @@ debounce@^1.2.1: resolved "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz" integrity sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug== -debug@^2.6.9: +debug@2.6.9, debug@^2.6.9: version "2.6.9" resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: ms "2.0.0" -debug@^3.1.0: - version "3.2.7" - resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" - integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== - dependencies: - ms "^2.1.1" - -debug@^3.2.7: - version "3.2.7" - resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" - integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== - dependencies: - ms "^2.1.1" - -debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.3.5, debug@^4.3.6, debug@^4.3.7, debug@^4.4.0, debug@4: +debug@4, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4, debug@^4.3.5, debug@^4.3.6, debug@^4.3.7, debug@^4.4.0: version "4.4.0" resolved "https://registry.npmjs.org/debug/-/debug-4.4.0.tgz" integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA== dependencies: ms "^2.1.3" -debug@2.6.9: - version "2.6.9" - resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz" - integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== +debug@^3.1.0, debug@^3.2.7: + version "3.2.7" + resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz" + integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ== dependencies: - ms "2.0.0" + ms "^2.1.1" decamelize-keys@^1.1.0: version "1.1.1" @@ -5116,12 +5046,7 @@ decamelize@^1.1.0, decamelize@^1.2.0: resolved "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz" integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== -decamelize@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz" - integrity sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ== - -decimal.js@^10.4.2, decimal.js@10: +decimal.js@10, decimal.js@^10.4.2: version "10.5.0" resolved "https://registry.npmjs.org/decimal.js/-/decimal.js-10.5.0.tgz" integrity sha512-8vDa8Qxvr/+d94hSh5P3IJwI5t8/c0KsMp+g8bNw9cY2icONa5aPfvKeieW1WlG0WQYwwhJ7mjui2xtiePQSXw== @@ -5222,16 +5147,16 @@ delayed-stream@~1.0.0: resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz" integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== -depd@~1.1.2: - version "1.1.2" - resolved "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz" - integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== - depd@2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz" integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== +depd@~1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz" + integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ== + destroy@1.2.0: version "1.2.0" resolved "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz" @@ -5252,7 +5177,7 @@ detect-node@^2.0.4: resolved "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz" integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g== -devtools-protocol@*, devtools-protocol@0.0.1367902: +devtools-protocol@0.0.1367902: 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== @@ -5277,11 +5202,6 @@ diff@^5.0.0: resolved "https://registry.npmjs.org/diff/-/diff-5.2.0.tgz" integrity sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A== -diff@^7.0.0: - version "7.0.0" - resolved "https://registry.npmjs.org/diff/-/diff-7.0.0.tgz" - integrity sha512-PJWHUb1RFevKCwaFA9RlG5tCd+FO5iRh9A8HEtkmBH2Li03iJriB6m6JIN4rGz3K3JLawI7/veA1xzRKP6ISBw== - dir-glob@^3.0.1: version "3.0.1" resolved "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz" @@ -5468,7 +5388,7 @@ enhanced-resolve@^5.17.1: graceful-fs "^4.2.4" tapable "^2.2.0" -enquirer@^2.3.6, "enquirer@>= 2.3.0 < 3": +enquirer@^2.3.6: version "2.4.1" resolved "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz" integrity sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ== @@ -5647,12 +5567,12 @@ escape-html@^1.0.3, escape-html@~1.0.3: resolved "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz" integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== -escape-string-regexp@^1.0.2: - version "1.0.5" - resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" - integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== +escape-string-regexp@4.0.0, escape-string-regexp@^4.0.0: + version "4.0.0" + resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" + integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== -escape-string-regexp@^1.0.5: +escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== @@ -5662,11 +5582,6 @@ escape-string-regexp@^2.0.0: resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz" integrity sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w== -escape-string-regexp@^4.0.0, escape-string-regexp@4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz" - integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA== - escodegen@^2.0.0, escodegen@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz" @@ -5678,7 +5593,7 @@ escodegen@^2.0.0, escodegen@^2.1.0: optionalDependencies: source-map "~0.6.1" -eslint-config-prettier@*, eslint-config-prettier@^8.3.0: +eslint-config-prettier@^8.3.0: version "8.10.0" resolved "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.10.0.tgz" integrity sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg== @@ -5724,7 +5639,7 @@ eslint-plugin-import@^2.25.2: string.prototype.trimend "^1.0.8" tsconfig-paths "^3.15.0" -eslint-plugin-jest@^27.4.3, eslint-plugin-jest@>=25: +eslint-plugin-jest@^27.4.3: version "27.9.0" resolved "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.9.0.tgz" integrity sha512-QIT7FH7fNmd9n4se7FFKHbsLKGQiw885Ds6Y/sxKgCZ6natwCsXdgPOADnYVxN2QrRweF0FZWbJ6S7Rsn7llug== @@ -5809,7 +5724,7 @@ eslint-plugin-react@^7.27.0: string.prototype.matchall "^4.0.12" string.prototype.repeat "^1.0.0" -eslint-scope@^5.1.1, eslint-scope@5.1.1: +eslint-scope@5.1.1, eslint-scope@^5.1.1: version "5.1.1" resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz" integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== @@ -5835,7 +5750,7 @@ eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4 resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz" integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== -"eslint@^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 || ^9", "eslint@^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9", "eslint@^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7", "eslint@^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0", "eslint@^6.0.0 || ^7.0.0 || ^8.0.0", "eslint@^6.0.0 || ^7.0.0 || >=8.0.0", "eslint@^7.0.0 || ^8.0.0", "eslint@^7.0.0 || ^8.0.0 || ^9.0.0", "eslint@^7.5.0 || ^8.0.0 || ^9.0.0", eslint@^8.3.0, eslint@>=7, eslint@>=7.0.0, eslint@>=8, eslint@>=8.0.0: +eslint@^8.3.0: version "8.57.1" resolved "https://registry.npmjs.org/eslint/-/eslint-8.57.1.tgz" integrity sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA== @@ -5942,21 +5857,6 @@ events@^3.2.0: resolved "https://registry.npmjs.org/events/-/events-3.3.0.tgz" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== -execa@^5.0.0: - version "5.1.1" - resolved "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz" - integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== - dependencies: - cross-spawn "^7.0.3" - get-stream "^6.0.0" - human-signals "^2.1.0" - is-stream "^2.0.0" - merge-stream "^2.0.0" - npm-run-path "^4.0.1" - onetime "^5.1.2" - signal-exit "^3.0.3" - strip-final-newline "^2.0.0" - execa@4.1.0: version "4.1.0" resolved "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz" @@ -5972,6 +5872,21 @@ execa@4.1.0: signal-exit "^3.0.2" strip-final-newline "^2.0.0" +execa@^5.0.0: + version "5.1.1" + resolved "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz" + integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg== + dependencies: + cross-spawn "^7.0.3" + get-stream "^6.0.0" + human-signals "^2.1.0" + is-stream "^2.0.0" + merge-stream "^2.0.0" + npm-run-path "^4.0.1" + onetime "^5.1.2" + signal-exit "^3.0.3" + strip-final-newline "^2.0.0" + executable@^4.1.1: version "4.1.1" resolved "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz" @@ -6007,7 +5922,7 @@ expect@^29.7.0: jest-message-util "^29.7.0" jest-util "^29.7.0" -express@^4.17.3, express@4.21.2: +express@4.21.2, express@^4.17.3: version "4.21.2" resolved "https://registry.npmjs.org/express/-/express-4.21.2.tgz" integrity sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA== @@ -6058,17 +5973,7 @@ external-editor@^3.1.0: iconv-lite "^0.4.24" tmp "^0.0.33" -extract-zip@^1.6.7: - version "1.7.0" - resolved "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz" - integrity sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA== - dependencies: - concat-stream "^1.6.2" - debug "^2.6.9" - mkdirp "^0.5.4" - yauzl "^2.10.0" - -extract-zip@^2.0.1, extract-zip@2.0.1: +extract-zip@2.0.1, extract-zip@^2.0.1: version "2.0.1" resolved "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz" integrity sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg== @@ -6079,16 +5984,26 @@ extract-zip@^2.0.1, extract-zip@2.0.1: optionalDependencies: "@types/yauzl" "^2.9.1" -extsprintf@^1.2.0: - version "1.4.1" - resolved "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.1.tgz" - integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== +extract-zip@^1.6.7: + version "1.7.0" + resolved "https://registry.npmjs.org/extract-zip/-/extract-zip-1.7.0.tgz" + integrity sha512-xoh5G1W/PB0/27lXgMQyIhP5DSY/LhoCsOyZgb+6iMmRtCwVBo55uKaMoEYrDCKQhWvqEip5ZPKAc6eFNyf/MA== + dependencies: + concat-stream "^1.6.2" + debug "^2.6.9" + mkdirp "^0.5.4" + yauzl "^2.10.0" extsprintf@1.3.0: version "1.3.0" resolved "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz" integrity sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g== +extsprintf@^1.2.0: + version "1.4.1" + resolved "https://registry.npmjs.org/extsprintf/-/extsprintf-1.4.1.tgz" + integrity sha512-Wrk35e8ydCKDj/ArClo1VrPVmN8zph5V4AtHwIuHhvMXsKf73UT3BOD+azBIW+3wOJ4FhEH7zyaJCFvChjYvMA== + fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: version "3.1.3" resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz" @@ -6366,7 +6281,7 @@ forever-agent@~0.6.1: resolved "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz" integrity sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw== -form-data@^4.0.0, form-data@~4.0.0: +form-data@^4.0.0, form-data@~4.0.4: version "4.0.4" resolved "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz" integrity sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow== @@ -6431,11 +6346,6 @@ fsevents@^2.3.2, fsevents@~2.3.2: resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz" integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== -fsevents@2.3.2: - version "2.3.2" - resolved "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz" - integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA== - fsu@^1.1.1: version "1.1.1" resolved "https://registry.npmjs.org/fsu/-/fsu-1.1.1.tgz" @@ -6542,13 +6452,6 @@ get-uri@^6.0.1: data-uri-to-buffer "^6.0.2" debug "^4.3.4" -getos@^3.2.1: - version "3.2.1" - resolved "https://registry.npmjs.org/getos/-/getos-3.2.1.tgz" - integrity sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q== - dependencies: - async "^3.2.0" - getpass@^0.1.1: version "0.1.7" resolved "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz" @@ -6563,14 +6466,7 @@ glob-parent@^5.1.2, glob-parent@~5.1.2: dependencies: is-glob "^4.0.1" -glob-parent@^6.0.1: - version "6.0.2" - resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" - integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== - dependencies: - is-glob "^4.0.3" - -glob-parent@^6.0.2: +glob-parent@^6.0.1, glob-parent@^6.0.2: version "6.0.2" resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== @@ -6594,18 +6490,6 @@ glob@^10.3.7: package-json-from-dist "^1.0.0" path-scurry "^1.11.1" -glob@^10.4.5: - version "10.4.5" - resolved "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz" - integrity sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg== - dependencies: - foreground-child "^3.1.0" - jackspeak "^3.1.2" - minimatch "^9.0.4" - minipass "^7.1.2" - package-json-from-dist "^1.0.0" - path-scurry "^1.11.1" - glob@^7.0.3, glob@^7.1.3, glob@^7.1.4, glob@^7.1.6, glob@~7.2.0: version "7.2.3" resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz" @@ -6821,6 +6705,14 @@ has-tostringtag@^1.0.2: dependencies: has-symbols "^1.0.3" +hasha@5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/hasha/-/hasha-5.2.2.tgz#a48477989b3b327aea3c04f53096d816d97522a1" + integrity sha512-Hrp5vIK/xr5SkeN2onO32H0MgNZ0f17HRNH39WfL0SYUNOTZ5Lz1TJ8Pajo/87dYGEFlLMm7mIc/k/s6Bvz9HQ== + dependencies: + is-stream "^2.0.0" + type-fest "^0.8.0" + hasown@^2.0.2: version "2.0.2" resolved "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz" @@ -6828,11 +6720,6 @@ hasown@^2.0.2: dependencies: function-bind "^1.1.2" -he@^1.2.0: - version "1.2.0" - resolved "https://registry.npmjs.org/he/-/he-1.2.0.tgz" - integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== - header-case@^2.0.4: version "2.0.4" resolved "https://registry.npmjs.org/header-case/-/header-case-2.0.4.tgz" @@ -6907,16 +6794,6 @@ http-deceiver@^1.2.7: resolved "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz" integrity sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw== -http-errors@~1.6.2: - version "1.6.3" - resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz" - integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A== - dependencies: - depd "~1.1.2" - inherits "2.0.3" - setprototypeof "1.1.0" - statuses ">= 1.4.0 < 2" - http-errors@2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz" @@ -6928,6 +6805,16 @@ http-errors@2.0.0: statuses "2.0.1" toidentifier "1.0.1" +http-errors@~1.6.2: + version "1.6.3" + resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz" + integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A== + dependencies: + depd "~1.1.2" + inherits "2.0.3" + setprototypeof "1.1.0" + statuses ">= 1.4.0 < 2" + http-link-header@^1.1.1: version "1.1.3" resolved "https://registry.npmjs.org/http-link-header/-/http-link-header-1.1.3.tgz" @@ -6955,17 +6842,6 @@ http-proxy-agent@^7.0.0, http-proxy-agent@^7.0.1: agent-base "^7.1.0" debug "^4.3.4" -http-proxy-middleware@^2.0.3: - 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== - dependencies: - "@types/http-proxy" "^1.17.8" - http-proxy "^1.18.1" - is-glob "^4.0.1" - is-plain-obj "^3.0.0" - micromatch "^4.0.2" - http-proxy-middleware@3.0.3: version "3.0.3" resolved "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-3.0.3.tgz" @@ -6978,6 +6854,17 @@ http-proxy-middleware@3.0.3: is-plain-object "^5.0.0" micromatch "^4.0.8" +http-proxy-middleware@^2.0.3: + 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== + dependencies: + "@types/http-proxy" "^1.17.8" + http-proxy "^1.18.1" + is-glob "^4.0.1" + is-plain-obj "^3.0.0" + micromatch "^4.0.2" + http-proxy@^1.18.1: version "1.18.1" resolved "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz" @@ -7030,21 +6917,14 @@ human-signals@^2.1.0: resolved "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz" integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw== -iconv-lite@^0.4.24, iconv-lite@0.4.24: +iconv-lite@0.4.24, iconv-lite@^0.4.24: version "0.4.24" resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== dependencies: safer-buffer ">= 2.1.2 < 3" -iconv-lite@^0.6.3: - version "0.6.3" - resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz" - integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== - dependencies: - safer-buffer ">= 2.1.2 < 3.0.0" - -iconv-lite@0.6.3: +iconv-lite@0.6.3, iconv-lite@^0.6.3: version "0.6.3" resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz" integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw== @@ -7132,7 +7012,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3, inherits@2, inherits@2.0.4: +inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.3: version "2.0.4" resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -7142,6 +7022,11 @@ inherits@2.0.3: resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz" integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw== +ini@2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz" + integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== + ini@^1.3.4, ini@^1.3.5: version "1.3.8" resolved "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz" @@ -7152,11 +7037,6 @@ ini@~3.0.0: resolved "https://registry.npmjs.org/ini/-/ini-3.0.1.tgz" integrity sha512-it4HyVAUTKBc6m8e1iXWvXSTdndF7HbdN713+kvLrymxTaU4AUBWrJ4vEooP+V7fexnVD3LKcBshjGGPefSMUQ== -ini@2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz" - integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== - internal-slot@^1.1.0: version "1.1.0" resolved "https://registry.npmjs.org/internal-slot/-/internal-slot-1.1.0.tgz" @@ -7189,16 +7069,16 @@ ip-address@^9.0.5: jsbn "1.1.0" sprintf-js "^1.1.3" -ipaddr.js@^2.0.1: - version "2.2.0" - resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz" - integrity sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA== - ipaddr.js@1.9.1: version "1.9.1" resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz" integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== +ipaddr.js@^2.0.1: + version "2.2.0" + resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz" + integrity sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA== + irregular-plurals@^3.2.0: version "3.5.0" resolved "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-3.5.0.tgz" @@ -7411,24 +7291,12 @@ is-plain-obj@^1.1.0: resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz" integrity sha512-yvkRyxmFKEOQ4pNXCmJG5AEQNlXJS5LaONXo5/cLdTZdWvsZ1ioJEonLGAosKlMWE8lwUy/bJzMjcw8az73+Fg== -is-plain-obj@^2.1.0: - version "2.1.0" - resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz" - integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== - is-plain-obj@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz" integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA== -is-plain-object@^2.0.1: - version "2.0.4" - resolved "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz" - integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== - dependencies: - isobject "^3.0.1" - -is-plain-object@^2.0.4: +is-plain-object@^2.0.1, is-plain-object@^2.0.4: version "2.0.4" resolved "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz" integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== @@ -7878,7 +7746,7 @@ jest-resolve-dependencies@^29.7.0: jest-regex-util "^29.6.3" jest-snapshot "^29.7.0" -jest-resolve@*, jest-resolve@^29.7.0: +jest-resolve@^29.7.0: version "29.7.0" resolved "https://registry.npmjs.org/jest-resolve/-/jest-resolve-29.7.0.tgz" integrity sha512-IOVhZSrg+UvVAshDSDtHyFCCBUl/Q3AAJv8iZ6ZjnZ74xzvwuzLXid9IIIPgTnY62SJjfuupMKZsZQRsCvxEgA== @@ -8031,7 +7899,7 @@ jest-worker@^29.7.0: merge-stream "^2.0.0" supports-color "^8.0.0" -jest@*, jest@^29.6.2, jest@>=29: +jest@^29.6.2: version "29.7.0" resolved "https://registry.npmjs.org/jest/-/jest-29.7.0.tgz" integrity sha512-NIy3oAFp9shda19hy4HK0HRTWKtPJmGdnvywu01nOqNC2vZg+Z+fvJDxpMQA88eb2I9EcafcdjYgsDthnYTvGw== @@ -8041,7 +7909,7 @@ jest@*, jest@^29.6.2, jest@>=29: import-local "^3.0.2" jest-cli "^29.7.0" -joi@^17.13.3, joi@17.13.3: +joi@17.13.3, joi@^17.13.3: version "17.13.3" resolved "https://registry.npmjs.org/joi/-/joi-17.13.3.tgz" integrity sha512-otDA4ldcIx+ZXsKHWmp0YizCweVRZG96J10b0FevjfuncLO1oX59THoAmHkNubYJ+9gWsYsp5k8v4ib6oDv1fA== @@ -8082,16 +7950,16 @@ js-yaml@^4.1.0: dependencies: argparse "^2.0.1" -jsbn@~0.1.0: - version "0.1.1" - resolved "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz" - integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg== - jsbn@1.1.0: version "1.1.0" resolved "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz" integrity sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A== +jsbn@~0.1.0: + version "0.1.1" + resolved "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz" + integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg== + jsdoc-type-pratt-parser@~4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/jsdoc-type-pratt-parser/-/jsdoc-type-pratt-parser-4.0.0.tgz" @@ -8129,7 +7997,7 @@ jsdom@^20.0.0: ws "^8.11.0" xml-name-validator "^4.0.0" -jsep@^0.4.0||^1.0.0, jsep@^1.4.0: +jsep@^1.4.0: version "1.4.0" resolved "https://registry.npmjs.org/jsep/-/jsep-1.4.0.tgz" integrity sha512-B7qPcEVE3NVkmSJbaYxvv4cHkVW7DQsZz13pUMrfS8z8Q/BuShN+gcTXrUlPiGqM2/t/EEaI030bpxMqY8gMlw== @@ -8722,11 +8590,6 @@ mathml-tag-names@^2.1.3: resolved "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz" integrity sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg== -mdn-data@^2.15.0: - version "2.17.0" - resolved "https://registry.npmjs.org/mdn-data/-/mdn-data-2.17.0.tgz" - integrity sha512-VT5LJBdLRI+cc3DPXJD89PGwI8yXuciE5gZJoSPnH4yeGzMPqxwkZv3BjFSoaWpmOlJNBhVT6HKeQPcZKlNEvA== - mdn-data@2.0.28: version "2.0.28" resolved "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.28.tgz" @@ -8742,6 +8605,11 @@ mdn-data@2.12.2: resolved "https://registry.npmjs.org/mdn-data/-/mdn-data-2.12.2.tgz" integrity sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA== +mdn-data@^2.15.0: + version "2.17.0" + resolved "https://registry.npmjs.org/mdn-data/-/mdn-data-2.17.0.tgz" + integrity sha512-VT5LJBdLRI+cc3DPXJD89PGwI8yXuciE5gZJoSPnH4yeGzMPqxwkZv3BjFSoaWpmOlJNBhVT6HKeQPcZKlNEvA== + mdurl@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz" @@ -8824,33 +8692,33 @@ micromatch@^4.0.2, micromatch@^4.0.4, micromatch@^4.0.5, micromatch@^4.0.8: braces "^3.0.3" picomatch "^2.3.1" -"mime-db@>= 1.43.0 < 2": - version "1.53.0" - resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.53.0.tgz" - integrity sha512-oHlN/w+3MQ3rba9rqFr6V/ypF10LSkdwUysQL7GkXoTgIWeV+tcXGA852TBxH+gsh8UWoyhR1hKcoMJTuWflpg== - mime-db@1.52.0: version "1.52.0" resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz" integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== -mime-types@^2.1.12, mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24, mime-types@~2.1.34, mime-types@2.1.35: +"mime-db@>= 1.43.0 < 2": + version "1.53.0" + resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.53.0.tgz" + integrity sha512-oHlN/w+3MQ3rba9rqFr6V/ypF10LSkdwUysQL7GkXoTgIWeV+tcXGA852TBxH+gsh8UWoyhR1hKcoMJTuWflpg== + +mime-types@2.1.35, mime-types@^2.1.12, mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24, mime-types@~2.1.34: version "2.1.35" resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz" integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== dependencies: mime-db "1.52.0" -mime@^3.0.0: - version "3.0.0" - resolved "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz" - integrity sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A== - mime@1.6.0: version "1.6.0" resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== +mime@^3.0.0: + version "3.0.0" + resolved "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz" + integrity sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A== + mimic-fn@^2.1.0: version "2.1.0" resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz" @@ -8884,6 +8752,13 @@ minimalistic-assert@^1.0.0: resolved "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz" integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A== +minimatch@9.0.3: + version "9.0.3" + resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz" + integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== + dependencies: + brace-expansion "^2.0.1" + minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz" @@ -8912,13 +8787,6 @@ minimatch@~3.0.5: dependencies: brace-expansion "^1.1.7" -minimatch@9.0.3: - version "9.0.3" - resolved "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz" - integrity sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg== - dependencies: - brace-expansion "^2.0.1" - minimist-options@4.1.0: version "4.1.0" resolved "https://registry.npmjs.org/minimist-options/-/minimist-options-4.1.0.tgz" @@ -8938,7 +8806,7 @@ minimist@^1.2.0, minimist@^1.2.5, minimist@^1.2.6, minimist@^1.2.8: resolved "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz" integrity sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw== -mitt@^3.0.1, mitt@3.0.1: +mitt@3.0.1, mitt@^3.0.1: version "3.0.1" resolved "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz" integrity sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw== @@ -8951,43 +8819,17 @@ mixin-object@^2.0.1: for-in "^0.1.3" is-extendable "^0.1.1" -mkdirp@^0.5.4: - version "0.5.6" - resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz" - integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== - dependencies: - minimist "^1.2.6" - mkdirp@3.0.1: version "3.0.1" resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz" integrity sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg== -mocha@>=3.1.2, mocha@>=7: - version "11.7.1" - resolved "https://registry.npmjs.org/mocha/-/mocha-11.7.1.tgz" - integrity sha512-5EK+Cty6KheMS/YLPPMJC64g5V61gIR25KsRItHw6x4hEKT6Njp1n9LOlH4gpevuwMVS66SXaBBpg+RWZkza4A== +mkdirp@^0.5.4: + version "0.5.6" + resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz" + integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw== dependencies: - browser-stdout "^1.3.1" - chokidar "^4.0.1" - debug "^4.3.5" - diff "^7.0.0" - escape-string-regexp "^4.0.0" - find-up "^5.0.0" - glob "^10.4.5" - he "^1.2.0" - js-yaml "^4.1.0" - log-symbols "^4.1.0" - minimatch "^9.0.5" - ms "^2.1.3" - picocolors "^1.1.1" - serialize-javascript "^6.0.2" - strip-json-comments "^3.1.1" - supports-color "^8.1.1" - workerpool "^9.2.0" - yargs "^17.7.2" - yargs-parser "^21.1.1" - yargs-unparser "^2.0.0" + minimist "^1.2.6" mochawesome-report-generator@^6.2.0: version "6.2.0" @@ -9028,16 +8870,16 @@ mrmime@^2.0.0: resolved "https://registry.npmjs.org/mrmime/-/mrmime-2.0.1.tgz" integrity sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ== -ms@^2.1.1, ms@^2.1.3, ms@2.1.3: - version "2.1.3" - resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - ms@2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz" integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A== +ms@2.1.3, ms@^2.1.1, ms@^2.1.3: + version "2.1.3" + resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + multicast-dns@^7.2.5: version "7.2.5" resolved "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz" @@ -9051,16 +8893,16 @@ mustache@4.2.0: resolved "https://registry.npmjs.org/mustache/-/mustache-4.2.0.tgz" integrity sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ== -mute-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz" - integrity sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA== - mute-stream@0.0.8: version "0.0.8" resolved "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz" integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== +mute-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.npmjs.org/mute-stream/-/mute-stream-2.0.0.tgz" + integrity sha512-WWdIxpyjEn+FhQJQQv9aQAYlHoNVdzIzUySNV1gHUPDSdZJ3yZn7pAAbQcV7B56Mvu881q9FZV+0Vx2xC44VWA== + nanoid@^3.3.8: version "3.3.8" resolved "https://registry.npmjs.org/nanoid/-/nanoid-3.3.8.tgz" @@ -9071,16 +8913,16 @@ natural-compare@^1.4.0: resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz" integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw== -negotiator@~0.6.4: - version "0.6.4" - resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz" - integrity sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w== - negotiator@0.6.3: version "0.6.3" resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz" integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== +negotiator@~0.6.4: + version "0.6.4" + resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz" + integrity sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w== + neo-async@^2.6.2: version "2.6.2" resolved "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz" @@ -9166,7 +9008,7 @@ npm-normalize-package-bin@^1.0.1: resolved "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz" integrity sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA== -npm-package-json-lint@^6.4.0, npm-package-json-lint@>=6.0.0: +npm-package-json-lint@^6.4.0: version "6.4.0" resolved "https://registry.npmjs.org/npm-package-json-lint/-/npm-package-json-lint-6.4.0.tgz" integrity sha512-cuXAJJB1Rdqz0UO6w524matlBqDBjcNt7Ru+RDIu4y6RI1gVqiWBnylrK8sPRk81gGBA0X8hJbDXolVOoTc+sA== @@ -9340,11 +9182,6 @@ open@^8.0.9, open@^8.4.0: is-docker "^2.1.1" is-wsl "^2.2.0" -openapi-types@>=7: - version "12.1.3" - resolved "https://registry.npmjs.org/openapi-types/-/openapi-types-12.1.3.tgz" - integrity sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw== - opener@^1.5.2: version "1.5.2" resolved "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz" @@ -9635,12 +9472,7 @@ picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3, picomatch@^2.3.1: resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz" integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== -pify@^2.0.0: - version "2.3.0" - resolved "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz" - integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== - -pify@^2.2.0: +pify@^2.0.0, pify@^2.2.0: version "2.3.0" resolved "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz" integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog== @@ -9681,20 +9513,6 @@ pkg-dir@^7.0.0: dependencies: find-up "^6.3.0" -playwright-core@1.54.2: - version "1.54.2" - resolved "https://registry.npmjs.org/playwright-core/-/playwright-core-1.54.2.tgz" - integrity sha512-n5r4HFbMmWsB4twG7tJLDN9gmBUeSPcsBZiWSE4DnYz9mJMAFqr2ID7+eGC9kpEnxExJ1epttwR59LEWCk8mtA== - -playwright@1.54.2: - version "1.54.2" - resolved "https://registry.npmjs.org/playwright/-/playwright-1.54.2.tgz" - integrity sha512-Hu/BMoA1NAdRUuulyvQC0pEqZ4vQbGfn8f7wPXcnqQmM+zct9UliKxsIkLNmz/ku7LElUNqmaiv1TG/aL5ACsw== - dependencies: - playwright-core "1.54.2" - optionalDependencies: - fsevents "2.3.2" - plur@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/plur/-/plur-4.0.0.tgz" @@ -9961,14 +9779,6 @@ postcss-selector-parser@^7.0.0, postcss-selector-parser@^7.1.0: cssesc "^3.0.0" util-deprecate "^1.0.2" -postcss-selector-parser@^7.1.0: - version "7.1.0" - resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz" - integrity sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA== - dependencies: - cssesc "^3.0.0" - util-deprecate "^1.0.2" - postcss-svgo@^6.0.3: version "6.0.3" resolved "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-6.0.3.tgz" @@ -9989,7 +9799,7 @@ postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== -"postcss@^7.0.0 || ^8.0.1", postcss@^8.0.0, postcss@^8.0.9, postcss@^8.1.0, postcss@^8.2.2, postcss@^8.3.3, postcss@^8.4.21, postcss@^8.4.29, postcss@^8.4.31, postcss@^8.4.33, postcss@^8.4.5, postcss@^8.5.3: +postcss@^8.4.21, postcss@^8.4.33, postcss@^8.4.5, postcss@^8.5.3: version "8.5.3" resolved "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz" integrity sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A== @@ -10010,7 +9820,7 @@ prettier-linter-helpers@^1.0.0: dependencies: fast-diff "^1.1.2" -prettier@>=3, prettier@>=3.0.0, "prettier@npm:wp-prettier@3.0.3": +"prettier@npm:wp-prettier@3.0.3": version "3.0.3" resolved "https://registry.npmjs.org/wp-prettier/-/wp-prettier-3.0.3.tgz" integrity sha512-X4UlrxDTH8oom9qXlcjnydsjAOD2BmB6yFmvS4Z2zdTzqqpRWb+fbqrH412+l+OUXmbzJlSXjlMFYPgYG12IAA== @@ -10083,16 +9893,16 @@ proxy-agent@^6.5.0: proxy-from-env "^1.1.0" socks-proxy-agent "^8.0.5" -proxy-from-env@^1.1.0: - version "1.1.0" - resolved "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz" - integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== - proxy-from-env@1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz" integrity sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A== +proxy-from-env@^1.1.0: + version "1.1.0" + resolved "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz" + integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg== + psl@^1.1.33: version "1.15.0" resolved "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz" @@ -10183,7 +9993,7 @@ randombytes@^2.1.0: dependencies: safe-buffer "^5.1.0" -range-parser@^1.2.1, range-parser@~1.2.1, range-parser@1.2.1: +range-parser@1.2.1, range-parser@^1.2.1, range-parser@~1.2.1: version "1.2.1" resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== @@ -10198,14 +10008,6 @@ raw-body@2.5.2: iconv-lite "0.4.24" unpipe "1.0.0" -react-dom@^18.0.0: - version "18.3.1" - resolved "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz" - integrity sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw== - dependencies: - loose-envify "^1.1.0" - scheduler "^0.23.2" - react-is@^16.13.1: version "16.13.1" resolved "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz" @@ -10216,12 +10018,12 @@ react-is@^18.0.0: resolved "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz" integrity sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg== -react-refresh@^0.14.0, "react-refresh@>=0.10.0 <1.0.0": +react-refresh@^0.14.0: version "0.14.2" resolved "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.2.tgz" integrity sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA== -react@^18.0.0, react@^18.3.0, react@^18.3.1: +react@^18.3.0: version "18.3.1" resolved "https://registry.npmjs.org/react/-/react-18.3.1.tgz" integrity sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ== @@ -10247,20 +10049,7 @@ read-pkg@^5.2.0: parse-json "^5.0.0" type-fest "^0.6.0" -readable-stream@^2.0.1: - version "2.3.8" - resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz" - integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - -readable-stream@^2.2.2: +readable-stream@^2.0.1, readable-stream@^2.2.2: version "2.3.8" resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz" integrity sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA== @@ -10571,7 +10360,7 @@ safe-array-concat@^1.1.3: has-symbols "^1.1.0" isarray "^2.0.5" -safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.2, safe-buffer@>=5.1.0, safe-buffer@~5.2.0, safe-buffer@5.2.1: +safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.2, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== @@ -10603,7 +10392,7 @@ safe-stable-stringify@^2.3.1: resolved "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz" integrity sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA== -safer-buffer@^2.0.2, safer-buffer@^2.1.0, "safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@~2.1.0: +"safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0: version "2.1.2" resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== @@ -10615,7 +10404,7 @@ sass-loader@^16.0.3: dependencies: neo-async "^2.6.2" -sass@^1.3.0, sass@^1.54.0: +sass@^1.54.0: version "1.85.1" resolved "https://registry.npmjs.org/sass/-/sass-1.85.1.tgz" integrity sha512-Uk8WpxM5v+0cMR0XjX9KfRIacmSG86RH4DCCZjLU2rFh5tyutt9siAXJ7G+YfxQ99Q6wrRMbMlVl6KqUms71ag== @@ -10638,13 +10427,6 @@ saxes@^6.0.0: dependencies: xmlchars "^2.2.0" -scheduler@^0.23.2: - version "0.23.2" - resolved "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz" - integrity sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ== - dependencies: - loose-envify "^1.1.0" - schema-utils@^3.0.0: version "3.3.0" resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz" @@ -10677,36 +10459,21 @@ selfsigned@^2.1.1: "@types/node-forge" "^1.3.0" node-forge "^1" -semver@^5.3.0: +"semver@2 || 3 || 4 || 5", semver@^5.3.0: version "5.7.2" resolved "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz" integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== -semver@^6.0.0: - version "6.3.1" - resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" - integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== - -semver@^6.3.0, semver@^6.3.1: +semver@^6.0.0, semver@^6.3.0, semver@^6.3.1: version "6.3.1" resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== -semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8, semver@^7.5.3, semver@^7.5.4, semver@^7.6.3, semver@^7.7.1: - version "7.7.1" - resolved "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz" - integrity sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA== - -semver@^7.7.0: +semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8, semver@^7.5.3, semver@^7.5.4, semver@^7.6.3, semver@^7.7.0, semver@^7.7.1: version "7.7.1" resolved "https://registry.npmjs.org/semver/-/semver-7.7.1.tgz" integrity sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA== -"semver@2 || 3 || 4 || 5": - version "5.7.2" - resolved "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz" - integrity sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g== - send@0.19.0: version "0.19.0" resolved "https://registry.npmjs.org/send/-/send-0.19.0.tgz" @@ -10885,12 +10652,7 @@ signal-exit@^3.0.2, signal-exit@^3.0.3, signal-exit@^3.0.7: resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz" integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ== -signal-exit@^4.0.1: - version "4.1.0" - resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz" - integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== - -signal-exit@^4.1.0: +signal-exit@^4.0.1, signal-exit@^4.1.0: version "4.1.0" resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz" integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== @@ -10992,7 +10754,7 @@ socks@^2.8.3: ip-address "^9.0.5" smart-buffer "^4.2.0" -source-map-js@^1.0.1, source-map-js@^1.2.1, "source-map-js@>=0.6.2 <2.0.0": +"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.1, source-map-js@^1.2.1: 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== @@ -11006,14 +10768,6 @@ source-map-loader@^3.0.0: iconv-lite "^0.6.3" source-map-js "^1.0.1" -source-map-support@~0.5.20: - version "0.5.21" - resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz" - integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== - dependencies: - buffer-from "^1.0.0" - source-map "^0.6.0" - source-map-support@0.5.13: version "0.5.13" resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz" @@ -11022,6 +10776,14 @@ source-map-support@0.5.13: buffer-from "^1.0.0" source-map "^0.6.0" +source-map-support@~0.5.20: + version "0.5.21" + resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: version "0.6.1" resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" @@ -11148,16 +10910,16 @@ stackframe@^1.3.4: resolved "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz" integrity sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw== -"statuses@>= 1.4.0 < 2": - version "1.5.0" - resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz" - integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== - statuses@2.0.1: version "2.0.1" resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz" integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== +"statuses@>= 1.4.0 < 2": + version "1.5.0" + resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz" + integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA== + streamsearch@^1.1.0: version "1.1.0" resolved "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz" @@ -11173,20 +10935,6 @@ streamx@^2.15.0, streamx@^2.21.0: optionalDependencies: bare-events "^2.2.0" -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - string-format@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/string-format/-/string-format-2.0.0.tgz" @@ -11295,6 +11043,20 @@ string.prototype.trimstart@^1.0.8: define-properties "^1.2.1" es-object-atoms "^1.0.0" +string_decoder@^1.1.1: + version "1.3.0" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz" + integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== + dependencies: + safe-buffer "~5.2.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz" + integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== + dependencies: + safe-buffer "~5.1.0" + "strip-ansi-cjs@npm:strip-ansi@^6.0.1": version "6.0.1" resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" @@ -11391,7 +11153,7 @@ stylelint-scss@^6.4.0: postcss-selector-parser "^7.1.0" postcss-value-parser "^4.2.0" -stylelint@^16.0.2, stylelint@^16.1.0, stylelint@^16.6.1, stylelint@^16.8.2: +stylelint@^16.8.2: version "16.15.0" resolved "https://registry.npmjs.org/stylelint/-/stylelint-16.15.0.tgz" integrity sha512-OK6Rs7EPdcdmjqiDycadZY4fw3f5/TC1X6/tGjnF3OosbwCeNs7nG+79MCAtjEg7ckwqTJTsku08e0Rmaz5nUw== @@ -11454,21 +11216,7 @@ supports-color@^7.0.0, supports-color@^7.1.0: dependencies: has-flag "^4.0.0" -supports-color@^8: - version "8.1.1" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - -supports-color@^8.0.0: - version "8.1.1" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" - integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== - dependencies: - has-flag "^4.0.0" - -supports-color@^8.1.1: +supports-color@^8, supports-color@^8.0.0, supports-color@^8.1.1: version "8.1.1" resolved "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz" integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== @@ -11532,6 +11280,11 @@ synckit@^0.9.1: "@pkgr/core" "^0.1.0" tslib "^2.6.2" +systeminformation@5.27.7: + version "5.27.7" + resolved "https://registry.yarnpkg.com/systeminformation/-/systeminformation-5.27.7.tgz#4dc9d436419948cd5e5f076779a1298220d19a72" + integrity sha512-saaqOoVEEFaux4v0K8Q7caiauRwjXC4XbD2eH60dxHXbpKxQ8kH9Rf7Jh+nryKpOUSEFxtCdBlSUx0/lO6rwRg== + table@^6.9.0: version "6.9.0" resolved "https://registry.npmjs.org/table/-/table-6.9.0.tgz" @@ -11681,10 +11434,10 @@ tmp@^0.0.33: dependencies: os-tmpdir "~1.0.2" -tmp@~0.2.3: - version "0.2.3" - resolved "https://registry.npmjs.org/tmp/-/tmp-0.2.3.tgz" - integrity sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w== +tmp@~0.2.4: + version "0.2.5" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.5.tgz#b06bcd23f0f3c8357b426891726d16015abfd8f8" + integrity sha512-voyz6MApa1rQGUxT3E+BK7/ROe8itEx7vD8/HEvt4xwXucvQ5G5oeEiHkmHZJuBO21RpOf+YYm9MOivj709jow== tmpl@1.0.5: version "1.0.5" @@ -11732,7 +11485,7 @@ tr46@^3.0.0: dependencies: punycode "^2.1.1" -tree-kill@^1.2.2, tree-kill@1.2.2: +tree-kill@1.2.2, tree-kill@^1.2.2: version "1.2.2" resolved "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz" integrity sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A== @@ -11769,16 +11522,16 @@ tsconfig-paths@^3.15.0: minimist "^1.2.6" strip-bom "^3.0.0" +tslib@2, tslib@2.8.1, tslib@^2.0.1, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.6.2: + version "2.8.1" + resolved "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz" + integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== + tslib@^1.8.1: version "1.14.1" resolved "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.0.1, tslib@^2.0.3, tslib@^2.1.0, tslib@^2.6.2, tslib@2, tslib@2.8.1: - version "2.8.1" - resolved "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz" - integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== - tsutils@^3.21.0: version "3.21.0" resolved "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz" @@ -11815,7 +11568,7 @@ type-fest@^0.18.0: resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.18.1.tgz" integrity sha512-OIAYXk8+ISY+qTOwkHtKqzAuxchoMiD9Udx+FSGQDuiRR+PJKJHc2NJAXlbhkGwTt/4/nKZxELY1w3ReWOL8mw== -type-fest@^0.20.2, "type-fest@>=0.17.0 <5.0.0": +type-fest@^0.20.2: version "0.20.2" resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz" integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== @@ -11830,7 +11583,7 @@ type-fest@^0.6.0: resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.6.0.tgz" integrity sha512-q+MB8nYR1KDLrgr4G5yemftpMC7/QLqVndBmEEdqzmNj5dcFOO4Oo8qlwZE3ULT3+Zim1F8Kq4cBnikNhlCMlg== -type-fest@^0.8.1: +type-fest@^0.8.0, type-fest@^0.8.1: version "0.8.1" resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz" integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== @@ -11898,7 +11651,7 @@ typed-emitter@2.1.0: resolved "https://registry.npmjs.org/typed-emitter/-/typed-emitter-2.1.0.tgz" integrity sha512-g/KzbYKbH5C2vPkaXGu8DJlHrGKHLsM25Zg9WuC9pMGfuvT+X25tZQWo5fK1BjBm8+UrVE9LDCvaY0CQk+fXDA== optionalDependencies: - rxjs "*" + rxjs "^7.5.2" typed-query-selector@^2.12.0: version "2.12.0" @@ -11917,11 +11670,6 @@ typedarray@^0.0.6: resolved "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz" integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA== -"typescript@>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta", typescript@>=4.2.0, typescript@>=4.9.5, typescript@>=5: - version "5.9.2" - resolved "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz" - integrity sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A== - uc.micro@^1.0.1, uc.micro@^1.0.5: version "1.0.6" resolved "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz" @@ -11995,7 +11743,7 @@ universalify@^2.0.0: resolved "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz" integrity sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw== -unpipe@~1.0.0, unpipe@1.0.0: +unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz" integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ== @@ -12187,7 +11935,7 @@ webpack-bundle-analyzer@^4.9.1: sirv "^2.0.3" ws "^7.3.1" -webpack-cli@^5.1.4, webpack-cli@5.x.x: +webpack-cli@^5.1.4: version "5.1.4" resolved "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.4.tgz" integrity sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg== @@ -12217,7 +11965,7 @@ webpack-dev-middleware@^5.3.4: range-parser "^1.2.1" schema-utils "^4.0.0" -webpack-dev-server@^4.15.1, "webpack-dev-server@3.x || 4.x || 5.x": +webpack-dev-server@^4.15.1: version "4.15.2" resolved "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.2.tgz" integrity sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g== @@ -12267,7 +12015,7 @@ webpack-sources@^3.2.3: resolved "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz" integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== -webpack@*, "webpack@^4.0.0 || ^5.0.0", "webpack@^4.37.0 || ^5.0.0", webpack@^5.0.0, webpack@^5.1.0, webpack@^5.97.0, "webpack@>=4.43.0 <6.0.0", webpack@>=5, webpack@5.x.x: +webpack@^5.97.0: version "5.98.0" resolved "https://registry.npmjs.org/webpack/-/webpack-5.98.0.tgz" integrity sha512-UFynvx+gM44Gv9qFgj0acCQK2VE1CtdfwFdimkapco3hlPCJ/zeq73n2yVKimVbtm+TnApIugGhLJnkU6gjYXA== @@ -12296,7 +12044,7 @@ webpack@*, "webpack@^4.0.0 || ^5.0.0", "webpack@^4.37.0 || ^5.0.0", webpack@^5.0 watchpack "^2.4.1" webpack-sources "^3.2.3" -websocket-driver@^0.7.4, websocket-driver@>=0.5.1: +websocket-driver@>=0.5.1, websocket-driver@^0.7.4: version "0.7.4" resolved "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz" integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg== @@ -12444,11 +12192,6 @@ wordwrap@^1.0.0: resolved "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz" integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== -workerpool@^9.2.0: - version "9.3.3" - resolved "https://registry.npmjs.org/workerpool/-/workerpool-9.3.3.tgz" - integrity sha512-slxCaKbYjEdFT/o2rH9xS1hf4uRDch1w7Uo+apxhZ+sf/1d9e0ZVkn42kPNGP2dgjIx6YFvSevj0zHvbWe2jdw== - "wrap-ansi-cjs@npm:wrap-ansi@^7.0.0": version "7.0.0" resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz" @@ -12516,25 +12259,15 @@ write-file-atomic@^5.0.1: imurmurhash "^0.1.4" signal-exit "^4.0.1" -ws@^7.0.0: - version "7.5.10" - resolved "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz" - integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ== - -ws@^7.3.1: - version "7.5.10" - resolved "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz" - integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ== - -ws@^8.11.0, ws@^8.13.0, ws@^8.18.0, ws@8.18.1: +ws@8.18.1, ws@^8.11.0, ws@^8.13.0, ws@^8.18.0, ws@^8.18.1: version "8.18.1" resolved "https://registry.npmjs.org/ws/-/ws-8.18.1.tgz" integrity sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w== -ws@^8.18.1: - version "8.18.1" - resolved "https://registry.npmjs.org/ws/-/ws-8.18.1.tgz" - integrity sha512-RKW2aJZMXeMxVpnZ6bck+RswznaxmzdULiBr6KY7XkTnW8uvt0iT9H5DkHUChXrc+uurzwa0rVI16n/Xzjdz1w== +ws@^7.0.0, ws@^7.3.1: + version "7.5.10" + resolved "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz" + integrity sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ== xdg-basedir@^4.0.0: version "4.0.0" @@ -12593,16 +12326,6 @@ yargs-parser@^21.0.0, yargs-parser@^21.1.1: resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz" integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== -yargs-unparser@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz" - integrity sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA== - dependencies: - camelcase "^6.0.0" - decamelize "^4.0.0" - flat "^5.0.2" - is-plain-obj "^2.1.0" - yargs@^17.2.1, yargs@^17.3.0, yargs@^17.3.1, yargs@^17.7.2: version "17.7.2" resolved "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz" @@ -12639,12 +12362,12 @@ yoctocolors-cjs@^2.1.2: resolved "https://registry.npmjs.org/yoctocolors-cjs/-/yoctocolors-cjs-2.1.2.tgz" integrity sha512-cYVsTjKl8b+FrnidjibDWskAv7UKOfcwaVZdp/it9n1s9fU3IkgDbhdIRKCW4JDsAlECJY0ytoVPT3sK6kideA== -zod@^3.24.1: - version "3.24.2" - resolved "https://registry.npmjs.org/zod/-/zod-3.24.2.tgz" - integrity sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ== - zod@3.23.8: version "3.23.8" resolved "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz" integrity sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g== + +zod@^3.24.1: + version "3.24.2" + resolved "https://registry.npmjs.org/zod/-/zod-3.24.2.tgz" + integrity sha512-lY7CDW43ECgW9u1TcT3IoXHflywfVqDYze4waEz812jR/bZ8FHDsl7pFQoSZTz5N+2NqRXs8GBwnAwo3ZNxqhQ==