diff --git a/.gitignore b/.gitignore index 5747357148..4af507e57e 100644 --- a/.gitignore +++ b/.gitignore @@ -12,6 +12,7 @@ dist.zip # dependencies node_modules +/__interactive-code-batteries # IDEs and editors /.idea diff --git a/package.json b/package.json index 9ecd4bb9ac..6039479764 100644 --- a/package.json +++ b/package.json @@ -37,6 +37,17 @@ }, "private": true, "dependencies": { + "@codemirror/autocomplete": "6.4.2", + "@codemirror/commands": "6.2.2", + "@codemirror/lang-css": "6.1.1", + "@codemirror/lang-html": "6.4.2", + "@codemirror/lang-javascript": "6.1.4", + "@codemirror/lang-php": "6.0.1", + "@codemirror/lang-sql": "6.4.0", + "@codemirror/language": "6.6.0", + "@codemirror/state": "6.2.0", + "@codemirror/theme-one-dark": "6.1.1", + "@codemirror/view": "6.9.3", "classnames": "^2.3.2", "comlink": "^4.4.1", "express-fileupload": "1.4.0", @@ -47,6 +58,11 @@ "request": "2.88.2", "unzipper": "0.10.11" }, + "resolutions": { + "@codemirror/state": "6.2.0", + "@codemirror/theme-one-dark": "6.1.1", + "@codemirror/view": "6.9.3" + }, "devDependencies": { "@convex-dev/typedoc-plugin-markdown": "3.14.0", "@knodes/typedoc-plugin-pages": "0.23.1", @@ -74,11 +90,20 @@ "@types/react": "^18.0.28", "@types/react-dom": "^18.0.11", "@types/react-modal": "^3.13.1", + "@types/wordpress__block-editor": "11.5.0", + "@types/wordpress__blocks": "12.5.0", "@typescript-eslint/eslint-plugin": "^5.36.1", "@typescript-eslint/parser": "^5.36.1", "@vitejs/plugin-react": "^3.1.0", "@vitest/coverage-c8": "~0.25.8", "@vitest/ui": "^0.25.8", + "@wordpress/block-editor": "11.6.0", + "@wordpress/blocks": "12.6.0", + "@wordpress/components": "23.6.0", + "@wordpress/core-data": "6.6.0", + "@wordpress/data": "8.6.0", + "@wordpress/element": "5.6.0", + "@wordpress/notices": "3.29.0", "chalk": "5.2.0", "dts-bundle-generator": "^7.2.0", "esbuild": "^0.17.5", @@ -104,6 +129,7 @@ "react-test-renderer": "18.2.0", "rimraf": "^4.4.0", "rollup-plugin-dts": "^5.2.0", + "rollup-plugin-external-globals": "0.7.3", "rollup-plugin-ts": "^3.2.0", "ts-jest": "^29.0.5", "ts-json-schema-generator": "1.2.0", @@ -116,7 +142,8 @@ "vite": "^4.0.1", "vite-plugin-dts": "~1.7.1", "vite-plugin-eslint": "^1.8.1", - "vite-plugin-static-copy": "^0.13.1", + "vite-plugin-external": "1.2.8", + "vite-plugin-static-copy": "0.13.1", "vite-plugin-wasm": "^3.2.2", "vite-tsconfig-paths": "^4.0.2", "vitepress": "1.0.0-alpha.60", diff --git a/packages/interactive-code-block/.eslintrc.json b/packages/interactive-code-block/.eslintrc.json new file mode 100644 index 0000000000..dd6da33e2d --- /dev/null +++ b/packages/interactive-code-block/.eslintrc.json @@ -0,0 +1,18 @@ +{ + "extends": ["../../.eslintrc.json"], + "ignorePatterns": ["!**/*"], + "overrides": [ + { + "files": ["*.ts", "*.tsx", "*.js", "*.jsx"], + "rules": {} + }, + { + "files": ["*.ts", "*.tsx"], + "rules": {} + }, + { + "files": ["*.js", "*.jsx"], + "rules": {} + } + ] +} diff --git a/packages/interactive-code-block/README.md b/packages/interactive-code-block/README.md new file mode 100644 index 0000000000..eb511df802 --- /dev/null +++ b/packages/interactive-code-block/README.md @@ -0,0 +1,11 @@ +# interactive-code-block + +This library was generated with [Nx](https://nx.dev). + +## Building + +Run `nx build interactive-code-block` to build the library. + +## Running unit tests + +Run `nx test interactive-code-block` to execute the unit tests via [Jest](https://jestjs.io). diff --git a/packages/interactive-code-block/package.json b/packages/interactive-code-block/package.json new file mode 100644 index 0000000000..3d9cde34e5 --- /dev/null +++ b/packages/interactive-code-block/package.json @@ -0,0 +1,6 @@ +{ + "name": "@wp-playground/interactive-code-block", + "version": "0.0.1", + "type": "module", + "private": true +} diff --git a/packages/interactive-code-block/project.json b/packages/interactive-code-block/project.json new file mode 100644 index 0000000000..a40b8fd7f6 --- /dev/null +++ b/packages/interactive-code-block/project.json @@ -0,0 +1,55 @@ +{ + "name": "interactive-code-block", + "$schema": "../../node_modules/nx/schemas/project-schema.json", + "sourceRoot": "packages/interactive-code-block/src", + "projectType": "library", + "targets": { + "build": { + "executor": "nx:noop", + "dependsOn": ["build:zip"] + }, + "build:zip": { + "executor": "@nrwl/workspace:run-commands", + "options": { + "cwd": "dist/packages", + "commands": [ + "rm interactive-code-block.zip || true", + "zip interactive-code-block.zip -r interactive-code-block" + ] + }, + "dependsOn": ["build:bundle"] + }, + "build:bundle": { + "executor": "@nrwl/vite:build", + "outputs": ["{options.outputPath}"], + "options": { + "outputPath": "dist/packages/interactive-code-block" + } + }, + "dev": { + "executor": "@nrwl/vite:build", + "outputs": ["{options.outputPath}"], + "options": { + "outputPath": "dist/packages/interactive-code-block", + "watch": true, + "minify": false + } + }, + "test": { + "executor": "@nrwl/vite:test", + "outputs": ["coverage/packages/interactive-code-block"], + "options": { + "passWithNoTests": true, + "reportsDirectory": "../../coverage/packages/interactive-code-block" + } + }, + "lint": { + "executor": "@nrwl/linter:eslint", + "outputs": ["{options.outputFile}"], + "options": { + "lintFilePatterns": ["packages/interactive-code-block/**/*.ts"] + } + } + }, + "tags": [] +} diff --git a/packages/interactive-code-block/public/block.php b/packages/interactive-code-block/public/block.php new file mode 100644 index 0000000000..ad1b66faeb --- /dev/null +++ b/packages/interactive-code-block/public/block.php @@ -0,0 +1,115 @@ + $asset_file['files']['view'], + 'interactive-code-block-editor' => $asset_file['files']['editor'], + ]; + foreach ($scripts as $script => $file) { + wp_register_script( + $script, + plugins_url($file, __FILE__), + $deps, + '' // Version is included in the file name + ); + } + + // Load block scripts as ES modules + add_filter('script_loader_tag', function ($tag, $handle, $src) use ($scripts) { + if (!array_key_exists($handle, $scripts)) { + return $tag; + } + + // Remove any query string from the URL + $new_url = current(explode('?', $src)); + $tag = ''; + return $tag; + }, 10, 3); + + $asset_file = require plugin_dir_path(__FILE__) . 'index.asset.php'; + $deps = []; + foreach ($asset_file['dependencies'] as $dep) { + if (wp_style_is($dep, 'registered')) { + $deps[] = $dep; + } + } + + // Register block styles + $styles = [ + 'interactive-code-block' => 'view', + 'interactive-code-block-editor' => 'editor', + ]; + foreach ($styles as $style => $file) { + wp_register_style( + $style, + plugins_url('assets/' . $file . '.css', __FILE__), + $deps, + $asset_file['version'] + ); + } + + // Register the block itself + register_block_type_from_metadata(__DIR__ . '/assets/block.json', [ + 'render_callback' => function ($attributes) { + if (!isset($attributes['code'])) { + return ''; + } + + $execution_scripts = get_option(LCS_Execution_Scripts_Endpoint::OPTION_KEY, []); + $script_id = $attributes['executionScript']; + $script = $execution_scripts[$script_id] ?? ''; + + $all_libraries = lcs_get_libraries_list(); + $library_ids = array_unique( + array_merge( + $attributes['libraries'], + $script['libraries'] ?? [] + ) + ); + $libraries = array_values(array_filter($all_libraries, function ($library) use ($library_ids) { + return in_array($library['id'], $library_ids); + })); + + // The base64_decode is to prevent incorrect escaping by Gutenberg + // E.g. representing

seems + // to be a problem for Gutenberg – it will store it as + // <h1 title="&lt;div&gt; &quot;html&quot;"$gt; + return ' +
+ Loading interactive code snippet... +
+ '; + } + // Render a static code snippet while the interactive one is loading: + // Useful only for PHP and only if the PHP version >= webhost version. + // ' . highlight_string(base64_decode($attributes['code']), true) . ' + ]); +}); + + +function lce_editor_init($hook) +{ + global $current_screen; + if (!$current_screen->is_block_editor()) { + return; + } + + lce_preload_endpoints_data(); +} +add_action('admin_enqueue_scripts', 'lce_editor_init'); \ No newline at end of file diff --git a/packages/interactive-code-block/public/interactive-code-block.php b/packages/interactive-code-block/public/interactive-code-block.php new file mode 100644 index 0000000000..5b2b75e56e --- /dev/null +++ b/packages/interactive-code-block/public/interactive-code-block.php @@ -0,0 +1,115 @@ + $asset_file['files']['execution-scripts'], + 'interactive-code-block-libraries-page' => $asset_file['files']['libraries'], + ]; + foreach ($asset_file['dependencies'] as $dep) { + if (wp_script_is($dep, 'registered')) { + $deps[] = $dep; + } + } + foreach ($scripts as $script => $file) { + wp_register_script( + $script, + plugins_url($file, __FILE__), + $deps, + $asset_file['version'] + ); + } + + // Load scripts as ES modules + add_filter('script_loader_tag', function($tag, $handle, $src) use ($scripts) { + if(!array_key_exists($handle, $scripts)) { + return $tag; + } + $tag = ''; + return $tag; + }, 10, 3); + + require_once __DIR__ . '/rest-api-lcs-libraries-endpoint.php'; + $lcs_libraries_endpoint = new LCS_Libraries_Endpoint(); + add_action('rest_api_init', array($lcs_libraries_endpoint, 'register_routes')); + + require_once __DIR__ . '/rest-api-lcs-execution-scripts-endpoint.php'; + $lcs_execution_scripts = new LCS_Execution_Scripts_Endpoint(); + add_action('rest_api_init', array($lcs_execution_scripts, 'register_routes')); +}); + +function lce_setup_admin_menu() +{ + // Add a top-level menu item that has two nested items named differently than the top-level menu + add_menu_page('Interactive Code Block', 'Interactive Code Block', 'manage_options', 'interactive-code-block--execution-scripts', 'lce_execution_scripts_page', 'dashicons-editor-code', 6); + add_submenu_page('interactive-code-block--execution-scripts', 'Execution Scripts', 'Execution Scripts', 'manage_options', 'interactive-code-block--execution-scripts', 'lce_execution_scripts_page'); + add_submenu_page('interactive-code-block--execution-scripts', 'Libraries', 'Libraries', 'manage_options', 'interactive-code-block--libraries', 'lce_libraries_page'); +} + +function lce_execution_scripts_page() +{ + echo ' +

Execution Scripts

+
+ '; +} + +function lce_libraries_page() +{ + echo ' +

Phar libraries

+
+ '; +} + +add_action('admin_menu', 'lce_setup_admin_menu'); + +function load_custom_wp_admin_scripts($hook) +{ + if ('interactive-code-block_page_interactive-code-block--libraries' === $hook) { + wp_enqueue_script('interactive-code-block-libraries-page'); + wp_enqueue_style('interactive-code-block-editor'); + lce_preload_endpoints_data(); + } else if ('toplevel_page_interactive-code-block--execution-scripts' === $hook) { + wp_enqueue_script('interactive-code-block-execution-scripts-page'); + wp_enqueue_style('interactive-code-block-editor'); + lce_preload_endpoints_data(); + } +} + +add_action('admin_enqueue_scripts', 'load_custom_wp_admin_scripts'); + +function lce_preload_endpoints_data() +{ + // Preload block editor paths. + // most of these are copied from edit-forms-blocks.php. + $preload_paths = array( + '/interactive-code-block/v1/libraries?context=edit', + '/interactive-code-block/v1/execution-scripts?context=edit', + ); + $preload_data = array_reduce( + $preload_paths, + 'rest_preload_api_request', + array() + ); + wp_add_inline_script( + 'wp-api-fetch', + sprintf('wp.apiFetch.use( wp.apiFetch.createPreloadingMiddleware( %s ) );', wp_json_encode($preload_data)), + 'after' + ); +} + + +require_once __DIR__ . '/block.php'; diff --git a/packages/interactive-code-block/public/playground-sandbox.html b/packages/interactive-code-block/public/playground-sandbox.html new file mode 100644 index 0000000000..ac6bc252f3 --- /dev/null +++ b/packages/interactive-code-block/public/playground-sandbox.html @@ -0,0 +1,70 @@ + + + + + + + + + + + + diff --git a/packages/interactive-code-block/public/rest-api-lcs-execution-scripts-endpoint.php b/packages/interactive-code-block/public/rest-api-lcs-execution-scripts-endpoint.php new file mode 100644 index 0000000000..6913f1cafc --- /dev/null +++ b/packages/interactive-code-block/public/rest-api-lcs-execution-scripts-endpoint.php @@ -0,0 +1,218 @@ + 'GET', + 'callback' => [$this, 'get_execution_scripts'], + 'permission_callback' => [$this, 'has_permission'], + ]); + + register_rest_route('interactive-code-block/v1', '/execution-scripts', [ + 'methods' => 'POST', + 'callback' => [$this, 'create_execution_script'], + 'permission_callback' => [$this, 'has_permission'], + 'args' => [ + 'name' => [ + 'required' => true, + 'validate_callback' => function ($param, $request, $key) { + return is_string($param); + }, + ], + 'content' => [ + 'required' => true, + 'validate_callback' => function ($param, $request, $key) { + return is_string($param); + }, + ], + 'runner' => [ + 'required' => true, + 'validate_callback' => function ($param, $request, $key) { + return in_array($param, VALID_CODE_RUNNERS); + }, + ], + 'outputFormat' => [ + 'validate_callback' => function ($param, $request, $key) { + return in_array($param, VALID_OUTPUT_FORMATS); + }, + ], + 'libraries' => [ + 'required' => false, + 'validate_callback' => function ($param, $request, $key) { + if (!is_array($param)) { + return false; + } + foreach ($param as $library) { + if (!is_string($library)) { + return false; + } + } + return true; + }, + ], + ], + ]); + + register_rest_route('interactive-code-block/v1', '/execution-scripts/(?P[a-z0-9]+)', [ + 'methods' => 'GET', + 'callback' => [$this, 'get_execution_script'], + 'permission_callback' => [$this, 'has_permission'], + ]); + + register_rest_route('interactive-code-block/v1', '/execution-scripts/(?P[a-z0-9]+)', [ + 'methods' => 'PUT', + 'callback' => [$this, 'update_execution_script'], + 'permission_callback' => [$this, 'has_permission'], + 'args' => [ + 'name' => [ + 'validate_callback' => function ($param, $request, $key) { + return is_string($param); + }, + ], + 'runner' => [ + 'validate_callback' => function ($param, $request, $key) { + return in_array($param, VALID_CODE_RUNNERS); + }, + ], + 'outputFormat' => [ + 'validate_callback' => function ($param, $request, $key) { + return in_array($param, VALID_OUTPUT_FORMATS); + }, + ], + 'content' => [ + 'validate_callback' => function ($param, $request, $key) { + return is_string($param); + }, + ], + ], + ]); + + register_rest_route('interactive-code-block/v1', '/execution-scripts/(?P[a-z0-9]+)', [ + 'methods' => 'DELETE', + 'callback' => [$this, 'delete_execution_script'], + 'permission_callback' => [$this, 'has_permission'], + ]); + } + + public function has_permission() + { + return current_user_can('upload_files') && current_user_can('edit_posts'); + } + + public function get_execution_scripts() + { + return array_values(get_option(self::OPTION_KEY, [])); + } + + public function create_execution_script($request) + { + $scripts = get_option(self::OPTION_KEY, []); + + do { + $id = uniqid(); + } while (array_key_exists($id, $scripts)); + + $scripts[$id] = [ + 'id' => $id, + 'name' => $request->get_param('name'), + 'runner' => $request->get_param('runner'), + 'outputFormat' => $request->get_param('outputFormat'), + 'content' => $request->get_param('content'), + 'libraries' => $request->get_param('libraries') ?: [], + ]; + + update_option(self::OPTION_KEY, $scripts); + + return $scripts[$id]; + } + + public function get_execution_script($request) + { + $id = $request['id']; + $scripts = get_option(self::OPTION_KEY, []); + + if (!array_key_exists($id, $scripts)) { + return new WP_Error('rest_invalid_param', 'Execution script not found.', ['status' => 404]); + } + + return $scripts[$id]; + } + + public function update_execution_script($request) + { + $id = $request['id']; + $new_name = $request->get_param('name'); + $new_runner = $request->get_param('runner'); + $new_content = $request->get_param('content'); + $new_libraries = $request->get_param('libraries'); + + $scripts = get_option(self::OPTION_KEY, []); + + if (!array_key_exists($id, $scripts)) { + return new WP_Error('rest_invalid_param', 'Execution script not found.', ['status' => 404]); + } + + if ($new_name) { + $scripts[$id]['name'] = $new_name; + } + if ($new_runner) { + $scripts[$id]['runner'] = $new_runner; + } + if ($new_content) { + $scripts[$id]['content'] = $new_content; + } + if ($new_libraries) { + $scripts[$id]['libraries'] = $new_libraries; + } + if ($request->has_param('outputFormat')) { + $scripts[$id]['outputFormat'] = $request->get_param('outputFormat'); + } + update_option(self::OPTION_KEY, $scripts); + + return $scripts[$id]; + } + + public function delete_execution_script($request) + { + $id = $request['id']; + + $scripts = get_option(self::OPTION_KEY, []); + + if (!array_key_exists($id, $scripts)) { + return new WP_Error('rest_invalid_param', 'Execution script not found.', ['status' => 404]); + } + + unset($scripts[$id]); + update_option(self::OPTION_KEY, $scripts); + + return true; + } +} \ No newline at end of file diff --git a/packages/interactive-code-block/public/rest-api-lcs-libraries-endpoint.php b/packages/interactive-code-block/public/rest-api-lcs-libraries-endpoint.php new file mode 100644 index 0000000000..93f27c2465 --- /dev/null +++ b/packages/interactive-code-block/public/rest-api-lcs-libraries-endpoint.php @@ -0,0 +1,233 @@ +uploads_dir = wp_upload_dir()['basedir'] . static::UPLOAD_DIR_SUFFIX; + $this->uploads_url = wp_upload_dir()['baseurl'] . static::UPLOAD_DIR_SUFFIX; + + if (!file_exists($this->uploads_dir)) { + mkdir($this->uploads_dir); + } + } + + public function register_routes() + { + register_rest_route('interactive-code-block/v1', '/libraries', [ + 'methods' => 'GET', + 'callback' => [$this, 'get_libraries'], + 'permission_callback' => [$this, 'has_permission'], + ]); + + register_rest_route('interactive-code-block/v1', '/libraries', [ + 'methods' => 'POST', + 'callback' => [$this, 'upload_library'], + 'permission_callback' => [$this, 'has_permission'], + ]); + + register_rest_route('interactive-code-block/v1', '/libraries/(?P[a-z0-9]+)', [ + 'methods' => 'GET', + 'callback' => [$this, 'get_library'], + 'permission_callback' => [$this, 'has_permission'], + 'args' => [ + 'id' => [ + 'required' => true, + 'validate_callback' => [$this, 'validate_id'], + ], + ], + ]); + register_rest_route('interactive-code-block/v1', '/libraries/(?P[a-z0-9]+)', [ + 'methods' => 'DELETE', + 'callback' => [$this, 'delete_library'], + 'permission_callback' => [$this, 'has_permission'], + 'args' => [ + 'id' => [ + 'required' => true, + 'validate_callback' => [$this, 'validate_id'], + ], + ], + ]); + register_rest_route('interactive-code-block/v1', '/libraries/(?P[a-z0-9]+)', [ + 'methods' => ['PUT', 'POST'], + 'callback' => [$this, 'update_library'], + 'permission_callback' => [$this, 'has_permission'], + 'args' => [ + 'id' => [ + 'required' => true, + 'validate_callback' => [$this, 'validate_id'], + ], + 'name' => [], + ], + ]); + + } + + public function has_permission() + { + return current_user_can('upload_files') && current_user_can('edit_posts'); + } + + public function get_libraries($request) + { + return lcs_get_libraries_list(); + } + + public function upload_library($request) + { + $file = $this->sanitize_file($request); + if (is_wp_error($file)) { + return $file; + } + + // If name already stored, replace the file + $libraries = get_option(self::OPTION_KEY, []); + foreach ($libraries as $library) { + if ($library['name'] === $file['name']) { + $file_path = $this->uploads_dir . "/" . $library['id']; + if (!move_uploaded_file($file['tmp_name'], $file_path)) { + return new WP_Error('rest_server_error', 'Failed to move uploaded file.', ['status' => 500]); + } + return $library; + } + } + + do { + $file_name = uniqid(); + } while (file_exists($this->uploads_dir . $file_name)); + $file_path = $this->uploads_dir . "/$file_name"; + + // Move the uploaded file to the uploads directory + if (!move_uploaded_file($file['tmp_name'], $file_path)) { + return new WP_Error('rest_server_error', 'Failed to move uploaded file.', ['status' => 500]); + } + + // Add the file to the list of uploaded libraries + $libraries = get_option(self::OPTION_KEY, []); + $libraries[$file_name] = [ + 'id' => $file_name, + 'name' => $file['name'], + 'type' => $file['type'], + 'size' => $file['size'], + ]; + update_option(self::OPTION_KEY, $libraries); + + return $libraries[$file_name]; + } + + public function update_library($request) + { + $id = $request['id']; + + $libraries = get_option(self::OPTION_KEY, []); + if (isset($request['name'])) { + $libraries[$id]['name'] = $request['name']; + } + + if (isset($request['file'])) { + $file = $this->sanitize_file($request); + if (is_wp_error($file)) { + return $file; + } + + // Replace the previous library file + $file_path = $this->uploads_dir . "/$id"; + if (!move_uploaded_file($file['tmp_name'], $file_path)) { + return new WP_Error('rest_server_error', 'Failed to move uploaded file.', ['status' => 500]); + } + + // Update stored file details + $libraries[$id]['type'] = $file['type']; + $libraries[$id]['size'] = $file['size']; + } + update_option(self::OPTION_KEY, $libraries); + + return $libraries[$id]; + } + + public function get_library($request) + { + $id = $request['id']; + $libraries = lcs_get_libraries_list(); + return $libraries[$id]; + } + + public function delete_library($request) + { + $id = $request['id']; + + // Remove the file from the list of uploaded files + $libraries = get_option(self::OPTION_KEY, []); + unset($libraries[$id]); + update_option(self::OPTION_KEY, $libraries); + + // Delete the file from the uploads directory + unlink($this->uploads_dir . "/$id"); + + return true; + } + + public function sanitize_file($request) + { + $files = $request->get_file_params(); + + if (empty($files['file'])) { + return new WP_Error('rest_server_error', 'No file was uploaded.', ['status' => 400]); + } + + $file = $files['file']; + + if (is_wp_error($file)) { + return new WP_Error('rest_server_error', 'There was an error uploading a file.', ['status' => 400]); + } + + // Check if the uploaded file is smaller than the max size + $max_size = wp_max_upload_size(); + if ($file['size'] > $max_size) { + return new WP_Error('rest_invalid_param', 'File is too large.', ['status' => 400]); + } + + return $file; + } + + public function validate_id($id, $request, $key) + { + $files = get_option(self::OPTION_KEY, []); + + // Check if the file with the specified ID exists + if (!array_key_exists($id, $files)) { + return new WP_Error('rest_invalid_param', 'File not found.', ['status' => 404]); + } + + return true; + } + +} + +function lcs_get_libraries_list() +{ + $libraries = array_values(get_option(LCS_Libraries_Endpoint::OPTION_KEY, [])); + usort($libraries, function ($a, $b) { + return strcmp(strtolower($a['name']), strtolower($b['name'])); + }); + $uploads_url = wp_upload_dir()['baseurl'] . LCS_Libraries_Endpoint::UPLOAD_DIR_SUFFIX; + foreach ($libraries as $k => $library) { + $libraries[$k]['url'] = $uploads_url . "/{$library['id']}"; + } + return $libraries; +} \ No newline at end of file diff --git a/packages/interactive-code-block/src/lib/block/base64-utils.ts b/packages/interactive-code-block/src/lib/block/base64-utils.ts new file mode 100644 index 0000000000..d8f4985b8f --- /dev/null +++ b/packages/interactive-code-block/src/lib/block/base64-utils.ts @@ -0,0 +1,7 @@ +export function utf8ToBase64(str: string) { + return window.btoa(unescape(encodeURIComponent(str))); +} + +export function base64ToUtf8(str: string) { + return decodeURIComponent(escape(window.atob(str))); +} diff --git a/packages/interactive-code-block/src/lib/block/block.json b/packages/interactive-code-block/src/lib/block/block.json new file mode 100644 index 0000000000..bbb3a0d102 --- /dev/null +++ b/packages/interactive-code-block/src/lib/block/block.json @@ -0,0 +1,36 @@ +{ + "$schema": "https://schemas.wp.org/trunk/block.json", + "name": "wordpress-playground/interactive-code", + "title": "Interactive Code", + "icon": "shield", + "category": "common", + "attributes": { + "code": { + "type": "string" + }, + "fileType": { + "type": "string", + "enum": ["php", "sql", "js"], + "default": "php" + }, + "executionScript": { + "type": "string", + "default": "PHP" + }, + "libraries": { + "type": "array", + "default": [] + }, + "cachedOutput": { + "type": "string" + }, + "showCachedOutput": { + "type": "boolean", + "default": true + } + }, + "viewScript": "interactive-code-block", + "editorScript": "interactive-code-block-editor", + "style": "interactive-code-block", + "editorStyle": "interactive-code-block-editor" +} diff --git a/packages/interactive-code-block/src/lib/block/edit.tsx b/packages/interactive-code-block/src/lib/block/edit.tsx new file mode 100644 index 0000000000..5b18b53285 --- /dev/null +++ b/packages/interactive-code-block/src/lib/block/edit.tsx @@ -0,0 +1,229 @@ +import * as React from 'react'; +import { useCallback, useMemo } from '@wordpress/element'; +import { useEntityRecords } from '@wordpress/core-data'; +import type { BlockEditProps } from '@wordpress/blocks'; +import { BlockControls, InspectorControls } from '@wordpress/block-editor'; + +import { + ToolbarGroup, + ToggleControl, + SelectControl, + Spinner, + PanelBody, + PanelRow, +} from '@wordpress/components'; +import { settings } from '@wordpress/icons'; + +import LibrariesControl from '../components/libraries-control'; +import { InteractiveCodeSnippet } from '../components/interactive-code-snippet'; +import { base64ToUtf8, utf8ToBase64 } from './base64-utils'; +import ToolbarDropdown from '../components/toolbar-dropdown'; +import { + ExecutionScript, + Library, + InteractiveCodeSnippetBlockAttributes, +} from '../types'; +import { + getDefaultExecutionScript, + SUPPORTED_RUNNERS, +} from '../components/code-runner'; +import { WithoutGutenbergKeyboardShortcuts } from './without-gutenberg-keyboard-shortcuts'; + +// CSS isn't injected into the block editor without +// putting this asynchronous import here (this is +// probably a bug in Vite): +document.addEventListener('DOMContentLoaded', () => { + import('../components/interactive-code-snippet'); +}); + +export const SUPPORTED_HIGHLIGHTERS = [ + { label: 'PHP', value: 'php' }, + { label: 'SQL', value: 'sql' }, + { label: 'JavaScript', value: 'js' }, +]; + +export default function EditInteractiveCodeSnippet({ + attributes, + isSelected, + setAttributes, +}: BlockEditProps) { + const executionScripts = useEntityRecords( + 'interactive-code-block', + 'script' + ); + function getExecutionScript(scriptId) { + return ( + getDefaultExecutionScript(scriptId) || + executionScripts.records?.find((script) => script.id === scriptId) + ); + } + const usedExecutionScript = + getExecutionScript(attributes.executionScript) || executionScripts?.[0]; + // Reset libraries if the runner changes + const setExecutionScript = useCallback( + (newScriptName: string) => { + const newScript = getExecutionScript(newScriptName); + if ( + newScript && + usedExecutionScript?.runner !== newScript?.runner + ) { + setAttributes({ libraries: [] }); + } + setAttributes({ executionScript: newScriptName }); + }, + [usedExecutionScript] + ); + + const libraries = useEntityRecords( + 'interactive-code-block', + 'library' + ); + const usedLibraries = useMemo( + () => + libraries.records?.filter( + (library) => + attributes.libraries.includes(library.id) || + usedExecutionScript?.libraries?.includes(library.id) + ), + [attributes.libraries, libraries.hasResolved] + ); + + const handleCodeChange = useCallback((newCode: string) => { + setAttributes({ code: utf8ToBase64(newCode) }); + }, []); + + const handleCacheOutput = useCallback((output: string) => { + setAttributes({ cachedOutput: utf8ToBase64(output) }); + }, []); + + return ( + <> + + + + setAttributes({ fileType }) + } + options={SUPPORTED_HIGHLIGHTERS.map((highlighter) => ({ + label: `Highlighting: ${highlighter.label}`, + value: highlighter.value, + }))} + /> + + + + + + + setAttributes({ + showCachedOutput: + !attributes.showCachedOutput, + }) + } + checked={attributes.showCachedOutput} + /> + + + setAttributes({ fileType })} + /> + + + + + + + setAttributes({ libraries }) + } + /> + + + + {!usedLibraries || !usedExecutionScript ? ( + + ) : ( + + + + )} + + ); +} + +function decodeAttr(value: string) { + if (!value) { + return ''; + } + + try { + return base64ToUtf8(value); + } catch (e) { + return value; + } +} + +interface ExecutionScriptControlProps { + selected: string; + onChange: (value: string) => void; +} + +function ExecutionScriptControl({ + selected, + onChange, +}: ExecutionScriptControlProps) { + const executionScripts = useEntityRecords( + 'interactive-code-block', + 'script' + ); + + if (executionScripts.records === null) { + return ; + } + + const defaultExecutionScripts = SUPPORTED_RUNNERS.map((runner) => ({ + label: runner.defaultExecutionScript.name!, + value: runner.defaultExecutionScript.id, + })); + const userCreatedScripts = executionScripts.records.map( + (script: ExecutionScript) => ({ + label: script.name || '', + value: script.id, + }) + ); + + const options = [...defaultExecutionScripts, ...userCreatedScripts]; + + return ( + + ); +} diff --git a/packages/interactive-code-block/src/lib/block/editor.css b/packages/interactive-code-block/src/lib/block/editor.css new file mode 100644 index 0000000000..09a343a211 --- /dev/null +++ b/packages/interactive-code-block/src/lib/block/editor.css @@ -0,0 +1,27 @@ +.interactive-code-snippet-items-list { + margin: 0; + padding: 0; + list-style: none; + + display: flex; + flex-direction: column; + gap: 5px; +} + +.interactive-code-snippet-items-list-wrapper { + max-width: 400px !important; +} + +.interactive-code-block-form__buttons { + margin-top: 10px; +} + +.interactive-code-block__snackbar-list { + position: fixed; + bottom: 20px; +} + +.interactive-code-block__panel-row .components-input-control__label { + padding-right: 10px; + text-overflow: unset !important; +} diff --git a/packages/interactive-code-block/src/lib/block/editor.tsx b/packages/interactive-code-block/src/lib/block/editor.tsx new file mode 100644 index 0000000000..104b2ec99b --- /dev/null +++ b/packages/interactive-code-block/src/lib/block/editor.tsx @@ -0,0 +1,36 @@ +import * as React from '@wordpress/element'; +import { useBlockProps } from '@wordpress/block-editor'; +import { registerBlockType } from '@wordpress/blocks'; +import { installEntities } from '../pages/entities'; + +import EditInteractiveCodeSnippet from './edit'; + +import * as metadata from './block.json'; +import { InteractiveCodeSnippetBlockAttributes } from '../types'; + +// Rollup crashes if this import, that is only needed +// in hooks/use-php.ts, isn't repeated here: +// @ts-ignore +import '../php-worker?url&worker'; + +// Rollup crashes if this import, that is only needed +// in hooks/use-php.ts, isn't repeated here: +// @ts-ignore +import '../block/view?url&worker'; + +// Make vite copy the block.json file to the build folder: +// @ts-ignore +export * as blockJsonUrl from './block.json?url'; + +const { name } = metadata; + +export { metadata, name }; + +installEntities(); +registerBlockType(metadata as any, { + icon: 'shield', + edit: EditInteractiveCodeSnippet, + save: ({ attributes }) => { + return
{attributes.code}
; + }, +}); diff --git a/packages/interactive-code-block/src/lib/block/php-wasm.php b/packages/interactive-code-block/src/lib/block/php-wasm.php new file mode 100644 index 0000000000..8b23c6c837 --- /dev/null +++ b/packages/interactive-code-block/src/lib/block/php-wasm.php @@ -0,0 +1,25 @@ +, + elem + ); +} diff --git a/packages/interactive-code-block/src/lib/block/view.css b/packages/interactive-code-block/src/lib/block/view.css new file mode 100644 index 0000000000..e0b82707ef --- /dev/null +++ b/packages/interactive-code-block/src/lib/block/view.css @@ -0,0 +1,51 @@ +.has-interactive-code-spinner { + position: relative; +} + +.has-interactive-code-spinner:before { + content: ''; + display: block; + position: absolute; + z-index: 1; + top: 0; + left: 0; + width: 100%; + height: 100%; + background-color: rgba(255, 255, 255, 0.7); +} + +.has-interactive-code-spinner:after { + content: ''; + display: block; + height: 60px; + width: 60px; + background-image: url(data:image/svg+xml;base64,PHN2ZyBoZWlnaHQ9IjQwIiB2aWV3Ym94PSIwIDAgNDAgNDAiIHdpZHRoPSI0MCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4KICA8c3R5bGU+CiAgICBwYXRoIHsKICAgICAgLXdlYmtpdC1hbmltYXRpb246IHJvdGF0ZSAxcyBsaW5lYXIgaW5maW5pdGU7CiAgICAgIC1tb3otYW5pbWF0aW9uOiByb3RhdGUgMXMgbGluZWFyIGluZmluaXRlOwogICAgICBhbmltYXRpb246IHJvdGF0ZSAxcyBsaW5lYXIgaW5maW5pdGU7CiAgICAgIHRyYW5zZm9ybS1vcmlnaW46IDIwcHggMjBweDsKICAgIH0KICAgIEAtd2Via2l0LWtleWZyYW1lcyByb3RhdGUgewogICAgICAxMDAlIHsKICAgICAgICB0cmFuc2Zvcm06IHJvdGF0ZSgzNjBkZWcpCiAgICAgIH0KICAgIH0KICAgIEBrZXlmcmFtZXMgcm90YXRlIHsKICAgICAgMTAwJSB7CiAgICAgICAgdHJhbnNmb3JtOiByb3RhdGUoMzYwZGVnKQogICAgICB9CiAgICB9CiAgPC9zdHlsZT4KICA8ZyBmaWxsPSJub25lIiBzdHJva2U9IiMwMDAiIHN0cm9rZS13aWR0aD0iNCI+CiAgICA8Y2lyY2xlIGN4PSI1MCUiIGN5PSI1MCUiIHI9IjE4IiBzdHJva2Utb3BhY2l0eT0iMC4zIj48L2NpcmNsZT4KICAgIDxwYXRoIGQ9Ik0yMCwyIEExOCwxOCAwIDAsMSAzOCwyMCI+PC9wYXRoPgogIDwvZz4KPC9zdmc+Cg==); + background-size: contain; + position: absolute; + z-index: 2; + left: calc(50% - 30px); + top: calc(50% - 30px); + animation: spinner-rotate 2s ease-in infinite; + animation-timing-function: linear; +} + +.has-interactive-code-spinner:before, +.has-interactive-code-spinner:after { + opacity: 0; + pointer-events: none; + transition: opacity ease-in 0.2s; +} + +.has-interactive-code-spinner.is-spinner-active:before, +.has-interactive-code-spinner.is-spinner-active:after { + opacity: 1; +} + +@keyframes spinner-rotate { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } +} diff --git a/packages/interactive-code-block/src/lib/block/view.ts b/packages/interactive-code-block/src/lib/block/view.ts new file mode 100644 index 0000000000..409276783d --- /dev/null +++ b/packages/interactive-code-block/src/lib/block/view.ts @@ -0,0 +1,3 @@ +document.addEventListener('DOMContentLoaded', () => { + import('./view-async'); +}); diff --git a/packages/interactive-code-block/src/lib/block/without-gutenberg-keyboard-shortcuts.tsx b/packages/interactive-code-block/src/lib/block/without-gutenberg-keyboard-shortcuts.tsx new file mode 100644 index 0000000000..cf7be53cf7 --- /dev/null +++ b/packages/interactive-code-block/src/lib/block/without-gutenberg-keyboard-shortcuts.tsx @@ -0,0 +1,84 @@ +import * as React from 'react'; +import { useEffect } from '@wordpress/element'; +import { KeyboardShortcuts } from '@wordpress/components'; +import { rawShortcut } from '@wordpress/keycodes'; + +const stop = (e) => e.stopImmediatePropagation(); + +const characters = [ + 'a', + 'b', + 'c', + 'd', + 'e', + 'f', + 'g', + 'h', + 'i', + 'j', + 'k', + 'l', + 'm', + 'n', + 'o', + 'p', + 'q', + 'r', + 's', + 't', + 'u', + 'v', + 'w', + 'x', + 'y', + 'z', + 'tab', + '[', + ']', + '{', + '}', +]; + +const shortcutOverrides = Object.fromEntries( + characters.flatMap((character) => [ + [character, stop], + [rawShortcut.access(character), stop], + [rawShortcut.ctrl(character), stop], + [rawShortcut.ctrlShift(character), stop], + [rawShortcut.primary(character), stop], + [rawShortcut.primaryShift(character), stop], + [rawShortcut.primaryAlt(character), stop], + ]) +); + +interface WithoutGutenbergKeyboardShortcutsProps { + isSelected: boolean; + children?: any; +} + +export function WithoutGutenbergKeyboardShortcuts({ + children, + isSelected, +}: WithoutGutenbergKeyboardShortcutsProps) { + useEffect(() => { + // Disable the global copy handlers when the block is selected. + if (isSelected) { + // Capture: true ensures this gets triggered before Gutenberg's + // copy handler. + document.addEventListener('copy', stop, { capture: true }); + document.addEventListener('cut', stop, { capture: true }); + document.addEventListener('paste', stop, { capture: true }); + return () => { + document.removeEventListener('copy', stop, { capture: true }); + document.removeEventListener('cut', stop, { capture: true }); + document.removeEventListener('paste', stop, { capture: true }); + }; + } + }, [isSelected]); + // Prevent regular keyboard shortcuts from bubbling to the editor: + return ( + + {children} + + ); +} diff --git a/packages/interactive-code-block/src/lib/components/code-mirror/index.tsx b/packages/interactive-code-block/src/lib/components/code-mirror/index.tsx new file mode 100644 index 0000000000..8141ac127c --- /dev/null +++ b/packages/interactive-code-block/src/lib/components/code-mirror/index.tsx @@ -0,0 +1,190 @@ +import type { ViewUpdate } from '@codemirror/view'; +import { + EditorView, + keymap, + highlightSpecialChars, + drawSelection, + highlightActiveLine, + dropCursor, + rectangularSelection, + crosshairCursor, + lineNumbers, + highlightActiveLineGutter, +} from '@codemirror/view'; +import { + defaultHighlightStyle, + syntaxHighlighting, + indentOnInput, + bracketMatching, + foldGutter, + foldKeymap, +} from '@codemirror/language'; +import { defaultKeymap, history, historyKeymap } from '@codemirror/commands'; +import { closeBrackets, closeBracketsKeymap } from '@codemirror/autocomplete'; +import { oneDark } from '@codemirror/theme-one-dark'; + +import { + useState, + useMemo, + useEffect, + useRef, + useImperativeHandle, + forwardRef, + memo, +} from '@wordpress/element'; + +import type { + ForwardRefExoticComponent, + MemoExoticComponent, + RefAttributes, +} from 'react'; + +export interface CodeMirrorProps { + onChange?: (updatedContents: string) => void; + onSave?: (updatedContents: string) => void; + initialContents: string; + fileType: 'php' | 'sql' | 'js'; + className?: string; +} + +export type CodeMirrorRef = { + getContents: () => string; +}; + +const CodeMirror: MemoExoticComponent< + ForwardRefExoticComponent> +> = memo( + forwardRef(function CodeMirror( + { onChange, onSave, initialContents, fileType, className = '' }, + ref + ) { + const codeMirrorRef = useRef(null); + const contentsRef = useRef(initialContents); + const onChangeRef = useRef(onChange); + const languagePlugin = useLanguagePlugin(fileType); + // For rerendering: + const [dep, setDep] = useState({}); + + useImperativeHandle(ref, () => ({ + getContents: () => contentsRef.current, + })); + useEffect(() => { + onChangeRef.current = onChange; + }, [onChange]); + + const view = useMemo(() => { + if (!codeMirrorRef.current) { + // Rerender + setTimeout(() => setDep({})); + return null; + } + + const themeOptions = EditorView.theme({ + '&': { + height: 'auto', + width: '100%', + }, + }); + + const ourKeymap = (keymap as any).of([ + { + key: 'Mod-s', + run() { + if (typeof onSave === 'function') { + onSave(contentsRef.current); + } + return true; + }, + }, + ...closeBracketsKeymap, + ...defaultKeymap, + ...historyKeymap, + ...foldKeymap, + ]); + + const updateListener = EditorView.updateListener.of( + (vu: ViewUpdate) => { + if (vu.docChanged) { + contentsRef.current = vu.state.doc.toString(); + if (typeof onChangeRef.current === 'function') { + onChangeRef.current(contentsRef.current); + } + } + } + ); + + const extensions = [ + lineNumbers(), + highlightActiveLineGutter(), + highlightSpecialChars(), + history(), + foldGutter(), + drawSelection(), + dropCursor(), + indentOnInput(), + syntaxHighlighting(defaultHighlightStyle, { + fallback: true, + }), + bracketMatching(), + closeBrackets(), + rectangularSelection(), + crosshairCursor(), + highlightActiveLine(), + oneDark, + themeOptions, + ourKeymap, + ]; + + if (languagePlugin) { + extensions.push(languagePlugin()); + } + extensions.push(updateListener); + + const _view = new EditorView({ + doc: initialContents, + extensions, + parent: codeMirrorRef.current, + }); + + return _view; + }, [languagePlugin, dep, codeMirrorRef.current]); + + useEffect(() => { + // return a function to be executed at component unmount + return () => { + view && view.destroy(); + }; + }, [view]); + + return
; + }) +); + +export default CodeMirror; + +function useLanguagePlugin(language: string): any { + const lastLanguageRef = useRef(language); + const [plugin, setPlugin] = useState(null); + useEffect(() => { + lastLanguageRef.current = language; + importLanguagePlugin(language).then((pluginFactory) => { + if (lastLanguageRef.current === language) { + setPlugin(() => pluginFactory); + } + }); + }, [language]); + return plugin; +} + +async function importLanguagePlugin(fileType: string): Promise { + switch (fileType) { + case 'js': + return (await import('@codemirror/lang-javascript')).javascript; + case 'php': + return (await import('@codemirror/lang-php')).php; + case 'sql': + return (await import('@codemirror/lang-sql')).sql; + default: + throw new Error(`Unknown file type: ${fileType}`); + } +} diff --git a/packages/interactive-code-block/src/lib/components/code-output/index.tsx b/packages/interactive-code-block/src/lib/components/code-output/index.tsx new file mode 100644 index 0000000000..c29027b03f --- /dev/null +++ b/packages/interactive-code-block/src/lib/components/code-output/index.tsx @@ -0,0 +1,268 @@ +import { useEffect, useMemo, useState } from 'react'; +import { useHasTransitionClassName } from '../../hooks/use-has-transition-class-name'; +import { OutputFormat } from '../../types'; +// @ts-ignore +import classes from './style.module.css'; + +interface CodeOutputProps { + result?: string; + isRunning: boolean; + outputFormat?: OutputFormat; +} +export function CodeOutput({ + result, + isRunning, + outputFormat, +}: CodeOutputProps) { + const hasIsReadyClass = useHasTransitionClassName(!isRunning, 250); + const [displaySpinner, setDisplaySpinner] = useState(false); + + // Only show the spinner if the PHP is taking a while to execute the code + useEffect(() => { + if (!isRunning) { + setDisplaySpinner(false); + return; + } + + const timeout = setTimeout(() => { + setDisplaySpinner(true); + }, 20); + return () => clearTimeout(timeout); + }, [isRunning]); + + const className = [ + classes.output, + hasIsReadyClass ? classes.isReady : '', + displaySpinner ? 'is-spinner-active' : '', + ].join(' '); + + return ( +
+
Output:
+ {(function () { + switch (outputFormat) { + case 'jsontabularsql': + return ( + + ); + case 'jsontabular': + return ( + + ); + case 'html': + return ( + + ); + default: + case 'plaintext': + return ( + + ); + } + })()} +
+ ); +} + +function JSONTabularSQLResult({ resultString, className }: ResultsTableProps) { + const [sqlHighlighter, setSqlHighlighter] = + useState(defaultCellRenderer); + useEffect(() => { + makeSQLHighlighter().then((highlighter) => + setSqlHighlighter(() => (header: string, value: string) => { + if (header === 'query') { + return ( + + ); + } else if (header === 'params') { + if (['[]', 'null'].includes(value)) { + return ''; + } + return ( +
{JSON.stringify(JSON.parse(value), null, 2)}
+ ); + } + return value; + }) + ); + }, []); + if (!sqlHighlighter) { + className = `${classes.output} is-spinner-active`; + } + return ( + + ); +} + +function makeSQLHighlighter() { + type Token = { + from: number; + to: number; + classes: string; + }; + return Promise.all([ + import('@codemirror/lang-sql'), + import('@lezer/highlight'), + import('@codemirror/language'), + ]).then(([sql, { highlightTree }, { defaultHighlightStyle }]) => { + return (query: string) => { + const parser = sql.SQLite.language.parser; + const result = parser.parse(query); + + const output = document.createElement('div'); + + function addToken({ from, to, classes }: Token) { + const span = document.createElement('SPAN'); + span.className = classes; + span.innerText = query.slice(from, to); + output.appendChild(span); + } + let lastToken: Token | null = null; + highlightTree( + result as any, + defaultHighlightStyle, + (from: number, to: number, classes: string) => { + if (lastToken && lastToken.to !== from) { + addToken({ + from: lastToken!.to, + to: from, + classes: '', + }); + } + const token = { from, to, classes }; + addToken(token); + lastToken = token; + } + ); + if (lastToken as any) { + addToken({ + from: (lastToken as any)?.to, + to: query.length, + classes: '', + }); + } + return output.outerHTML; + }; + }); +} + +type CellRenderer = (header: string, value: string) => string | JSX.Element; +interface ResultsTableProps { + resultString: string; + className: string; + cellRenderer?: CellRenderer; +} + +const INVALID_JSON = {}; + +function defaultCellRenderer(header: string, value: string) { + return value; +} +function JSONTabularResult({ + resultString, + className, + cellRenderer = defaultCellRenderer, +}: ResultsTableProps) { + const results = useMemo(() => { + try { + return JSON.parse(resultString); + } catch (e) { + return INVALID_JSON; + } + }, [resultString]); + if (results === INVALID_JSON) { + return ( + + ); + } + if (!Array.isArray(results) || !results.length) { + return {''}; + } + + const headers = Object.keys(results[0]); + + const headerHtml = ( + + {headers.map((header) => ( + {toJSONString(header)} + ))} + + ); + + const rowHtml = results.map((result: any) => ( + + {headers.map((header) => ( + {cellRenderer(header, toJSONString(result[header]))} + ))} + + )); + + return ( +
+ + {headerHtml} + {rowHtml} +
+
+ ); +} + +function toJSONString(value: any) { + if (typeof value === 'string') { + return value; + } + return JSON.stringify(value, null, 2); +} + +function HTMLResult({ + result, + className, +}: { + result: string; + className: string; +}) { + return ( +
+ ); +} + +function PlaintextResult({ + result, + className, +}: { + result: string; + className: string; +}) { + return ( +
+
{result}
+
+ ); +} diff --git a/packages/interactive-code-block/src/lib/components/code-output/loader.tsx b/packages/interactive-code-block/src/lib/components/code-output/loader.tsx new file mode 100644 index 0000000000..b4a7371e48 --- /dev/null +++ b/packages/interactive-code-block/src/lib/components/code-output/loader.tsx @@ -0,0 +1,17 @@ +import React from 'react'; +// @ts-ignore +import classes from './style.module.css'; +import { ProgressBar } from '../progress-bar'; + +export function CodeOutputLoader({ progress }: { progress: number }) { + return ( +
+
+ Output: +
+
+ +
+
+ ); +} diff --git a/packages/interactive-code-block/src/lib/components/code-output/style.module.css b/packages/interactive-code-block/src/lib/components/code-output/style.module.css new file mode 100644 index 0000000000..4d4d7f38ab --- /dev/null +++ b/packages/interactive-code-block/src/lib/components/code-output/style.module.css @@ -0,0 +1,72 @@ +.output { + box-sizing: border-box; + min-height: 3em; + position: relative; + overflow-y: auto; + + opacity: 1; + transition: opacity ease-in 0.25s, border-color ease-in 0.25s, + background-color ease-in 0.25s; +} + +.output.format-plaintext { + border: 1px solid #e0e0e0; +} + +.title { + margin-bottom: 5px; + font-weight: bold; +} + +.output.is-ready { + opacity: 0.5; + border-color: #f9e79f; + background-color: #f9e79f; +} + +.output.format-plaintext > pre { + margin: 15px 20px; +} + +.json-tabular { + border: 1px solid #cbcbcb; + border-spacing: 0; + border-collapse: collapse; + empty-cells: show; + min-width: 40px; + box-shadow: 0 0 20px rgba(0, 0, 0, 0.15); +} + +.json-tabular thead { + background-color: #e0e0e0; + color: #000; + text-align: left; + vertical-align: bottom; +} + +.json-tabular thead th { + color: #ffffff; + background-color: #009879; + text-transform: capitalize; + text-align: center; +} + +.json-tabular td { + background-color: initial; +} + +.json-tabular td, +.json-tabular th { + border-bottom-width: 0; + border-left: 1px solid #cbcbcb; + border-right-width: 0; + border-top-width: 0; + font-size: inherit; + margin: 0; + padding: 6px 10px; + overflow: visible; +} + +.json-tabular tr:nth-child(2n) td { + background-color: #f2f2f2; +} diff --git a/packages/interactive-code-block/src/lib/components/code-runner/index.tsx b/packages/interactive-code-block/src/lib/components/code-runner/index.tsx new file mode 100644 index 0000000000..4cb2aff29d --- /dev/null +++ b/packages/interactive-code-block/src/lib/components/code-runner/index.tsx @@ -0,0 +1,58 @@ +import * as React from 'react'; +import { useLibraries } from '../../hooks/use-libraries'; +import { ExecutionScript, CodeRunnerClass, Library } from '../../types'; +import PHPRunner from '../php-runner'; +import PlaygroundRunner from '../playground-runner'; + +export interface CodeRunnerRef { + runCode: (code: string) => any; +} + +interface InitializationOptions { + executionScript: ExecutionScript; + libraries: Library[]; + initialOutput?: string; + initialCode?: string; +} +export const CodeRunner = React.forwardRef< + CodeRunnerRef, + InitializationOptions +>(function CodeRunnerComponent( + { + executionScript, + libraries, + initialCode, + initialOutput, + }: InitializationOptions, + ref +) { + const librariesResult = useLibraries(libraries); + + if (executionScript?.runner === PHPRunner.id) { + return ( + + ); + } else if (executionScript?.runner === PlaygroundRunner.id) { + return ; + } else { + return null; + } +}); + +export const SUPPORTED_RUNNERS: CodeRunnerClass[] = [ + PHPRunner, + PlaygroundRunner, +]; + +export function getDefaultExecutionScript(id: string) { + return SUPPORTED_RUNNERS.find((r) => r.id === id)?.defaultExecutionScript; +} + +export function isDefaultScriptId(id: string) { + return !!getDefaultExecutionScript(id); +} diff --git a/packages/interactive-code-block/src/lib/components/interactive-code-snippet/default-bootstrap-script.php b/packages/interactive-code-block/src/lib/components/interactive-code-snippet/default-bootstrap-script.php new file mode 100644 index 0000000000..c6596505ac --- /dev/null +++ b/packages/interactive-code-block/src/lib/components/interactive-code-snippet/default-bootstrap-script.php @@ -0,0 +1,3 @@ + void; + onChange?: (updatedContents: string) => void; + onSave?: (updatedContents: string) => void; +} + +let CodeMirror: typeof CodeMirrorComponent; +const CodeMirrorPromise = import('../code-mirror').then((module) => { + CodeMirror = module.default as any; +}); + +export function InteractiveCodeSnippet({ + initialCode, + initialOutput, + libraries = [], + fileType, + executionScript, + onEval, + onChange, + onSave, +}: InteractiveCodeSnippetProps) { + const [computedResult, setComputedResult] = useState(initialOutput); + const result = computedResult ?? initialOutput; + useEffect(() => { + if (result) { + onEval?.(result); + } + }, [result]); + + usePromise(CodeMirrorPromise); + const editorRef = useRef(null); + const runnerRef = useRef(null); + async function run() { + const code = editorRef.current + ? editorRef.current!.getContents() + : initialCode; + const result = await runnerRef.current!.runCode(code); + setComputedResult(result); + } + function handleSave() { + run(); + const code = editorRef.current + ? editorRef.current.getContents() + : initialCode; + onSave?.(code); + } + + return ( +
+
+
+ Live Example: + +
+ {CodeMirror ? ( + + ) : ( + + )} +
+ +
+ ); +} diff --git a/packages/interactive-code-block/src/lib/components/interactive-code-snippet/style.module.css b/packages/interactive-code-block/src/lib/components/interactive-code-snippet/style.module.css new file mode 100644 index 0000000000..bb7129b911 --- /dev/null +++ b/packages/interactive-code-block/src/lib/components/interactive-code-snippet/style.module.css @@ -0,0 +1,31 @@ +.snippet { + display: flex; + flex-direction: column; + gap: 1rem; +} + +:local .snippet :global .cm-editor { + border: 1px solid #e0e0e0; +} + +.snippet code { + display: block; +} + +.title { + display: flex; + gap: 1rem; + align-items: center; + flex-direction: row; + margin-bottom: 5px; +} + +.run-button { + font-size: 18px; + padding: 10px !important; + padding-right: 15px !important; +} + +:local .run-button :global .dashicon { + margin-right: 5px !important; +} diff --git a/packages/interactive-code-block/src/lib/components/libraries-control/index.tsx b/packages/interactive-code-block/src/lib/components/libraries-control/index.tsx new file mode 100644 index 0000000000..0953822a67 --- /dev/null +++ b/packages/interactive-code-block/src/lib/components/libraries-control/index.tsx @@ -0,0 +1,67 @@ +import * as React from '@wordpress/element'; +import { useEntityRecords } from '@wordpress/core-data'; +import { ToggleControl, Spinner, Flex, FlexItem } from '@wordpress/components'; +import { Library } from '../../types'; + +interface LibrariesControlProps { + selected: string[]; + librariesIncludedByScript?: string[]; + onChange: (selected: string[]) => void; +} + +export default function LibrariesControl({ + selected, + librariesIncludedByScript, + onChange, +}: LibrariesControlProps) { + const libraries = useEntityRecords( + 'interactive-code-block', + 'library' + ); + + if (libraries.records === null) { + return ; + } + + if (!selected) { + selected = []; + } + + function toggleLibrary(id: string) { + if (selected.includes(id)) { + onChange(selected.filter((selectedId) => selectedId !== id)); + } else { + onChange([...selected, id]); + } + } + + return ( + + {libraries.records.map((library) => { + const isIncludedByScript = librariesIncludedByScript?.includes( + library.id + ); + if (isIncludedByScript) { + return ( + + + + ); + } + return ( + + toggleLibrary(library.id)} + checked={selected.includes(library.id)} + /> + + ); + })} + + ); +} diff --git a/packages/interactive-code-block/src/lib/components/php-runner/index.tsx b/packages/interactive-code-block/src/lib/components/php-runner/index.tsx new file mode 100644 index 0000000000..6a1b7e83aa --- /dev/null +++ b/packages/interactive-code-block/src/lib/components/php-runner/index.tsx @@ -0,0 +1,140 @@ +import * as React from 'react'; +import { PHPClient } from '../../php-worker'; +import { ExecutionScript } from '../../types'; +import { CodeOutput } from '../code-output'; +import { CodeOutputLoader } from '../code-output/loader'; +import { UseLibrariesResult } from '../../hooks/use-libraries'; +import sharedPHPLoader from './php-loader'; +import classnames from 'classnames'; + +interface State { + userScriptPath: string; + executionScriptPath: string; + isReady: boolean; + isRunning: boolean; + result?: string; + lastEnqueuedCode?: string; + phpProgress: number; +} +interface Props { + executionScript?: ExecutionScript; + initialOutput?: string; + libraries: UseLibrariesResult; +} + +export default class PHPRunner extends React.Component { + static id = 'PHP' as const; + static defaultExecutionScript: ExecutionScript = { + id: PHPRunner.id, + runner: PHPRunner.id, + name: 'PHP', + content: ` + ) => { + this.setState({ + phpProgress: e.detail, + }); + }) as any); + this.php + .then((php) => php.isReady()) + .then(() => { + this.updateLoadedLibraries(); + this.setState({ isReady: true }); + if (this.state.lastEnqueuedCode) { + this.runCode(this.state.lastEnqueuedCode); + this.setState({ + lastEnqueuedCode: undefined, + }); + } + }); + } + + get php(): Promise { + return sharedPHPLoader.load(); + } + + async updateLoadedLibraries() { + const php = await this.php; + const loaded = this.props.libraries.loaded; + for (const name in loaded) { + php!.writeFile(`/${name}`, new Uint8Array(loaded[name])); + } + } + + async runCode(code: string) { + this.setState({ isRunning: true }); + + if (!this.state.isReady) { + this.setState({ lastEnqueuedCode: code }); + return ''; + } + + const php = await this.php; + php.writeFile( + this.state.executionScriptPath, + `` + + this.props.executionScript!.content + ); + php.writeFile(this.state.userScriptPath, code); + const { text } = await php.run({ + scriptPath: this.state.executionScriptPath, + }); + this.setState({ + result: text, + isRunning: false, + }); + return text; + } + + override render() { + if (!this.state.isReady) { + return ; + } + + const className = classnames('has-interactive-code-spinner', { + ['is-spinner-active']: this.state.isRunning, + }); + + return ( +
+ +
+ ); + } + + get progress() { + const parts = [ + this.props.libraries.progress, + this.state.phpProgress, + ].filter((p) => p !== undefined) as number[]; + return parts.reduce((a, b) => a + b, 0) / parts.length; + } +} diff --git a/packages/interactive-code-block/src/lib/components/php-runner/php-loader.ts b/packages/interactive-code-block/src/lib/components/php-runner/php-loader.ts new file mode 100644 index 0000000000..7747b7849e --- /dev/null +++ b/packages/interactive-code-block/src/lib/components/php-runner/php-loader.ts @@ -0,0 +1,49 @@ +import type { LoadingStatus } from '../../types'; +import { + consumeAPI, + recommendedWorkerBackend, + spawnPHPWorkerThread, +} from '@php-wasm/web'; + +import type { PHPClient } from '../../php-worker'; + +export class PHPLoader extends EventTarget { + private promise?: Promise; + status: LoadingStatus = 'idle'; + progress = 0; + + load() { + if (!this.promise) { + this.promise = this._load(); + } + return this.promise!; + } + + async _load() { + this.status = 'loading'; + const { default: workerScriptUrl } = await import( + /** @ts-ignore */ + '../../php-worker.ts?url&worker' + ); + const worker = await spawnPHPWorkerThread( + workerScriptUrl, + recommendedWorkerBackend + ); + const php = consumeAPI(worker); + php?.onDownloadProgress((e) => { + const { loaded, total } = e.detail; + this.progress = (100 * loaded) / total; + this.dispatchEvent( + new CustomEvent('progress', { + detail: this.progress, + }) + ); + }); + await php?.isReady(); + this.status = 'ready'; + return php; + } +} + +const sharedPHPLoader: PHPLoader = new PHPLoader(); +export default sharedPHPLoader; diff --git a/packages/interactive-code-block/src/lib/components/playground-runner/index.tsx b/packages/interactive-code-block/src/lib/components/playground-runner/index.tsx new file mode 100644 index 0000000000..cd9080250c --- /dev/null +++ b/packages/interactive-code-block/src/lib/components/playground-runner/index.tsx @@ -0,0 +1,135 @@ +import * as React from 'react'; +import * as Comlink from 'comlink'; +import { ExecutionScript } from '../../types'; +// @ts-ignore +import { default as playgroundUrl } from '../../../../public/playground-sandbox.html?url'; +import classnames from 'classnames'; +import ReactDOM from 'react-dom'; +const sandboxHash = playgroundUrl.split('-').pop().split('.')[0]; + +interface SandboxApi { + isReady(): Promise; + execute(code: string): Promise; +} + +interface Props { + initialCode?: string; + executionScript?: ExecutionScript; +} +interface State { + iframeId: string; + isReady: boolean; + iframeLoaded: boolean; + isLoading: boolean; + isRunning: boolean; + hasOwnLoader: boolean; + + lastEnqueuedCode?: string; + client?: SandboxApi; +} + +export default class PlaygroundRunner extends React.Component { + static id = 'WordPress Playground' as const; + static defaultExecutionScript: ExecutionScript = { + id: PlaygroundRunner.id, + runner: PlaygroundRunner.id, + name: 'WordPress Playground', + content: `/* Implemented in TypeScript as PlaygroundRunner.runCode() */`, + }; + + constructor(props: Props) { + if (!props.executionScript) { + props.executionScript = PlaygroundRunner.defaultExecutionScript; + } + super(props); + this.state = { + iframeId: 'playground-frame', + iframeLoaded: false, + isReady: true, + isLoading: true, + isRunning: false, + hasOwnLoader: true, + lastEnqueuedCode: props.initialCode, + }; + } + + async onIframeLoaded() { + if (!this.state.client) { + const root = ReactDOM.findDOMNode(this)! as Element; + const iframe = root.querySelector('iframe')!; + const endpoint = Comlink.windowEndpoint(iframe.contentWindow!); + const client = Comlink.wrap(endpoint); + this.setState({ + client, + }); + await client.isReady(); + + /** + * Run the initial (or last requested) code snippet once + * the playground site is loaded + */ + if (this.state.lastEnqueuedCode) { + this.runCode(this.state.lastEnqueuedCode); + this.setState({ lastEnqueuedCode: undefined }); + } + + this.setState({ + isLoading: false, + }); + } + } + + async runCode(code: string) { + if (this.state.isRunning) { + this.setState({ lastEnqueuedCode: code }); + return; + } + + this.setState({ isRunning: true }); + + if (!this.state.client) { + this.setState({ lastEnqueuedCode: code }); + return; + } + + await this.state.client.isReady(); + await this.state.client.execute(code); + + this.setState({ isRunning: false }); + + if (this.state.lastEnqueuedCode) { + const newCode = this.state.lastEnqueuedCode; + this.setState({ lastEnqueuedCode: undefined }); + await this.runCode(newCode); + } + } + + override render() { + const className = classnames('has-interactive-code-spinner', { + ['is-spinner-active']: this.state.isLoading, + }); + // @TODO remove allow-scripts for true sandboxing + return ( +
+ +
+ ); + } +} diff --git a/packages/interactive-code-block/src/lib/components/progress-bar/index.tsx b/packages/interactive-code-block/src/lib/components/progress-bar/index.tsx new file mode 100644 index 0000000000..3c19fac2b7 --- /dev/null +++ b/packages/interactive-code-block/src/lib/components/progress-bar/index.tsx @@ -0,0 +1,16 @@ +// @ts-ignore +import classes from './style.module.css'; + +export function ProgressBar({ progress }: { progress: number }) { + return ( +
+ Loading PHP... +
+
+
+
+ ); +} diff --git a/packages/interactive-code-block/src/lib/components/progress-bar/style.module.css b/packages/interactive-code-block/src/lib/components/progress-bar/style.module.css new file mode 100644 index 0000000000..0dba6531ed --- /dev/null +++ b/packages/interactive-code-block/src/lib/components/progress-bar/style.module.css @@ -0,0 +1,35 @@ +.root { + display: flex; + flex-direction: column; + position: absolute; + top: 0; + left: 0; + z-index: 5; + display: flex; + width: 100%; + height: 100%; + justify-content: center; + align-items: center; + pointer-events: none; +} + +.wrapper { + position: relative; + width: 80%; + height: 4px; + margin: 4px auto; + border-radius: 10px; + background: #e0e0e0; +} + +.bar { + position: absolute; + top: 0; + left: 0; + bottom: 0; + right: 100%; + width: 0; + background: #3858e9; + border-radius: 2px; + transition: opacity linear 0.25s, width ease-in 0.5s; +} diff --git a/packages/interactive-code-block/src/lib/components/toolbar-dropdown/index.tsx b/packages/interactive-code-block/src/lib/components/toolbar-dropdown/index.tsx new file mode 100644 index 0000000000..e75476b797 --- /dev/null +++ b/packages/interactive-code-block/src/lib/components/toolbar-dropdown/index.tsx @@ -0,0 +1,94 @@ +import * as React from '@wordpress/element'; +import classnames from 'classnames'; +import { + Button, + Dropdown, + MenuGroup, + MenuItem, + NavigableMenu, +} from '@wordpress/components'; + +interface ToolbarDropdownProps { + options: { + label: string; + value: string; + }[]; + optionsLabel?: string; + icon?: { + icon: string; + }; + value: string; + onChange: (value: string) => void; +} + +/** + * @typedef {Object} DropdownOption + * + * @property {string} label Option label. + * @property {string} value Option value. + */ +/** + * Dropdown for the editor toolbar. + * + * @param {Object} props Component props. + * @param {DropdownOption[]} props.options Dropdown options. + * @param {string} [props.optionsLabel] Options label. + * @param {Object} [props.icon] Icon for the toolbar. + * @param {string} props.value Current dropdown value. + * @param {Function} props.onChange Dropdown change callback, which receive the new value as argument. + * + * @return {Object} React component. + */ +const ToolbarDropdown = ({ + options, + optionsLabel, + icon, + value, + onChange, + ...props +}: ToolbarDropdownProps) => { + const selectedOption = options.find((option) => value === option.value); + + return ( + ( + + {isOpen && ( + { + if (e.target.closest('.cm-editor')) { + return; + } + closeModal(); + }} + title="Create a new script" + > + { + closeModal(); + }} + /> + + )} + + ); +} + +export function CreateScriptForm({ onSaveFinished }) { + const { createErrorNotice, createSuccessNotice } = useDispatch( + noticesStore + ) as any; + const [script, setScript] = useState({ + id: '', + name: '', + runner: PHPRunner.id, + content: '', + }); + const { lastError, isSaving } = useSelect( + (select) => ({ + lastError: select(coreDataStore).getLastEntitySaveError( + 'interactive-code-block', + 'script', + undefined! + ), + isSaving: select(coreDataStore).isSavingEntityRecord( + 'interactive-code-block', + 'script', + undefined! + ), + }), + [] + ); + + const { saveEntityRecord } = useDispatch(coreDataStore); + const handleSave = async () => { + try { + await saveEntityRecord('interactive-code-block', 'script', script, { + throwOnError: true, + }); + onSaveFinished(); + createSuccessNotice('Script created successfully', { + type: 'snackbar', + }); + } catch (error) { + createErrorNotice(error.message, { + type: 'snackbar', + }); + } + }; + + return ( + setScript({ ...script, ...fields })} + canSave={!!(script.name && script.content)} + onSave={handleSave} + lastError={lastError} + isSaving={isSaving} + /> + ); +} + +export function EditScriptButton({ id }) { + const [isOpen, setOpen] = useState(false); + const openModal = () => setOpen(true); + const closeModal = () => setOpen(false); + return ( + <> + + {isOpen && ( + + + + )} + + ); +} + +export function EditScriptForm({ id, onSaveFinished }) { + const { createErrorNotice, createSuccessNotice } = useDispatch( + noticesStore + ) as any; + const { script, lastError, isSaving, hasEdits } = useSelect( + (select) => ({ + script: select(coreDataStore).getEditedEntityRecord( + 'interactive-code-block', + 'script', + id + ) as any as ExecutionScript, + lastError: select(coreDataStore).getLastEntitySaveError( + 'interactive-code-block', + 'script', + id + ), + isSaving: select(coreDataStore).isSavingEntityRecord( + 'interactive-code-block', + 'script', + id + ), + hasEdits: select(coreDataStore).hasEditsForEntityRecord( + 'interactive-code-block', + 'script', + id + ), + }), + [id] + ); + + const { saveEditedEntityRecord, editEntityRecord } = + useDispatch(coreDataStore); + const handleSave = async () => { + try { + await saveEditedEntityRecord( + 'interactive-code-block', + 'script', + id, + { + throwOnError: true, + } + ); + createSuccessNotice('Script saved successfully', { + type: 'snackbar', + }); + onSaveFinished(); + } catch (error) { + createErrorNotice(error.message, { + type: 'snackbar', + }); + } + }; + const handleChange = (delta) => + editEntityRecord('interactive-code-block', 'script', id, delta); + + if (isDefaultScriptId(id)) { + return ( + + ); + } + + return ( + + ); +} + +interface ScriptFormProps { + script: ExecutionScript; + onChange: (delta: Partial) => void; + canSave: boolean; + lastError?: Error; + isSaving?: boolean; + onSave?: () => void; +} +function ScriptForm({ + script, + onChange, + canSave, + lastError, + isSaving, + onSave, +}: ScriptFormProps) { + const initialContents = useMemo(() => script.content, []); + const editorRef = useRef(null); + function handleSave(e) { + e.preventDefault(); + onSave?.(); + } + return ( +
+ {lastError ? ( +
Error: {lastError.message}
+ ) : ( + false + )} + + + + onChange({ name: newName })} + autoFocus + /> + + + + ({ + label: id, + value: id, + }))} + onChange={(newRunner) => + onChange({ runner: newRunner }) + } + /> + + + + ({ + label, + value, + }) + )} + onChange={(newOutputFormat) => + onChange({ outputFormat: newOutputFormat }) + } + /> + + + + + onChange({ content })} + onSave={(content) => onChange({ content })} + ref={editorRef} + /> + + + + {isDefaultScriptId(script.id) ? ( + false + ) : ( + + + + onChange({ libraries }) + } + selected={script.libraries || []} + /> + + + )} + + + {isDefaultScriptId(script.id) ? ( + "This is the default execution script and can't be changed." + ) : ( +
+ +
+ )} +
+
+
+ ); +} diff --git a/packages/interactive-code-block/src/lib/pages/execution-scripts-list.tsx b/packages/interactive-code-block/src/lib/pages/execution-scripts-list.tsx new file mode 100644 index 0000000000..642a7fc800 --- /dev/null +++ b/packages/interactive-code-block/src/lib/pages/execution-scripts-list.tsx @@ -0,0 +1,160 @@ +/** + * WordPress dependencies + */ +import * as React from '@wordpress/element'; +import { Button, Flex, FlexItem, Spinner } from '@wordpress/components'; +import { __ } from '@wordpress/i18n'; +import { store as noticesStore } from '@wordpress/notices'; +import { useDispatch } from '@wordpress/data'; +import { useEntityRecords, useEntityRecord } from '@wordpress/core-data'; + +/** + * Internal dependencies + */ +import { + CreateScriptButton, + EditScriptButton, +} from './execution-scripts-forms'; +import { ExecutionScript } from '../types'; +import { + SUPPORTED_RUNNERS, + isDefaultScriptId, + getDefaultExecutionScript, +} from '../components/code-runner'; + +export default function ExecutionScriptsPanel() { + return ( + + +

+ When the user clicks "Run" in an interactive code block, + they don't actually run the code snippet. Instead, + they run an execution script associated with the code + block. +

+ +

+ The built-in execution scripts are quite simple, but you're + free to get more fancy and: +

+ +
    +
  • Load a few libraries
  • +
  • Expose some variables to the code snippet
  • +
  • Preload an SQLite database
  • +
  • Highlight the code snippet instead of executing it
  • +
+
+ + + + + + +
+ ); +} + +// List of scripts +function ScriptsList() { + const scripts = useEntityRecords( + 'interactive-code-block', + 'script' + ); + + if (scripts.records === null) { + return ( + + + + + + ); + } + + if (!scripts.records?.length && !SUPPORTED_RUNNERS.length) { + return
No results
; + } + + return ( +
    + {SUPPORTED_RUNNERS.map((runnerClass) => ( + + ))} + {scripts.records.map(({ id }) => ( + + ))} +
+ ); +} + +const ScriptsListItem = ({ id }) => { + const { createSuccessNotice, createErrorNotice } = useDispatch( + noticesStore + ) as any; + const script = useEntityRecord( + 'interactive-code-block', + 'script', + id + ); + if (isDefaultScriptId(id)) { + script.editedRecord = getDefaultExecutionScript(id)!; + script.editedRecord = { + ...script.editedRecord, + name: `${script.editedRecord.name} (built-in)`, + }; + } + const { deleteEntityRecord } = useDispatch('core'); + + const handleDelete = async () => { + // eslint-disable-next-line no-alert + const confirmation = window.confirm( + __( + 'Are you sure you want to delete this script? ALL code blocks using this script will stop working.' + ) + ); + if (!confirmation) { + return; + } + try { + await deleteEntityRecord( + 'interactive-code-block', + 'script', + id, + null, + { + throwOnError: true, + } + ); + // Tell the user the operation succeeded: + createSuccessNotice('The script was deleted!', { + type: 'snackbar', + }); + } catch (e) { + const message = + (e?.message || 'There was an error.') + + ' Please refresh the page and try again.'; + // Tell the user how exactly the operation has failed: + createErrorNotice(message, { + type: 'snackbar', + }); + } + }; + + const AnyItem = FlexItem as any; + return ( + + {script.editedRecord.name} + + + + + {!isDefaultScriptId(id) && ( + + )} + + + ); +}; diff --git a/packages/interactive-code-block/src/lib/pages/execution-scripts-page.tsx b/packages/interactive-code-block/src/lib/pages/execution-scripts-page.tsx new file mode 100644 index 0000000000..618f63bfdd --- /dev/null +++ b/packages/interactive-code-block/src/lib/pages/execution-scripts-page.tsx @@ -0,0 +1,21 @@ +import * as React from '@wordpress/element'; +import { render } from '@wordpress/element'; + +import ExecutionScriptsList from './execution-scripts-list'; +import { installEntities } from './entities'; +import Notifications from './notifications'; +installEntities(); + +window.addEventListener( + 'load', + function () { + render( + <> + + + , + document.querySelector('#execution-scripts') + ); + }, + false +); diff --git a/packages/interactive-code-block/src/lib/pages/libraries-list.tsx b/packages/interactive-code-block/src/lib/pages/libraries-list.tsx new file mode 100644 index 0000000000..98ffc5dbd8 --- /dev/null +++ b/packages/interactive-code-block/src/lib/pages/libraries-list.tsx @@ -0,0 +1,192 @@ +import * as React from '@wordpress/element'; + +/** + * WordPress dependencies + */ +import { Button, Flex, FlexItem, Spinner } from '@wordpress/components'; +import apiFetch from '@wordpress/api-fetch'; +import { __ } from '@wordpress/i18n'; +import { store as noticesStore } from '@wordpress/notices'; +import { useState } from '@wordpress/element'; +import { useDispatch } from '@wordpress/data'; +import { + useEntityRecords, + useEntityRecord, + store as coreDataStore, +} from '@wordpress/core-data'; + +/** + * Internal dependencies + */ +import UploadOverlay from './upload-overlay'; +import { useOnEscapeKey } from '../hooks/use-on-escape-key'; +import { Library } from '../types'; + +export default function PharLibrariesPanel() { + const { createErrorNotice, createSuccessNotice } = useDispatch( + noticesStore + ) as any; + const { saveEntityRecord } = useDispatch(coreDataStore); + const [isUploading, setIsUploading] = useState(false); + + const handleUpload = async (file) => { + setIsUploading(true); + + const formData = new FormData(); + formData.append('file', file); + try { + await saveEntityRecord( + 'interactive-code-block', + 'library', + { + name: file.name, + }, + { + throwOnError: true, + __unstableFetch: ({ data, ...options }) => { + for (const key in data) { + formData.append(key, data[key]); + } + const headers = { ...options.headers }; + delete headers['Content-Type']; + return apiFetch({ + ...options, + headers, + body: formData, + }); + }, + } + ); + + createSuccessNotice(`Library uploaded successfully`, { + type: 'snackbar', + }); + } catch (error) { + createErrorNotice(`Error creating a library: ${error.message}`, { + type: 'snackbar', + }); + } finally { + setIsUploading(false); + } + }; + + return ( + + + Upload libraries (e.g. .phar files) to use in your interative + code blocks. Uploading a library with the same name twice + overwrites the previous version. + + + + + + + + + ); +} + +// List of libraries +function LibraryList() { + const libraries = useEntityRecords( + 'interactive-code-block', + 'library' + ); + + if (libraries.records === null) { + return ( + + + + + + ); + } + + if (!libraries.records?.length) { + return
No results
; + } + + return ( +
    + {libraries.records.map(({ id }) => ( + + ))} +
+ ); +} + +const LibraryListItem = ({ id }) => { + const { createSuccessNotice, createErrorNotice } = useDispatch( + noticesStore + ) as any; + const library = useEntityRecord( + 'interactive-code-block', + 'library', + id + ); + const { deleteEntityRecord } = useDispatch('core'); + + const [isEditing, setIsEditing] = useState(false); + useOnEscapeKey(function () { + if (isEditing) { + library.edit({ name: library.record!.name }); + setIsEditing(false); + } + }); + + const handleDelete = async () => { + // eslint-disable-next-line no-alert + const confirmation = window.confirm( + __( + 'Are you sure you want to delete this library? ALL code blocks using this library will stop working.' + ) + ); + if (!confirmation) { + return; + } + try { + await deleteEntityRecord( + 'interactive-code-block', + 'library', + id, + null, + { throwOnError: true } + ); + // Tell the user the operation succeeded: + createSuccessNotice('The library was deleted!', { + type: 'snackbar', + }); + } catch (e) { + const message = + (e?.message || 'There was an error.') + + ' Please refresh the page and try again.'; + // Tell the user how exactly the operation has failed: + createErrorNotice(message, { + type: 'snackbar', + }); + } + }; + + const AnyItem = FlexItem as any; + return ( + + setIsEditing(true)}> + {library.editedRecord.name} + + + + + + ); +}; diff --git a/packages/interactive-code-block/src/lib/pages/libraries-page.tsx b/packages/interactive-code-block/src/lib/pages/libraries-page.tsx new file mode 100644 index 0000000000..b7ec1daea6 --- /dev/null +++ b/packages/interactive-code-block/src/lib/pages/libraries-page.tsx @@ -0,0 +1,21 @@ +import * as React from '@wordpress/element'; + +import { render } from '@wordpress/element'; +import PharLibrariesList from './libraries-list'; +import { installEntities } from './entities'; +import Notifications from './notifications'; +installEntities(); + +window.addEventListener( + 'load', + function () { + render( + <> + + + , + document.querySelector('#libraries') + ); + }, + false +); diff --git a/packages/interactive-code-block/src/lib/pages/notifications.tsx b/packages/interactive-code-block/src/lib/pages/notifications.tsx new file mode 100644 index 0000000000..247a212635 --- /dev/null +++ b/packages/interactive-code-block/src/lib/pages/notifications.tsx @@ -0,0 +1,21 @@ +import * as React from '@wordpress/element'; + +import { SnackbarList } from '@wordpress/components'; +import { useSelect, useDispatch } from '@wordpress/data'; +import { store as noticesStore } from '@wordpress/notices'; + +export default function Notifications() { + const notices = useSelect( + (select) => (select(noticesStore) as any).getNotices(), + [] + ); + const { removeNotice } = useDispatch(noticesStore); + const snackbarNotices = notices.filter(({ type }) => type === 'snackbar'); + return ( + + ); +} diff --git a/packages/interactive-code-block/src/lib/pages/upload-overlay.tsx b/packages/interactive-code-block/src/lib/pages/upload-overlay.tsx new file mode 100644 index 0000000000..47b04ea65f --- /dev/null +++ b/packages/interactive-code-block/src/lib/pages/upload-overlay.tsx @@ -0,0 +1,31 @@ +import * as React from '@wordpress/element'; +import { useRef } from '@wordpress/element'; + +const UploadOverlay = ({ onFileSelected }) => { + const fileInputRef = useRef(null); + + const handleFileChange = async (event) => { + await onFileSelected(event.target.files[0]); + event.target.value = null; + }; + + return ( + + ); +}; + +export default UploadOverlay; diff --git a/packages/interactive-code-block/src/lib/php-worker.ts b/packages/interactive-code-block/src/lib/php-worker.ts new file mode 100644 index 0000000000..ff61709554 --- /dev/null +++ b/packages/interactive-code-block/src/lib/php-worker.ts @@ -0,0 +1,40 @@ +import { + exposeAPI, + parseWorkerStartupOptions, + PublicAPI, + WebPHP, + WebPHPEndpoint, +} from '@php-wasm/web'; +import { EmscriptenDownloadMonitor } from '@php-wasm/progress'; +import { + LatestSupportedPHPVersion, + SupportedPHPVersion, + SupportedPHPVersionsList, +} from '@php-wasm/universal'; + +interface WorkerOptions extends Record { + php: string; +} +const options = parseWorkerStartupOptions(); +const phpVersion = (options?.php?.replace('_', '.') || + LatestSupportedPHPVersion) as SupportedPHPVersion; +if (!SupportedPHPVersionsList.includes(phpVersion)) { + throw new Error(`Unsupported PHP version ${phpVersion}`); +} + +const monitor = new EmscriptenDownloadMonitor(); +const { php, phpReady } = WebPHP.loadSync(phpVersion, { + requestHandler: { + documentRoot: '/', + absoluteUrl: 'https://example.com/', + }, + downloadMonitor: monitor, +}); + +const [setApiReady, client] = exposeAPI(new WebPHPEndpoint(php, monitor)); +await phpReady; + +setApiReady(); + +export type PHPClient = PublicAPI; +export const assertClientType: PHPClient = client; diff --git a/packages/interactive-code-block/src/lib/types.ts b/packages/interactive-code-block/src/lib/types.ts new file mode 100644 index 0000000000..88266d308e --- /dev/null +++ b/packages/interactive-code-block/src/lib/types.ts @@ -0,0 +1,67 @@ +export type MemFile = { + fileName: string; + contents: string; +}; + +export const outputFormats = { + plaintext: 'Plain text', + html: 'HTML', + jsontabular: 'JSON (tabular)', + jsontabularsql: 'JSON (tabular, SQL queries)', +} as const; +export type OutputFormat = keyof typeof outputFormats; + +export interface ExecutionScript { + id: string; + runner: CodeRunnerClass['id']; + name?: string; + content: string; + outputFormat?: OutputFormat; + libraries?: string[]; +} + +export interface Library { + id: string; + name: string; + url: string; +} + +export type LoadingStatus = 'idle' | 'loading' | 'ready' | 'error'; + +export interface InteractiveCodeSnippetBlockAttributes { + code: string; + fileType: 'php' | 'sql'; + executionScript: string; + libraries: string[]; + cachedOutput: string; + showCachedOutput: boolean; +} + +export interface ICodeRunner { + isReady: boolean; + isRunning: boolean; + result?: string; + run(code: string): Promise; + addEventListener(event: string, listener: any): void; + setLoadedLibraries(loadedLibraries: Record): void; +} + +import type PHPRunner from './components/php-runner'; +import type PlaygroundRunner from './components/playground-runner'; + +export type CodeRunner = PHPRunner | PlaygroundRunner; + +// Get class type from instance type +export interface Type extends Function { + new (...args: any[]): T; +} +export type CodeRunnerClass = Type & { + id: string; + defaultExecutionScript: ExecutionScript; +}; + +export interface Loader { + load(): Promise; + // progress or ready + addEventListener(event: string, callback: any): void; +} diff --git a/packages/interactive-code-block/src/lib/utils.ts b/packages/interactive-code-block/src/lib/utils.ts new file mode 100644 index 0000000000..50cd5a3534 --- /dev/null +++ b/packages/interactive-code-block/src/lib/utils.ts @@ -0,0 +1,5 @@ +export function setFileName(url: URL, newFilename: any) { + const currentScriptPath = url.pathname.split('/').slice(0, -1).join('/'); + url.pathname = `${currentScriptPath}/${newFilename}`; + return url; +} diff --git a/packages/interactive-code-block/tsconfig.json b/packages/interactive-code-block/tsconfig.json new file mode 100644 index 0000000000..368f1cc019 --- /dev/null +++ b/packages/interactive-code-block/tsconfig.json @@ -0,0 +1,24 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "forceConsistentCasingInFileNames": true, + "strict": true, + "jsx": "react-jsx", + "noImplicitOverride": true, + "noPropertyAccessFromIndexSignature": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "allowSyntheticDefaultImports": true, + "types": ["vitest", "react"] + }, + "files": [], + "include": [], + "references": [ + { + "path": "./tsconfig.lib.json" + }, + { + "path": "./tsconfig.spec.json" + } + ] +} diff --git a/packages/interactive-code-block/tsconfig.lib.json b/packages/interactive-code-block/tsconfig.lib.json new file mode 100644 index 0000000000..03cb63a509 --- /dev/null +++ b/packages/interactive-code-block/tsconfig.lib.json @@ -0,0 +1,18 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../dist/out-tsc", + "declaration": true + }, + "include": [ + "src/**/*.ts", + "src/lib/block/view-async.tsx", + "src/lib/block/register.tsx", + "src/lib/components/php-runner/index.tsx", + "src/lib/components/playground-runner/index.tsx", + "src/lib/hooks/use-code-runner.tsx", + "src/lib/hooks/use-libraries.tsx", + "src/lib/components/code-runner/index.tsx" + ], + "exclude": ["jest.config.ts", "src/**/*.spec.ts", "src/**/*.test.ts"] +} diff --git a/packages/interactive-code-block/tsconfig.spec.json b/packages/interactive-code-block/tsconfig.spec.json new file mode 100644 index 0000000000..eb23daacbc --- /dev/null +++ b/packages/interactive-code-block/tsconfig.spec.json @@ -0,0 +1,19 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "../../dist/out-tsc", + "types": ["vitest/globals", "vitest/importMeta", "vite/client", "node"] + }, + "include": [ + "vite.config.ts", + "src/**/*.test.ts", + "src/**/*.spec.ts", + "src/**/*.test.tsx", + "src/**/*.spec.tsx", + "src/**/*.test.js", + "src/**/*.spec.js", + "src/**/*.test.jsx", + "src/**/*.spec.jsx", + "src/**/*.d.ts" + ] +} diff --git a/packages/interactive-code-block/vite.config.ts b/packages/interactive-code-block/vite.config.ts new file mode 100644 index 0000000000..651bd4e972 --- /dev/null +++ b/packages/interactive-code-block/vite.config.ts @@ -0,0 +1,262 @@ +/// +import { defineConfig } from 'vite'; +import * as fs from 'fs'; +import * as crypto from 'crypto'; +import react from '@vitejs/plugin-react'; +import viteTsConfigPaths from 'vite-tsconfig-paths'; +import externalGlobals from 'rollup-plugin-external-globals'; +import { viteStaticCopy } from 'vite-plugin-static-copy'; +import type { OutputOptions } from 'rollup'; + +const path = (filename: string) => new URL(filename, import.meta.url).pathname; +export default defineConfig({ + base: './', + assetsInclude: ['**/*.wasm', '**/*.data'], + cacheDir: '../../node_modules/.vite/interactive-code-block', + + css: { + modules: { + localsConvention: 'camelCaseOnly', + }, + }, + + plugins: [ + viteTsConfigPaths({ + root: '../../', + }), + + viteStaticCopy({ + targets: [ + { + src: path('../../dist/packages/playground/client/index.js'), + dest: 'assets/', + rename: () => 'playground-client.js', + }, + { + src: new URL('src/lib/block/editor.css', import.meta.url) + .pathname, + dest: 'assets/', + }, + { + src: new URL('src/lib/block/view.css', import.meta.url) + .pathname, + dest: 'assets/', + }, + ], + }), + + ...WordPressVitePlugins({ + manifest: { + entrypoints: [ + 'editor', + 'view', + 'execution-scripts', + 'libraries', + ], + }, + }), + ], + + // Uncomment this if you are using workers. + worker: { + format: 'es', + plugins: [ + viteTsConfigPaths({ + root: '../../', + }), + ], + }, + + // Configuration for building your library. + // See: https://vitejs.dev/guide/build.html#library-mode + build: { + assetsInlineLimit: 0, + minify: true, + rollupOptions: { + preserveEntrySignatures: 'strict', + plugins: [react()], + input: { + ['comlink']: 'comlink/dist/esm/comlink.mjs', + ['editor']: path('src/lib/block/editor.tsx'), + ['view']: path('src/lib/block/view.ts'), + ['execution-scripts']: path( + 'src/lib/pages/execution-scripts-page.tsx' + ), + ['libraries']: path('src/lib/pages/libraries-page.tsx'), + }, + output: { + // Change this to the formats you want to support. + // Don't forgot to update your package.json as well. + format: 'es', + entryFileNames: (entryInfo) => { + if (entryInfo.name.includes('comlink')) { + return 'assets/comlink.js'; + } + return 'assets/[name]-[hash].js'; + }, + chunkFileNames: (assetInfo) => { + if (assetInfo.name === 'view.ts') { + return 'assets/view.js'; + } + return 'assets/[name]-[hash].js'; + }, + assetFileNames: (assetInfo) => { + if (assetInfo.name === 'block.json') { + return 'assets/block.json'; + } + return 'assets/[name]-[hash][extname]'; + }, + }, + }, + }, + + test: { + globals: true, + cache: { + dir: '../../node_modules/.vitest', + }, + environment: 'jsdom', + include: ['src/**/*.{test,spec}.{js,mjs,cjs,ts,mts,cts,jsx,tsx}'], + }, +}); + +interface WordPressVitePluginOptions { + manifest?: { + entrypoints?: string[]; + }; +} +function WordPressVitePlugins(pluginOptions: WordPressVitePluginOptions): any { + const wpImports: string[] = []; + return [ + externalGlobals( + ((id: string) => { + const globalVar = getGlobalForModule(id); + if (globalVar) { + if (id.includes('@wordpress/')) { + wpImports.push(globalVar); + } + return globalVar; + } + return; + }) as any, + { + include: ['**/*.ts', '**/*.js', '**/*.tsx', '**/*.jsx'], + } + ), + { + name: 'wordpress-dependency-extraction', + enforce: 'pre', + generateBundle( + options: OutputOptions, + bundle: Record + ) { + const deps = [...new Set(wpImports)] + // wp.element to wp-element + .map((dep) => dep.replace('.', '-')) + // wp-blockEditor to wp-block-editor + .map((dep) => + dep.replace( + /[A-Z]/g, + (letter) => `-${letter.toLowerCase()}` + ) + ); + + const files = []; + let code = ''; + for (const [, value] of Object.entries(bundle)) { + code += value.code; + const include = + !value['name'].endsWith('.wasm') && + (!pluginOptions?.manifest?.entrypoints || + pluginOptions.manifest.entrypoints?.includes( + value['name'] + )); + if (include) { + files.push( + `${JSON.stringify( + value['name'] + )} => ${JSON.stringify(value['fileName'])},` + ); + } + } + fs.writeFileSync( + `${options.dir}/index.asset.php`, + ` ${JSON.stringify(sha256(code).substring(0, 8))}, + 'dependencies' => ${JSON.stringify(deps)}, + 'files' => array( + ${files.join('\n')} + ) + ); + ` + ); + }, + }, + ]; +} + +function sha256(buffer: any) { + const hash = crypto.createHash('sha256'); + hash.update(buffer); + return hash.digest('hex'); +} + +function getGlobalForModule(id: string) { + return { + react: 'window.wp.element', + 'react-dom': 'window.wp.element', + lodash: 'window.lodash', + 'lodash-es': 'window.lodash', + moment: 'window.moment', + jquery: 'window.jQuery', + tinymce: 'tinymce', + backbone: 'Backbone', + '@wordpress/a11y': 'wp.a11y', + '@wordpress/api-fetch': 'wp.apiFetch', + '@wordpress/autop': 'wp.autop', + '@wordpress/blob': 'wp.blob', + '@wordpress/block-directory': 'wp.blockDirectory', + '@wordpress/block-editor': 'wp.blockEditor', + '@wordpress/block-library': 'wp.blockLibrary', + '@wordpress/block-serialization-default-parser': + 'wp.blockSerializationDefaultParser', + '@wordpress/blocks': 'wp.blocks', + '@wordpress/components': 'wp.components', + '@wordpress/compose': 'wp.compose', + '@wordpress/core-data': 'wp.coreData', + '@wordpress/data': 'wp.data', + '@wordpress/date': 'wp.date', + '@wordpress/deprecated': 'wp.deprecated', + '@wordpress/dom': 'wp.dom', + '@wordpress/dom-ready': 'wp.domReady', + '@wordpress/edit-navigation': 'wp.editNavigation', + '@wordpress/edit-post': 'wp.editPost', + '@wordpress/edit-site': 'wp.editSite', + '@wordpress/edit-widgets': 'wp.editWidgets', + '@wordpress/editor': 'wp.editor', + '@wordpress/element': 'wp.element', + '@wordpress/escape-html': 'wp.escapeHtml', + '@wordpress/format-library': 'wp.formatLibrary', + '@wordpress/hooks': 'wp.hooks', + '@wordpress/html-entities': 'wp.htmlEntities', + '@wordpress/i18n': 'wp.i18n', + // '@wordpress/icons': 'wp.icons', + '@wordpress/is-shallow-equal': 'wp.isShallowEqual', + '@wordpress/keyboard-shortcuts': 'wp.keyboardShortcuts', + '@wordpress/keycodes': 'wp.keycodes', + '@wordpress/notices': 'wp.notices', + '@wordpress/nux': 'wp.nux', + '@wordpress/plugins': 'wp.plugins', + '@wordpress/preferences': 'wp.preferences', + '@wordpress/preferences-persistence': 'wp.preferencesPersistence', + '@wordpress/primitives': 'wp.primitives', + '@wordpress/reusable-blocks': 'wp.reusableBlocks', + '@wordpress/rich-text': 'wp.richText', + '@wordpress/shortcode': 'wp.shortcode', + '@wordpress/url': 'wp.url', + '@wordpress/viewport': 'wp.viewport', + '@wordpress/warning': 'wp.warning', + '@wordpress/widgets': 'wp.widgets', + '@wordpress/wordcount': 'wp.wordcount', + }[id]; +} diff --git a/tsconfig.base.json b/tsconfig.base.json index d3218e7daa..bd58c57bd5 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -8,6 +8,8 @@ "emitDecoratorMetadata": true, "experimentalDecorators": true, "importHelpers": true, + "resolveJsonModule": true, + "jsx": "react", "target": "ES2021", "module": "esnext", "lib": ["ES2022", "dom"], @@ -32,6 +34,9 @@ "@wp-playground/client": [ "packages/playground/client/src/index.ts" ], + "@wp-playground/interactive-code-block": [ + "packages/interactive-code-block/src/index.ts" + ], "@wp-playground/node": ["packages/playground/node/src/index.ts"], "@wp-playground/nx-extensions": [ "packages/nx-extensions/src/index.ts" diff --git a/yarn.lock b/yarn.lock index 5e42abb7b0..8e08ce344e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -277,6 +277,13 @@ dependencies: "@babel/types" "^7.18.6" +"@babel/helper-module-imports@^7.16.7": + version "7.21.4" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz#ac88b2f76093637489e718a90cec6cf8a9b029af" + integrity sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg== + dependencies: + "@babel/types" "^7.21.4" + "@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.20.11", "@babel/helper-module-transforms@^7.21.2": version "7.21.2" resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.21.2.tgz#160caafa4978ac8c00ac66636cb0fa37b024e2d2" @@ -351,6 +358,11 @@ resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63" integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== +"@babel/helper-string-parser@^7.21.5": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.21.5.tgz#2b3eea65443c6bdc31c22d037c65f6d323b6b2bd" + integrity sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w== + "@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1": version "7.19.1" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" @@ -1090,6 +1102,13 @@ dependencies: regenerator-runtime "^0.13.11" +"@babel/runtime@^7.16.0", "@babel/runtime@^7.18.3", "@babel/runtime@^7.21.0", "@babel/runtime@^7.9.2": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.21.5.tgz#8492dddda9644ae3bda3b45eabe87382caee7200" + integrity sha512-8jI69toZqqcsnqGGqwGS4Qb1VwLOEp4hz+CXPywcvjs60u3B4Pom/U/7rm4W8tMOYEB+E9wgD0mW1l3r8qlI9Q== + dependencies: + regenerator-runtime "^0.13.11" + "@babel/template@^7.18.10", "@babel/template@^7.20.7", "@babel/template@^7.3.3": version "7.20.7" resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.20.7.tgz#a15090c2839a83b02aa996c0b4994005841fd5a8" @@ -1124,11 +1143,194 @@ "@babel/helper-validator-identifier" "^7.19.1" to-fast-properties "^2.0.0" +"@babel/types@^7.21.4": + version "7.21.5" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.21.5.tgz#18dfbd47c39d3904d5db3d3dc2cc80bedb60e5b6" + integrity sha512-m4AfNvVF2mVC/F7fDEdH2El3HzUg9It/XsCxZiOTTA3m3qYfcSVSbTfM6Q9xG+hYDniZssYhlXKKUMD5m8tF4Q== + dependencies: + "@babel/helper-string-parser" "^7.21.5" + "@babel/helper-validator-identifier" "^7.19.1" + to-fast-properties "^2.0.0" + "@bcoe/v8-coverage@^0.2.3": version "0.2.3" resolved "https://registry.yarnpkg.com/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz#75a2e8b51cb758a7553d6804a5932d7aace75c39" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== +"@codemirror/autocomplete@6.4.2": + version "6.4.2" + resolved "https://registry.yarnpkg.com/@codemirror/autocomplete/-/autocomplete-6.4.2.tgz#938b25223bd21f97b2a6d85474643355f98b505b" + integrity sha512-8WE2xp+D0MpWEv5lZ6zPW1/tf4AGb358T5GWYiKEuCP8MvFfT3tH2mIF9Y2yr2e3KbHuSvsVhosiEyqCpiJhZQ== + dependencies: + "@codemirror/language" "^6.0.0" + "@codemirror/state" "^6.0.0" + "@codemirror/view" "^6.6.0" + "@lezer/common" "^1.0.0" + +"@codemirror/autocomplete@^6.0.0": + version "6.6.1" + resolved "https://registry.yarnpkg.com/@codemirror/autocomplete/-/autocomplete-6.6.1.tgz#19e3541f8d17ceeb7e96fcc7506e8da9346b14af" + integrity sha512-RpsvnYOopnyNbZg487qoRD5bKg63KMMUVP5d8MQ4Luc7Mb6JBWTORovLi6cTvWaKlbmLW8Zd2dAJkIdrhBsXug== + dependencies: + "@codemirror/language" "^6.0.0" + "@codemirror/state" "^6.0.0" + "@codemirror/view" "^6.6.0" + "@lezer/common" "^1.0.0" + +"@codemirror/commands@6.2.2": + version "6.2.2" + resolved "https://registry.yarnpkg.com/@codemirror/commands/-/commands-6.2.2.tgz#437d9ba275107dbc629f0bfa3b150e0e43f2a218" + integrity sha512-s9lPVW7TxXrI/7voZ+HmD/yiAlwAYn9PH5SUVSUhsxXHhv4yl5eZ3KLntSoTynfdgVYM0oIpccQEWRBQgmNZyw== + dependencies: + "@codemirror/language" "^6.0.0" + "@codemirror/state" "^6.2.0" + "@codemirror/view" "^6.0.0" + "@lezer/common" "^1.0.0" + +"@codemirror/lang-css@6.1.1": + version "6.1.1" + resolved "https://registry.yarnpkg.com/@codemirror/lang-css/-/lang-css-6.1.1.tgz#8c4414d399df14e796f9891a8152e411264ef535" + integrity sha512-P6jdNEHyRcqqDgbvHYyC9Wxkek0rnG3a9aVSRi4a7WrjPbQtBTaOmvYpXmm13zZMAatO4Oqpac+0QZs7sy+LnQ== + dependencies: + "@codemirror/autocomplete" "^6.0.0" + "@codemirror/language" "^6.0.0" + "@codemirror/state" "^6.0.0" + "@lezer/css" "^1.0.0" + +"@codemirror/lang-css@^6.0.0": + version "6.2.0" + resolved "https://registry.yarnpkg.com/@codemirror/lang-css/-/lang-css-6.2.0.tgz#f84f9da392099432445c75e32fdac63ae572315f" + integrity sha512-oyIdJM29AyRPM3+PPq1I2oIk8NpUfEN3kAM05XWDDs6o3gSneIKaVJifT2P+fqONLou2uIgXynFyMUDQvo/szA== + dependencies: + "@codemirror/autocomplete" "^6.0.0" + "@codemirror/language" "^6.0.0" + "@codemirror/state" "^6.0.0" + "@lezer/common" "^1.0.2" + "@lezer/css" "^1.0.0" + +"@codemirror/lang-html@6.4.2": + version "6.4.2" + resolved "https://registry.yarnpkg.com/@codemirror/lang-html/-/lang-html-6.4.2.tgz#3c7117e45bae009bc7bc08eef8a79b5d05930d83" + integrity sha512-bqCBASkteKySwtIbiV/WCtGnn/khLRbbiV5TE+d9S9eQJD7BA4c5dTRm2b3bVmSpilff5EYxvB4PQaZzM/7cNw== + dependencies: + "@codemirror/autocomplete" "^6.0.0" + "@codemirror/lang-css" "^6.0.0" + "@codemirror/lang-javascript" "^6.0.0" + "@codemirror/language" "^6.4.0" + "@codemirror/state" "^6.0.0" + "@codemirror/view" "^6.2.2" + "@lezer/common" "^1.0.0" + "@lezer/css" "^1.1.0" + "@lezer/html" "^1.3.0" + +"@codemirror/lang-html@^6.0.0": + version "6.4.3" + resolved "https://registry.yarnpkg.com/@codemirror/lang-html/-/lang-html-6.4.3.tgz#dec78f76d9d0261cbe9f2a3a247a1b546327f700" + integrity sha512-VKzQXEC8nL69Jg2hvAFPBwOdZNvL8tMFOrdFwWpU+wc6a6KEkndJ/19R5xSaglNX6v2bttm8uIEFYxdQDcIZVQ== + dependencies: + "@codemirror/autocomplete" "^6.0.0" + "@codemirror/lang-css" "^6.0.0" + "@codemirror/lang-javascript" "^6.0.0" + "@codemirror/language" "^6.4.0" + "@codemirror/state" "^6.0.0" + "@codemirror/view" "^6.2.2" + "@lezer/common" "^1.0.0" + "@lezer/css" "^1.1.0" + "@lezer/html" "^1.3.0" + +"@codemirror/lang-javascript@6.1.4": + version "6.1.4" + resolved "https://registry.yarnpkg.com/@codemirror/lang-javascript/-/lang-javascript-6.1.4.tgz#8a41f4d213e1143b4eef6f65f8b77b349aaf894c" + integrity sha512-OxLf7OfOZBTMRMi6BO/F72MNGmgOd9B0vetOLvHsDACFXayBzW8fm8aWnDM0yuy68wTK03MBf4HbjSBNRG5q7A== + dependencies: + "@codemirror/autocomplete" "^6.0.0" + "@codemirror/language" "^6.6.0" + "@codemirror/lint" "^6.0.0" + "@codemirror/state" "^6.0.0" + "@codemirror/view" "^6.0.0" + "@lezer/common" "^1.0.0" + "@lezer/javascript" "^1.0.0" + +"@codemirror/lang-javascript@^6.0.0": + version "6.1.7" + resolved "https://registry.yarnpkg.com/@codemirror/lang-javascript/-/lang-javascript-6.1.7.tgz#e39fb9757b1cf47de432e4244d18ca5284a73a58" + integrity sha512-KXKqxlZ4W6t5I7i2ScmITUD3f/F5Cllk3kj0De9P9mFeYVfhOVOWuDLgYiLpk357u7Xh4dhqjJAnsNPPoTLghQ== + dependencies: + "@codemirror/autocomplete" "^6.0.0" + "@codemirror/language" "^6.6.0" + "@codemirror/lint" "^6.0.0" + "@codemirror/state" "^6.0.0" + "@codemirror/view" "^6.0.0" + "@lezer/common" "^1.0.0" + "@lezer/javascript" "^1.0.0" + +"@codemirror/lang-php@6.0.1": + version "6.0.1" + resolved "https://registry.yarnpkg.com/@codemirror/lang-php/-/lang-php-6.0.1.tgz#fa34cc75562178325861a5731f79bd621f57ffaa" + integrity sha512-ublojMdw/PNWa7qdN5TMsjmqkNuTBD3k6ndZ4Z0S25SBAiweFGyY68AS3xNcIOlb6DDFDvKlinLQ40vSLqf8xA== + dependencies: + "@codemirror/lang-html" "^6.0.0" + "@codemirror/language" "^6.0.0" + "@codemirror/state" "^6.0.0" + "@lezer/common" "^1.0.0" + "@lezer/php" "^1.0.0" + +"@codemirror/lang-sql@6.4.0": + version "6.4.0" + resolved "https://registry.yarnpkg.com/@codemirror/lang-sql/-/lang-sql-6.4.0.tgz#f9303e511fb9511884f90043e354d5df3bd4b032" + integrity sha512-UWGK1+zc9+JtkiT+XxHByp4N6VLgLvC2x0tIudrJG26gyNtn0hWOVoB0A8kh/NABPWkKl3tLWDYf2qOBJS9Zdw== + dependencies: + "@codemirror/autocomplete" "^6.0.0" + "@codemirror/language" "^6.0.0" + "@codemirror/state" "^6.0.0" + "@lezer/highlight" "^1.0.0" + "@lezer/lr" "^1.0.0" + +"@codemirror/language@6.6.0", "@codemirror/language@^6.0.0", "@codemirror/language@^6.4.0", "@codemirror/language@^6.6.0": + version "6.6.0" + resolved "https://registry.yarnpkg.com/@codemirror/language/-/language-6.6.0.tgz#2204407174a38a68053715c19e28ad61f491779f" + integrity sha512-cwUd6lzt3MfNYOobdjf14ZkLbJcnv4WtndYaoBkbor/vF+rCNguMPK0IRtvZJG4dsWiaWPcK8x1VijhvSxnstg== + dependencies: + "@codemirror/state" "^6.0.0" + "@codemirror/view" "^6.0.0" + "@lezer/common" "^1.0.0" + "@lezer/highlight" "^1.0.0" + "@lezer/lr" "^1.0.0" + style-mod "^4.0.0" + +"@codemirror/lint@^6.0.0": + version "6.2.1" + resolved "https://registry.yarnpkg.com/@codemirror/lint/-/lint-6.2.1.tgz#654581d8cc293c315ecfa5c9d61d78c52bbd9ccd" + integrity sha512-y1muai5U/uUPAGRyHMx9mHuHLypPcHWxzlZGknp/U5Mdb5Ol8Q5ZLp67UqyTbNFJJ3unVxZ8iX3g1fMN79S1JQ== + dependencies: + "@codemirror/state" "^6.0.0" + "@codemirror/view" "^6.0.0" + crelt "^1.0.5" + +"@codemirror/state@6.2.0", "@codemirror/state@^6.0.0", "@codemirror/state@^6.1.4", "@codemirror/state@^6.2.0": + version "6.2.0" + resolved "https://registry.yarnpkg.com/@codemirror/state/-/state-6.2.0.tgz#a0fb08403ced8c2a68d1d0acee926bd20be922f2" + integrity sha512-69QXtcrsc3RYtOtd+GsvczJ319udtBf1PTrr2KbLWM/e2CXUPnh0Nz9AUo8WfhSQ7GeL8dPVNUmhQVgpmuaNGA== + +"@codemirror/theme-one-dark@6.1.1": + version "6.1.1" + resolved "https://registry.yarnpkg.com/@codemirror/theme-one-dark/-/theme-one-dark-6.1.1.tgz#76600555cbb314c495216f018f75b0c28daff158" + integrity sha512-+CfzmScfJuD6uDF5bHJkAjWTQ2QAAHxODCPxUEgcImDYcJLT+4l5vLnBHmDVv46kCC5uUJGMrBJct2Z6JbvqyQ== + dependencies: + "@codemirror/language" "^6.0.0" + "@codemirror/state" "^6.0.0" + "@codemirror/view" "^6.0.0" + "@lezer/highlight" "^1.0.0" + +"@codemirror/view@6.9.3", "@codemirror/view@^6.0.0", "@codemirror/view@^6.2.2", "@codemirror/view@^6.6.0": + version "6.9.3" + resolved "https://registry.yarnpkg.com/@codemirror/view/-/view-6.9.3.tgz#4475dc0ff5d9a55f8144ad7484e7e17416861cce" + integrity sha512-BJ5mvEIhFM+SrNwc5X8pLIvMM9ffjkviVbxpg84Xk2OE8ZyKaEbId8kX+nAYEEso7+qnbwsXe1bkAHsasebMow== + dependencies: + "@codemirror/state" "^6.1.4" + style-mod "^4.0.0" + w3c-keyname "^2.2.4" + "@convex-dev/typedoc-plugin-markdown@3.14.0": version "3.14.0" resolved "https://registry.yarnpkg.com/@convex-dev/typedoc-plugin-markdown/-/typedoc-plugin-markdown-3.14.0.tgz#86947c486f05b1915728425ddf737fc4858201fc" @@ -1166,6 +1368,136 @@ "@docsearch/css" "3.3.3" algoliasearch "^4.0.0" +"@emotion/babel-plugin@^11.10.8": + version "11.10.8" + resolved "https://registry.yarnpkg.com/@emotion/babel-plugin/-/babel-plugin-11.10.8.tgz#bae325c902937665d00684038fd5294223ef9e1d" + integrity sha512-gxNky50AJL3AlkbjvTARiwAqei6/tNUxDZPSKd+3jqWVM3AmdVTTdpjHorR/an/M0VJqdsuq5oGcFH+rjtyujQ== + dependencies: + "@babel/helper-module-imports" "^7.16.7" + "@babel/runtime" "^7.18.3" + "@emotion/hash" "^0.9.0" + "@emotion/memoize" "^0.8.0" + "@emotion/serialize" "^1.1.1" + babel-plugin-macros "^3.1.0" + convert-source-map "^1.5.0" + escape-string-regexp "^4.0.0" + find-root "^1.1.0" + source-map "^0.5.7" + stylis "4.1.4" + +"@emotion/cache@^11.10.8", "@emotion/cache@^11.7.1": + version "11.10.8" + resolved "https://registry.yarnpkg.com/@emotion/cache/-/cache-11.10.8.tgz#3b39b4761bea0ae2f4f07f0a425eec8b6977c03e" + integrity sha512-5fyqGHi51LU95o7qQ/vD1jyvC4uCY5GcBT+UgP4LHdpO9jPDlXqhrRr9/wCKmfoAvh5G/F7aOh4MwQa+8uEqhA== + dependencies: + "@emotion/memoize" "^0.8.0" + "@emotion/sheet" "^1.2.1" + "@emotion/utils" "^1.2.0" + "@emotion/weak-memoize" "^0.3.0" + stylis "4.1.4" + +"@emotion/css@^11.7.1": + version "11.10.8" + resolved "https://registry.yarnpkg.com/@emotion/css/-/css-11.10.8.tgz#9dec9996ad9a1cc28ec8d26b1b27ab0b8f6fb053" + integrity sha512-i9k0HKUKz5KuZbzVpMpcg1OZWDG+Ete9wIa6OT4sOaxE64PG8S8H8H6sVYHvkCmAgcO+hbxT1XMr5pz/jTranQ== + dependencies: + "@emotion/babel-plugin" "^11.10.8" + "@emotion/cache" "^11.10.8" + "@emotion/serialize" "^1.1.1" + "@emotion/sheet" "^1.2.1" + "@emotion/utils" "^1.2.0" + +"@emotion/hash@^0.9.0": + version "0.9.0" + resolved "https://registry.yarnpkg.com/@emotion/hash/-/hash-0.9.0.tgz#c5153d50401ee3c027a57a177bc269b16d889cb7" + integrity sha512-14FtKiHhy2QoPIzdTcvh//8OyBlknNs2nXRwIhG904opCby3l+9Xaf/wuPvICBF0rc1ZCNBd3nKe9cd2mecVkQ== + +"@emotion/is-prop-valid@^0.8.2": + version "0.8.8" + resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-0.8.8.tgz#db28b1c4368a259b60a97311d6a952d4fd01ac1a" + integrity sha512-u5WtneEAr5IDG2Wv65yhunPSMLIpuKsbuOktRojfrEiEvRyC85LgPMZI63cr7NUqT8ZIGdSVg8ZKGxIug4lXcA== + dependencies: + "@emotion/memoize" "0.7.4" + +"@emotion/is-prop-valid@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@emotion/is-prop-valid/-/is-prop-valid-1.2.0.tgz#7f2d35c97891669f7e276eb71c83376a5dc44c83" + integrity sha512-3aDpDprjM0AwaxGE09bOPkNxHpBd+kA6jty3RnaEXdweX1DF1U3VQpPYb0g1IStAuK7SVQ1cy+bNBBKp4W3Fjg== + dependencies: + "@emotion/memoize" "^0.8.0" + +"@emotion/memoize@0.7.4": + version "0.7.4" + resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.7.4.tgz#19bf0f5af19149111c40d98bb0cf82119f5d9eeb" + integrity sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw== + +"@emotion/memoize@^0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@emotion/memoize/-/memoize-0.8.0.tgz#f580f9beb67176fa57aae70b08ed510e1b18980f" + integrity sha512-G/YwXTkv7Den9mXDO7AhLWkE3q+I92B+VqAE+dYG4NGPaHZGvt3G8Q0p9vmE+sq7rTGphUbAvmQ9YpbfMQGGlA== + +"@emotion/react@^11.7.1": + version "11.10.8" + resolved "https://registry.yarnpkg.com/@emotion/react/-/react-11.10.8.tgz#02e274ecb45e03ab9d7a8eb9f0f0c064613eaf7b" + integrity sha512-ZfGfiABtJ1P1OXqOBsW08EgCDp5fK6C5I8hUJauc/VcJBGSzqAirMnFslhFWnZJ/w5HxPI36XbvMV0l4KZHl+w== + dependencies: + "@babel/runtime" "^7.18.3" + "@emotion/babel-plugin" "^11.10.8" + "@emotion/cache" "^11.10.8" + "@emotion/serialize" "^1.1.1" + "@emotion/use-insertion-effect-with-fallbacks" "^1.0.0" + "@emotion/utils" "^1.2.0" + "@emotion/weak-memoize" "^0.3.0" + hoist-non-react-statics "^3.3.1" + +"@emotion/serialize@^1.0.2", "@emotion/serialize@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@emotion/serialize/-/serialize-1.1.1.tgz#0595701b1902feded8a96d293b26be3f5c1a5cf0" + integrity sha512-Zl/0LFggN7+L1liljxXdsVSVlg6E/Z/olVWpfxUTxOAmi8NU7YoeWeLfi1RmnB2TATHoaWwIBRoL+FvAJiTUQA== + dependencies: + "@emotion/hash" "^0.9.0" + "@emotion/memoize" "^0.8.0" + "@emotion/unitless" "^0.8.0" + "@emotion/utils" "^1.2.0" + csstype "^3.0.2" + +"@emotion/sheet@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@emotion/sheet/-/sheet-1.2.1.tgz#0767e0305230e894897cadb6c8df2c51e61a6c2c" + integrity sha512-zxRBwl93sHMsOj4zs+OslQKg/uhF38MB+OMKoCrVuS0nyTkqnau+BM3WGEoOptg9Oz45T/aIGs1qbVAsEFo3nA== + +"@emotion/styled@^11.6.0": + version "11.10.8" + resolved "https://registry.yarnpkg.com/@emotion/styled/-/styled-11.10.8.tgz#a3fd68efd90bd7e8a06b82b95adec643d386fa69" + integrity sha512-gow0lF4Uw/QEdX2REMhI8v6wLOabPKJ+4HKNF0xdJ2DJdznN6fxaXpQOx6sNkyBhSUL558Rmcu1Lq/MYlVo4vw== + dependencies: + "@babel/runtime" "^7.18.3" + "@emotion/babel-plugin" "^11.10.8" + "@emotion/is-prop-valid" "^1.2.0" + "@emotion/serialize" "^1.1.1" + "@emotion/use-insertion-effect-with-fallbacks" "^1.0.0" + "@emotion/utils" "^1.2.0" + +"@emotion/unitless@^0.8.0": + version "0.8.0" + resolved "https://registry.yarnpkg.com/@emotion/unitless/-/unitless-0.8.0.tgz#a4a36e9cbdc6903737cd20d38033241e1b8833db" + integrity sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw== + +"@emotion/use-insertion-effect-with-fallbacks@^1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.0.tgz#ffadaec35dbb7885bd54de3fa267ab2f860294df" + integrity sha512-1eEgUGmkaljiBnRMTdksDV1W4kUnmwgp7X9G8B++9GYwl1lUdqSndSriIrTJ0N7LQaoauY9JJ2yhiOYK5+NI4A== + +"@emotion/utils@^1.0.0", "@emotion/utils@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-1.2.0.tgz#9716eaccbc6b5ded2ea5a90d65562609aab0f561" + integrity sha512-sn3WH53Kzpw8oQ5mgMmIzzyAaH2ZqFEbozVVBSYp538E06OSE6ytOp7pRAjNQR+Q/orwqdQYJSe2m3hCOeznkw== + +"@emotion/weak-memoize@^0.3.0": + version "0.3.0" + resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.3.0.tgz#ea89004119dc42db2e1dba0f97d553f7372f6fcb" + integrity sha512-AHPmaAx+RYfZz0eYu6Gviiagpmiyw98ySSlQvCUhVGDRtDFe4DBS0x1bSjdF3gqUDYOczB+yYvBTtEylYSdRhg== + "@esbuild/android-arm64@0.17.11": version "0.17.11" resolved "https://registry.yarnpkg.com/@esbuild/android-arm64/-/android-arm64-0.17.11.tgz#52c3e6cabc19c5e4c1c0c01cb58f0442338e1c14" @@ -1303,6 +1635,25 @@ minimatch "^3.1.2" strip-json-comments "^3.1.1" +"@floating-ui/core@^1.2.6": + version "1.2.6" + resolved "https://registry.yarnpkg.com/@floating-ui/core/-/core-1.2.6.tgz#d21ace437cc919cdd8f1640302fa8851e65e75c0" + integrity sha512-EvYTiXet5XqweYGClEmpu3BoxmsQ4hkj3QaYA6qEnigCWffTP3vNRwBReTdrwDwo7OoJ3wM8Uoe9Uk4n+d4hfg== + +"@floating-ui/dom@^1.0.0": + version "1.2.7" + resolved "https://registry.yarnpkg.com/@floating-ui/dom/-/dom-1.2.7.tgz#c123e4db014b07b97e996cd459245fa217049c6b" + integrity sha512-DyqylONj1ZaBnzj+uBnVfzdjjCkFCL2aA9ESHLyUOGSqb03RpbLMImP1ekIQXYs4KLk9jAjJfZAU8hXfWSahEg== + dependencies: + "@floating-ui/core" "^1.2.6" + +"@floating-ui/react-dom@1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@floating-ui/react-dom/-/react-dom-1.0.0.tgz#e0975966694433f1f0abffeee5d8e6bb69b7d16e" + integrity sha512-uiOalFKPG937UCLm42RxjESTWUVpbbatvlphQAU6bsv+ence6IoVG8JOUZcy8eW81NkU+Idiwvx10WFLmR4MIg== + dependencies: + "@floating-ui/dom" "^1.0.0" + "@gar/promisify@^1.1.3": version "1.1.3" resolved "https://registry.yarnpkg.com/@gar/promisify/-/promisify-1.1.3.tgz#555193ab2e3bb3b6adc3d551c9c030d9e860daf6" @@ -1882,6 +2233,58 @@ write-pkg "4.0.0" yargs "16.2.0" +"@lezer/common@^1.0.0", "@lezer/common@^1.0.2": + version "1.0.2" + resolved "https://registry.yarnpkg.com/@lezer/common/-/common-1.0.2.tgz#8fb9b86bdaa2ece57e7d59e5ffbcb37d71815087" + integrity sha512-SVgiGtMnMnW3ActR8SXgsDhw7a0w0ChHSYAyAUxxrOiJ1OqYWEKk/xJd84tTSPo1mo6DXLObAJALNnd0Hrv7Ng== + +"@lezer/css@^1.0.0", "@lezer/css@^1.1.0": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@lezer/css/-/css-1.1.1.tgz#c36dcb0789317cb80c3740767dd3b85e071ad082" + integrity sha512-mSjx+unLLapEqdOYDejnGBokB5+AiJKZVclmud0MKQOKx3DLJ5b5VTCstgDDknR6iIV4gVrN6euzsCnj0A2gQA== + dependencies: + "@lezer/highlight" "^1.0.0" + "@lezer/lr" "^1.0.0" + +"@lezer/highlight@^1.0.0", "@lezer/highlight@^1.1.3": + version "1.1.4" + resolved "https://registry.yarnpkg.com/@lezer/highlight/-/highlight-1.1.4.tgz#98ed821e89f72981b7ba590474e6ee86c8185619" + integrity sha512-IECkFmw2l7sFcYXrV8iT9GeY4W0fU4CxX0WMwhmhMIVjoDdD1Hr6q3G2NqVtLg/yVe5n7i4menG3tJ2r4eCrPQ== + dependencies: + "@lezer/common" "^1.0.0" + +"@lezer/html@^1.3.0": + version "1.3.4" + resolved "https://registry.yarnpkg.com/@lezer/html/-/html-1.3.4.tgz#7a5c5498dae6c93aee3de208bfb01aa3a0a932e3" + integrity sha512-HdJYMVZcT4YsMo7lW3ipL4NoyS2T67kMPuSVS5TgLGqmaCjEU/D6xv7zsa1ktvTK5lwk7zzF1e3eU6gBZIPm5g== + dependencies: + "@lezer/common" "^1.0.0" + "@lezer/highlight" "^1.0.0" + "@lezer/lr" "^1.0.0" + +"@lezer/javascript@^1.0.0": + version "1.4.3" + resolved "https://registry.yarnpkg.com/@lezer/javascript/-/javascript-1.4.3.tgz#f59e764a0578184c6fb86abb5279a9679777c3ba" + integrity sha512-k7Eo9z9B1supZ5cCD4ilQv/RZVN30eUQL+gGbr6ybrEY3avBAL5MDiYi2aa23Aj0A79ry4rJRvPAwE2TM8bd+A== + dependencies: + "@lezer/highlight" "^1.1.3" + "@lezer/lr" "^1.3.0" + +"@lezer/lr@^1.0.0", "@lezer/lr@^1.1.0", "@lezer/lr@^1.3.0": + version "1.3.4" + resolved "https://registry.yarnpkg.com/@lezer/lr/-/lr-1.3.4.tgz#8795bf2ba4f69b998e8fb4b5a7c57ea68753474c" + integrity sha512-7o+e4og/QoC/6btozDPJqnzBhUaD1fMfmvnEKQO1wRRiTse1WxaJ3OMEXZJnkgT6HCcTVOctSoXK9jGJw2oe9g== + dependencies: + "@lezer/common" "^1.0.0" + +"@lezer/php@^1.0.0": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@lezer/php/-/php-1.0.1.tgz#4496b58c980ca710c0433fd743d27e9964fd74ea" + integrity sha512-aqdCQJOXJ66De22vzdwnuC502hIaG9EnPK2rSi+ebXyUd+j7GAX1mRjWZOVOmf3GST1YUfUCu6WXDiEgDGOVwA== + dependencies: + "@lezer/highlight" "^1.0.0" + "@lezer/lr" "^1.1.0" + "@mdn/browser-compat-data@^5.2.33": version "5.2.42" resolved "https://registry.yarnpkg.com/@mdn/browser-compat-data/-/browser-compat-data-5.2.42.tgz#c6672c6008ca36846c46930d39c8aa342cff85d3" @@ -1929,6 +2332,59 @@ resolved "https://registry.yarnpkg.com/@microsoft/tsdoc/-/tsdoc-0.14.2.tgz#c3ec604a0b54b9a9b87e9735dfc59e1a5da6a5fb" integrity sha512-9b8mPpKrfeGRuhFH5iO1iwCLeIIsV6+H1sRfxbkoGXIyQE2BTsPd9zqSqQJ+pv5sJ/hT5M1zvOFL02MnEezFug== +"@motionone/animation@^10.15.1": + version "10.15.1" + resolved "https://registry.yarnpkg.com/@motionone/animation/-/animation-10.15.1.tgz#4a85596c31cbc5100ae8eb8b34c459fb0ccf6807" + integrity sha512-mZcJxLjHor+bhcPuIFErMDNyrdb2vJur8lSfMCsuCB4UyV8ILZLvK+t+pg56erv8ud9xQGK/1OGPt10agPrCyQ== + dependencies: + "@motionone/easing" "^10.15.1" + "@motionone/types" "^10.15.1" + "@motionone/utils" "^10.15.1" + tslib "^2.3.1" + +"@motionone/dom@^10.15.3": + version "10.15.5" + resolved "https://registry.yarnpkg.com/@motionone/dom/-/dom-10.15.5.tgz#4af18f8136d85c2fc997cac98121c969f6731802" + integrity sha512-Xc5avlgyh3xukU9tydh9+8mB8+2zAq+WlLsC3eEIp7Ax7DnXgY7Bj/iv0a4X2R9z9ZFZiaXK3BO0xMYHKbAAdA== + dependencies: + "@motionone/animation" "^10.15.1" + "@motionone/generators" "^10.15.1" + "@motionone/types" "^10.15.1" + "@motionone/utils" "^10.15.1" + hey-listen "^1.0.8" + tslib "^2.3.1" + +"@motionone/easing@^10.15.1": + version "10.15.1" + resolved "https://registry.yarnpkg.com/@motionone/easing/-/easing-10.15.1.tgz#95cf3adaef34da6deebb83940d8143ede3deb693" + integrity sha512-6hIHBSV+ZVehf9dcKZLT7p5PEKHGhDwky2k8RKkmOvUoYP3S+dXsKupyZpqx5apjd9f+php4vXk4LuS+ADsrWw== + dependencies: + "@motionone/utils" "^10.15.1" + tslib "^2.3.1" + +"@motionone/generators@^10.15.1": + version "10.15.1" + resolved "https://registry.yarnpkg.com/@motionone/generators/-/generators-10.15.1.tgz#dc6abb11139d1bafe758a41c134d4c753a9b871c" + integrity sha512-67HLsvHJbw6cIbLA/o+gsm7h+6D4Sn7AUrB/GPxvujse1cGZ38F5H7DzoH7PhX+sjvtDnt2IhFYF2Zp1QTMKWQ== + dependencies: + "@motionone/types" "^10.15.1" + "@motionone/utils" "^10.15.1" + tslib "^2.3.1" + +"@motionone/types@^10.15.1": + version "10.15.1" + resolved "https://registry.yarnpkg.com/@motionone/types/-/types-10.15.1.tgz#89441b54285012795cbba8612cbaa0fa420db3eb" + integrity sha512-iIUd/EgUsRZGrvW0jqdst8st7zKTzS9EsKkP+6c6n4MPZoQHwiHuVtTQLD6Kp0bsBLhNzKIBlHXponn/SDT4hA== + +"@motionone/utils@^10.15.1": + version "10.15.1" + resolved "https://registry.yarnpkg.com/@motionone/utils/-/utils-10.15.1.tgz#6b5f51bde75be88b5411e084310299050368a438" + integrity sha512-p0YncgU+iklvYr/Dq4NobTRdAPv9PveRDUXabPEeOjBLSO/1FNB2phNTZxOxpi1/GZwYpAoECEa0Wam+nsmhSw== + dependencies: + "@motionone/types" "^10.15.1" + hey-listen "^1.0.8" + tslib "^2.3.1" + "@nodelib/fs.scandir@2.1.5": version "2.1.5" resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz#7619c2eb21b25483f6d167548b4cfd5a7488c3d5" @@ -2894,6 +3350,57 @@ resolved "https://registry.yarnpkg.com/@polka/url/-/url-1.0.0-next.21.tgz#5de5a2385a35309427f6011992b544514d559aa1" integrity sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g== +"@popperjs/core@^2.5.4": + version "2.11.7" + resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.7.tgz#ccab5c8f7dc557a52ca3288c10075c9ccd37fff7" + integrity sha512-Cr4OjIkipTtcXKjAsm8agyleBuDHvxzeBoa1v543lbv1YaIwQjESsVcmjiWiPEbC1FIeHOG/Op9kdCmAmiS3Kw== + +"@react-spring/animated@~9.7.2": + version "9.7.2" + resolved "https://registry.yarnpkg.com/@react-spring/animated/-/animated-9.7.2.tgz#0119db8075e91d693ec45c42575541e01b104a70" + integrity sha512-ipvleJ99ipqlnHkz5qhSsgf/ny5aW0ZG8Q+/2Oj9cI7LCc7COdnrSO6V/v8MAX3JOoQNzfz6dye2s5Pt5jGaIA== + dependencies: + "@react-spring/shared" "~9.7.2" + "@react-spring/types" "~9.7.2" + +"@react-spring/core@~9.7.2": + version "9.7.2" + resolved "https://registry.yarnpkg.com/@react-spring/core/-/core-9.7.2.tgz#804ebadee45a6adff00886454d6f1c5d97ee219d" + integrity sha512-fF512edZT/gKVCA90ZRxfw1DmELeVwiL4OC2J6bMUlNr707C0h4QRoec6DjzG27uLX2MvS1CEatf9KRjwZR9/w== + dependencies: + "@react-spring/animated" "~9.7.2" + "@react-spring/rafz" "~9.7.2" + "@react-spring/shared" "~9.7.2" + "@react-spring/types" "~9.7.2" + +"@react-spring/rafz@~9.7.2": + version "9.7.2" + resolved "https://registry.yarnpkg.com/@react-spring/rafz/-/rafz-9.7.2.tgz#77e7088c215e05cf893851cd87ceb40d89f2a7d7" + integrity sha512-kDWMYDQto3+flkrX3vy6DU/l9pxQ4TVW91DglQEc11iDc7shF4+WVDRJvOVLX+xoMP7zyag1dMvlIgvQ+dvA/A== + +"@react-spring/shared@~9.7.2": + version "9.7.2" + resolved "https://registry.yarnpkg.com/@react-spring/shared/-/shared-9.7.2.tgz#b8485617bdcc9f6348b245922051fb534e07c566" + integrity sha512-6U9qkno+9DxlH5nSltnPs+kU6tYKf0bPLURX2te13aGel8YqgcpFYp5Av8DcN2x3sukinAsmzHUS/FRsdZMMBA== + dependencies: + "@react-spring/rafz" "~9.7.2" + "@react-spring/types" "~9.7.2" + +"@react-spring/types@~9.7.2": + version "9.7.2" + resolved "https://registry.yarnpkg.com/@react-spring/types/-/types-9.7.2.tgz#e04dd72755d88b0e3163ba143ecd8ba78b68a5b0" + integrity sha512-GEflx2Ex/TKVMHq5g5MxQDNNPNhqg+4Db9m7+vGTm8ttZiyga7YQUF24shgRNebKIjahqCuei16SZga8h1pe4g== + +"@react-spring/web@^9.4.5": + version "9.7.2" + resolved "https://registry.yarnpkg.com/@react-spring/web/-/web-9.7.2.tgz#76e53dd24033764c3062f9927f88b0f3194688d4" + integrity sha512-7qNc7/5KShu2D05x7o2Ols2nUE7mCKfKLaY2Ix70xPMfTle1sZisoQMBFgV9w/fSLZlHZHV9P0uWJqEXQnbV4Q== + dependencies: + "@react-spring/animated" "~9.7.2" + "@react-spring/core" "~9.7.2" + "@react-spring/shared" "~9.7.2" + "@react-spring/types" "~9.7.2" + "@rollup/plugin-babel@^5.3.0": version "5.3.1" resolved "https://registry.yarnpkg.com/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz#04bc0608f4aa4b2e4b1aebf284344d0f68fda283" @@ -3149,6 +3656,31 @@ dependencies: tslib "^2.4.0" +"@tannin/compile@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@tannin/compile/-/compile-1.1.0.tgz#1e4d1c5364cbfeffa1c20352c053e19ef20ffe93" + integrity sha512-n8m9eNDfoNZoxdvWiTfW/hSPhehzLJ3zW7f8E7oT6mCROoMNWCB4TYtv041+2FMAxweiE0j7i1jubQU4MEC/Gg== + dependencies: + "@tannin/evaluate" "^1.2.0" + "@tannin/postfix" "^1.1.0" + +"@tannin/evaluate@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@tannin/evaluate/-/evaluate-1.2.0.tgz#468a13c45eff45340108836fc46c708457199c3f" + integrity sha512-3ioXvNowbO/wSrxsDG5DKIMxC81P0QrQTYai8zFNY+umuoHWRPbQ/TuuDEOju9E+jQDXmj6yI5GyejNuh8I+eg== + +"@tannin/plural-forms@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@tannin/plural-forms/-/plural-forms-1.1.0.tgz#cffbb060d2640a56a314e3c77cbf6ea6072b51d5" + integrity sha512-xl9R2mDZO/qiHam1AgMnAES6IKIg7OBhcXqy6eDsRCdXuxAFPcjrej9HMjyCLE0DJ/8cHf0i5OQTstuBRhpbHw== + dependencies: + "@tannin/compile" "^1.1.0" + +"@tannin/postfix@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@tannin/postfix/-/postfix-1.1.0.tgz#6071f4204ae26c2e885cf3a3f1203a9f71e3f291" + integrity sha512-oocsqY7g0cR+Gur5jRQLSrX2OtpMLMse1I10JQBm8CdGMrDkh1Mg2gjsiquMHRtBs4Qwu5wgEp5GgIYHk4SNPw== + "@testing-library/dom@^9.0.0": version "9.0.1" resolved "https://registry.yarnpkg.com/@testing-library/dom/-/dom-9.0.1.tgz#fb9e3837fe2a662965df1536988f0863f01dbf51" @@ -3454,6 +3986,11 @@ resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.2.tgz#ee771e2ba4b3dc5b372935d549fd9617bf345b8c" integrity sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ== +"@types/mousetrap@^1.6.8": + version "1.6.11" + resolved "https://registry.yarnpkg.com/@types/mousetrap/-/mousetrap-1.6.11.tgz#ef9620160fdcefcb85bccda8aaa3e84d7429376d" + integrity sha512-F0oAily9Q9QQpv9JKxKn0zMKfOo36KHCW7myYsmUyf2t0g+sBTbG3UleTPoguHdE1z3GLFr3p7/wiOio52QFjQ== + "@types/node@*": version "18.15.3" resolved "https://registry.yarnpkg.com/@types/node/-/node-18.15.3.tgz#f0b991c32cfc6a4e7f3399d6cb4b8cf9a0315014" @@ -3511,6 +4048,13 @@ dependencies: "@types/react" "*" +"@types/react-dom@^18.0.6": + version "18.2.3" + resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-18.2.3.tgz#2fe492bb0e67047b7b43e18166d8f50d44e0525e" + integrity sha512-hxXEXWxFJXbY0LMj/T69mznqOZJXNtQMqVxIiirVAZnnpeYiD4zt+lPsgcr/cfWg2VLsxZ1y26vigG03prYB+Q== + dependencies: + "@types/react" "*" + "@types/react-modal@^3.13.1": version "3.13.1" resolved "https://registry.yarnpkg.com/@types/react-modal/-/react-modal-3.13.1.tgz#5b9845c205fccc85d9a77966b6e16dc70a60825a" @@ -3527,6 +4071,15 @@ "@types/scheduler" "*" csstype "^3.0.2" +"@types/react@^18.0.21": + version "18.2.4" + resolved "https://registry.yarnpkg.com/@types/react/-/react-18.2.4.tgz#970e6d56f6d3fd8bd2cb1d1f042aef1d0426d08e" + integrity sha512-IvAIhJTmKAAJmCIcaa6+5uagjyh+9GvcJ/thPZcw+i+vx+22eHlTy2Q1bJg/prES57jehjebq9DnIhOTtIhmLw== + dependencies: + "@types/prop-types" "*" + "@types/scheduler" "*" + csstype "^3.0.2" + "@types/resolve@1.17.1": version "1.17.1" resolved "https://registry.yarnpkg.com/@types/resolve/-/resolve-1.17.1.tgz#3afd6ad8967c77e4376c598a82ddd58f46ec45d6" @@ -3576,6 +4129,11 @@ resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-2.0.1.tgz#20f18294f797f2209b5f65c8e3b5c8e8261d127c" integrity sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw== +"@types/tinycolor2@*": + version "1.4.3" + resolved "https://registry.yarnpkg.com/@types/tinycolor2/-/tinycolor2-1.4.3.tgz#ed4a0901f954b126e6a914b4839c77462d56e706" + integrity sha512-Kf1w9NE5HEgGxCRyIcRXR/ZYtDv0V8FVPtYHwLxl0O+maGX0erE77pQlD0gpP+/KByMZ87mOA79SjifhSB3PjQ== + "@types/tough-cookie@*": version "4.0.2" resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-4.0.2.tgz#6286b4c7228d58ab7866d19716f3696e03a09397" @@ -3591,6 +4149,71 @@ resolved "https://registry.yarnpkg.com/@types/web-bluetooth/-/web-bluetooth-0.0.16.tgz#1d12873a8e49567371f2a75fe3e7f7edca6662d8" integrity sha512-oh8q2Zc32S6gd/j50GowEjKLoOVOwHP/bWVjKJInBwQqdOYMdPrf1oVlelTlyfFK3CKxL1uahMDAr+vy8T7yMQ== +"@types/wordpress__block-editor@11.5.0": + version "11.5.0" + resolved "https://registry.yarnpkg.com/@types/wordpress__block-editor/-/wordpress__block-editor-11.5.0.tgz#d3a54e6b377d0412f7bd7bd8681eaa27a3a6f83b" + integrity sha512-Q4aY88Q2eq3At5tLDEHeR7CFRrf+CHx8+JdMq8RMlsZFdnUKGoRVrqCg8sKqVTelljEtiBCbSisbgf4UltnOxg== + dependencies: + "@types/react" "*" + "@types/wordpress__blocks" "*" + "@types/wordpress__components" "*" + "@types/wordpress__keycodes" "*" + "@wordpress/data" "^8.5.0" + "@wordpress/element" "^5.0.0" + react-autosize-textarea "^7.1.0" + +"@types/wordpress__blocks@*", "@types/wordpress__blocks@12.5.0": + version "12.5.0" + resolved "https://registry.yarnpkg.com/@types/wordpress__blocks/-/wordpress__blocks-12.5.0.tgz#98f0f36ba5e4b2b2f5f27a896d48f257e18bd0d4" + integrity sha512-SGuNlBUYlzZTJmuc/iCfYGAj7QzLXxcJShSMPdPjay8k52Zy9PvCOcie+owpi2EHPZADAKhLrSzQFUh1F2F7PA== + dependencies: + "@types/react" "*" + "@types/wordpress__components" "*" + "@types/wordpress__shortcode" "*" + "@wordpress/data" "^8.5.0" + "@wordpress/element" "^5.0.0" + +"@types/wordpress__components@*": + version "23.0.1" + resolved "https://registry.yarnpkg.com/@types/wordpress__components/-/wordpress__components-23.0.1.tgz#b7a6eff7be24e69681ff0fcffcd7e08cdd2ee7bd" + integrity sha512-mpAVr74ElANYR6f8+atultx4A1Md40vZeKfA2ZtgcJMWXQWez3OzP1W2g20BENxOo2kWVsp1r3Tcik/mt/8l/g== + dependencies: + "@types/react" "*" + "@types/tinycolor2" "*" + "@types/wordpress__components" "*" + "@types/wordpress__notices" "*" + "@types/wordpress__rich-text" "*" + "@wordpress/element" "^5.0.0" + downshift "^6.0.15" + re-resizable "^6.4.0" + +"@types/wordpress__keycodes@*": + version "2.3.1" + resolved "https://registry.yarnpkg.com/@types/wordpress__keycodes/-/wordpress__keycodes-2.3.1.tgz#707bab639854eb5bf3ae5dda6e5b7f3507389ffa" + integrity sha512-CUZv3WdPvWqnEwojbc4yEttwZlvsMGI8YurgB9CHVJXx6nQ4U2RU6PB0Mv7nxATufduFDMKq8TNpCHBenZqEjQ== + +"@types/wordpress__notices@*": + version "3.27.0" + resolved "https://registry.yarnpkg.com/@types/wordpress__notices/-/wordpress__notices-3.27.0.tgz#0ed1566473c76d53b80c99be489a98b605b24287" + integrity sha512-Da2iJ295TVYqk08EjgUuJjyxSV2DdBktrhBvNd38FH0jEFmI1Y4ollcMHvZ5EWlQk6rPeBreNke4PkuC9vL40A== + dependencies: + "@types/react" "*" + "@wordpress/data" "^8.5.0" + +"@types/wordpress__rich-text@*": + version "6.4.0" + resolved "https://registry.yarnpkg.com/@types/wordpress__rich-text/-/wordpress__rich-text-6.4.0.tgz#3e36507b2598b02994851c417295a41854c82239" + integrity sha512-xG+4ALsKVj4I6N7GXAvhxvobgri39rjiKBGRM1UTo02jFGVBQcE4ICSsggkZ/fox5WJwdk1vmWLFuQAGTNb7nw== + dependencies: + "@types/react" "*" + "@types/wordpress__rich-text" "*" + "@wordpress/data" "^8.5.0" + +"@types/wordpress__shortcode@*": + version "2.3.3" + resolved "https://registry.yarnpkg.com/@types/wordpress__shortcode/-/wordpress__shortcode-2.3.3.tgz#b7623eebc82ea29a381903052a84fa9f90b3fdec" + integrity sha512-I2e5phrpvqjDv1jtm6Fdo4CfQ6fnpssAJ3rdN//lqyw9TBWp1Ffi1g5xge5SD22d5WxUexbr+I6DFuVxF15IPg== + "@types/ws@^8.5.1": version "8.5.4" resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.4.tgz#bb10e36116d6e570dd943735f86c933c1587b8a5" @@ -3694,6 +4317,18 @@ "@typescript-eslint/types" "5.55.0" eslint-visitor-keys "^3.3.0" +"@use-gesture/core@10.2.26": + version "10.2.26" + resolved "https://registry.yarnpkg.com/@use-gesture/core/-/core-10.2.26.tgz#c2fc4aa7d36cee7319a98a898b0698c66b01663e" + integrity sha512-NyFpQ3iID9iFBROXyyvU1D0NK+t+dP+WAVByhCvqHUenpxLD2NlRLVRpoK3XGGwksr6mU3PvZ2Nm4q0q+gLJPA== + +"@use-gesture/react@^10.2.24": + version "10.2.26" + resolved "https://registry.yarnpkg.com/@use-gesture/react/-/react-10.2.26.tgz#593549fed30ebcac71cfd197993eaede0795c098" + integrity sha512-0QhaE5mhaQbFlip4MX7n1nwCX8gax6Da1LsP2fZ/BU6xW9zyEmV6NX7DPelDxq1rr2NiBJh30vx9RIp80YeA/A== + dependencies: + "@use-gesture/core" "10.2.26" + "@vitejs/plugin-react@^3.1.0": version "3.1.0" resolved "https://registry.yarnpkg.com/@vitejs/plugin-react/-/plugin-react-3.1.0.tgz#d1091f535eab8b83d6e74034d01e27d73c773240" @@ -3968,6 +4603,614 @@ resolved "https://registry.yarnpkg.com/@wessberg/stringutil/-/stringutil-1.0.19.tgz#baadcb6f4471fe2d46462a7d7a8294e4b45b29ad" integrity sha512-9AZHVXWlpN8Cn9k5BC/O0Dzb9E9xfEMXzYrNunwvkUTvuK7xgQPVRZpLo+jWCOZ5r8oBa8NIrHuPEu1hzbb6bg== +"@wordpress/a11y@^3.29.0", "@wordpress/a11y@^3.31.0", "@wordpress/a11y@^3.32.0": + version "3.32.0" + resolved "https://registry.yarnpkg.com/@wordpress/a11y/-/a11y-3.32.0.tgz#06ce689c940ddabb31ca6a8d42f68bdaee9a59dc" + integrity sha512-eUlQUqF9iL6cumhKWG5YZ7ywN/WWdlUpQzZ4B4SKVUcJvZty8fpWQfko0GpPpuGN2l7aFacs3NlfzYvUVn4wNQ== + dependencies: + "@babel/runtime" "^7.16.0" + "@wordpress/dom-ready" "^3.32.0" + "@wordpress/i18n" "^4.32.0" + +"@wordpress/api-fetch@^6.26.0": + version "6.29.0" + resolved "https://registry.yarnpkg.com/@wordpress/api-fetch/-/api-fetch-6.29.0.tgz#2140e9f719a30db45740f70180cc708567439222" + integrity sha512-6qtKZbS6mQl0PQhTB6BX9f9n3ika+R2RH+AqIQHiQH2yMulWlcaW6s/aOMLhEdXKPgG7geDqTdcASDJluV1yhQ== + dependencies: + "@babel/runtime" "^7.16.0" + "@wordpress/i18n" "^4.32.0" + "@wordpress/url" "^3.33.0" + +"@wordpress/autop@^3.29.0", "@wordpress/autop@^3.32.0": + version "3.32.0" + resolved "https://registry.yarnpkg.com/@wordpress/autop/-/autop-3.32.0.tgz#6eb90f38175b944ad3b8728e1199f0302b459595" + integrity sha512-k4p+Tse7x58gV3bw7aMzUi4cp7evtXDy6GmtQaF8MDM2Q43aJuvHKJD0AIFCzcCWir7y5X4fOyUxO/5TOh1vmg== + dependencies: + "@babel/runtime" "^7.16.0" + +"@wordpress/blob@^3.29.0", "@wordpress/blob@^3.32.0": + version "3.32.0" + resolved "https://registry.yarnpkg.com/@wordpress/blob/-/blob-3.32.0.tgz#c8cc6d13f3f140f7b96854cce34d436dff3ef288" + integrity sha512-0ruTze+Qp/O3n0m5uD61O1uP258AvHls0JfWKt5zAytbH1HwIqpIj3ApzKmcwmOI170QpGGS/ppZvJCkYftVQQ== + dependencies: + "@babel/runtime" "^7.16.0" + +"@wordpress/block-editor@11.6.0": + version "11.6.0" + resolved "https://registry.yarnpkg.com/@wordpress/block-editor/-/block-editor-11.6.0.tgz#b792d995309b751925f6099e679d458537ab0db6" + integrity sha512-9zlB+mHecX3R4oAdG3965Nezky/o/v2o71dgD92TljDKqQ37MU62ITz7ds0kcGmysYEAeL89YL/d/+xy8SVVMQ== + dependencies: + "@babel/runtime" "^7.16.0" + "@react-spring/web" "^9.4.5" + "@wordpress/a11y" "^3.29.0" + "@wordpress/api-fetch" "^6.26.0" + "@wordpress/blob" "^3.29.0" + "@wordpress/blocks" "^12.6.0" + "@wordpress/components" "^23.6.0" + "@wordpress/compose" "^6.6.0" + "@wordpress/data" "^8.6.0" + "@wordpress/date" "^4.29.0" + "@wordpress/deprecated" "^3.29.0" + "@wordpress/dom" "^3.29.0" + "@wordpress/element" "^5.6.0" + "@wordpress/escape-html" "^2.29.0" + "@wordpress/hooks" "^3.29.0" + "@wordpress/html-entities" "^3.29.0" + "@wordpress/i18n" "^4.29.0" + "@wordpress/icons" "^9.20.0" + "@wordpress/is-shallow-equal" "^4.29.0" + "@wordpress/keyboard-shortcuts" "^4.6.0" + "@wordpress/keycodes" "^3.29.0" + "@wordpress/notices" "^3.29.0" + "@wordpress/preferences" "^3.6.0" + "@wordpress/private-apis" "^0.11.0" + "@wordpress/rich-text" "^6.6.0" + "@wordpress/shortcode" "^3.29.0" + "@wordpress/style-engine" "^1.12.0" + "@wordpress/token-list" "^2.29.0" + "@wordpress/url" "^3.30.0" + "@wordpress/warning" "^2.29.0" + "@wordpress/wordcount" "^3.29.0" + change-case "^4.1.2" + classnames "^2.3.1" + colord "^2.7.0" + diff "^4.0.2" + dom-scroll-into-view "^1.2.1" + fast-deep-equal "^3.1.3" + inherits "^2.0.3" + lodash "^4.17.21" + react-autosize-textarea "^7.1.0" + react-easy-crop "^4.5.1" + rememo "^4.0.0" + remove-accents "^0.4.2" + traverse "^0.6.6" + +"@wordpress/block-serialization-default-parser@^4.29.0", "@wordpress/block-serialization-default-parser@^4.32.0": + version "4.32.0" + resolved "https://registry.yarnpkg.com/@wordpress/block-serialization-default-parser/-/block-serialization-default-parser-4.32.0.tgz#8eef7e3bf74a34aa7c933f39a5f3963925e68af1" + integrity sha512-MRguQlh8oXS5+csKCmD61g22cLHU8OegiLWk6COpmXHMFL9X3SIpTgBis7c8kyo3Iqg9edO5gD1Wf1OciNX9Pw== + dependencies: + "@babel/runtime" "^7.16.0" + +"@wordpress/blocks@12.6.0": + version "12.6.0" + resolved "https://registry.yarnpkg.com/@wordpress/blocks/-/blocks-12.6.0.tgz#91a30bf1c896a2ff54e429a6040840e95ddbaf6c" + integrity sha512-h4j95TU7iGwzXZe+GSjuTr5IXWXdxERiYU0z7Jt6X/GJ2p7PHrdQ/frBh8I/kEqGSroGEPo7uoy8xguyaIw8AQ== + dependencies: + "@babel/runtime" "^7.16.0" + "@wordpress/autop" "^3.29.0" + "@wordpress/blob" "^3.29.0" + "@wordpress/block-serialization-default-parser" "^4.29.0" + "@wordpress/compose" "^6.6.0" + "@wordpress/data" "^8.6.0" + "@wordpress/deprecated" "^3.29.0" + "@wordpress/dom" "^3.29.0" + "@wordpress/element" "^5.6.0" + "@wordpress/hooks" "^3.29.0" + "@wordpress/html-entities" "^3.29.0" + "@wordpress/i18n" "^4.29.0" + "@wordpress/is-shallow-equal" "^4.29.0" + "@wordpress/private-apis" "^0.11.0" + "@wordpress/shortcode" "^3.29.0" + change-case "^4.1.2" + colord "^2.7.0" + fast-deep-equal "^3.1.3" + hpq "^1.3.0" + is-plain-object "^5.0.0" + lodash "^4.17.21" + memize "^1.1.0" + rememo "^4.0.0" + remove-accents "^0.4.2" + showdown "^1.9.1" + simple-html-tokenizer "^0.5.7" + uuid "^8.3.0" + +"@wordpress/blocks@^12.6.0": + version "12.9.0" + resolved "https://registry.yarnpkg.com/@wordpress/blocks/-/blocks-12.9.0.tgz#9884420b00d309f37cc916b5884c05ab5331bccd" + integrity sha512-11X8dHqj+ITn/XKpa69eVHxDXQaK6jgaPm8lWllAiTAO7ICappVrWMFeYB7qYka2+nQQftdiAlVoAA4yD/nTxA== + dependencies: + "@babel/runtime" "^7.16.0" + "@wordpress/autop" "^3.32.0" + "@wordpress/blob" "^3.32.0" + "@wordpress/block-serialization-default-parser" "^4.32.0" + "@wordpress/compose" "^6.9.0" + "@wordpress/data" "^9.2.0" + "@wordpress/deprecated" "^3.32.0" + "@wordpress/dom" "^3.32.0" + "@wordpress/element" "^5.9.0" + "@wordpress/hooks" "^3.32.0" + "@wordpress/html-entities" "^3.32.0" + "@wordpress/i18n" "^4.32.0" + "@wordpress/is-shallow-equal" "^4.32.0" + "@wordpress/private-apis" "^0.14.0" + "@wordpress/shortcode" "^3.32.0" + change-case "^4.1.2" + colord "^2.7.0" + fast-deep-equal "^3.1.3" + hpq "^1.3.0" + is-plain-object "^5.0.0" + lodash "^4.17.21" + memize "^1.1.0" + rememo "^4.0.2" + remove-accents "^0.4.2" + showdown "^1.9.1" + simple-html-tokenizer "^0.5.7" + uuid "^8.3.0" + +"@wordpress/components@23.6.0": + version "23.6.0" + resolved "https://registry.yarnpkg.com/@wordpress/components/-/components-23.6.0.tgz#0a052b6584c52362fccd4acbdd984309443065f1" + integrity sha512-k4eiAwWKiyOV41Yy+TxgIW9xk/52P6el0WvHxr/kkuZc8WYerfRCdP7YJtucYKMQKGtuitROpUG4lAeHJYCxAw== + dependencies: + "@babel/runtime" "^7.16.0" + "@emotion/cache" "^11.7.1" + "@emotion/css" "^11.7.1" + "@emotion/react" "^11.7.1" + "@emotion/serialize" "^1.0.2" + "@emotion/styled" "^11.6.0" + "@emotion/utils" "^1.0.0" + "@floating-ui/react-dom" "1.0.0" + "@use-gesture/react" "^10.2.24" + "@wordpress/a11y" "^3.29.0" + "@wordpress/compose" "^6.6.0" + "@wordpress/date" "^4.29.0" + "@wordpress/deprecated" "^3.29.0" + "@wordpress/dom" "^3.29.0" + "@wordpress/element" "^5.6.0" + "@wordpress/escape-html" "^2.29.0" + "@wordpress/hooks" "^3.29.0" + "@wordpress/html-entities" "^3.29.0" + "@wordpress/i18n" "^4.29.0" + "@wordpress/icons" "^9.20.0" + "@wordpress/is-shallow-equal" "^4.29.0" + "@wordpress/keycodes" "^3.29.0" + "@wordpress/primitives" "^3.27.0" + "@wordpress/private-apis" "^0.11.0" + "@wordpress/rich-text" "^6.6.0" + "@wordpress/warning" "^2.29.0" + change-case "^4.1.2" + classnames "^2.3.1" + colord "^2.7.0" + date-fns "^2.28.0" + deepmerge "^4.3.0" + dom-scroll-into-view "^1.2.1" + downshift "^6.0.15" + fast-deep-equal "^3.1.3" + framer-motion "^7.6.1" + gradient-parser "^0.1.5" + highlight-words-core "^1.2.2" + is-plain-object "^5.0.0" + lodash "^4.17.21" + memize "^1.1.0" + path-to-regexp "^6.2.1" + re-resizable "^6.4.0" + react-colorful "^5.3.1" + reakit "^1.3.8" + remove-accents "^0.4.2" + use-lilius "^2.0.1" + uuid "^8.3.0" + valtio "1.7.0" + +"@wordpress/components@^23.6.0", "@wordpress/components@^23.9.0": + version "23.9.0" + resolved "https://registry.yarnpkg.com/@wordpress/components/-/components-23.9.0.tgz#572f8f9b5cf3dd2d49b6baa5e17ba9b66cc10efb" + integrity sha512-hEgzWe6PSWlUXPRcYX8YyQhL5Wp6TRqmzv+jIDJnYKXZH1UvsK/WcfCtdIOx7Q7oaPKDtH3vdv+0twcrHeN/bA== + dependencies: + "@babel/runtime" "^7.16.0" + "@emotion/cache" "^11.7.1" + "@emotion/css" "^11.7.1" + "@emotion/react" "^11.7.1" + "@emotion/serialize" "^1.0.2" + "@emotion/styled" "^11.6.0" + "@emotion/utils" "^1.0.0" + "@floating-ui/react-dom" "1.0.0" + "@use-gesture/react" "^10.2.24" + "@wordpress/a11y" "^3.32.0" + "@wordpress/compose" "^6.9.0" + "@wordpress/date" "^4.32.0" + "@wordpress/deprecated" "^3.32.0" + "@wordpress/dom" "^3.32.0" + "@wordpress/element" "^5.9.0" + "@wordpress/escape-html" "^2.32.0" + "@wordpress/hooks" "^3.32.0" + "@wordpress/html-entities" "^3.32.0" + "@wordpress/i18n" "^4.32.0" + "@wordpress/icons" "^9.23.0" + "@wordpress/is-shallow-equal" "^4.32.0" + "@wordpress/keycodes" "^3.32.0" + "@wordpress/primitives" "^3.30.0" + "@wordpress/private-apis" "^0.14.0" + "@wordpress/rich-text" "^6.9.0" + "@wordpress/warning" "^2.32.0" + change-case "^4.1.2" + classnames "^2.3.1" + colord "^2.7.0" + date-fns "^2.28.0" + deepmerge "^4.3.0" + dom-scroll-into-view "^1.2.1" + downshift "^6.0.15" + fast-deep-equal "^3.1.3" + framer-motion "^10.11.6" + gradient-parser "^0.1.5" + highlight-words-core "^1.2.2" + is-plain-object "^5.0.0" + memize "^1.1.0" + path-to-regexp "^6.2.1" + re-resizable "^6.4.0" + react-colorful "^5.3.1" + reakit "^1.3.11" + remove-accents "^0.4.2" + use-lilius "^2.0.1" + uuid "^8.3.0" + valtio "1.7.0" + +"@wordpress/compose@^6.6.0", "@wordpress/compose@^6.9.0": + version "6.9.0" + resolved "https://registry.yarnpkg.com/@wordpress/compose/-/compose-6.9.0.tgz#f941bf8e7d08dfbe5008844147b1bacdd976b5f9" + integrity sha512-5uWC2hzhXtrBBgVsVSO5sjEt2NjgblYpPO99pD6K8zlXni0rs60cQVGcUPmOsusbQen9vJbnfYvoXPnVAbTLRw== + dependencies: + "@babel/runtime" "^7.16.0" + "@types/mousetrap" "^1.6.8" + "@wordpress/deprecated" "^3.32.0" + "@wordpress/dom" "^3.32.0" + "@wordpress/element" "^5.9.0" + "@wordpress/is-shallow-equal" "^4.32.0" + "@wordpress/keycodes" "^3.32.0" + "@wordpress/priority-queue" "^2.32.0" + change-case "^4.1.2" + clipboard "^2.0.8" + mousetrap "^1.6.5" + use-memo-one "^1.1.1" + +"@wordpress/core-data@6.6.0": + version "6.6.0" + resolved "https://registry.yarnpkg.com/@wordpress/core-data/-/core-data-6.6.0.tgz#61c4c87a68293b2faf39c509da5bebd7fbb20c1a" + integrity sha512-UUqhjPIeQcQg8QkNaEQBtKIJmZtvotIQmeve7k241axqwRCxkv/7QyD1BiyW1l+0HbpfA7iY6Ix5ZNZp79gSJw== + dependencies: + "@babel/runtime" "^7.16.0" + "@wordpress/api-fetch" "^6.26.0" + "@wordpress/blocks" "^12.6.0" + "@wordpress/compose" "^6.6.0" + "@wordpress/data" "^8.6.0" + "@wordpress/deprecated" "^3.29.0" + "@wordpress/element" "^5.6.0" + "@wordpress/html-entities" "^3.29.0" + "@wordpress/i18n" "^4.29.0" + "@wordpress/is-shallow-equal" "^4.29.0" + "@wordpress/url" "^3.30.0" + change-case "^4.1.2" + equivalent-key-map "^0.2.2" + fast-deep-equal "^3.1.3" + lodash "^4.17.21" + memize "^1.1.0" + rememo "^4.0.0" + uuid "^8.3.0" + +"@wordpress/data@8.6.0", "@wordpress/data@^8.5.0", "@wordpress/data@^8.6.0": + version "8.6.0" + resolved "https://registry.yarnpkg.com/@wordpress/data/-/data-8.6.0.tgz#82307cf049de5b82548710b834f9031c0db0bf60" + integrity sha512-+bQ5dTkJkHeOng3mXXzLBZkudUlOifJql1U99sWGbtLarU/yjfF0ldi/a6uR1cVvDJkGizDYHf9vv/nA39Oaqw== + dependencies: + "@babel/runtime" "^7.16.0" + "@wordpress/compose" "^6.6.0" + "@wordpress/deprecated" "^3.29.0" + "@wordpress/element" "^5.6.0" + "@wordpress/is-shallow-equal" "^4.29.0" + "@wordpress/priority-queue" "^2.29.0" + "@wordpress/private-apis" "^0.11.0" + "@wordpress/redux-routine" "^4.29.0" + deepmerge "^4.3.0" + equivalent-key-map "^0.2.2" + is-plain-object "^5.0.0" + is-promise "^4.0.0" + redux "^4.1.2" + turbo-combine-reducers "^1.0.2" + use-memo-one "^1.1.1" + +"@wordpress/data@^9.1.0", "@wordpress/data@^9.2.0": + version "9.2.0" + resolved "https://registry.yarnpkg.com/@wordpress/data/-/data-9.2.0.tgz#170bc3833598d430d2a5fc154d8bac63104d88c9" + integrity sha512-7LIklCC9zc9kG8zVQquniEnX0KLL8J5n7WWY/AWYLOHFnjKQR65mzF5KaMl6YX041oWsDGaKBKzLvWOm23KWlA== + dependencies: + "@babel/runtime" "^7.16.0" + "@wordpress/compose" "^6.9.0" + "@wordpress/deprecated" "^3.32.0" + "@wordpress/element" "^5.9.0" + "@wordpress/is-shallow-equal" "^4.32.0" + "@wordpress/priority-queue" "^2.32.0" + "@wordpress/private-apis" "^0.14.0" + "@wordpress/redux-routine" "^4.32.0" + deepmerge "^4.3.0" + equivalent-key-map "^0.2.2" + is-plain-object "^5.0.0" + is-promise "^4.0.0" + redux "^4.1.2" + turbo-combine-reducers "^1.0.2" + use-memo-one "^1.1.1" + +"@wordpress/date@^4.29.0", "@wordpress/date@^4.32.0": + version "4.32.0" + resolved "https://registry.yarnpkg.com/@wordpress/date/-/date-4.32.0.tgz#eb951812c146c0b965063f86e5dc65ee166087c7" + integrity sha512-PNPHkSh1cgzG8+O0xO93yE+JIx6B30Qdjyk8HaDvUT+jj0q/uWhcEjOr/0jmLBdHEqjoVzUE9MPtkzcVGaTLJg== + dependencies: + "@babel/runtime" "^7.16.0" + "@wordpress/deprecated" "^3.32.0" + moment "^2.29.4" + moment-timezone "^0.5.40" + +"@wordpress/deprecated@^3.29.0", "@wordpress/deprecated@^3.32.0": + version "3.32.0" + resolved "https://registry.yarnpkg.com/@wordpress/deprecated/-/deprecated-3.32.0.tgz#28fc2ac195597c0105ed00f6e89abf239e5f1a06" + integrity sha512-onQuqKH1r8G1rYQ2NSaWbXzrIG1D7n9CBol4XG3Lj55Vi82xD5ZD6jcK5GvfBTj9gsmpBWOk0Skm8LMHhxHycw== + dependencies: + "@babel/runtime" "^7.16.0" + "@wordpress/hooks" "^3.32.0" + +"@wordpress/dom-ready@^3.32.0": + version "3.32.0" + resolved "https://registry.yarnpkg.com/@wordpress/dom-ready/-/dom-ready-3.32.0.tgz#efa37de405d04deb059019b1f5e83f63f8b2bf9f" + integrity sha512-WqM4wL9vgu2OTHCXmZm/10c4t11jSYnDijuhlHLicFQ4aJmw1q8d+PfEGUnj6wBXVzNizo8x/gvOX3aVejAxrw== + dependencies: + "@babel/runtime" "^7.16.0" + +"@wordpress/dom@^3.29.0", "@wordpress/dom@^3.32.0": + version "3.32.0" + resolved "https://registry.yarnpkg.com/@wordpress/dom/-/dom-3.32.0.tgz#cba9713677af07aa78f396bc1cf2071f47d271f0" + integrity sha512-TAY+GfO4zS6JFcPZR2Yh0EsoKkJliNURUH4fsx1eXhqTcrfCYjo0FUQUMv5IGKriq196ku1g92eJt7/yZw60/Q== + dependencies: + "@babel/runtime" "^7.16.0" + "@wordpress/deprecated" "^3.32.0" + +"@wordpress/element@5.6.0": + version "5.6.0" + resolved "https://registry.yarnpkg.com/@wordpress/element/-/element-5.6.0.tgz#8e411fba3c3cee3b0f48e4c6a9c39832ce8af6cf" + integrity sha512-pQdpyzUtmn12vvNX26RiYHEPnQHKK24Ro0MK0tGRYcE9BRVgnH54uL03Nfad2zc6TwQUglD/wkRoeonZ0XmVTw== + dependencies: + "@babel/runtime" "^7.16.0" + "@types/react" "^18.0.21" + "@types/react-dom" "^18.0.6" + "@wordpress/escape-html" "^2.29.0" + change-case "^4.1.2" + is-plain-object "^5.0.0" + react "^18.2.0" + react-dom "^18.2.0" + +"@wordpress/element@^5.0.0", "@wordpress/element@^5.6.0", "@wordpress/element@^5.9.0": + version "5.9.0" + resolved "https://registry.yarnpkg.com/@wordpress/element/-/element-5.9.0.tgz#c44c5e5792f87c4679e8b761a0eeeba29758b85b" + integrity sha512-ZZB82h08Il9d45o4HrcbF3G6Q8yJU6NNyLnO/CMdfpCxD45bbwFT5drzmGx4jZniCrm+s/LoxArXLS+O8/Lx1Q== + dependencies: + "@babel/runtime" "^7.16.0" + "@types/react" "^18.0.21" + "@types/react-dom" "^18.0.6" + "@wordpress/escape-html" "^2.32.0" + change-case "^4.1.2" + is-plain-object "^5.0.0" + react "^18.2.0" + react-dom "^18.2.0" + +"@wordpress/escape-html@^2.29.0", "@wordpress/escape-html@^2.32.0": + version "2.32.0" + resolved "https://registry.yarnpkg.com/@wordpress/escape-html/-/escape-html-2.32.0.tgz#81ebb4f48b9ea0d7178fbd7b5bf55655ff1f92b4" + integrity sha512-0GNMvutdJUhYgfIY6iAI4mNsyQV4FvMgUgECBQ1hXpWdbxGM7Lu2nH/UxLrAlh5QehNor+stYScT4v+yWJsM+g== + dependencies: + "@babel/runtime" "^7.16.0" + +"@wordpress/hooks@^3.29.0", "@wordpress/hooks@^3.32.0": + version "3.32.0" + resolved "https://registry.yarnpkg.com/@wordpress/hooks/-/hooks-3.32.0.tgz#cf1ff8b9aae11ed81dd76fa4566d3a6c68d53fcf" + integrity sha512-jYwi0MkUIrMw5RQaQFnAQS8iwxQXbipCIyK8tak1rPyAUtS0Ho8WN8I750srpg9x1XmVHrRi1j0xf8I5VbfUuA== + dependencies: + "@babel/runtime" "^7.16.0" + +"@wordpress/html-entities@^3.29.0", "@wordpress/html-entities@^3.32.0": + version "3.32.0" + resolved "https://registry.yarnpkg.com/@wordpress/html-entities/-/html-entities-3.32.0.tgz#26b5d8e612a486cafa6e8d570bc3bcda6743ded3" + integrity sha512-B1PK+F2pJM+0Ido9Ucti/yQxjssm4W6NtJTFcgZA6HJgyfBmRU54LRBCcBt6wCpJERpMn0bm9nFJqc0nvJSfNQ== + dependencies: + "@babel/runtime" "^7.16.0" + +"@wordpress/i18n@^4.29.0", "@wordpress/i18n@^4.32.0": + version "4.32.0" + resolved "https://registry.yarnpkg.com/@wordpress/i18n/-/i18n-4.32.0.tgz#00d41ca721b4f85d24f61e0ce16bfdffc6f69d9e" + integrity sha512-WXLmsvxWG0IAT5XBpwGROG47Q+BNWZdbR9IWi5Btz6Uh1kAya/HVbnwlT2sIB3FLeHXdFv0W2y2ideJtoflDvA== + dependencies: + "@babel/runtime" "^7.16.0" + "@wordpress/hooks" "^3.32.0" + gettext-parser "^1.3.1" + memize "^1.1.0" + sprintf-js "^1.1.1" + tannin "^1.2.0" + +"@wordpress/icons@^9.20.0", "@wordpress/icons@^9.23.0": + version "9.23.0" + resolved "https://registry.yarnpkg.com/@wordpress/icons/-/icons-9.23.0.tgz#1f38ae1f456441421a1fd50c795b53ce6f816e91" + integrity sha512-sHE7UgDX4FUuiBPg71uckXriBim/gb1hL1t2NwqVUYTVB1FzXSaJ/kQYox1u46WzbK2z5u165J/c/VrDsQ9YZA== + dependencies: + "@babel/runtime" "^7.16.0" + "@wordpress/element" "^5.9.0" + "@wordpress/primitives" "^3.30.0" + +"@wordpress/is-shallow-equal@^4.29.0", "@wordpress/is-shallow-equal@^4.32.0": + version "4.32.0" + resolved "https://registry.yarnpkg.com/@wordpress/is-shallow-equal/-/is-shallow-equal-4.32.0.tgz#d5f21639942b1fadef9bded92bcc161b76ec9b73" + integrity sha512-YsFB0BqiIcHqYDMgbpEo23jRRXwleeTLFEq+1gBvEuANN+mAo5rV7oe2EHee5w5yLKyN+xN7QU9ok5XRIJpX9g== + dependencies: + "@babel/runtime" "^7.16.0" + +"@wordpress/keyboard-shortcuts@^4.6.0": + version "4.9.0" + resolved "https://registry.yarnpkg.com/@wordpress/keyboard-shortcuts/-/keyboard-shortcuts-4.9.0.tgz#4c0d8b60d38102c785d6ffac9fb0f5d35a01cbff" + integrity sha512-07IG61W+Ic10/hgJ5qCi8YvYz7/Z6AiDNqk3MNcf5/ZM2WQOqoeUjrBy2NUSx5k+vddEgQqUHUdvcNiwnsvjDQ== + dependencies: + "@babel/runtime" "^7.16.0" + "@wordpress/data" "^9.2.0" + "@wordpress/element" "^5.9.0" + "@wordpress/keycodes" "^3.32.0" + rememo "^4.0.2" + +"@wordpress/keycodes@^3.29.0", "@wordpress/keycodes@^3.32.0": + version "3.32.0" + resolved "https://registry.yarnpkg.com/@wordpress/keycodes/-/keycodes-3.32.0.tgz#fdfaf36d84ede0c603cbb25fef76a603452e8889" + integrity sha512-Ks8moRk8a4lLmX1uHDcy7PX4xc+xjeu757WVvIfrUpc9W5p+RrKnHJAPhYYNSr5J2gwba8xRAjstgobgIni9FQ== + dependencies: + "@babel/runtime" "^7.16.0" + "@wordpress/i18n" "^4.32.0" + change-case "^4.1.2" + +"@wordpress/notices@3.29.0": + version "3.29.0" + resolved "https://registry.yarnpkg.com/@wordpress/notices/-/notices-3.29.0.tgz#6297c85436c77f5f7d6c317f6cc65ed4f3e30e4b" + integrity sha512-yk73fppy89ZswTi/XYcXmEJtjUbqvFMxfL5KfDjUolAntc4GSK3IMg1MIQnEimSOKi+r/3hiAUakJUZJ4ivb2g== + dependencies: + "@babel/runtime" "^7.16.0" + "@wordpress/a11y" "^3.29.0" + "@wordpress/data" "^8.6.0" + +"@wordpress/notices@^3.29.0": + version "3.31.0" + resolved "https://registry.yarnpkg.com/@wordpress/notices/-/notices-3.31.0.tgz#a278767eaa2e7b704fe1f4d68f95c7984779737c" + integrity sha512-9WyaFaSr/vQc1K7cZLyPw1xBKqWfjpAKMJzWMzHYjwk1ldibhBWVLukicuolD6Y+9l+97IZHCoESBQwUeFo79Q== + dependencies: + "@babel/runtime" "^7.16.0" + "@wordpress/a11y" "^3.31.0" + "@wordpress/data" "^9.1.0" + +"@wordpress/preferences@^3.6.0": + version "3.9.0" + resolved "https://registry.yarnpkg.com/@wordpress/preferences/-/preferences-3.9.0.tgz#c3d607eaa1df7c6f343368f5bc1ec5a18f1364b5" + integrity sha512-NMSd2NPzi05jiPC7Z5NJhK5uW69MOVapnuVJdBQEgeGo9hqxa5D4bI/vP/NciOLO1M/tbh4n5IQzfTXrK97FLg== + dependencies: + "@babel/runtime" "^7.16.0" + "@wordpress/a11y" "^3.32.0" + "@wordpress/components" "^23.9.0" + "@wordpress/data" "^9.2.0" + "@wordpress/i18n" "^4.32.0" + "@wordpress/icons" "^9.23.0" + classnames "^2.3.1" + +"@wordpress/primitives@^3.27.0", "@wordpress/primitives@^3.30.0": + version "3.30.0" + resolved "https://registry.yarnpkg.com/@wordpress/primitives/-/primitives-3.30.0.tgz#8fbbdfb6eacc839987b82884eb4373013a0e69ef" + integrity sha512-45Q0QvotCI2o+5GvtZhkgt47L96pRjhtNr0NpICcFjpVblOg1WPBqNPB03r8L4c1u9sELmnBPmn1vU3tofX7FA== + dependencies: + "@babel/runtime" "^7.16.0" + "@wordpress/element" "^5.9.0" + classnames "^2.3.1" + +"@wordpress/priority-queue@^2.29.0", "@wordpress/priority-queue@^2.32.0": + version "2.32.0" + resolved "https://registry.yarnpkg.com/@wordpress/priority-queue/-/priority-queue-2.32.0.tgz#843292d7e3fe55a7edea59d91b4f4c76b513916a" + integrity sha512-L8q6V/ZpNMqBgdnr4OsSJdLyvMai8Yi7noVoLZPp6bcuEOXDEQSVcPv1/R4Ch6z2/zgF80wPwf5zTkcG8ar45g== + dependencies: + "@babel/runtime" "^7.16.0" + requestidlecallback "^0.3.0" + +"@wordpress/private-apis@^0.11.0": + version "0.11.0" + resolved "https://registry.yarnpkg.com/@wordpress/private-apis/-/private-apis-0.11.0.tgz#2c1565baaf42e1c4fd1910b2a7fa66bcc75eec0f" + integrity sha512-GpAZ34Ou9YkYi9fuJCb9oDIZhsLqj41stuHflxpTNih6vV/Qw7ApBkLZDhDCyWjOybnjtHQH1LWw3K3RCN4miw== + dependencies: + "@babel/runtime" "^7.16.0" + +"@wordpress/private-apis@^0.14.0": + version "0.14.0" + resolved "https://registry.yarnpkg.com/@wordpress/private-apis/-/private-apis-0.14.0.tgz#2af492ac2b01796dab1b156487d8f23bab06fb2f" + integrity sha512-4F5aCsjWijjq9JjAPUAh0iGnrsRoJNVgQGfOZFND7PMswuaA+uu7xtarKQ5QRsjA1owz2QOv7Hg+MvMuwmG0NA== + dependencies: + "@babel/runtime" "^7.16.0" + +"@wordpress/redux-routine@^4.29.0", "@wordpress/redux-routine@^4.32.0": + version "4.32.0" + resolved "https://registry.yarnpkg.com/@wordpress/redux-routine/-/redux-routine-4.32.0.tgz#6bbff66d94c7aebd85d03de126feb021e061eb4b" + integrity sha512-7lFDphLZR+6wqWZUyxdo4azOb/7Lxn1JFT1xVPVqJpjkmEotKXEsZR16LkQz91AUzGvUTrJFVmoBIVxlW73K/Q== + dependencies: + "@babel/runtime" "^7.16.0" + is-plain-object "^5.0.0" + is-promise "^4.0.0" + rungen "^0.3.2" + +"@wordpress/rich-text@^6.6.0", "@wordpress/rich-text@^6.9.0": + version "6.9.0" + resolved "https://registry.yarnpkg.com/@wordpress/rich-text/-/rich-text-6.9.0.tgz#5ce36bbc934d39e56433568353b5ebf7b500d746" + integrity sha512-ejMnW4YCW6/U8Z+9r/2ssHPkMa4HraLVQ/uiT/zU8MgwL5kiOUXX/DSIRzhhZh58031Bf18pIgxeHDQUJGIshw== + dependencies: + "@babel/runtime" "^7.16.0" + "@wordpress/a11y" "^3.32.0" + "@wordpress/compose" "^6.9.0" + "@wordpress/data" "^9.2.0" + "@wordpress/deprecated" "^3.32.0" + "@wordpress/element" "^5.9.0" + "@wordpress/escape-html" "^2.32.0" + "@wordpress/i18n" "^4.32.0" + "@wordpress/keycodes" "^3.32.0" + memize "^1.1.0" + rememo "^4.0.2" + +"@wordpress/shortcode@^3.29.0", "@wordpress/shortcode@^3.32.0": + version "3.32.0" + resolved "https://registry.yarnpkg.com/@wordpress/shortcode/-/shortcode-3.32.0.tgz#6eea26ce6a1d1c3972e082cb5722065cf8a4522b" + integrity sha512-kgAaeCdwgtPjVPqFfdllCxPn1DJYVCrnLsW7tGPEb9zAeGdBo6SSdlSnc/jkExshXh5VEOhh/SNUB/OhoNhesg== + dependencies: + "@babel/runtime" "^7.16.0" + memize "^1.1.0" + +"@wordpress/style-engine@^1.12.0": + version "1.15.0" + resolved "https://registry.yarnpkg.com/@wordpress/style-engine/-/style-engine-1.15.0.tgz#b8bb15d6a27725c6a5ed69c75715be18dfcefc3c" + integrity sha512-axWOvO0CfHWQ6JnursjHs1djQ9wpylFBGw/EMFf06KrqiOQ8wvH4WcNGiSpA35Q8npS2ajg1fbuSSinHwD6gTw== + dependencies: + "@babel/runtime" "^7.16.0" + lodash "^4.17.21" + +"@wordpress/token-list@^2.29.0": + version "2.32.0" + resolved "https://registry.yarnpkg.com/@wordpress/token-list/-/token-list-2.32.0.tgz#a485e405749e345f68e4c5e167d061fd82686586" + integrity sha512-Z/otEb6OOJtH6+kawnrkkxW8WzoY5JfC1/A1/LK25uSyR2Kln5vI9YRUEdsxVX+8S8atzyDfnHFGsVFQFJCcJQ== + dependencies: + "@babel/runtime" "^7.16.0" + +"@wordpress/url@^3.30.0", "@wordpress/url@^3.33.0": + version "3.33.0" + resolved "https://registry.yarnpkg.com/@wordpress/url/-/url-3.33.0.tgz#b65486d8b55f808777dadf250be9f49d00fcaade" + integrity sha512-J9VPIK72NOYE4xpvd+HT8KLLDh37Ao8Y+f02eqa4DHW79BsRHjZ1pXKiK7KKVPXA6MkP44gXF8OliKbWBphsUg== + dependencies: + "@babel/runtime" "^7.16.0" + remove-accents "^0.4.2" + +"@wordpress/warning@^2.29.0", "@wordpress/warning@^2.32.0": + version "2.32.0" + resolved "https://registry.yarnpkg.com/@wordpress/warning/-/warning-2.32.0.tgz#4fb321b3dc5c568933d53950eda5ca82ab979e8b" + integrity sha512-jGzeFcThz/7jwWezu1pLtHLQap5aDmpF3v2bXXKJBA5Qb4VIRD4oauf1yFvqqb9CkfTLhw8E/KbtW0xzVffqDg== + +"@wordpress/wordcount@^3.29.0": + version "3.32.0" + resolved "https://registry.yarnpkg.com/@wordpress/wordcount/-/wordcount-3.32.0.tgz#1a6a61f80fd3ad8d48a003c1fef856b9ecba93d4" + integrity sha512-CYlOoT/0ZR7DoKzNFUZ1UnTimql6Y6kOMZbz6RUFLGCoTSp8/BeLVpfboohWAkCFEnMOjbrpOgl4f+wt8qmV8g== + dependencies: + "@babel/runtime" "^7.16.0" + "@xtuc/ieee754@^1.2.0": version "1.2.0" resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" @@ -4169,6 +5412,11 @@ ansi-html-community@^0.0.8: resolved "https://registry.yarnpkg.com/ansi-html-community/-/ansi-html-community-0.0.8.tgz#69fbc4d6ccbe383f9736934ae34c3f8290f1bf41" integrity sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw== +ansi-regex@^4.1.0: + version "4.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.1.tgz#164daac87ab2d6f6db3a29875e2d1766582dabed" + integrity sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g== + ansi-regex@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" @@ -4184,7 +5432,7 @@ ansi-sequence-parser@^1.1.0: resolved "https://registry.yarnpkg.com/ansi-sequence-parser/-/ansi-sequence-parser-1.1.0.tgz#4d790f31236ac20366b23b3916b789e1bde39aed" integrity sha512-lEm8mt52to2fT8GhciPCGeCXACSz2UwIN4X2e2LJSnZ5uAbn2/dsYdOmUXq0AtWS5cpAupysIneExOgH0Vd2TQ== -ansi-styles@^3.2.1: +ansi-styles@^3.2.0, ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== @@ -4419,6 +5667,11 @@ autoprefixer@^10.4.9: picocolors "^1.0.0" postcss-value-parser "^4.2.0" +autosize@^4.0.2: + version "4.0.4" + resolved "https://registry.yarnpkg.com/autosize/-/autosize-4.0.4.tgz#924f13853a466b633b9309330833936d8bccce03" + integrity sha512-5yxLQ22O0fCRGoxGfeLSNt3J8LB1v+umtpMnPW6XjkTWXKoN0AmXAIhelJcDtFT/Y/wYWmfE+oqU10Q0b8FhaQ== + available-typed-arrays@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz#92f95616501069d07d10edb2fc37d3e1c65123b7" @@ -4538,6 +5791,15 @@ babel-plugin-macros@^2.8.0: cosmiconfig "^6.0.0" resolve "^1.12.0" +babel-plugin-macros@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz#9ef6dc74deb934b4db344dc973ee851d148c50c1" + integrity sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg== + dependencies: + "@babel/runtime" "^7.12.5" + cosmiconfig "^7.0.0" + resolve "^1.19.0" + babel-plugin-polyfill-corejs2@^0.3.3: version "0.3.3" resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz#5d1bd3836d0a19e1b84bbf2d9640ccb6f951c122" @@ -4721,6 +5983,11 @@ body-scroll-lock@4.0.0-beta.0: resolved "https://registry.yarnpkg.com/body-scroll-lock/-/body-scroll-lock-4.0.0-beta.0.tgz#4f78789d10e6388115c0460cd6d7d4dd2bbc4f7e" integrity sha512-a7tP5+0Mw3YlUJcGAKUqIBkYYGlYxk2fnCasq/FUph1hadxlTRjF+gAcZksxANnaMnALjxEddmSi/H3OR8ugcQ== +body-scroll-lock@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/body-scroll-lock/-/body-scroll-lock-3.1.5.tgz#c1392d9217ed2c3e237fee1e910f6cdd80b7aaec" + integrity sha512-Yi1Xaml0EvNA0OYWxXiYNqY24AfWkbA6w5vxE7GWxtKfzIbZM+Qw+aSmkgsbWzbHiy/RCSkUZBplVxTA+E4jJg== + bonjour-service@^1.0.11: version "1.1.0" resolved "https://registry.yarnpkg.com/bonjour-service/-/bonjour-service-1.1.0.tgz#424170268d68af26ff83a5c640b95def01803a13" @@ -4942,6 +6209,14 @@ callsites@^3.0.0: resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== +camel-case@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/camel-case/-/camel-case-4.1.2.tgz#9728072a954f805228225a6deea6b38461e1bd5a" + integrity sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw== + dependencies: + pascal-case "^3.1.2" + tslib "^2.0.3" + camelcase-keys@^6.2.2: version "6.2.2" resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-6.2.2.tgz#5e755d6ba51aa223ec7d3d52f25778210f9dc3c0" @@ -4951,7 +6226,7 @@ camelcase-keys@^6.2.2: map-obj "^4.0.0" quick-lru "^4.0.1" -camelcase@^5.3.1: +camelcase@^5.0.0, camelcase@^5.3.1: version "5.3.1" resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz#e3c9b31569e106811df242f715725a1f4c494320" integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg== @@ -4976,6 +6251,15 @@ caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001449, caniuse-lite@^1.0.30001450, can resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001466.tgz#c1e6197c540392e09709ecaa9e3e403428c53375" integrity sha512-ewtFBSfWjEmxUgNBSZItFSmVtvk9zkwkl1OfRZlKA8slltRN+/C/tuGVrF9styXkN36Yu3+SeJ1qkXxDEyNZ5w== +capital-case@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/capital-case/-/capital-case-1.0.4.tgz#9d130292353c9249f6b00fa5852bee38a717e669" + integrity sha512-ds37W8CytHgwnhGGTi88pcPyR15qoNkOpYwmMMfnWqqWgESapLqvDx6huFjQ5vqWSn2Z06173XNA7LtMOeUh1A== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + upper-case-first "^2.0.2" + caseless@~0.12.0: version "0.12.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" @@ -5031,6 +6315,24 @@ chalk@^4.0.0, chalk@^4.0.2, chalk@^4.1.0, chalk@^4.1.1, chalk@^4.1.2: ansi-styles "^4.1.0" supports-color "^7.1.0" +change-case@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/change-case/-/change-case-4.1.2.tgz#fedfc5f136045e2398c0410ee441f95704641e12" + integrity sha512-bSxY2ws9OtviILG1EiY5K7NNxkqg/JnRnFxLtKQ96JaviiIxi7djMrSd0ECT9AC+lttClmYwKw53BWpOMblo7A== + dependencies: + camel-case "^4.1.2" + capital-case "^1.0.4" + constant-case "^3.0.4" + dot-case "^3.0.4" + header-case "^2.0.4" + no-case "^3.0.4" + param-case "^3.0.4" + pascal-case "^3.1.2" + path-case "^3.0.4" + sentence-case "^3.0.4" + snake-case "^3.0.4" + tslib "^2.0.3" + char-regex@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" @@ -5086,7 +6388,7 @@ cjs-module-lexer@^1.0.0: resolved "https://registry.yarnpkg.com/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz#9f84ba3244a512f3a54e5277e8eef4c489864e40" integrity sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA== -classnames@^2.3.2: +classnames@^2.3.1, classnames@^2.3.2: version "2.3.2" resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.2.tgz#351d813bf0137fcc6a76a16b88208d2560a0d924" integrity sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw== @@ -5121,15 +6423,33 @@ cli-spinners@^2.5.0: integrity sha512-qu3pN8Y3qHNgE2AFweciB1IfMnmZ/fsNTEE+NOFjmGB2F/7rLhnhzppvpCnN4FovtP26k8lHyy9ptEbNwWFLzw== cli-spinners@^2.6.1: - version "2.8.0" - resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.8.0.tgz#e97a3e2bd00e6d85aa0c13d7f9e3ce236f7787fc" - integrity sha512-/eG5sJcvEIwxcdYM86k5tPwn0MUzkX5YY3eImTGpJOZgVe4SdTMY14vQpcxgBzJ0wXwAYrS8E+c3uHeK4JNyzQ== + version "2.9.0" + resolved "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.9.0.tgz#5881d0ad96381e117bbe07ad91f2008fe6ffd8db" + integrity sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g== cli-width@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== +clipboard@^2.0.8: + version "2.0.11" + resolved "https://registry.yarnpkg.com/clipboard/-/clipboard-2.0.11.tgz#62180360b97dd668b6b3a84ec226975762a70be5" + integrity sha512-C+0bbOqkezLIsmWSvlsXS0Q0bmkugu7jcfMIACB+RDEntIzQIkdr148we28AfSloQLRdZlYL/QYyrq05j/3Faw== + dependencies: + good-listener "^1.2.2" + select "^1.1.2" + tiny-emitter "^2.0.0" + +cliui@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz#deefcfdb2e800784aa34f46fa08e06851c7bbbc5" + integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA== + dependencies: + string-width "^3.1.0" + strip-ansi "^5.2.0" + wrap-ansi "^5.1.0" + cliui@^7.0.2: version "7.0.4" resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" @@ -5218,7 +6538,7 @@ color-support@^1.1.3: resolved "https://registry.yarnpkg.com/color-support/-/color-support-1.1.3.tgz#93834379a1cc9a0c61f82f52f0d04322251bd5a2" integrity sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg== -colord@^2.9.1: +colord@^2.7.0, colord@^2.9.1: version "2.9.3" resolved "https://registry.yarnpkg.com/colord/-/colord-2.9.3.tgz#4f8ce919de456f1d5c1c368c307fe20f3e59fb43" integrity sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw== @@ -5318,6 +6638,16 @@ compression@^1.7.4: safe-buffer "5.1.2" vary "~1.1.2" +compute-scroll-into-view@^1.0.17: + version "1.0.20" + resolved "https://registry.yarnpkg.com/compute-scroll-into-view/-/compute-scroll-into-view-1.0.20.tgz#1768b5522d1172754f5d0c9b02de3af6be506a43" + integrity sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg== + +computed-style@~0.1.3: + version "0.1.4" + resolved "https://registry.yarnpkg.com/computed-style/-/computed-style-0.1.4.tgz#7f344fd8584b2e425bedca4a1afc0e300bb05d74" + integrity sha512-WpAmaKbMNmS3OProfHIdJiNleNJdgUrJfbKArXua28QF7+0CoZjlLn0lp6vlc+dl5r2/X9GQiQRQQU4BzSa69w== + concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" @@ -5363,6 +6693,15 @@ console-control-strings@^1.1.0: resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ== +constant-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/constant-case/-/constant-case-3.0.4.tgz#3b84a9aeaf4cf31ec45e6bf5de91bdfb0589faf1" + integrity sha512-I2hSBi7Vvs7BEuJDr5dDHfzb/Ruj3FyvFyh7KLilAjNQw3Be+xgqUBA2W6scVEcL0hL1dwPRtIqEPVUCKkSsyQ== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + upper-case "^2.0.2" + content-disposition@0.5.4: version "0.5.4" resolved "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.4.tgz#8b82b4efac82512a02bb0b1dcec9d2c5e8eb5bfe" @@ -5457,7 +6796,7 @@ conventional-recommended-bump@6.1.0: meow "^8.0.0" q "^1.5.1" -convert-source-map@^1.4.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: +convert-source-map@^1.4.0, convert-source-map@^1.5.0, convert-source-map@^1.6.0, convert-source-map@^1.7.0: version "1.9.0" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== @@ -5556,6 +6895,11 @@ create-require@^1.1.0: resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== +crelt@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/crelt/-/crelt-1.0.5.tgz#57c0d52af8c859e354bace1883eb2e1eb182bb94" + integrity sha512-+BO9wPPi+DWTDcNYhr/W90myha8ptzftZT+LwcmUbbok0rcP/fequmFYCw8NMoH7pkAZQzU78b3kYrlua5a9eA== + cross-spawn@^7.0.0, cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" @@ -5755,6 +7099,13 @@ data-urls@^3.0.2: whatwg-mimetype "^3.0.0" whatwg-url "^11.0.0" +date-fns@^2.28.0, date-fns@^2.29.2: + version "2.30.0" + resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.30.0.tgz#f367e644839ff57894ec6ac480de40cae4b0f4d0" + integrity sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw== + dependencies: + "@babel/runtime" "^7.21.0" + dateformat@^3.0.0: version "3.0.3" resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-3.0.3.tgz#a6e37499a4d9a9cf85ef5872044d62901c9889ae" @@ -5796,7 +7147,7 @@ decamelize-keys@^1.1.0: decamelize "^1.1.0" map-obj "^1.0.0" -decamelize@^1.1.0: +decamelize@^1.1.0, decamelize@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA== @@ -5856,6 +7207,11 @@ deepmerge@^4.2.2: resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.0.tgz#65491893ec47756d44719ae520e0e2609233b59b" integrity sha512-z2wJZXrmeHdvYJp/Ux55wIjqo81G5Bp4c+oELTW+7ar6SogWHajt5a9gO3s3IDaGSAXjDk0vlQKN3rms8ab3og== +deepmerge@^4.3.0: + version "4.3.1" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-4.3.1.tgz#44b5f2147cd3b00d4b56137685966f26fd25dd4a" + integrity sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A== + default-gateway@^6.0.3: version "6.0.3" resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-6.0.3.tgz#819494c888053bdb743edbf343d6cdf7f2943a71" @@ -5902,6 +7258,11 @@ delayed-stream@~1.0.0: resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== +delegate@^3.1.2: + version "3.2.0" + resolved "https://registry.yarnpkg.com/delegate/-/delegate-3.2.0.tgz#b66b71c3158522e8ab5744f720d8ca0c2af59166" + integrity sha512-IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw== + delegates@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" @@ -5952,7 +7313,7 @@ diff-sequences@^29.4.3: resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-29.4.3.tgz#9314bc1fabe09267ffeca9cbafc457d8499a13f2" integrity sha512-ofrBgwpPhCD85kMKtE9RYFFq6OC1A89oW2vvgWZNCwxrUpRUILopY7lsYyMDSjc8g6U6aiO0Qubg6r4Wgt5ZnA== -diff@^4.0.1: +diff@^4.0.1, diff@^4.0.2: version "4.0.2" resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== @@ -5995,6 +7356,11 @@ dom-accessibility-api@^0.5.9: resolved "https://registry.yarnpkg.com/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz#5a7429e6066eb3664d911e33fb0e45de8eb08453" integrity sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg== +dom-scroll-into-view@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/dom-scroll-into-view/-/dom-scroll-into-view-1.2.1.tgz#e8f36732dd089b0201a88d7815dc3f88e6d66c7e" + integrity sha512-LwNVg3GJOprWDO+QhLL1Z9MMgWe/KAFLxVWKzjRTxNSPn8/LLDIfmuG71YHznXCqaqTjvHJDYO1MEAgX6XCNbQ== + dom-serializer@^1.0.1: version "1.4.1" resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.4.1.tgz#de5d41b1aea290215dc45a6dae8adcf1d32e2d30" @@ -6032,6 +7398,14 @@ domutils@^2.8.0: domelementtype "^2.2.0" domhandler "^4.2.0" +dot-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/dot-case/-/dot-case-3.0.4.tgz#9b2b670d00a431667a8a75ba29cd1b98809ce751" + integrity sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + dot-prop@6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-6.0.1.tgz#fc26b3cf142b9e59b74dbd39ed66ce620c681083" @@ -6051,6 +7425,17 @@ dotenv@~10.0.0: resolved "https://registry.yarnpkg.com/dotenv/-/dotenv-10.0.0.tgz#3d4227b8fb95f81096cdd2b66653fb2c7085ba81" integrity sha512-rlBi9d8jpv9Sf1klPjNfFAuWDjKLwTIJJ/VxtoTwIR6hnZxcEOQCZg2oIL3MWBYw5GpUDKOEnND7LXTbIpQ03Q== +downshift@^6.0.15: + version "6.1.12" + resolved "https://registry.yarnpkg.com/downshift/-/downshift-6.1.12.tgz#f14476b41a6f6fd080c340bad1ddf449f7143f6f" + integrity sha512-7XB/iaSJVS4T8wGFT3WRXmSF1UlBHAA40DshZtkrIscIN+VC+Lh363skLxFTvJwtNgHxAMDGEHT4xsyQFWL+UA== + dependencies: + "@babel/runtime" "^7.14.8" + compute-scroll-into-view "^1.0.17" + prop-types "^15.7.2" + react-is "^17.0.2" + tslib "^2.3.0" + dts-bundle-generator@^7.2.0: version "7.2.0" resolved "https://registry.yarnpkg.com/dts-bundle-generator/-/dts-bundle-generator-7.2.0.tgz#1a06f621e33399e38c8968bbd71d65ab577e5327" @@ -6111,6 +7496,11 @@ emittery@^0.13.1: resolved "https://registry.yarnpkg.com/emittery/-/emittery-0.13.1.tgz#c04b8c3457490e0847ae51fced3af52d338e3dad" integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ== +emoji-regex@^7.0.1: + version "7.0.3" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" + integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== + emoji-regex@^8.0.0: version "8.0.0" resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" @@ -6131,7 +7521,7 @@ encodeurl@~1.0.2: resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59" integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w== -encoding@^0.1.13: +encoding@^0.1.12, encoding@^0.1.13: version "0.1.13" resolved "https://registry.yarnpkg.com/encoding/-/encoding-0.1.13.tgz#56574afdd791f54a8e9b2785c0582a2d26210fa9" integrity sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A== @@ -6180,6 +7570,11 @@ envinfo@^7.7.4: resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475" integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw== +equivalent-key-map@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/equivalent-key-map/-/equivalent-key-map-0.2.2.tgz#be4d57049bb8d46a81d6e256c1628465620c2a13" + integrity sha512-xvHeyCDbZzkpN4VHQj/n+j2lOwL0VWszG30X4cOrc9Y7Tuo2qCdZK/0AMod23Z5dCtNUbaju6p0rwOhHUk05ew== + err-code@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/err-code/-/err-code-2.0.3.tgz#23c2f3b756ffdfc608d30e27c9a941024807e7f9" @@ -6583,6 +7978,13 @@ estree-walker@^2.0.1, estree-walker@^2.0.2: resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-2.0.2.tgz#52f010178c2a4c117a7757cfe942adb7d2da4cac" integrity sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w== +estree-walker@^3.0.1: + version "3.0.3" + resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-3.0.3.tgz#67c3e549ec402a487b4fc193d1953a524752340d" + integrity sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g== + dependencies: + "@types/estree" "^1.0.0" + esutils@^2.0.2: version "2.0.3" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" @@ -6878,6 +8280,11 @@ find-cache-dir@^3.3.1, find-cache-dir@^3.3.2: make-dir "^3.0.2" pkg-dir "^4.1.0" +find-root@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" + integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== + find-up@5.0.0, find-up@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" @@ -6997,6 +8404,26 @@ fraction.js@^4.2.0: resolved "https://registry.yarnpkg.com/fraction.js/-/fraction.js-4.2.0.tgz#448e5109a313a3527f5a3ab2119ec4cf0e0e2950" integrity sha512-MhLuK+2gUcnZe8ZHlaaINnQLl0xRIGRfcGk2yl8xoQAfHrSsL3rYu6FCmBdkdbhc9EPlwyGHewaRsvwRMJtAlA== +framer-motion@^10.11.6: + version "10.12.7" + resolved "https://registry.yarnpkg.com/framer-motion/-/framer-motion-10.12.7.tgz#7a32a891d61b0cb0eaff54ebe054e96bb3815d9c" + integrity sha512-awOlKkDvcQpv92Pzw5KCWFehxzvqtGYZqnLvHWZvQFpIxaPsRMypRX+vhugpciOzQPkZbc37X4dJLIZLfGM/CQ== + dependencies: + tslib "^2.4.0" + optionalDependencies: + "@emotion/is-prop-valid" "^0.8.2" + +framer-motion@^7.6.1: + version "7.10.3" + resolved "https://registry.yarnpkg.com/framer-motion/-/framer-motion-7.10.3.tgz#8b23f50bbc1ee8c830c869c5398e457d5272feb5" + integrity sha512-k2ccYeZNSpPg//HTaqrU+4pRq9f9ZpaaN7rr0+Rx5zA4wZLbk547wtDzge2db1sB+1mnJ6r59P4xb+aEIi/W+w== + dependencies: + "@motionone/dom" "^10.15.3" + hey-listen "^1.0.8" + tslib "2.4.0" + optionalDependencies: + "@emotion/is-prop-valid" "^0.8.2" + fresh@0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" @@ -7157,7 +8584,7 @@ gensync@^1.0.0-beta.2: resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== -get-caller-file@^2.0.5: +get-caller-file@^2.0.1, get-caller-file@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== @@ -7221,6 +8648,14 @@ getpass@^0.1.1: dependencies: assert-plus "^1.0.0" +gettext-parser@^1.3.1: + version "1.4.0" + resolved "https://registry.yarnpkg.com/gettext-parser/-/gettext-parser-1.4.0.tgz#f8baf34a292f03d5e42f02df099d301f167a7ace" + integrity sha512-sedZYLHlHeBop/gZ1jdg59hlUEcpcZJofLq2JFwJT1zTqAU3l2wFv6IsuwFHGqbiT9DWzMUW4/em2+hspnmMMA== + dependencies: + encoding "^0.1.12" + safe-buffer "^5.1.1" + gh-pages@5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/gh-pages/-/gh-pages-5.0.0.tgz#e0893272a0e33f0453e53a3c017c33b91ddd6394" @@ -7430,6 +8865,13 @@ globrex@^0.1.2: resolved "https://registry.yarnpkg.com/globrex/-/globrex-0.1.2.tgz#dd5d9ec826232730cd6793a5e33a9302985e6098" integrity sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg== +good-listener@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/good-listener/-/good-listener-1.2.2.tgz#d53b30cdf9313dffb7dc9a0d477096aa6d145c50" + integrity sha512-goW1b+d9q/HIwbVYZzZ6SsTr4IgE+WA44A0GmPIQstuOrgsFcT7VEJ48nmr9GaRtNu0XTKacFLGnBPAM6Afouw== + dependencies: + delegate "^3.1.2" + gopd@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/gopd/-/gopd-1.0.1.tgz#29ff76de69dac7489b7c0918a5788e56477c332c" @@ -7447,6 +8889,11 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.15, graceful-fs@^4.2.2: resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== +gradient-parser@^0.1.5: + version "0.1.5" + resolved "https://registry.yarnpkg.com/gradient-parser/-/gradient-parser-0.1.5.tgz#0c7e2179559e5ce7d8d71f4423af937100b2248c" + integrity sha512-+uPlcVbjrKOnTzvz0MjTj7BfACj8OmxIa1moIjJV7btvhUMSJk0D47RfDCgDrZE3dYMz9Cf5xKJwnrKLjUq0KQ== + grapheme-splitter@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz#9cf3a665c6247479896834af35cf1dbb4400767e" @@ -7548,11 +8995,36 @@ he@^1.2.0: resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== +header-case@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/header-case/-/header-case-2.0.4.tgz#5a42e63b55177349cf405beb8d775acabb92c063" + integrity sha512-H/vuk5TEEVZwrR0lp2zed9OCo1uAILMlx0JEMgC26rzyJJ3N1v6XkwHHXJQdR2doSjcGPM6OKPYoJgf0plJ11Q== + dependencies: + capital-case "^1.0.4" + tslib "^2.0.3" + helpertypes@^0.0.19: version "0.0.19" resolved "https://registry.yarnpkg.com/helpertypes/-/helpertypes-0.0.19.tgz#6f8cb18e4e1fad73dc103b98e624ac85cb06a720" integrity sha512-J00e55zffgi3yVnUp0UdbMztNkr2PnizEkOe9URNohnrNhW5X0QpegkuLpOmFQInpi93Nb8MCjQRHAiCDF42NQ== +hey-listen@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/hey-listen/-/hey-listen-1.0.8.tgz#8e59561ff724908de1aa924ed6ecc84a56a9aa68" + integrity sha512-COpmrF2NOg4TBWUJ5UVyaCU2A88wEMkUPK4hNqyCkqHbxT92BbvfjoSozkAIIm6XhicGlJHhFdullInrdhwU8Q== + +highlight-words-core@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/highlight-words-core/-/highlight-words-core-1.2.2.tgz#1eff6d7d9f0a22f155042a00791237791b1eeaaa" + integrity sha512-BXUKIkUuh6cmmxzi5OIbUJxrG8OAk2MqoL1DtO3Wo9D2faJg2ph5ntyuQeLqaHJmzER6H5tllCDA9ZnNe9BVGg== + +hoist-non-react-statics@^3.3.1: + version "3.3.2" + resolved "https://registry.yarnpkg.com/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz#ece0acaf71d62c2969c2ec59feff42a4b1a85b45" + integrity sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw== + dependencies: + react-is "^16.7.0" + hosted-git-info@^2.1.4: version "2.8.9" resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.9.tgz#dffc0bf9a21c02209090f2aa69429e1414daf3f9" @@ -7596,6 +9068,11 @@ hpack.js@^2.1.6: readable-stream "^2.0.1" wbuf "^1.1.0" +hpq@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/hpq/-/hpq-1.4.0.tgz#a65ad6ea8e9dfd835d990118597357befa5a88d9" + integrity sha512-ycJQMRaRPBcfnoT1gS5I1XCvbbw9KO94Y0vkwksuOjcJMqNZtb03MF2tCItLI2mQbkZWSSeFinoRDPmjzv4tKg== + html-encoding-sniffer@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz#2cb1a8cf0db52414776e5b2a7a04d5dd98158de9" @@ -8030,6 +9507,11 @@ is-extglob@^2.1.1: resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + integrity sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w== + is-fullwidth-code-point@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" @@ -8136,6 +9618,11 @@ is-potential-custom-element-name@^1.0.1: resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5" integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ== +is-promise@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-4.0.0.tgz#42ff9f84206c1991d26debf520dd5c01042dd2f3" + integrity sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ== + is-reference@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/is-reference/-/is-reference-1.2.1.tgz#8b2dac0b371f4bc994fdeaba9eb542d03002d0b7" @@ -8143,6 +9630,13 @@ is-reference@^1.2.1: dependencies: "@types/estree" "*" +is-reference@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/is-reference/-/is-reference-3.0.1.tgz#d400f4260f7e55733955e60d361d827eb4d3b831" + integrity sha512-baJJdQLiYaJdvFbJqXrcGv3WU3QCzBlUcI5QhbesIm6/xPsvmO+2CDoi/GMOFBQEQm+PXkwOPrp9KK5ozZsp2w== + dependencies: + "@types/estree" "*" + is-regex@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.4.tgz#eef5663cd59fa4c0ae339505323df6854bb15958" @@ -9454,6 +10948,13 @@ lilconfig@^2.0.3, lilconfig@^2.0.5: resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.1.0.tgz#78e23ac89ebb7e1bfbf25b18043de756548e7f52" integrity sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ== +line-height@^0.3.1: + version "0.3.1" + resolved "https://registry.yarnpkg.com/line-height/-/line-height-0.3.1.tgz#4b1205edde182872a5efa3c8f620b3187a9c54c9" + integrity sha512-YExecgqPwnp5gplD2+Y8e8A5+jKpr25+DzMbFdI1/1UAr0FJrTFv4VkHLf8/6B590i1wUPJWMKKldkd/bdQ//w== + dependencies: + computed-style "~0.1.3" + lines-and-columns@^1.1.6: version "1.2.4" resolved "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.2.4.tgz#eca284f75d2965079309dc0ad9255abb2ebc1632" @@ -9618,6 +11119,13 @@ loupe@^2.3.1: dependencies: get-func-name "^2.0.0" +lower-case@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/lower-case/-/lower-case-2.0.2.tgz#6fa237c63dbdc4a82ca0fd882e4722dc5e634e28" + integrity sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg== + dependencies: + tslib "^2.0.3" + lru-cache@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" @@ -9654,6 +11162,13 @@ magic-string@^0.25.7: dependencies: sourcemap-codec "^1.4.8" +magic-string@^0.26.7: + version "0.26.7" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.26.7.tgz#caf7daf61b34e9982f8228c4527474dac8981d6f" + integrity sha512-hX9XH3ziStPoPhJxLq1syWuZMxbDvGNbVchfrdCtanC7D13888bMFow61x8axrx+GfHLtVeAx2kxL7tTGRl+Ow== + dependencies: + sourcemap-codec "^1.4.8" + magic-string@^0.27.0: version "0.27.0" resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.27.0.tgz#e4a3413b4bab6d98d2becffd48b4a257effdbbf3" @@ -9770,6 +11285,11 @@ memfs@^3.4.1, memfs@^3.4.3: dependencies: fs-monkey "^1.0.3" +memize@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/memize/-/memize-1.1.0.tgz#4a5a684ac6992a13b1299043f3e49b1af6a0b0d3" + integrity sha512-K4FcPETOMTwe7KL2LK0orMhpOmWD2wRGwWWpbZy0fyArwsyIKR8YJVz8+efBAh3BO4zPqlSICu4vsLTRRqtFAg== + meow@^8.0.0: version "8.1.2" resolved "https://registry.yarnpkg.com/meow/-/meow-8.1.2.tgz#bcbe45bda0ee1729d350c03cffc8395a36c4e897" @@ -10024,6 +11544,23 @@ modify-values@^1.0.0: resolved "https://registry.yarnpkg.com/modify-values/-/modify-values-1.0.1.tgz#b3939fa605546474e3e3e3c63d64bd43b4ee6022" integrity sha512-xV2bxeN6F7oYjZWTe/YPAy6MN2M+sL4u/Rlm2AHCIVGfo2p1yGmBHQ6vHehl4bRTZBdHu3TSkWdYgkwpYzAGSw== +moment-timezone@^0.5.40: + version "0.5.43" + resolved "https://registry.yarnpkg.com/moment-timezone/-/moment-timezone-0.5.43.tgz#3dd7f3d0c67f78c23cd1906b9b2137a09b3c4790" + integrity sha512-72j3aNyuIsDxdF1i7CEgV2FfxM1r6aaqJyLB2vwb33mXYyoyLly+F1zbWqhA3/bVIoJ4szlUoMbUnVdid32NUQ== + dependencies: + moment "^2.29.4" + +moment@^2.29.4: + version "2.29.4" + resolved "https://registry.yarnpkg.com/moment/-/moment-2.29.4.tgz#3dbe052889fe7c1b2ed966fcb3a77328964ef108" + integrity sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w== + +mousetrap@^1.6.5: + version "1.6.5" + resolved "https://registry.yarnpkg.com/mousetrap/-/mousetrap-1.6.5.tgz#8a766d8c272b08393d5f56074e0b5ec183485bf9" + integrity sha512-QNo4kEepaIBwiT8CDhP98umTetp+JNfQYBWvC1pc6/OAibuXtRcxZ58Qz8skvEHYvURne/7R8T5VoOI7rDsEUA== + mrmime@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/mrmime/-/mrmime-1.0.1.tgz#5f90c825fad4bdd41dc914eff5d1a8cfdaf24f27" @@ -10102,6 +11639,14 @@ neo-async@^2.6.0, neo-async@^2.6.2: resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== +no-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/no-case/-/no-case-3.0.4.tgz#d361fd5c9800f558551a8369fc0dcd4662b6124d" + integrity sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg== + dependencies: + lower-case "^2.0.2" + tslib "^2.0.3" + node-abort-controller@^3.0.1: version "3.1.1" resolved "https://registry.yarnpkg.com/node-abort-controller/-/node-abort-controller-3.1.1.tgz#a94377e964a9a37ac3976d848cb5c765833b8548" @@ -10231,6 +11776,11 @@ normalize-url@^6.0.1: resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a" integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A== +normalize-wheel@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/normalize-wheel/-/normalize-wheel-1.0.1.tgz#aec886affdb045070d856447df62ecf86146ec45" + integrity sha512-1OnlAPZ3zgrk8B91HyRj+eVv+kS5u+Z0SCsak6Xil/kmgEia50ga7zfkumayonZrImffAxPU/5WcyGhzetHNPA== + npm-bundled@^1.1.1, npm-bundled@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/npm-bundled/-/npm-bundled-1.1.2.tgz#944c78789bd739035b70baa2ca5cc32b8d860bc1" @@ -10924,6 +12474,14 @@ pacote@^15.0.0, pacote@^15.0.8: ssri "^10.0.0" tar "^6.1.11" +param-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/param-case/-/param-case-3.0.4.tgz#7d17fe4aa12bde34d4a77d91acfb6219caad01c5" + integrity sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A== + dependencies: + dot-case "^3.0.4" + tslib "^2.0.3" + parent-module@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz#691d2709e78c79fae3a156622452d00762caaaa2" @@ -10994,11 +12552,27 @@ parseurl@~1.3.2, parseurl@~1.3.3: resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== +pascal-case@^3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/pascal-case/-/pascal-case-3.1.2.tgz#b48e0ef2b98e205e7c1dae747d0b1508237660eb" + integrity sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + path-browserify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/path-browserify/-/path-browserify-1.0.1.tgz#d98454a9c3753d5790860f16f68867b9e46be1fd" integrity sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g== +path-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/path-case/-/path-case-3.0.4.tgz#9168645334eb942658375c56f80b4c0cb5f82c6f" + integrity sha512-qO4qCFjXqVTrcbPt/hQfhTQ+VhFsqNKOPtytgNKkKxSoEp3XPUQ8ObFuePylOIok5gjn69ry8XiULxCwot3Wfg== + dependencies: + dot-case "^3.0.4" + tslib "^2.0.3" + path-exists@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" @@ -11037,6 +12611,11 @@ path-to-regexp@0.1.7: resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ== +path-to-regexp@^6.2.1: + version "6.2.1" + resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-6.2.1.tgz#d54934d6798eb9e5ef14e7af7962c945906918e5" + integrity sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw== + path-type@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz#cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f" @@ -11536,7 +13115,7 @@ promzard@^0.3.0: dependencies: read "1" -prop-types@^15.7.2, prop-types@^15.8.1: +prop-types@^15.5.6, prop-types@^15.7.2, prop-types@^15.8.1: version "15.8.1" resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.8.1.tgz#67d87bf1a694f48435cf332c24af10214a3140b5" integrity sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg== @@ -11563,6 +13142,11 @@ proxy-addr@~2.0.7: forwarded "0.2.0" ipaddr.js "1.9.1" +proxy-compare@2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/proxy-compare/-/proxy-compare-2.3.0.tgz#ac9633ae52918ff9c9fcc54dfe6316c7a02d20ee" + integrity sha512-c3L2CcAi7f7pvlD0D7xsF+2CQIW8C3HaYx2Pfgq8eA4HAl3GAH6/dVYsyBbYF/0XJs2ziGLrzmz5fmzPm6A0pQ== + proxy-from-env@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2" @@ -11649,6 +13233,25 @@ raw-body@2.5.1: iconv-lite "0.4.24" unpipe "1.0.0" +re-resizable@^6.4.0: + version "6.9.9" + resolved "https://registry.yarnpkg.com/re-resizable/-/re-resizable-6.9.9.tgz#99e8b31c67a62115dc9c5394b7e55892265be216" + integrity sha512-l+MBlKZffv/SicxDySKEEh42hR6m5bAHfNu3Tvxks2c4Ah+ldnWjfnVRwxo/nxF27SsUsxDS0raAzFuJNKABXA== + +react-autosize-textarea@^7.1.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/react-autosize-textarea/-/react-autosize-textarea-7.1.0.tgz#902c84fc395a689ca3a484dfb6bc2be9ba3694d1" + integrity sha512-BHpjCDkuOlllZn3nLazY2F8oYO1tS2jHnWhcjTWQdcKiiMU6gHLNt/fzmqMSyerR0eTdKtfSIqtSeTtghNwS+g== + dependencies: + autosize "^4.0.2" + line-height "^0.3.1" + prop-types "^15.5.6" + +react-colorful@^5.3.1: + version "5.6.1" + resolved "https://registry.yarnpkg.com/react-colorful/-/react-colorful-5.6.1.tgz#7dc2aed2d7c72fac89694e834d179e32f3da563b" + integrity sha512-1exovf0uGTGyq5mXQT0zgQ80uvj2PCwvF8zY1RN9/vbJVSjSo3fsB/4L3ObbF7u70NduSiK4xu4Y6q1MHoUGEw== + react-dom@^18.2.0: version "18.2.0" resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-18.2.0.tgz#22aaf38708db2674ed9ada224ca4aa708d821e3d" @@ -11657,17 +13260,25 @@ react-dom@^18.2.0: loose-envify "^1.1.0" scheduler "^0.23.0" +react-easy-crop@^4.5.1: + version "4.7.4" + resolved "https://registry.yarnpkg.com/react-easy-crop/-/react-easy-crop-4.7.4.tgz#3106bfb3de371d9393aedc0b9ae1fb97c2b9f722" + integrity sha512-oDi1375Jo/zuPUvo3oauxnNbfy8L4wsbmHD1KB2vT55fdgu+q8/K0w/rDWzy9jz4jfQ94Q9+3Yu366sDDFVmiA== + dependencies: + normalize-wheel "^1.0.1" + tslib "2.0.1" + "react-is@^16.12.0 || ^17.0.0 || ^18.0.0", react-is@^18.0.0, react-is@^18.2.0: version "18.2.0" resolved "https://registry.yarnpkg.com/react-is/-/react-is-18.2.0.tgz#199431eeaaa2e09f86427efbb4f1473edb47609b" integrity sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w== -react-is@^16.13.1: +react-is@^16.13.1, react-is@^16.7.0: version "16.13.1" resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.13.1.tgz#789729a4dc36de2999dc156dd6c1d9c18cea56a4" integrity sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ== -react-is@^17.0.1: +react-is@^17.0.1, react-is@^17.0.2: version "17.0.2" resolved "https://registry.yarnpkg.com/react-is/-/react-is-17.0.2.tgz#e691d4a8e9c789365655539ab372762b0efb54f0" integrity sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w== @@ -11861,6 +13472,36 @@ readdirp@~3.6.0: dependencies: picomatch "^2.2.1" +reakit-system@^0.15.2: + version "0.15.2" + resolved "https://registry.yarnpkg.com/reakit-system/-/reakit-system-0.15.2.tgz#a485fab84b3942acbed6212c3b56a6ef8611c457" + integrity sha512-TvRthEz0DmD0rcJkGamMYx+bATwnGNWJpe/lc8UV2Js8nnPvkaxrHk5fX9cVASFrWbaIyegZHCWUBfxr30bmmA== + dependencies: + reakit-utils "^0.15.2" + +reakit-utils@^0.15.2: + version "0.15.2" + resolved "https://registry.yarnpkg.com/reakit-utils/-/reakit-utils-0.15.2.tgz#b4d5836e534576bfd175171541d43182ad97f2d2" + integrity sha512-i/RYkq+W6hvfFmXw5QW7zvfJJT/K8a4qZ0hjA79T61JAFPGt23DsfxwyBbyK91GZrJ9HMrXFVXWMovsKBc1qEQ== + +reakit-warning@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/reakit-warning/-/reakit-warning-0.6.2.tgz#9c346ae483eb1f284f2088653f90cabd26dbee56" + integrity sha512-z/3fvuc46DJyD3nJAUOto6inz2EbSQTjvI/KBQDqxwB0y02HDyeP8IWOJxvkuAUGkWpeSx+H3QWQFSNiPcHtmw== + dependencies: + reakit-utils "^0.15.2" + +reakit@^1.3.11, reakit@^1.3.8: + version "1.3.11" + resolved "https://registry.yarnpkg.com/reakit/-/reakit-1.3.11.tgz#c15360ac43e94fbe4291d233af3ac5040428252e" + integrity sha512-mYxw2z0fsJNOQKAEn5FJCPTU3rcrY33YZ/HzoWqZX0G7FwySp1wkCYW79WhuYMNIUFQ8s3Baob1RtsEywmZSig== + dependencies: + "@popperjs/core" "^2.5.4" + body-scroll-lock "^3.1.5" + reakit-system "^0.15.2" + reakit-utils "^0.15.2" + reakit-warning "^0.6.2" + redent@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/redent/-/redent-3.0.0.tgz#e557b7998316bb53c9f1f56fa626352c6963059f" @@ -11869,6 +13510,13 @@ redent@^3.0.0: indent-string "^4.0.0" strip-indent "^3.0.0" +redux@^4.1.2: + version "4.2.1" + resolved "https://registry.yarnpkg.com/redux/-/redux-4.2.1.tgz#c08f4306826c49b5e9dc901dee0452ea8fce6197" + integrity sha512-LAUYz4lc+Do8/g7aeRa8JkyDErK6ekstQaqWQrNRW//MY1TvCEpMtpTWvlQ+FPbWCx+Xixu/6SHt5N0HR+SB4w== + dependencies: + "@babel/runtime" "^7.9.2" + regenerate-unicode-properties@^10.1.0: version "10.1.0" resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz#7c3192cab6dd24e21cb4461e5ddd7dd24fa8374c" @@ -11926,6 +13574,16 @@ regjsparser@^0.9.1: dependencies: jsesc "~0.5.0" +rememo@^4.0.0, rememo@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/rememo/-/rememo-4.0.2.tgz#8af1f09fd3bf5809ca0bfd0b803926c67ead8c1e" + integrity sha512-NVfSP9NstE3QPNs/TnegQY0vnJnstKQSpcrsI2kBTB3dB2PkdfKdTa+abbjMIDqpc63fE5LfjLgfMst0ULMFxQ== + +remove-accents@^0.4.2: + version "0.4.4" + resolved "https://registry.yarnpkg.com/remove-accents/-/remove-accents-0.4.4.tgz#73704abf7dae3764295d475d2b6afac4ea23e4d9" + integrity sha512-EpFcOa/ISetVHEXqu+VwI96KZBmq+a8LJnGkaeFw45epGlxIZz5dhEEnNZMsQXgORu3qaMoLX4qJCzOik6ytAg== + request@2.88.2: version "2.88.2" resolved "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz#d73c918731cb5a87da047e207234146f664d12b3" @@ -11952,6 +13610,11 @@ request@2.88.2: tunnel-agent "^0.6.0" uuid "^3.3.2" +requestidlecallback@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/requestidlecallback/-/requestidlecallback-0.3.0.tgz#6fb74e0733f90df3faa4838f9f6a2a5f9b742ac5" + integrity sha512-TWHFkT7S9p7IxLC5A1hYmAYQx2Eb9w1skrXmQ+dS1URyvR8tenMLl4lHbqEOUnpEYxNKpkVMXUgknVpBZWXXfQ== + require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" @@ -11962,6 +13625,11 @@ require-from-string@^2.0.2: resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== +require-main-filename@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz#d0b329ecc7cc0f61649f62215be69af54aa8989b" + integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg== + requires-port@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff" @@ -12104,6 +13772,16 @@ rollup-plugin-dts@^5.2.0: optionalDependencies: "@babel/code-frame" "^7.18.6" +rollup-plugin-external-globals@0.7.3: + version "0.7.3" + resolved "https://registry.yarnpkg.com/rollup-plugin-external-globals/-/rollup-plugin-external-globals-0.7.3.tgz#da5455fd7b26e469dc746c88549e958b8e67295c" + integrity sha512-rOxtHUyIYR06kV2H5xhxIjbmdfQ7YGw/LUPFzxi9qwUqTqnbBUbZlVpkc5hs13b8KVO20Zkb+LzT2TGpJgRaIg== + dependencies: + "@rollup/pluginutils" "^5.0.2" + estree-walker "^3.0.1" + is-reference "^3.0.0" + magic-string "^0.26.7" + rollup-plugin-peer-deps-external@^2.2.4: version "2.2.4" resolved "https://registry.yarnpkg.com/rollup-plugin-peer-deps-external/-/rollup-plugin-peer-deps-external-2.2.4.tgz#8a420bbfd6dccc30aeb68c9bf57011f2f109570d" @@ -12188,6 +13866,11 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" +rungen@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/rungen/-/rungen-0.3.2.tgz#400c09ebe914e7b17e0b6ef3263400fc2abc7cb3" + integrity sha512-zWl10xu2D7zoR8zSC2U6bg5bYF6T/Wk7rxwp8IPaJH7f0Ge21G03kNHVgHR7tyVkSSfAOG0Rqf/Cl38JftSmtw== + rxjs@^6.5.4: version "6.6.7" resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" @@ -12207,7 +13890,7 @@ safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== -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: +safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, safe-buffer@^5.1.2, safe-buffer@~5.2.0: version "5.2.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== @@ -12301,6 +13984,11 @@ select-hose@^2.0.0: resolved "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca" integrity sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg== +select@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/select/-/select-1.1.2.tgz#0e7350acdec80b1108528786ec1d4418d11b396d" + integrity sha512-OwpTSOfy6xSs1+pwcNrv0RBMOzI39Lp3qQKUTPVVPRjCdNa5JH/oPRiqsesIskK8TVgmRiHwO4KXlV2Li9dANA== + selfsigned@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-2.1.1.tgz#18a7613d714c0cd3385c48af0075abf3f266af61" @@ -12351,6 +14039,15 @@ send@0.18.0: range-parser "~1.2.1" statuses "2.0.1" +sentence-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/sentence-case/-/sentence-case-3.0.4.tgz#3645a7b8c117c787fde8702056225bb62a45131f" + integrity sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg== + dependencies: + no-case "^3.0.4" + tslib "^2.0.3" + upper-case-first "^2.0.2" + serialize-javascript@^6.0.0, serialize-javascript@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.1.tgz#b206efb27c3da0b0ab6b52f48d170b7996458e5c" @@ -12435,6 +14132,13 @@ shiki@^0.14.1: vscode-oniguruma "^1.7.0" vscode-textmate "^8.0.0" +showdown@^1.9.1: + version "1.9.1" + resolved "https://registry.yarnpkg.com/showdown/-/showdown-1.9.1.tgz#134e148e75cd4623e09c21b0511977d79b5ad0ef" + integrity sha512-9cGuS382HcvExtf5AHk7Cb4pAeQQ+h0eTr33V1mu+crYWV4KvWAw6el92bDrqGEk5d46Ai/fhbEUwqJ/mTCNEA== + dependencies: + yargs "^14.2" + side-channel@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/side-channel/-/side-channel-1.0.4.tgz#efce5c8fdc104ee751b25c58d4290011fa5ea2cf" @@ -12458,6 +14162,11 @@ sigstore@^1.0.0: make-fetch-happen "^11.0.1" tuf-js "^1.0.0" +simple-html-tokenizer@^0.5.7: + version "0.5.11" + resolved "https://registry.yarnpkg.com/simple-html-tokenizer/-/simple-html-tokenizer-0.5.11.tgz#4c5186083c164ba22a7b477b7687ac056ad6b1d9" + integrity sha512-C2WEK/Z3HoSFbYq8tI7ni3eOo/NneSPRoPpcM7WdLjFOArFuyXEjAoCdOC3DgMfRyziZQ1hCNR4mrNdWEvD0og== + sirv@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/sirv/-/sirv-2.0.2.tgz#128b9a628d77568139cff85703ad5497c46a4760" @@ -12487,6 +14196,14 @@ smart-buffer@^4.2.0: resolved "https://registry.yarnpkg.com/smart-buffer/-/smart-buffer-4.2.0.tgz#6e1d71fa4f18c05f7d0ff216dd16a481d0e8d9ae" integrity sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg== +snake-case@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/snake-case/-/snake-case-3.0.4.tgz#4f2bbd568e9935abdfd593f34c691dadb49c452c" + integrity sha512-LAOh4z89bGQvl9pFfNF8V146i7o7/CqFPbqzYgP+yYzDIDeS9HaNFtXABamRW+AQzEVODcvE79ljJ+8a9YSdMg== + dependencies: + dot-case "^3.0.4" + tslib "^2.0.3" + sockjs@^0.3.24: version "0.3.24" resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.24.tgz#c9bc8995f33a111bea0395ec30aa3206bdb5ccce" @@ -12566,6 +14283,11 @@ source-map-support@^0.5.21, source-map-support@~0.5.20: buffer-from "^1.0.0" source-map "^0.6.0" +source-map@^0.5.7: + version "0.5.7" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" + integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ== + source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.0, source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" @@ -12644,6 +14366,11 @@ split@^1.0.0: dependencies: through "2" +sprintf-js@^1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.2.tgz#da1765262bf8c0f571749f2ad6c26300207ae673" + integrity sha512-VE0SOVEHCk7Qc8ulkWw3ntAzXuqf7S2lvwQaDLRnUeIEaKNQJzV6BwmLKhOqT61aGhfUMrXeaBk+oDGCzvhcug== + sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" @@ -12746,6 +14473,15 @@ string-length@^4.0.1: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" +string-width@^3.0.0, string-width@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" + integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== + dependencies: + emoji-regex "^7.0.1" + is-fullwidth-code-point "^2.0.0" + strip-ansi "^5.1.0" + string.prototype.matchall@^4.0.8: version "4.0.8" resolved "https://registry.yarnpkg.com/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz#3bf85722021816dcd1bf38bb714915887ca79fd3" @@ -12801,6 +14537,13 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" +strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0: + version "5.2.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" + integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== + dependencies: + ansi-regex "^4.1.0" + strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" @@ -12875,6 +14618,11 @@ style-loader@^3.3.0: resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-3.3.2.tgz#eaebca714d9e462c19aa1e3599057bc363924899" integrity sha512-RHs/vcrKdQK8wZliteNK4NKzxvLBzpuHMqYmUVWeKa6MkaIQ97ZTOS0b+zapZhy6GcrgWnvWYCMHRirC3FsUmw== +style-mod@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/style-mod/-/style-mod-4.0.3.tgz#136c4abc905f82a866a18b39df4dc08ec762b1ad" + integrity sha512-78Jv8kYJdjbvRwwijtCevYADfsI0lGzYJe4mMFdceO8l75DFFDoqBhR1jVDicDRRaX4//g1u9wKeo+ztc2h1Rw== + stylehacks@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-5.1.1.tgz#7934a34eb59d7152149fa69d6e9e56f2fc34bcc9" @@ -12883,6 +14631,11 @@ stylehacks@^5.1.1: browserslist "^4.21.4" postcss-selector-parser "^6.0.4" +stylis@4.1.4: + version "4.1.4" + resolved "https://registry.yarnpkg.com/stylis/-/stylis-4.1.4.tgz#9cb60e7153d8ac6d02d773552bf51c7a0344535b" + integrity sha512-USf5pszRYwuE6hg9by0OkKChkQYEXfkeTtm0xKw+jqQhwyjCVLdYyMBK7R+n7dhzsblAWJnGxju4vxq5eH20GQ== + stylus-loader@^7.1.0: version "7.1.0" resolved "https://registry.yarnpkg.com/stylus-loader/-/stylus-loader-7.1.0.tgz#19e09a98b19075c246e6e3f65e38b8cb89d2d6fb" @@ -12958,6 +14711,13 @@ symbol-tree@^3.2.4: resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== +tannin@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/tannin/-/tannin-1.2.0.tgz#1da6fe65280dca4c3d84efb075b077b1b94362a6" + integrity sha512-U7GgX/RcSeUETbV7gYgoz8PD7Ni4y95pgIP/Z6ayI3CfhSujwKEBlGFTCRN+Aqnuyf4AN2yHL+L8x+TCGjb9uA== + dependencies: + "@tannin/plural-forms" "^1.1.0" + tapable@^2.1.1, tapable@^2.2.0, tapable@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" @@ -13092,6 +14852,11 @@ thunky@^1.0.2: resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d" integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA== +tiny-emitter@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/tiny-emitter/-/tiny-emitter-2.1.0.tgz#1d1a56edfc51c43e863cbb5382a72330e3555423" + integrity sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q== + tinybench@^2.3.1: version "2.4.0" resolved "https://registry.yarnpkg.com/tinybench/-/tinybench-2.4.0.tgz#83f60d9e5545353610fe7993bd783120bc20c7a7" @@ -13183,6 +14948,11 @@ tr46@~0.0.3: resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.3.9.tgz#717b8f220cc0bb7b44e40514c22b2e8bbc70d8b9" integrity sha512-iawgk0hLP3SxGKDfnDJf8wTz4p2qImnyihM5Hh/sGvQ3K37dPi/w8sRhdNIxYA1TwFwc5mDhIJq+O0RsvXBKdQ== +traverse@^0.6.6: + version "0.6.7" + resolved "https://registry.yarnpkg.com/traverse/-/traverse-0.6.7.tgz#46961cd2d57dd8706c36664acde06a248f1173fe" + integrity sha512-/y956gpUo9ZNCb99YjxG7OaslxZWHfCHAUUfshwqOXmxUIvqLjVO581BT+gM59+QV9tFe6/CGG53tsA1Y7RSdg== + tree-kill@1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc" @@ -13309,12 +15079,22 @@ tsconfig-paths@^4.0.0, tsconfig-paths@^4.1.2: minimist "^1.2.6" strip-bom "^3.0.0" +tslib@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.0.1.tgz#410eb0d113e5b6356490eec749603725b021b43e" + integrity sha512-SgIkNheinmEBgx1IUNirK0TUD4X9yjjBRTqqjggWCU3pUEqIk3/Uwl3yRixYKT6WjQuGiwDv4NomL3wqRCj+CQ== + +tslib@2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.4.0.tgz#7cecaa7f073ce680a05847aa77be941098f36dc3" + integrity sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ== + tslib@^1.8.1, tslib@^1.9.0: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== -tslib@^2.1.0, tslib@^2.3.0, tslib@^2.4.0, tslib@^2.4.1, tslib@^2.5.0: +tslib@^2.0.3, tslib@^2.1.0, tslib@^2.3.0, tslib@^2.3.1, tslib@^2.4.0, tslib@^2.4.1, tslib@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf" integrity sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg== @@ -13341,6 +15121,11 @@ tunnel-agent@^0.6.0: dependencies: safe-buffer "^5.0.1" +turbo-combine-reducers@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/turbo-combine-reducers/-/turbo-combine-reducers-1.0.2.tgz#aa3650b3c63daa6804d35a4042014f6d31df1e47" + integrity sha512-gHbdMZlA6Ym6Ur5pSH/UWrNQMIM9IqTH6SoL1DbHpqEdQ8i+cFunSmSlFykPt0eGQwZ4d/XTHOl74H0/kFBVWw== + tweetnacl@^0.14.3, tweetnacl@~0.14.0: version "0.14.5" resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" @@ -13596,6 +15381,20 @@ update-browserslist-db@^1.0.10: escalade "^3.1.1" picocolors "^1.0.0" +upper-case-first@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/upper-case-first/-/upper-case-first-2.0.2.tgz#992c3273f882abd19d1e02894cc147117f844324" + integrity sha512-514ppYHBaKwfJRK/pNC6c/OxfGa0obSnAl106u97Ed0I625Nin96KAjttZF6ZL3e1XLtphxnqrOi9iWgm+u+bg== + dependencies: + tslib "^2.0.3" + +upper-case@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-2.0.2.tgz#d89810823faab1df1549b7d97a76f8662bae6f7a" + integrity sha512-KgdgDGJt2TpuwBUIjgG6lzw2GWFRCW9Qkfkiv0DxqHHLYJHmtmdUIKcZd8rHgFSjopVTlw6ggzCm1b8MFQwikg== + dependencies: + tslib "^2.0.3" + uri-js@^4.2.2: version "4.4.1" resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" @@ -13616,6 +15415,23 @@ url-parse@^1.5.3: querystringify "^2.1.1" requires-port "^1.0.0" +use-lilius@^2.0.1: + version "2.0.3" + resolved "https://registry.yarnpkg.com/use-lilius/-/use-lilius-2.0.3.tgz#07cdf1dea72da6f0c72d9234c16516fbbd396e2d" + integrity sha512-+Q7nspdv+QGnyHGVMd6yAdLrqv5EGB4n3ix4GJH0JEE27weKCLCLmZSuAr5Nw+yPBCZn/iZ+KjL5+UykLCWXrw== + dependencies: + date-fns "^2.29.2" + +use-memo-one@^1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/use-memo-one/-/use-memo-one-1.1.3.tgz#2fd2e43a2169eabc7496960ace8c79efef975e99" + integrity sha512-g66/K7ZQGYrI6dy8GLpVcMsBp4s17xNkYJVSMvTEevGy3nDxHOfE6z8BVE22+5G5x7t3+bhzrlTDB7ObrEE0cQ== + +use-sync-external-store@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz#7dbefd6ef3fe4e767a0cf5d7287aacfb5846928a" + integrity sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA== + util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" @@ -13626,7 +15442,7 @@ utils-merge@1.0.1: resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA== -uuid@8.3.2, uuid@^8.3.2: +uuid@8.3.2, uuid@^8.3.0, uuid@^8.3.2: version "8.3.2" resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2" integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg== @@ -13689,6 +15505,14 @@ validator@^13.7.0: resolved "https://registry.yarnpkg.com/validator/-/validator-13.9.0.tgz#33e7b85b604f3bbce9bb1a05d5c3e22e1c2ff855" integrity sha512-B+dGG8U3fdtM0/aNK4/X8CXq/EcxU2WPrPEkJGslb47qyHsxmbggTWK0yEA4qnYVNF+nxNlN88o14hIcPmSIEA== +valtio@1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/valtio/-/valtio-1.7.0.tgz#2105716db440402f7d0402073f938bdda7207acd" + integrity sha512-3Tnix66EERwMcrl1rfB3ylcewOcL5L/GiPmC3FlVNreQzqf2jufEeqlNmgnLgSGchkEmH3WYVtS+x6Qw4r+yzQ== + dependencies: + proxy-compare "2.3.0" + use-sync-external-store "1.2.0" + vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" @@ -13726,7 +15550,14 @@ vite-plugin-eslint@^1.8.1: "@types/eslint" "^8.4.5" rollup "^2.77.2" -vite-plugin-static-copy@^0.13.1: +vite-plugin-external@1.2.8: + version "1.2.8" + resolved "https://registry.yarnpkg.com/vite-plugin-external/-/vite-plugin-external-1.2.8.tgz#47e6a4907d262951042897b231c229a26c59f30d" + integrity sha512-w5xDuYoXPd7rPC6OVuee63Y4HSYeOuIFlEYyP6PWTE+o5MKF4qFH79RiLmpdopPxNmTGjQvlUes+UY1MVU+BMA== + dependencies: + fs-extra "^10.0.0" + +vite-plugin-static-copy@0.13.1: version "0.13.1" resolved "https://registry.yarnpkg.com/vite-plugin-static-copy/-/vite-plugin-static-copy-0.13.1.tgz#0560c904f3c6b0acf756bd81d53131f4a8072d55" integrity sha512-KwIcGBT1aOxSq+laK3VmSngoEa3HXWj/6ZEXdv+y59eZ7p/XSuPahoDo+CfYW22JjTdnstgeKWiX+78KNgDu6g== @@ -13823,6 +15654,11 @@ vue@^3.2.47: "@vue/server-renderer" "3.2.47" "@vue/shared" "3.2.47" +w3c-keyname@^2.2.4: + version "2.2.6" + resolved "https://registry.yarnpkg.com/w3c-keyname/-/w3c-keyname-2.2.6.tgz#8412046116bc16c5d73d4e612053ea10a189c85f" + integrity sha512-f+fciywl1SJEniZHD6H+kUO8gOnwIr7f4ijKA6+ZvJFjeGi1r4PDLl53Ayud9O/rk64RqgoQine0feoeOU0kXg== + w3c-xmlserializer@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-4.0.0.tgz#aebdc84920d806222936e3cdce408e32488a3073" @@ -14038,6 +15874,11 @@ which-collection@^1.0.1: is-weakmap "^2.0.1" is-weakset "^2.0.1" +which-module@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/which-module/-/which-module-2.0.1.tgz#776b1fe35d90aebe99e8ac15eb24093389a4a409" + integrity sha512-iBdZ57RDvnOR9AGBhML2vFZf7h8vmBjhoaZqODJBFWHVtKkDmKuHai3cx5PgVMrX5YDNp27AofYbAwctSS+vhQ== + which-typed-array@^1.1.9: version "1.1.9" resolved "https://registry.yarnpkg.com/which-typed-array/-/which-typed-array-1.1.9.tgz#307cf898025848cf995e795e8423c7f337efbde6" @@ -14081,6 +15922,15 @@ wordwrap@^1.0.0: resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== +wrap-ansi@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz#1fd1f67235d5b6d0fee781056001bfb694c03b09" + integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q== + dependencies: + ansi-styles "^3.2.0" + string-width "^3.0.0" + strip-ansi "^5.0.0" + wrap-ansi@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" @@ -14169,6 +16019,11 @@ xtend@~4.0.1: resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54" integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ== +y18n@^4.0.0: + version "4.0.3" + resolved "https://registry.yarnpkg.com/y18n/-/y18n-4.0.3.tgz#b5f259c82cd6e336921efd7bfd8bf560de9eeedf" + integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ== + y18n@^5.0.5: version "5.0.8" resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" @@ -14199,6 +16054,14 @@ yargs-parser@21.1.1, yargs-parser@^21.0.1, yargs-parser@^21.1.1: resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== +yargs-parser@^15.0.1: + version "15.0.3" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-15.0.3.tgz#316e263d5febe8b38eef61ac092b33dfcc9b1115" + integrity sha512-/MVEVjTXy/cGAjdtQf8dW3V9b97bPN7rNn8ETj6BmAQL7ibC7O1Q9SPJbGjgh3SlwoBNXMzj/ZGIj8mBgl12YA== + dependencies: + camelcase "^5.0.0" + decamelize "^1.2.0" + yargs-parser@^20.2.2, yargs-parser@^20.2.3, yargs-parser@^20.2.9: version "20.2.9" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee" @@ -14217,6 +16080,23 @@ yargs@16.2.0, yargs@^16.2.0: y18n "^5.0.5" yargs-parser "^20.2.2" +yargs@^14.2: + version "14.2.3" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-14.2.3.tgz#1a1c3edced1afb2a2fea33604bc6d1d8d688a414" + integrity sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg== + dependencies: + cliui "^5.0.0" + decamelize "^1.2.0" + find-up "^3.0.0" + get-caller-file "^2.0.1" + require-directory "^2.1.1" + require-main-filename "^2.0.0" + set-blocking "^2.0.0" + string-width "^3.0.0" + which-module "^2.0.0" + y18n "^4.0.0" + yargs-parser "^15.0.1" + yargs@^17.3.1, yargs@^17.6.0, yargs@^17.6.2, yargs@^17.7.1: version "17.7.1" resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.1.tgz#34a77645201d1a8fc5213ace787c220eabbd0967"