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="<div> "html""$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 (
+
+ );
+}
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 (
+
+ );
+}
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:
+
+ Run
+
+
+ {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 (
+
+ );
+}
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 (
+ (
+
+ )}
+ renderContent={({ onClose }) => (
+
+
+ {options.map((option) => {
+ const isSelected =
+ option.value === selectedOption?.value;
+ return (
+ {
+ onChange(option.value);
+ onClose();
+ }}
+ children={option.label}
+ />
+ );
+ })}
+
+
+ )}
+ {...props}
+ />
+ );
+};
+
+export default ToolbarDropdown;
diff --git a/packages/interactive-code-block/src/lib/hooks/use-has-transition-class-name.tsx b/packages/interactive-code-block/src/lib/hooks/use-has-transition-class-name.tsx
new file mode 100644
index 0000000000..8da2baed21
--- /dev/null
+++ b/packages/interactive-code-block/src/lib/hooks/use-has-transition-class-name.tsx
@@ -0,0 +1,28 @@
+import { useEffect, useState } from 'react';
+import { useRef } from 'react';
+
+export function useHasTransitionClassName(
+ isActive: boolean,
+ minActiveDuration: number
+) {
+ const [hasClass, setHasClass] = useState(isActive);
+ const lastUpdate = useRef(Date.now());
+ useEffect(() => {
+ if (isActive) {
+ lastUpdate.current = Date.now();
+ setHasClass(true);
+ }
+
+ const remainingTime = Math.max(
+ 0,
+ lastUpdate.current + minActiveDuration - Date.now()
+ );
+ const timeout = setTimeout(() => {
+ lastUpdate.current = Date.now();
+ setHasClass(false);
+ }, remainingTime);
+ return () => clearTimeout(timeout);
+ }, [isActive]);
+
+ return hasClass;
+}
diff --git a/packages/interactive-code-block/src/lib/hooks/use-libraries.tsx b/packages/interactive-code-block/src/lib/hooks/use-libraries.tsx
new file mode 100644
index 0000000000..3678b90b3c
--- /dev/null
+++ b/packages/interactive-code-block/src/lib/hooks/use-libraries.tsx
@@ -0,0 +1,143 @@
+import * as React from 'react';
+import { useState, useEffect } from '@wordpress/element';
+import { cloneResponseMonitorProgress } from '@php-wasm/progress';
+import type { Library } from '../types';
+
+type LibraryCache = Record<
+ Library['id'],
+ {
+ progress: number;
+ name: string;
+ contents?: Uint8Array;
+ }
+>;
+
+class LibraryLoader extends EventTarget {
+ private cache: LibraryCache = {};
+
+ private async loadLibrary(library: Library) {
+ // Loading is already in progress
+ if (this.cache[library.id]) {
+ return;
+ }
+ this.cache[library.id] = {
+ progress: 0,
+ name: library.name,
+ };
+ const reportingResponse = cloneResponseMonitorProgress(
+ await fetch(library.url),
+ (e) => {
+ const { loaded, total } = e.detail;
+ this.setLibraryProgress(library.id, loaded / total);
+ }
+ );
+ const blob = await reportingResponse.blob();
+ this.cache[library.id].contents = new Uint8Array(
+ await blob.arrayBuffer()
+ );
+ this.dispatchEvent(
+ new CustomEvent('load', {
+ detail: {
+ libraryId: library.id,
+ },
+ })
+ );
+ }
+
+ private setLibraryProgress(libraryId: string, progress: number) {
+ this.cache[libraryId].progress = progress;
+ this.dispatchEvent(
+ new CustomEvent('progress', {
+ detail: {
+ libraryId,
+ progress,
+ },
+ })
+ );
+ }
+
+ getLoadingProgress(libraryIds: string | string[]) {
+ if (!Array.isArray(libraryIds)) {
+ libraryIds = [libraryIds];
+ }
+
+ if (libraryIds.length === 0) {
+ return undefined;
+ }
+
+ return (
+ (100 *
+ libraryIds.reduce(
+ (total, id) => total + this.cache[id]?.progress || 0,
+ 0
+ )) /
+ libraryIds.length
+ );
+ }
+
+ isLoaded(libraryIds: string | string[]) {
+ if (!Array.isArray(libraryIds)) {
+ libraryIds = [libraryIds];
+ }
+
+ return libraryIds.every((id) => this.cache[id]?.contents);
+ }
+
+ getLibraryContents(libraryId: string): Uint8Array | undefined {
+ return this.cache[libraryId]?.contents;
+ }
+
+ getLibrariesContents(libraryIds: string[]): Record {
+ return Object.fromEntries(
+ libraryIds
+ .map((id) => [this.cache[id].name, this.getLibraryContents(id)])
+ .filter(([, contents]) => contents)
+ );
+ }
+
+ async load(libraries: Library[]) {
+ libraries.forEach((library) => this.loadLibrary(library));
+ }
+}
+
+const loader = new LibraryLoader();
+export interface UseLibrariesResult {
+ status: 'ready' | 'loading';
+ progress?: number;
+ loaded: Record;
+}
+
+export function useLibraries(libraries: Library[]): UseLibrariesResult {
+ const ids = libraries.map(({ id }) => id);
+ const isLoaded = loader.isLoaded(ids);
+ const [loadedLibraries, setLoadedLibraries] = useState<
+ Record
+ >(() => (isLoaded ? loader.getLibrariesContents(ids) : {}));
+
+ // Load libraries
+ useEffect(() => {
+ if (loader.isLoaded(ids)) {
+ setLoadedLibraries(loader.getLibrariesContents(ids));
+ return;
+ }
+
+ loader.load(libraries);
+
+ function onLoad() {
+ if (loader.isLoaded(ids)) {
+ setLoadedLibraries(loader.getLibrariesContents(ids));
+ }
+ }
+
+ loader.addEventListener('load', onLoad);
+ return () => {
+ loader.removeEventListener('load', onLoad);
+ };
+ }, [libraries]);
+
+ return {
+ status: isLoaded ? 'ready' : 'loading',
+ progress: loader.getLoadingProgress(ids),
+ loaded: loadedLibraries,
+ };
+}
diff --git a/packages/interactive-code-block/src/lib/hooks/use-on-escape-key.tsx b/packages/interactive-code-block/src/lib/hooks/use-on-escape-key.tsx
new file mode 100644
index 0000000000..bd0e376c12
--- /dev/null
+++ b/packages/interactive-code-block/src/lib/hooks/use-on-escape-key.tsx
@@ -0,0 +1,16 @@
+import { useEffect } from '@wordpress/element';
+
+export const useOnEscapeKey = (callback) => {
+ const handleKeyDown = (event) => {
+ if (event.key === 'Escape') {
+ callback();
+ }
+ };
+
+ useEffect(() => {
+ document.addEventListener('keydown', handleKeyDown);
+ return () => {
+ document.removeEventListener('keydown', handleKeyDown);
+ };
+ }, [callback]);
+};
diff --git a/packages/interactive-code-block/src/lib/hooks/use-promise.ts b/packages/interactive-code-block/src/lib/hooks/use-promise.ts
new file mode 100644
index 0000000000..746bf23067
--- /dev/null
+++ b/packages/interactive-code-block/src/lib/hooks/use-promise.ts
@@ -0,0 +1,9 @@
+import { useEffect, useState } from '@wordpress/element';
+
+export function usePromise(promise: Promise) {
+ const [isResolved, setIsResolved] = useState(false);
+ useEffect(() => {
+ promise.then(() => setIsResolved(true));
+ }, [promise]);
+ return isResolved;
+}
diff --git a/packages/interactive-code-block/src/lib/pages/entities.tsx b/packages/interactive-code-block/src/lib/pages/entities.tsx
new file mode 100644
index 0000000000..a112bd1002
--- /dev/null
+++ b/packages/interactive-code-block/src/lib/pages/entities.tsx
@@ -0,0 +1,26 @@
+import { dispatch } from '@wordpress/data';
+import { store as coreStore } from '@wordpress/core-data';
+import { ExecutionScript, Library } from '../types';
+
+export function installEntities() {
+ (dispatch(coreStore) as any).addEntities([
+ {
+ kind: 'interactive-code-block',
+ name: 'library',
+ baseURL: `/interactive-code-block/v1/libraries`,
+ baseURLParams: { context: 'edit' },
+ label: 'PHP Library',
+ plural: 'PHP Libraries',
+ getTitle: (record: Library) => record.name,
+ },
+ {
+ kind: 'interactive-code-block',
+ name: 'script',
+ baseURL: `/interactive-code-block/v1/execution-scripts`,
+ baseURLParams: { context: 'edit' },
+ label: 'Execution script',
+ plural: 'Execution scripts',
+ getTitle: (record: ExecutionScript) => record.name,
+ },
+ ]);
+}
diff --git a/packages/interactive-code-block/src/lib/pages/execution-scripts-forms.tsx b/packages/interactive-code-block/src/lib/pages/execution-scripts-forms.tsx
new file mode 100644
index 0000000000..a6af44cdf9
--- /dev/null
+++ b/packages/interactive-code-block/src/lib/pages/execution-scripts-forms.tsx
@@ -0,0 +1,329 @@
+import * as React from '@wordpress/element';
+import {
+ Button,
+ BaseControl,
+ TextControl,
+ SelectControl,
+ Modal,
+ Flex,
+ FlexItem,
+} from '@wordpress/components';
+import { useState, useRef, useMemo } from '@wordpress/element';
+import { useSelect, useDispatch } from '@wordpress/data';
+import { store as coreDataStore } from '@wordpress/core-data';
+import { store as noticesStore } from '@wordpress/notices';
+import { ToggleControl } from '@wordpress/components';
+
+import CodeMirror from '../components/code-mirror';
+import LibrariesControl from '../components/libraries-control';
+import { ExecutionScript, outputFormats } from '../types';
+import {
+ isDefaultScriptId,
+ getDefaultExecutionScript,
+ SUPPORTED_RUNNERS,
+} from '../components/code-runner';
+import PHPRunner from '../components/php-runner';
+
+export function CreateScriptButton() {
+ const [isOpen, setOpen] = useState(false);
+ const openModal = () => setOpen(true);
+ const closeModal = () => setOpen(false);
+ return (
+ <>
+
+ + Add Script
+
+ {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 (
+ <>
+
+ {isDefaultScriptId(id) ? 'View' : 'Edit'}
+
+ {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 (
+
+ );
+}
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) && (
+
+ {__('Delete')}
+
+ )}
+
+
+ );
+};
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.
+
+
+
+
+
+
+ Upload a library
+
+
+
+
+ );
+}
+
+// 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}
+
+
+
+ {__('Delete')}
+
+
+
+ );
+};
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"