From 25d0595975e5dd498f2615880d815a7fb7f80777 Mon Sep 17 00:00:00 2001 From: ahabhgk Date: Thu, 21 Sep 2023 16:08:27 +0800 Subject: [PATCH 1/3] update --- Cargo.lock | 11 ++++ crates/rspack_binding_options/Cargo.toml | 1 + .../src/options/raw_module/mod.rs | 6 ++ crates/rspack_loader_react_refresh/Cargo.toml | 14 +++++ crates/rspack_loader_react_refresh/LICENSE | 22 +++++++ crates/rspack_loader_react_refresh/src/lib.rs | 51 +++++++++++++++ examples/react-refresh/package.json | 10 ++- examples/react-refresh/rspack.config.js | 55 +++++++++++++--- .../index.test.ts | 59 ++++++++++++++++++ .../rspack.config.js | 57 +++++++++++++++++ .../src/App.jsx | 30 +++++++++ .../src/CountProvider.jsx | 19 ++++++ .../src/LazyComponent.css | 0 .../src/LazyComponent.jsx | 7 +++ .../src/ReactRefreshFinder.jsx | 10 +++ .../src/SameExportName1.jsx | 3 + .../src/SameExportName2.jsx | 3 + .../src/index.css | 3 + .../src/index.html | 12 ++++ .../src/index.jsx | 11 ++++ .../index.test.ts | 24 +++++++ .../rspack.config.js | 54 ++++++++++++++++ .../src/App.jsx | 18 ++++++ .../src/index.html | 12 ++++ .../src/index.jsx | 6 ++ .../index.test.ts | 32 ++++++++++ .../rspack.config.js | 62 +++++++++++++++++++ .../src/App.css | 10 +++ .../src/App.jsx | 12 ++++ .../src/index.html | 12 ++++ .../src/main.jsx | 5 ++ .../tailwind.config.js | 9 +++ .../index.test.ts | 13 ++++ .../rspack.config.js | 54 ++++++++++++++++ .../src/App.jsx | 21 +++++++ .../src/Button.jsx | 15 +++++ .../src/index.html | 12 ++++ .../src/index.jsx | 6 ++ .../src/worker.js | 6 ++ .../rspack-plugin-react-refresh/src/index.js | 7 ++- pnpm-lock.yaml | 8 ++- 41 files changed, 764 insertions(+), 18 deletions(-) create mode 100644 crates/rspack_loader_react_refresh/Cargo.toml create mode 100644 crates/rspack_loader_react_refresh/LICENSE create mode 100644 crates/rspack_loader_react_refresh/src/lib.rs create mode 100644 packages/playground/cases/react/basic-disableTransformByDefault/index.test.ts create mode 100644 packages/playground/cases/react/basic-disableTransformByDefault/rspack.config.js create mode 100644 packages/playground/cases/react/basic-disableTransformByDefault/src/App.jsx create mode 100644 packages/playground/cases/react/basic-disableTransformByDefault/src/CountProvider.jsx create mode 100644 packages/playground/cases/react/basic-disableTransformByDefault/src/LazyComponent.css create mode 100644 packages/playground/cases/react/basic-disableTransformByDefault/src/LazyComponent.jsx create mode 100644 packages/playground/cases/react/basic-disableTransformByDefault/src/ReactRefreshFinder.jsx create mode 100644 packages/playground/cases/react/basic-disableTransformByDefault/src/SameExportName1.jsx create mode 100644 packages/playground/cases/react/basic-disableTransformByDefault/src/SameExportName2.jsx create mode 100644 packages/playground/cases/react/basic-disableTransformByDefault/src/index.css create mode 100644 packages/playground/cases/react/basic-disableTransformByDefault/src/index.html create mode 100644 packages/playground/cases/react/basic-disableTransformByDefault/src/index.jsx create mode 100644 packages/playground/cases/react/class-component-disableTransformByDefault/index.test.ts create mode 100644 packages/playground/cases/react/class-component-disableTransformByDefault/rspack.config.js create mode 100644 packages/playground/cases/react/class-component-disableTransformByDefault/src/App.jsx create mode 100644 packages/playground/cases/react/class-component-disableTransformByDefault/src/index.html create mode 100644 packages/playground/cases/react/class-component-disableTransformByDefault/src/index.jsx create mode 100644 packages/playground/cases/react/tailwindcss-disableTransformByDefault/index.test.ts create mode 100644 packages/playground/cases/react/tailwindcss-disableTransformByDefault/rspack.config.js create mode 100644 packages/playground/cases/react/tailwindcss-disableTransformByDefault/src/App.css create mode 100644 packages/playground/cases/react/tailwindcss-disableTransformByDefault/src/App.jsx create mode 100644 packages/playground/cases/react/tailwindcss-disableTransformByDefault/src/index.html create mode 100644 packages/playground/cases/react/tailwindcss-disableTransformByDefault/src/main.jsx create mode 100644 packages/playground/cases/react/tailwindcss-disableTransformByDefault/tailwind.config.js create mode 100644 packages/playground/cases/react/worker-disableTransformByDefault/index.test.ts create mode 100644 packages/playground/cases/react/worker-disableTransformByDefault/rspack.config.js create mode 100644 packages/playground/cases/react/worker-disableTransformByDefault/src/App.jsx create mode 100644 packages/playground/cases/react/worker-disableTransformByDefault/src/Button.jsx create mode 100644 packages/playground/cases/react/worker-disableTransformByDefault/src/index.html create mode 100644 packages/playground/cases/react/worker-disableTransformByDefault/src/index.jsx create mode 100644 packages/playground/cases/react/worker-disableTransformByDefault/src/worker.js diff --git a/Cargo.lock b/Cargo.lock index d7936e2a3bb..72e5aa40d80 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2392,6 +2392,7 @@ dependencies = [ "rspack_error", "rspack_identifier", "rspack_ids", + "rspack_loader_react_refresh", "rspack_loader_runner", "rspack_loader_sass", "rspack_loader_swc", @@ -2576,6 +2577,16 @@ dependencies = [ "rustc-hash", ] +[[package]] +name = "rspack_loader_react_refresh" +version = "0.1.0" +dependencies = [ + "async-trait", + "rspack_core", + "rspack_error", + "rspack_loader_runner", +] + [[package]] name = "rspack_loader_runner" version = "0.1.0" diff --git a/crates/rspack_binding_options/Cargo.toml b/crates/rspack_binding_options/Cargo.toml index 9c9bd76b1a1..ce947b8f301 100644 --- a/crates/rspack_binding_options/Cargo.toml +++ b/crates/rspack_binding_options/Cargo.toml @@ -11,6 +11,7 @@ rspack_core = { path = "../rspack_core" } rspack_error = { path = "../rspack_error" } rspack_identifier = { path = "../rspack_identifier" } rspack_ids = { path = "../rspack_ids" } +rspack_loader_react_refresh = { path = "../rspack_loader_react_refresh" } rspack_loader_runner = { path = "../rspack_loader_runner" } rspack_loader_sass = { path = "../rspack_loader_sass" } rspack_loader_swc = { path = "../rspack_loader_swc" } diff --git a/crates/rspack_binding_options/src/options/raw_module/mod.rs b/crates/rspack_binding_options/src/options/raw_module/mod.rs index 60024b410ad..1cca38eb209 100644 --- a/crates/rspack_binding_options/src/options/raw_module/mod.rs +++ b/crates/rspack_binding_options/src/options/raw_module/mod.rs @@ -15,6 +15,7 @@ use rspack_core::{ ModuleRuleUseLoader, ModuleType, ParserOptions, ParserOptionsByModuleType, }; use rspack_error::internal_error; +use rspack_loader_react_refresh::REACT_REFRESH_LOADER_IDENTIFIER; use rspack_loader_sass::SASS_LOADER_IDENTIFIER; use rspack_loader_swc::SWC_LOADER_IDENTIFIER; use serde::Deserialize; @@ -44,6 +45,11 @@ pub fn get_builtin_loader(builtin: &str, options: Option<&str>) -> BoxLoader { .with_identifier(builtin.into()), ); } + if builtin.starts_with(REACT_REFRESH_LOADER_IDENTIFIER) { + return Arc::new( + rspack_loader_react_refresh::ReactRefreshLoader::new().with_identifier(builtin.into()), + ); + } unreachable!("Unexpected builtin loader: {builtin}") } diff --git a/crates/rspack_loader_react_refresh/Cargo.toml b/crates/rspack_loader_react_refresh/Cargo.toml new file mode 100644 index 00000000000..c5776208b2a --- /dev/null +++ b/crates/rspack_loader_react_refresh/Cargo.toml @@ -0,0 +1,14 @@ +[package] +edition = "2021" +license = "MIT" +name = "rspack_loader_react_refresh" +repository = "https://github.com/web-infra-dev/rspack" +version = "0.1.0" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +async-trait = { workspace = true } +rspack_core = { path = "../rspack_core" } +rspack_error = { path = "../rspack_error" } +rspack_loader_runner = { path = "../rspack_loader_runner" } diff --git a/crates/rspack_loader_react_refresh/LICENSE b/crates/rspack_loader_react_refresh/LICENSE new file mode 100644 index 00000000000..46310101ad8 --- /dev/null +++ b/crates/rspack_loader_react_refresh/LICENSE @@ -0,0 +1,22 @@ +MIT License + +Copyright (c) 2022-present Bytedance, Inc. and its affiliates. + + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/crates/rspack_loader_react_refresh/src/lib.rs b/crates/rspack_loader_react_refresh/src/lib.rs new file mode 100644 index 00000000000..df3d6163edc --- /dev/null +++ b/crates/rspack_loader_react_refresh/src/lib.rs @@ -0,0 +1,51 @@ +use rspack_core::LoaderRunnerContext; +use rspack_error::{internal_error, Result}; +use rspack_loader_runner::{Identifiable, Identifier, Loader, LoaderContext}; + +pub struct ReactRefreshLoader { + identifier: Identifier, +} + +impl ReactRefreshLoader { + pub fn new() -> Self { + Self { + identifier: REACT_REFRESH_LOADER_IDENTIFIER.into(), + } + } + + /// Panics: + /// Panics if `identifier` passed in is not starting with `builtin:react-refresh-loader`. + pub fn with_identifier(mut self, identifier: Identifier) -> Self { + assert!(identifier.starts_with(REACT_REFRESH_LOADER_IDENTIFIER)); + self.identifier = identifier; + self + } +} + +#[async_trait::async_trait] +impl Loader for ReactRefreshLoader { + async fn run(&self, loader_context: &mut LoaderContext<'_, LoaderRunnerContext>) -> Result<()> { + let Some(content) = std::mem::take(&mut loader_context.content) else { + return Err(internal_error!("Content should be available")) + }; + let mut source = content.try_into_string()?; + source += r#" +function $RefreshReg$(type, id) { + $ReactRefreshRuntime$.register(type, __webpack_module__.id + "_" + id); +} +Promise.resolve().then(function() { + $ReactRefreshRuntime$.refresh(__webpack_module__.id, __webpack_module__.hot); +}); +"#; + loader_context.content = Some(source.into()); + Ok(()) + } +} + +pub const REACT_REFRESH_LOADER_IDENTIFIER: &str = "builtin:react-refresh-loader"; + +impl Identifiable for ReactRefreshLoader { + fn identifier(&self) -> Identifier { + self.identifier + } +} diff --git a/examples/react-refresh/package.json b/examples/react-refresh/package.json index a34b24734f6..ad6729b1d9d 100644 --- a/examples/react-refresh/package.json +++ b/examples/react-refresh/package.json @@ -6,15 +6,19 @@ "private": true, "scripts": { "dev": "rspack serve ", - "build": "rspack build" + "build": "cross-env NODE_ENV=production rspack build" }, "keywords": [], "author": "", "license": "MIT", "dependencies": { - "@rspack/cli": "workspace:*", "react": "18.0.0", - "react-dom": "18.0.0", + "react-dom": "18.0.0" + }, + "devDependencies": { + "@rspack/cli": "workspace:*", + "@rspack/core": "workspace:*", + "@rspack/plugin-react-refresh": "workspace:*", "react-refresh": "0.13.0" } } \ No newline at end of file diff --git a/examples/react-refresh/rspack.config.js b/examples/react-refresh/rspack.config.js index cc6fb651af4..5e798e18184 100644 --- a/examples/react-refresh/rspack.config.js +++ b/examples/react-refresh/rspack.config.js @@ -1,14 +1,49 @@ -/** - * @type {import('@rspack/cli').Configuration} - */ +const rspack = require("@rspack/core") +const ReactRefreshPlugin = require("@rspack/plugin-react-refresh") + +const isProduction = process.env.NODE_ENV === "production" + +/** @type {import('@rspack/cli').Configuration} */ const config = { - mode: "development", - entry: { main: "./src/index.tsx" }, - builtins: { - html: [{ template: "./index.html" }], - define: { - "process.env.NODE_ENV": "'development'" + experiments: { + rspackFuture: { + disableTransformByDefault: true, } - } + }, + mode: isProduction ? "production" : "development", + entry: { main: "./src/index.tsx" }, + devtool: 'source-map', + module: { + rules: [ + { + test: /\.tsx$/, + use: { + loader: "builtin:swc-loader", + options: { + sourceMap: true, + jsc: { + parser: { + syntax: "typescript", + tsx: true + }, + transform: { + react: { + runtime: "automatic", + development: !isProduction, + refresh: !isProduction, + } + } + } + } + } + } + ] + }, + plugins: [ + new rspack.HtmlRspackPlugin({ template: "./index.html" }), + new rspack.DefinePlugin({ "process.env.NODE_ENV": "'development'" }), + !isProduction && new ReactRefreshPlugin(), + ].filter(Boolean) }; + module.exports = config; diff --git a/packages/playground/cases/react/basic-disableTransformByDefault/index.test.ts b/packages/playground/cases/react/basic-disableTransformByDefault/index.test.ts new file mode 100644 index 00000000000..33fefe02749 --- /dev/null +++ b/packages/playground/cases/react/basic-disableTransformByDefault/index.test.ts @@ -0,0 +1,59 @@ +import { test, expect } from "@/fixtures"; + +test("render should work", async ({ page }) => { + expect(await page.textContent(".header")).toBe("Hello World"); + expect(await page.textContent("#lazy-component")).toBe("Lazy Component"); +}); + +test("hmr should work", async ({ page, fileAction, rspack }) => { + expect(await page.textContent("button")).toBe("10"); + await page.click("button"); + expect(await page.textContent("button")).toBe("11"); + expect(await page.textContent(".placeholder")).toBe("__PLACE_HOLDER__"); + fileAction.updateFile("src/App.jsx", content => + content.replace("__PLACE_HOLDER__", "__EDITED__") + ); + await rspack.waitingForHmr(async function () { + return (await page.textContent(".placeholder")) === "__EDITED__"; + }); + expect(await page.textContent("button")).toBe("11"); +}); + +test("context+component should work", async ({ page, fileAction, rspack }) => { + expect(await page.textContent("#context")).toBe("context-value"); + await page.click("#context"); + expect(await page.textContent("#context")).toBe("context-value-click"); + fileAction.updateFile("src/CountProvider.jsx", content => + content.replace("context-value", "context-value-update") + ); + await rspack.waitingForHmr(async function () { + return (await page.textContent("#context")) === "context-value-update"; + }); +}); + +test("ReactRefreshFinder should work", async ({ page }) => { + expect(await page.textContent("#nest-function")).toBe("nest-function"); +}); + +test("update same export name from different module should work", async ({ + page, + fileAction, + rspack +}) => { + expect(await page.textContent(".same-export-name1")).toBe("__NAME_1__"); + expect(await page.textContent(".same-export-name2")).toBe("__NAME_2__"); + fileAction.updateFile("src/SameExportName1.jsx", content => + content.replace("__NAME_1__", "__name_1__") + ); + await rspack.waitingForHmr(async function () { + return (await page.textContent(".same-export-name1")) === "__name_1__"; + }); + expect(await page.textContent(".same-export-name2")).toBe("__NAME_2__"); + fileAction.updateFile("src/SameExportName2.jsx", content => + content.replace("__NAME_2__", "__name_2__") + ); + await rspack.waitingForHmr(async function () { + return (await page.textContent(".same-export-name2")) === "__name_2__"; + }); + expect(await page.textContent(".same-export-name1")).toBe("__name_1__"); +}); diff --git a/packages/playground/cases/react/basic-disableTransformByDefault/rspack.config.js b/packages/playground/cases/react/basic-disableTransformByDefault/rspack.config.js new file mode 100644 index 00000000000..7d9545fcbe8 --- /dev/null +++ b/packages/playground/cases/react/basic-disableTransformByDefault/rspack.config.js @@ -0,0 +1,57 @@ +const rspack = require("@rspack/core"); +const ReactRefreshPlugin = require("@rspack/plugin-react-refresh"); + +/** @type { import('@rspack/core').RspackOptions } */ +module.exports = { + experiments: { + rspackFuture: { + disableTransformByDefault: true + } + }, + context: __dirname, + mode: "development", + module: { + rules: [ + { + test: /\.jsx$/, + use: { + loader: "builtin:swc-loader", + options: { + jsc: { + parser: { + syntax: "ecmascript", + jsx: true + }, + transform: { + react: { + runtime: "automatic", + development: true, + refresh: true + } + } + } + } + } + } + ] + }, + plugins: [ + new rspack.HtmlRspackPlugin({ template: "./src/index.html" }), + new ReactRefreshPlugin() + ], + entry: "./src/index.jsx", + devServer: { + hot: true, + devMiddleware: { + writeToDisk: true + } + }, + cache: false, + stats: "none", + infrastructureLogging: { + debug: false + }, + watchOptions: { + poll: 1000 + } +}; diff --git a/packages/playground/cases/react/basic-disableTransformByDefault/src/App.jsx b/packages/playground/cases/react/basic-disableTransformByDefault/src/App.jsx new file mode 100644 index 00000000000..a72ff3a972a --- /dev/null +++ b/packages/playground/cases/react/basic-disableTransformByDefault/src/App.jsx @@ -0,0 +1,30 @@ +import React from 'react' +import './index.css' +import { ContextComponent } from './CountProvider' +import { ReactRefreshFinder } from './ReactRefreshFinder' +import { SameExportName as SameExportName1 } from './SameExportName1' +import { SameExportName as SameExportName2 } from './SameExportName2' + +const Button = () => { + const [count, setCount] = React.useState(10) + return +} + +const LazyComponent = React.lazy(() => import('./LazyComponent')) + +export const App = () => { + return ( +
+
Hello World
+
}> + + + + ) +} diff --git a/packages/playground/cases/react/basic-disableTransformByDefault/src/CountProvider.jsx b/packages/playground/cases/react/basic-disableTransformByDefault/src/CountProvider.jsx new file mode 100644 index 00000000000..afbe1fcbe34 --- /dev/null +++ b/packages/playground/cases/react/basic-disableTransformByDefault/src/CountProvider.jsx @@ -0,0 +1,19 @@ +import React from 'react'; + +export const CountContext = React.createContext(); + +export function CountProvider({ children }) { + const [count, setCount] = React.useState('context-value'); + return ( + + {children} + + ); +} + +export function ContextComponent() { + const { count, setCount } = React.useContext(CountContext); + return
setCount((count) => count + '-click')}> + {count} +
+} \ No newline at end of file diff --git a/packages/playground/cases/react/basic-disableTransformByDefault/src/LazyComponent.css b/packages/playground/cases/react/basic-disableTransformByDefault/src/LazyComponent.css new file mode 100644 index 00000000000..e69de29bb2d diff --git a/packages/playground/cases/react/basic-disableTransformByDefault/src/LazyComponent.jsx b/packages/playground/cases/react/basic-disableTransformByDefault/src/LazyComponent.jsx new file mode 100644 index 00000000000..65545394690 --- /dev/null +++ b/packages/playground/cases/react/basic-disableTransformByDefault/src/LazyComponent.jsx @@ -0,0 +1,7 @@ +import './LazyComponent.css' + +function LazyComponent () { + return
Lazy Component
+} + +export default LazyComponent diff --git a/packages/playground/cases/react/basic-disableTransformByDefault/src/ReactRefreshFinder.jsx b/packages/playground/cases/react/basic-disableTransformByDefault/src/ReactRefreshFinder.jsx new file mode 100644 index 00000000000..83b0509d747 --- /dev/null +++ b/packages/playground/cases/react/basic-disableTransformByDefault/src/ReactRefreshFinder.jsx @@ -0,0 +1,10 @@ +import React, { useState } from 'react'; + +function CreateReactRefreshFinder() { + return function Component() { + useState(1); + return
nest-function
; + }; +} + +export const ReactRefreshFinder = CreateReactRefreshFinder() \ No newline at end of file diff --git a/packages/playground/cases/react/basic-disableTransformByDefault/src/SameExportName1.jsx b/packages/playground/cases/react/basic-disableTransformByDefault/src/SameExportName1.jsx new file mode 100644 index 00000000000..2a7f2b45f15 --- /dev/null +++ b/packages/playground/cases/react/basic-disableTransformByDefault/src/SameExportName1.jsx @@ -0,0 +1,3 @@ +export function SameExportName() { + return
__NAME_1__
+} diff --git a/packages/playground/cases/react/basic-disableTransformByDefault/src/SameExportName2.jsx b/packages/playground/cases/react/basic-disableTransformByDefault/src/SameExportName2.jsx new file mode 100644 index 00000000000..8bf62ab6bb5 --- /dev/null +++ b/packages/playground/cases/react/basic-disableTransformByDefault/src/SameExportName2.jsx @@ -0,0 +1,3 @@ +export function SameExportName() { + return
__NAME_2__
+} diff --git a/packages/playground/cases/react/basic-disableTransformByDefault/src/index.css b/packages/playground/cases/react/basic-disableTransformByDefault/src/index.css new file mode 100644 index 00000000000..753f48a591f --- /dev/null +++ b/packages/playground/cases/react/basic-disableTransformByDefault/src/index.css @@ -0,0 +1,3 @@ +body { + background-color: rgba(0, 0, 0, 0); +} diff --git a/packages/playground/cases/react/basic-disableTransformByDefault/src/index.html b/packages/playground/cases/react/basic-disableTransformByDefault/src/index.html new file mode 100644 index 00000000000..127a457455b --- /dev/null +++ b/packages/playground/cases/react/basic-disableTransformByDefault/src/index.html @@ -0,0 +1,12 @@ + + + + + + + Document + + +
+ + diff --git a/packages/playground/cases/react/basic-disableTransformByDefault/src/index.jsx b/packages/playground/cases/react/basic-disableTransformByDefault/src/index.jsx new file mode 100644 index 00000000000..52e72c3334e --- /dev/null +++ b/packages/playground/cases/react/basic-disableTransformByDefault/src/index.jsx @@ -0,0 +1,11 @@ +import React from "react"; +import { createRoot } from "react-dom/client"; +import { App } from './App'; +import { CountProvider } from "./CountProvider"; + +const container = createRoot(document.getElementById("root")); +container.render( + + + +); diff --git a/packages/playground/cases/react/class-component-disableTransformByDefault/index.test.ts b/packages/playground/cases/react/class-component-disableTransformByDefault/index.test.ts new file mode 100644 index 00000000000..b1c3c5f0a17 --- /dev/null +++ b/packages/playground/cases/react/class-component-disableTransformByDefault/index.test.ts @@ -0,0 +1,24 @@ +import { test, expect } from "@/fixtures"; + +test("render should work", async ({ page }) => { + expect(await page.textContent(".header")).toBe("Hello World"); +}); + +test("class component hmr should work", async ({ + page, + fileAction, + rspack +}) => { + expect(await page.textContent("button")).toBe("10"); + await page.click("button"); + expect(await page.textContent("button")).toBe("11"); + expect(await page.textContent(".placeholder")).toBe("__PLACE_HOLDER__"); + fileAction.updateFile("src/App.jsx", content => + content.replace("__PLACE_HOLDER__", "__EDITED__") + ); + await rspack.waitingForHmr(async function () { + return (await page.textContent(".placeholder")) === "__EDITED__"; + }); + // class component will not keep local status + expect(await page.textContent("button")).toBe("10"); +}); diff --git a/packages/playground/cases/react/class-component-disableTransformByDefault/rspack.config.js b/packages/playground/cases/react/class-component-disableTransformByDefault/rspack.config.js new file mode 100644 index 00000000000..b3cc8c5472d --- /dev/null +++ b/packages/playground/cases/react/class-component-disableTransformByDefault/rspack.config.js @@ -0,0 +1,54 @@ +const rspack = require("@rspack/core"); +const ReactRefreshPlugin = require("@rspack/plugin-react-refresh"); + +/** @type { import('@rspack/core').RspackOptions } */ +module.exports = { + experiments: { + rspackFuture: { + disableTransformByDefault: true + } + }, + context: __dirname, + mode: "development", + entry: "./src/index.jsx", + module: { + rules: [ + { + test: /\.jsx$/, + use: { + loader: "builtin:swc-loader", + options: { + jsc: { + parser: { + syntax: "ecmascript", + jsx: true + }, + transform: { + react: { + runtime: "automatic", + development: true, + refresh: true + } + } + } + } + } + } + ] + }, + plugins: [ + new rspack.HtmlRspackPlugin({ template: "./src/index.html" }), + new ReactRefreshPlugin() + ], + devServer: { + hot: true + }, + cache: false, + stats: "none", + infrastructureLogging: { + debug: false + }, + watchOptions: { + poll: 1000 + } +}; diff --git a/packages/playground/cases/react/class-component-disableTransformByDefault/src/App.jsx b/packages/playground/cases/react/class-component-disableTransformByDefault/src/App.jsx new file mode 100644 index 00000000000..dd95da73edd --- /dev/null +++ b/packages/playground/cases/react/class-component-disableTransformByDefault/src/App.jsx @@ -0,0 +1,18 @@ +import React from "react"; + +const Button = () => { + const [count, setCount] = React.useState(10); + return ; +}; + +export class App extends React.Component { + render() { + return ( +
+
Hello World
+
+ ); + } +} diff --git a/packages/playground/cases/react/class-component-disableTransformByDefault/src/index.html b/packages/playground/cases/react/class-component-disableTransformByDefault/src/index.html new file mode 100644 index 00000000000..127a457455b --- /dev/null +++ b/packages/playground/cases/react/class-component-disableTransformByDefault/src/index.html @@ -0,0 +1,12 @@ + + + + + + + Document + + +
+ + diff --git a/packages/playground/cases/react/class-component-disableTransformByDefault/src/index.jsx b/packages/playground/cases/react/class-component-disableTransformByDefault/src/index.jsx new file mode 100644 index 00000000000..18f79ce0697 --- /dev/null +++ b/packages/playground/cases/react/class-component-disableTransformByDefault/src/index.jsx @@ -0,0 +1,6 @@ +import React from 'react' +import { createRoot } from 'react-dom/client' +import { App } from './App' + +const container = createRoot(document.getElementById('root')) +container.render() diff --git a/packages/playground/cases/react/tailwindcss-disableTransformByDefault/index.test.ts b/packages/playground/cases/react/tailwindcss-disableTransformByDefault/index.test.ts new file mode 100644 index 00000000000..72eda5d7793 --- /dev/null +++ b/packages/playground/cases/react/tailwindcss-disableTransformByDefault/index.test.ts @@ -0,0 +1,32 @@ +import { test, expect } from "@/fixtures"; + +test("tailwindcss should work when modify js file", async ({ + page, + fileAction, + rspack +}) => { + function getAppFontSize() { + return page.evaluate(() => { + const app = document.querySelector("#app"); + if (!app) { + return ""; + } + return window.getComputedStyle(app).fontSize; + }); + } + + let appFontSize = await getAppFontSize(); + expect(appFontSize).toBe("24px"); + + // update + fileAction.updateFile("src/App.jsx", content => { + return content.replace("text-2xl", "text-3xl"); + }); + await rspack.waitingForHmr(async () => { + const classNames = await page.getAttribute("#app", "class"); + return classNames?.includes("text-3xl") || false; + }); + + appFontSize = await getAppFontSize(); + expect(appFontSize).toBe("30px"); +}); diff --git a/packages/playground/cases/react/tailwindcss-disableTransformByDefault/rspack.config.js b/packages/playground/cases/react/tailwindcss-disableTransformByDefault/rspack.config.js new file mode 100644 index 00000000000..2ea530d10ab --- /dev/null +++ b/packages/playground/cases/react/tailwindcss-disableTransformByDefault/rspack.config.js @@ -0,0 +1,62 @@ +const path = require("path"); +const rspack = require("@rspack/core"); +const ReactRefreshPlugin = require("@rspack/plugin-react-refresh"); + +module.exports = { + experiments: { + rspackFuture: { + disableTransformByDefault: true + } + }, + context: __dirname, + entry: { + main: "./src/main.jsx" + }, + plugins: [ + new rspack.HtmlRspackPlugin({ template: "./src/index.html" }), + new ReactRefreshPlugin() + ], + module: { + rules: [ + { + test: /\.jsx$/, + use: { + loader: "builtin:swc-loader", + options: { + jsc: { + parser: { + syntax: "ecmascript", + jsx: true + }, + transform: { + react: { + runtime: "automatic", + development: true, + refresh: true + } + } + } + } + } + }, + { + test: /\.css$/, + use: [ + { + loader: "postcss-loader", + options: { + postcssOptions: { + plugins: { + tailwindcss: { + config: path.join(__dirname, "./tailwind.config.js") + } + } + } + } + } + ], + type: "css" + } + ] + } +}; diff --git a/packages/playground/cases/react/tailwindcss-disableTransformByDefault/src/App.css b/packages/playground/cases/react/tailwindcss-disableTransformByDefault/src/App.css new file mode 100644 index 00000000000..6300d8a49d6 --- /dev/null +++ b/packages/playground/cases/react/tailwindcss-disableTransformByDefault/src/App.css @@ -0,0 +1,10 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +#root { + max-width: 1280px; + margin: 0 auto; + padding: 2rem; + text-align: center; +} diff --git a/packages/playground/cases/react/tailwindcss-disableTransformByDefault/src/App.jsx b/packages/playground/cases/react/tailwindcss-disableTransformByDefault/src/App.jsx new file mode 100644 index 00000000000..51826c77656 --- /dev/null +++ b/packages/playground/cases/react/tailwindcss-disableTransformByDefault/src/App.jsx @@ -0,0 +1,12 @@ +import React from "react"; +import "./App.css"; + +function App() { + return ( +

+ Hello world! +

+ ); +} + +export default App; diff --git a/packages/playground/cases/react/tailwindcss-disableTransformByDefault/src/index.html b/packages/playground/cases/react/tailwindcss-disableTransformByDefault/src/index.html new file mode 100644 index 00000000000..127a457455b --- /dev/null +++ b/packages/playground/cases/react/tailwindcss-disableTransformByDefault/src/index.html @@ -0,0 +1,12 @@ + + + + + + + Document + + +
+ + diff --git a/packages/playground/cases/react/tailwindcss-disableTransformByDefault/src/main.jsx b/packages/playground/cases/react/tailwindcss-disableTransformByDefault/src/main.jsx new file mode 100644 index 00000000000..d0d585c0881 --- /dev/null +++ b/packages/playground/cases/react/tailwindcss-disableTransformByDefault/src/main.jsx @@ -0,0 +1,5 @@ +import React from "react"; +import ReactDOM from "react-dom/client"; +import App from "./App"; + +ReactDOM.createRoot(document.getElementById("root")).render(); diff --git a/packages/playground/cases/react/tailwindcss-disableTransformByDefault/tailwind.config.js b/packages/playground/cases/react/tailwindcss-disableTransformByDefault/tailwind.config.js new file mode 100644 index 00000000000..c0d9e5130a2 --- /dev/null +++ b/packages/playground/cases/react/tailwindcss-disableTransformByDefault/tailwind.config.js @@ -0,0 +1,9 @@ +/** @type {import('tailwindcss').Config} */ +const path = require("path"); +module.exports = { + content: [path.join(__dirname, "./src/**/*.{html,js,jsx}")], + theme: { + extend: {} + }, + plugins: [] +}; diff --git a/packages/playground/cases/react/worker-disableTransformByDefault/index.test.ts b/packages/playground/cases/react/worker-disableTransformByDefault/index.test.ts new file mode 100644 index 00000000000..e5cf91b389c --- /dev/null +++ b/packages/playground/cases/react/worker-disableTransformByDefault/index.test.ts @@ -0,0 +1,13 @@ +import { test, expect } from "@/fixtures"; + +test("should successfully render the page", async ({ page }) => { + expect(await page.textContent("button")).toBe("+"); + expect(await page.textContent("h1")).toBe("0"); +}); + +// test("worker should work", async ({ page, fileAction, rspack }) => { +// await page.click("button"); +// expect(await page.textContent("h1")).toBe("1"); +// await page.click("button"); +// expect(await page.textContent("h1")).toBe("2"); +// }); diff --git a/packages/playground/cases/react/worker-disableTransformByDefault/rspack.config.js b/packages/playground/cases/react/worker-disableTransformByDefault/rspack.config.js new file mode 100644 index 00000000000..b3cc8c5472d --- /dev/null +++ b/packages/playground/cases/react/worker-disableTransformByDefault/rspack.config.js @@ -0,0 +1,54 @@ +const rspack = require("@rspack/core"); +const ReactRefreshPlugin = require("@rspack/plugin-react-refresh"); + +/** @type { import('@rspack/core').RspackOptions } */ +module.exports = { + experiments: { + rspackFuture: { + disableTransformByDefault: true + } + }, + context: __dirname, + mode: "development", + entry: "./src/index.jsx", + module: { + rules: [ + { + test: /\.jsx$/, + use: { + loader: "builtin:swc-loader", + options: { + jsc: { + parser: { + syntax: "ecmascript", + jsx: true + }, + transform: { + react: { + runtime: "automatic", + development: true, + refresh: true + } + } + } + } + } + } + ] + }, + plugins: [ + new rspack.HtmlRspackPlugin({ template: "./src/index.html" }), + new ReactRefreshPlugin() + ], + devServer: { + hot: true + }, + cache: false, + stats: "none", + infrastructureLogging: { + debug: false + }, + watchOptions: { + poll: 1000 + } +}; diff --git a/packages/playground/cases/react/worker-disableTransformByDefault/src/App.jsx b/packages/playground/cases/react/worker-disableTransformByDefault/src/App.jsx new file mode 100644 index 00000000000..9ccfd1f8ac4 --- /dev/null +++ b/packages/playground/cases/react/worker-disableTransformByDefault/src/App.jsx @@ -0,0 +1,21 @@ +import React, { useState } from "react"; +import Button from './Button' + +let updateRenderTimes; + +const worker = new Worker(new URL("./worker", import.meta.url)); + +worker.onmessage = (e) => { + updateRenderTimes(e.data) +} + +export const App = () => { + const [renderTimes, setRenderTimes] = useState(0) + updateRenderTimes = setRenderTimes; + return ( +
+

{renderTimes}

+
+ ); +}; diff --git a/packages/playground/cases/react/worker-disableTransformByDefault/src/Button.jsx b/packages/playground/cases/react/worker-disableTransformByDefault/src/Button.jsx new file mode 100644 index 00000000000..ddaa59b3bee --- /dev/null +++ b/packages/playground/cases/react/worker-disableTransformByDefault/src/Button.jsx @@ -0,0 +1,15 @@ +import React from "react"; + +export default function Button({ onClick }) { + return ; +}; + +Button.count = 0; + +Button.get = () => { + return Button.count; +} + +Button.add = () => { + Button.count += 1; +} diff --git a/packages/playground/cases/react/worker-disableTransformByDefault/src/index.html b/packages/playground/cases/react/worker-disableTransformByDefault/src/index.html new file mode 100644 index 00000000000..127a457455b --- /dev/null +++ b/packages/playground/cases/react/worker-disableTransformByDefault/src/index.html @@ -0,0 +1,12 @@ + + + + + + + Document + + +
+ + diff --git a/packages/playground/cases/react/worker-disableTransformByDefault/src/index.jsx b/packages/playground/cases/react/worker-disableTransformByDefault/src/index.jsx new file mode 100644 index 00000000000..032d1403b0c --- /dev/null +++ b/packages/playground/cases/react/worker-disableTransformByDefault/src/index.jsx @@ -0,0 +1,6 @@ +import React from "react"; +import { createRoot } from "react-dom/client"; +import { App } from './App'; + +const container = createRoot(document.getElementById("root")); +container.render(); diff --git a/packages/playground/cases/react/worker-disableTransformByDefault/src/worker.js b/packages/playground/cases/react/worker-disableTransformByDefault/src/worker.js new file mode 100644 index 00000000000..01baa84f07d --- /dev/null +++ b/packages/playground/cases/react/worker-disableTransformByDefault/src/worker.js @@ -0,0 +1,6 @@ +import Button from "./Button"; + +onmessage = e => { + Button.add(); + postMessage(Button.get()); +}; diff --git a/packages/rspack-plugin-react-refresh/src/index.js b/packages/rspack-plugin-react-refresh/src/index.js index 92b057de0ed..6f24531ebc7 100644 --- a/packages/rspack-plugin-react-refresh/src/index.js +++ b/packages/rspack-plugin-react-refresh/src/index.js @@ -27,9 +27,10 @@ module.exports = class ReactRefreshRspackPlugin { $ReactRefreshRuntime$: reactRefreshPath }).apply(compiler); - compiler.options.module.rules.push({ - include: runtimePaths, - type: "js" + compiler.options.module.rules.unshift({ + exclude: [/node_modules/i, ...runtimePaths], + include: /\.([cm]js|[jt]sx?|flow)$/i, + use: "builtin:react-refresh-loader" }); } }; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5da82ac5a37..a47a436cea1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -563,13 +563,18 @@ importers: examples/react-refresh: specifiers: '@rspack/cli': workspace:* + '@rspack/core': workspace:* + '@rspack/plugin-react-refresh': workspace:* react: 18.0.0 react-dom: 18.0.0 react-refresh: 0.13.0 dependencies: - '@rspack/cli': link:../../packages/rspack-cli react: 18.0.0 react-dom: 18.0.0_react@18.0.0 + devDependencies: + '@rspack/cli': link:../../packages/rspack-cli + '@rspack/core': link:../../packages/rspack + '@rspack/plugin-react-refresh': link:../../packages/rspack-plugin-react-refresh react-refresh: 0.13.0 examples/react-storybook: @@ -23468,7 +23473,6 @@ packages: /react-refresh/0.13.0: resolution: {integrity: sha512-XP8A9BT0CpRBD+NYLLeIhld/RqG9+gktUjW1FkE+Vm7OCinbG1SshcK5tb9ls4kzvjZr9mOQc7HYgBngEyPAXg==} engines: {node: '>=0.10.0'} - dev: false /react-refresh/0.14.0: resolution: {integrity: sha512-wViHqhAd8OHeLS/IRMJjTSDHF3U9eWi62F/MledQGPdJGDhodXJ9PBLNGr6WWL7qlH12Mt3TyTpbS+hGXMjCzQ==} From a4dda88ffe32dc1606f9d928bd56278b93f88f9a Mon Sep 17 00:00:00 2001 From: ahabhgk Date: Thu, 21 Sep 2023 16:23:28 +0800 Subject: [PATCH 2/3] lint --- crates/rspack_binding_options/src/options/raw_module/mod.rs | 2 +- crates/rspack_loader_react_refresh/src/lib.rs | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/crates/rspack_binding_options/src/options/raw_module/mod.rs b/crates/rspack_binding_options/src/options/raw_module/mod.rs index 1cca38eb209..4bb450a7127 100644 --- a/crates/rspack_binding_options/src/options/raw_module/mod.rs +++ b/crates/rspack_binding_options/src/options/raw_module/mod.rs @@ -47,7 +47,7 @@ pub fn get_builtin_loader(builtin: &str, options: Option<&str>) -> BoxLoader { } if builtin.starts_with(REACT_REFRESH_LOADER_IDENTIFIER) { return Arc::new( - rspack_loader_react_refresh::ReactRefreshLoader::new().with_identifier(builtin.into()), + rspack_loader_react_refresh::ReactRefreshLoader::default().with_identifier(builtin.into()), ); } diff --git a/crates/rspack_loader_react_refresh/src/lib.rs b/crates/rspack_loader_react_refresh/src/lib.rs index df3d6163edc..47997e7cf59 100644 --- a/crates/rspack_loader_react_refresh/src/lib.rs +++ b/crates/rspack_loader_react_refresh/src/lib.rs @@ -6,13 +6,15 @@ pub struct ReactRefreshLoader { identifier: Identifier, } -impl ReactRefreshLoader { - pub fn new() -> Self { +impl Default for ReactRefreshLoader { + fn default() -> Self { Self { identifier: REACT_REFRESH_LOADER_IDENTIFIER.into(), } } +} +impl ReactRefreshLoader { /// Panics: /// Panics if `identifier` passed in is not starting with `builtin:react-refresh-loader`. pub fn with_identifier(mut self, identifier: Identifier) -> Self { From c368920d23cacb633838b892022f1856aa215b19 Mon Sep 17 00:00:00 2001 From: ahabhgk Date: Thu, 21 Sep 2023 17:00:11 +0800 Subject: [PATCH 3/3] add test --- .../react-refresh-babel-loader/index.html | 15 + .../react-refresh-babel-loader/package.json | 28 + .../rspack.config.js | 40 ++ .../react-refresh-babel-loader/src/App.tsx | 25 + .../src/ArrowFunction.tsx | 1 + .../src/ClassDefault.tsx | 9 + .../src/ClassNamed.tsx | 7 + .../src/FunctionDefault.tsx | 5 + .../src/FunctionNamed.tsx | 13 + .../src/LazyComponent.tsx | 5 + .../react-refresh-babel-loader/src/index.tsx | 6 + .../rspack.config.js | 5 +- .../cases/react/with-babel/index.test.ts | 59 ++ .../cases/react/with-babel/rspack.config.js | 43 ++ .../cases/react/with-babel/src/App.jsx | 30 + .../react/with-babel/src/CountProvider.jsx | 19 + .../react/with-babel/src/LazyComponent.css | 0 .../react/with-babel/src/LazyComponent.jsx | 7 + .../with-babel/src/ReactRefreshFinder.jsx | 10 + .../react/with-babel/src/SameExportName1.jsx | 3 + .../react/with-babel/src/SameExportName2.jsx | 3 + .../cases/react/with-babel/src/index.css | 3 + .../cases/react/with-babel/src/index.html | 12 + .../cases/react/with-babel/src/index.jsx | 11 + packages/playground/package.json | 3 + pnpm-lock.yaml | 654 +++++++++++++++--- 26 files changed, 931 insertions(+), 85 deletions(-) create mode 100644 examples/react-refresh-babel-loader/index.html create mode 100644 examples/react-refresh-babel-loader/package.json create mode 100644 examples/react-refresh-babel-loader/rspack.config.js create mode 100644 examples/react-refresh-babel-loader/src/App.tsx create mode 100644 examples/react-refresh-babel-loader/src/ArrowFunction.tsx create mode 100644 examples/react-refresh-babel-loader/src/ClassDefault.tsx create mode 100644 examples/react-refresh-babel-loader/src/ClassNamed.tsx create mode 100644 examples/react-refresh-babel-loader/src/FunctionDefault.tsx create mode 100644 examples/react-refresh-babel-loader/src/FunctionNamed.tsx create mode 100644 examples/react-refresh-babel-loader/src/LazyComponent.tsx create mode 100644 examples/react-refresh-babel-loader/src/index.tsx create mode 100644 packages/playground/cases/react/with-babel/index.test.ts create mode 100644 packages/playground/cases/react/with-babel/rspack.config.js create mode 100644 packages/playground/cases/react/with-babel/src/App.jsx create mode 100644 packages/playground/cases/react/with-babel/src/CountProvider.jsx create mode 100644 packages/playground/cases/react/with-babel/src/LazyComponent.css create mode 100644 packages/playground/cases/react/with-babel/src/LazyComponent.jsx create mode 100644 packages/playground/cases/react/with-babel/src/ReactRefreshFinder.jsx create mode 100644 packages/playground/cases/react/with-babel/src/SameExportName1.jsx create mode 100644 packages/playground/cases/react/with-babel/src/SameExportName2.jsx create mode 100644 packages/playground/cases/react/with-babel/src/index.css create mode 100644 packages/playground/cases/react/with-babel/src/index.html create mode 100644 packages/playground/cases/react/with-babel/src/index.jsx diff --git a/examples/react-refresh-babel-loader/index.html b/examples/react-refresh-babel-loader/index.html new file mode 100644 index 00000000000..1fd94734cd0 --- /dev/null +++ b/examples/react-refresh-babel-loader/index.html @@ -0,0 +1,15 @@ + + + + + + + + Document + + + +
+ + + \ No newline at end of file diff --git a/examples/react-refresh-babel-loader/package.json b/examples/react-refresh-babel-loader/package.json new file mode 100644 index 00000000000..951f215ed36 --- /dev/null +++ b/examples/react-refresh-babel-loader/package.json @@ -0,0 +1,28 @@ +{ + "name": "example-rspack-react-refresh", + "version": "1.0.0", + "description": "", + "main": "index.js", + "private": true, + "scripts": { + "dev": "rspack serve ", + "build": "cross-env NODE_ENV=production rspack build" + }, + "keywords": [], + "author": "", + "license": "MIT", + "dependencies": { + "react": "18.0.0", + "react-dom": "18.0.0" + }, + "devDependencies": { + "@babel/core": "^7.22.20", + "@babel/preset-react": "^7.22.15", + "@babel/preset-typescript": "^7.22.5", + "@rspack/cli": "workspace:*", + "@rspack/core": "workspace:*", + "@rspack/plugin-react-refresh": "workspace:*", + "babel-loader": "^9.1.3", + "react-refresh": "0.13.0" + } +} \ No newline at end of file diff --git a/examples/react-refresh-babel-loader/rspack.config.js b/examples/react-refresh-babel-loader/rspack.config.js new file mode 100644 index 00000000000..20510987d57 --- /dev/null +++ b/examples/react-refresh-babel-loader/rspack.config.js @@ -0,0 +1,40 @@ +const rspack = require("@rspack/core") +const ReactRefreshPlugin = require("@rspack/plugin-react-refresh") + +const isProduction = process.env.NODE_ENV === "production" + +/** @type {import('@rspack/cli').Configuration} */ +const config = { + experiments: { + rspackFuture: { + disableTransformByDefault: true, + } + }, + mode: isProduction ? "production" : "development", + entry: { main: "./src/index.tsx" }, + devtool: 'source-map', + module: { + rules: [ + { + test: /\.tsx$/, + use: { + loader: "babel-loader", + options: { + presets: [ + ["@babel/preset-react", { runtime: "automatic" }], + '@babel/preset-typescript', + ], + plugins: [!isProduction && require.resolve('react-refresh/babel')].filter(Boolean) + } + } + } + ] + }, + plugins: [ + new rspack.HtmlRspackPlugin({ template: "./index.html" }), + new rspack.DefinePlugin({ "process.env.NODE_ENV": "'development'" }), + !isProduction && new ReactRefreshPlugin(), + ].filter(Boolean) +}; + +module.exports = config; diff --git a/examples/react-refresh-babel-loader/src/App.tsx b/examples/react-refresh-babel-loader/src/App.tsx new file mode 100644 index 00000000000..0837177fc5a --- /dev/null +++ b/examples/react-refresh-babel-loader/src/App.tsx @@ -0,0 +1,25 @@ +import { lazy, Suspense } from 'react' +import { ArrowFunction } from './ArrowFunction' +import ClassDefault from './ClassDefault' +import { ClassNamed } from './ClassNamed' +import FunctionDefault from './FunctionDefault' +import { FunctionNamed } from './FunctionNamed' + +const LazyComponent = lazy(() => import('./LazyComponent')) + +function App() { + return ( +
+ + + + + + Loading}> + + +
+ ) +} + +export default App diff --git a/examples/react-refresh-babel-loader/src/ArrowFunction.tsx b/examples/react-refresh-babel-loader/src/ArrowFunction.tsx new file mode 100644 index 00000000000..bbd4f03ab22 --- /dev/null +++ b/examples/react-refresh-babel-loader/src/ArrowFunction.tsx @@ -0,0 +1 @@ +export const ArrowFunction = () =>

Arrow Function

diff --git a/examples/react-refresh-babel-loader/src/ClassDefault.tsx b/examples/react-refresh-babel-loader/src/ClassDefault.tsx new file mode 100644 index 00000000000..a4c63f932d6 --- /dev/null +++ b/examples/react-refresh-babel-loader/src/ClassDefault.tsx @@ -0,0 +1,9 @@ +import { Component } from 'react' + +class ClassDefault extends Component { + render() { + return

Default Export Class

+ } +} + +export default ClassDefault diff --git a/examples/react-refresh-babel-loader/src/ClassNamed.tsx b/examples/react-refresh-babel-loader/src/ClassNamed.tsx new file mode 100644 index 00000000000..f80310692a8 --- /dev/null +++ b/examples/react-refresh-babel-loader/src/ClassNamed.tsx @@ -0,0 +1,7 @@ +import { Component } from 'react' + +export class ClassNamed extends Component { + render() { + return

Named Export Class

+ } +} diff --git a/examples/react-refresh-babel-loader/src/FunctionDefault.tsx b/examples/react-refresh-babel-loader/src/FunctionDefault.tsx new file mode 100644 index 00000000000..8ce88b8c315 --- /dev/null +++ b/examples/react-refresh-babel-loader/src/FunctionDefault.tsx @@ -0,0 +1,5 @@ +function FunctionDefault() { + return

Default Export Function

+} + +export default FunctionDefault diff --git a/examples/react-refresh-babel-loader/src/FunctionNamed.tsx b/examples/react-refresh-babel-loader/src/FunctionNamed.tsx new file mode 100644 index 00000000000..635805f56ea --- /dev/null +++ b/examples/react-refresh-babel-loader/src/FunctionNamed.tsx @@ -0,0 +1,13 @@ +import { useEffect, useState } from 'react' + +export function FunctionNamed() { + const [data, setData] = useState(0) + + useEffect(() => { + setInterval(() => { + setData((i) => i + 1) + }, 100) + }, []) + + return

Named Export Function {data}

+} diff --git a/examples/react-refresh-babel-loader/src/LazyComponent.tsx b/examples/react-refresh-babel-loader/src/LazyComponent.tsx new file mode 100644 index 00000000000..de5635fce1a --- /dev/null +++ b/examples/react-refresh-babel-loader/src/LazyComponent.tsx @@ -0,0 +1,5 @@ +function LazyComponent() { + return

Lazy Component

+} + +export default LazyComponent diff --git a/examples/react-refresh-babel-loader/src/index.tsx b/examples/react-refresh-babel-loader/src/index.tsx new file mode 100644 index 00000000000..12b3ed8af4c --- /dev/null +++ b/examples/react-refresh-babel-loader/src/index.tsx @@ -0,0 +1,6 @@ +import { createRoot } from 'react-dom/client' +import App from './App' + +const container = document.getElementById('root') +const root = createRoot(container!) +root.render() \ No newline at end of file diff --git a/packages/playground/cases/react/basic-disableTransformByDefault/rspack.config.js b/packages/playground/cases/react/basic-disableTransformByDefault/rspack.config.js index 7d9545fcbe8..0a562f79625 100644 --- a/packages/playground/cases/react/basic-disableTransformByDefault/rspack.config.js +++ b/packages/playground/cases/react/basic-disableTransformByDefault/rspack.config.js @@ -41,10 +41,7 @@ module.exports = { ], entry: "./src/index.jsx", devServer: { - hot: true, - devMiddleware: { - writeToDisk: true - } + hot: true }, cache: false, stats: "none", diff --git a/packages/playground/cases/react/with-babel/index.test.ts b/packages/playground/cases/react/with-babel/index.test.ts new file mode 100644 index 00000000000..33fefe02749 --- /dev/null +++ b/packages/playground/cases/react/with-babel/index.test.ts @@ -0,0 +1,59 @@ +import { test, expect } from "@/fixtures"; + +test("render should work", async ({ page }) => { + expect(await page.textContent(".header")).toBe("Hello World"); + expect(await page.textContent("#lazy-component")).toBe("Lazy Component"); +}); + +test("hmr should work", async ({ page, fileAction, rspack }) => { + expect(await page.textContent("button")).toBe("10"); + await page.click("button"); + expect(await page.textContent("button")).toBe("11"); + expect(await page.textContent(".placeholder")).toBe("__PLACE_HOLDER__"); + fileAction.updateFile("src/App.jsx", content => + content.replace("__PLACE_HOLDER__", "__EDITED__") + ); + await rspack.waitingForHmr(async function () { + return (await page.textContent(".placeholder")) === "__EDITED__"; + }); + expect(await page.textContent("button")).toBe("11"); +}); + +test("context+component should work", async ({ page, fileAction, rspack }) => { + expect(await page.textContent("#context")).toBe("context-value"); + await page.click("#context"); + expect(await page.textContent("#context")).toBe("context-value-click"); + fileAction.updateFile("src/CountProvider.jsx", content => + content.replace("context-value", "context-value-update") + ); + await rspack.waitingForHmr(async function () { + return (await page.textContent("#context")) === "context-value-update"; + }); +}); + +test("ReactRefreshFinder should work", async ({ page }) => { + expect(await page.textContent("#nest-function")).toBe("nest-function"); +}); + +test("update same export name from different module should work", async ({ + page, + fileAction, + rspack +}) => { + expect(await page.textContent(".same-export-name1")).toBe("__NAME_1__"); + expect(await page.textContent(".same-export-name2")).toBe("__NAME_2__"); + fileAction.updateFile("src/SameExportName1.jsx", content => + content.replace("__NAME_1__", "__name_1__") + ); + await rspack.waitingForHmr(async function () { + return (await page.textContent(".same-export-name1")) === "__name_1__"; + }); + expect(await page.textContent(".same-export-name2")).toBe("__NAME_2__"); + fileAction.updateFile("src/SameExportName2.jsx", content => + content.replace("__NAME_2__", "__name_2__") + ); + await rspack.waitingForHmr(async function () { + return (await page.textContent(".same-export-name2")) === "__name_2__"; + }); + expect(await page.textContent(".same-export-name1")).toBe("__name_1__"); +}); diff --git a/packages/playground/cases/react/with-babel/rspack.config.js b/packages/playground/cases/react/with-babel/rspack.config.js new file mode 100644 index 00000000000..127adbe0308 --- /dev/null +++ b/packages/playground/cases/react/with-babel/rspack.config.js @@ -0,0 +1,43 @@ +const rspack = require("@rspack/core"); +const ReactRefreshPlugin = require("@rspack/plugin-react-refresh"); + +/** @type { import('@rspack/core').RspackOptions } */ +module.exports = { + experiments: { + rspackFuture: { + disableTransformByDefault: true + } + }, + context: __dirname, + mode: "development", + module: { + rules: [ + { + test: /\.jsx$/, + use: { + loader: "babel-loader", + options: { + presets: [["@babel/preset-react", { runtime: "automatic" }]], + plugins: [require.resolve("react-refresh/babel")] + } + } + } + ] + }, + plugins: [ + new rspack.HtmlRspackPlugin({ template: "./src/index.html" }), + new ReactRefreshPlugin() + ], + entry: "./src/index.jsx", + devServer: { + hot: true + }, + cache: false, + stats: "none", + infrastructureLogging: { + debug: false + }, + watchOptions: { + poll: 1000 + } +}; diff --git a/packages/playground/cases/react/with-babel/src/App.jsx b/packages/playground/cases/react/with-babel/src/App.jsx new file mode 100644 index 00000000000..a72ff3a972a --- /dev/null +++ b/packages/playground/cases/react/with-babel/src/App.jsx @@ -0,0 +1,30 @@ +import React from 'react' +import './index.css' +import { ContextComponent } from './CountProvider' +import { ReactRefreshFinder } from './ReactRefreshFinder' +import { SameExportName as SameExportName1 } from './SameExportName1' +import { SameExportName as SameExportName2 } from './SameExportName2' + +const Button = () => { + const [count, setCount] = React.useState(10) + return +} + +const LazyComponent = React.lazy(() => import('./LazyComponent')) + +export const App = () => { + return ( +
+
Hello World
+
}> + + + + ) +} diff --git a/packages/playground/cases/react/with-babel/src/CountProvider.jsx b/packages/playground/cases/react/with-babel/src/CountProvider.jsx new file mode 100644 index 00000000000..afbe1fcbe34 --- /dev/null +++ b/packages/playground/cases/react/with-babel/src/CountProvider.jsx @@ -0,0 +1,19 @@ +import React from 'react'; + +export const CountContext = React.createContext(); + +export function CountProvider({ children }) { + const [count, setCount] = React.useState('context-value'); + return ( + + {children} + + ); +} + +export function ContextComponent() { + const { count, setCount } = React.useContext(CountContext); + return
setCount((count) => count + '-click')}> + {count} +
+} \ No newline at end of file diff --git a/packages/playground/cases/react/with-babel/src/LazyComponent.css b/packages/playground/cases/react/with-babel/src/LazyComponent.css new file mode 100644 index 00000000000..e69de29bb2d diff --git a/packages/playground/cases/react/with-babel/src/LazyComponent.jsx b/packages/playground/cases/react/with-babel/src/LazyComponent.jsx new file mode 100644 index 00000000000..65545394690 --- /dev/null +++ b/packages/playground/cases/react/with-babel/src/LazyComponent.jsx @@ -0,0 +1,7 @@ +import './LazyComponent.css' + +function LazyComponent () { + return
Lazy Component
+} + +export default LazyComponent diff --git a/packages/playground/cases/react/with-babel/src/ReactRefreshFinder.jsx b/packages/playground/cases/react/with-babel/src/ReactRefreshFinder.jsx new file mode 100644 index 00000000000..83b0509d747 --- /dev/null +++ b/packages/playground/cases/react/with-babel/src/ReactRefreshFinder.jsx @@ -0,0 +1,10 @@ +import React, { useState } from 'react'; + +function CreateReactRefreshFinder() { + return function Component() { + useState(1); + return
nest-function
; + }; +} + +export const ReactRefreshFinder = CreateReactRefreshFinder() \ No newline at end of file diff --git a/packages/playground/cases/react/with-babel/src/SameExportName1.jsx b/packages/playground/cases/react/with-babel/src/SameExportName1.jsx new file mode 100644 index 00000000000..2a7f2b45f15 --- /dev/null +++ b/packages/playground/cases/react/with-babel/src/SameExportName1.jsx @@ -0,0 +1,3 @@ +export function SameExportName() { + return
__NAME_1__
+} diff --git a/packages/playground/cases/react/with-babel/src/SameExportName2.jsx b/packages/playground/cases/react/with-babel/src/SameExportName2.jsx new file mode 100644 index 00000000000..8bf62ab6bb5 --- /dev/null +++ b/packages/playground/cases/react/with-babel/src/SameExportName2.jsx @@ -0,0 +1,3 @@ +export function SameExportName() { + return
__NAME_2__
+} diff --git a/packages/playground/cases/react/with-babel/src/index.css b/packages/playground/cases/react/with-babel/src/index.css new file mode 100644 index 00000000000..753f48a591f --- /dev/null +++ b/packages/playground/cases/react/with-babel/src/index.css @@ -0,0 +1,3 @@ +body { + background-color: rgba(0, 0, 0, 0); +} diff --git a/packages/playground/cases/react/with-babel/src/index.html b/packages/playground/cases/react/with-babel/src/index.html new file mode 100644 index 00000000000..127a457455b --- /dev/null +++ b/packages/playground/cases/react/with-babel/src/index.html @@ -0,0 +1,12 @@ + + + + + + + Document + + +
+ + diff --git a/packages/playground/cases/react/with-babel/src/index.jsx b/packages/playground/cases/react/with-babel/src/index.jsx new file mode 100644 index 00000000000..52e72c3334e --- /dev/null +++ b/packages/playground/cases/react/with-babel/src/index.jsx @@ -0,0 +1,11 @@ +import React from "react"; +import { createRoot } from "react-dom/client"; +import { App } from './App'; +import { CountProvider } from "./CountProvider"; + +const container = createRoot(document.getElementById("root")); +container.render( + + + +); diff --git a/packages/playground/package.json b/packages/playground/package.json index 9a70b16b4ba..57c83908ac5 100644 --- a/packages/playground/package.json +++ b/packages/playground/package.json @@ -12,12 +12,15 @@ "directory": "packages/playground" }, "devDependencies": { + "@babel/core": "^7.22.20", + "@babel/preset-react": "^7.22.15", "@playwright/test": "1.35.0", "@rspack/core": "workspace:*", "@rspack/dev-client": "workspace:*", "@rspack/dev-server": "workspace:*", "@rspack/plugin-react-refresh": "workspace:*", "@types/fs-extra": "11.0.1", + "babel-loader": "^9.1.3", "fs-extra": "11.1.1", "postcss": "^8.4.21", "postcss-loader": "^7.3.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a47a436cea1..ff5e1f6524f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -577,6 +577,31 @@ importers: '@rspack/plugin-react-refresh': link:../../packages/rspack-plugin-react-refresh react-refresh: 0.13.0 + examples/react-refresh-babel-loader: + specifiers: + '@babel/core': ^7.22.20 + '@babel/preset-react': ^7.22.15 + '@babel/preset-typescript': ^7.22.5 + '@rspack/cli': workspace:* + '@rspack/core': workspace:* + '@rspack/plugin-react-refresh': workspace:* + babel-loader: ^9.1.3 + react: 18.0.0 + react-dom: 18.0.0 + react-refresh: 0.13.0 + dependencies: + react: 18.0.0 + react-dom: 18.0.0_react@18.0.0 + devDependencies: + '@babel/core': 7.22.20 + '@babel/preset-react': 7.22.15_@babel+core@7.22.20 + '@babel/preset-typescript': 7.22.5_@babel+core@7.22.20 + '@rspack/cli': link:../../packages/rspack-cli + '@rspack/core': link:../../packages/rspack + '@rspack/plugin-react-refresh': link:../../packages/rspack-plugin-react-refresh + babel-loader: 9.1.3_@babel+core@7.22.20 + react-refresh: 0.13.0 + examples/react-storybook: specifiers: '@rspack/cli': workspace:* @@ -883,12 +908,15 @@ importers: packages/playground: specifiers: + '@babel/core': ^7.22.20 + '@babel/preset-react': ^7.22.15 '@playwright/test': 1.35.0 '@rspack/core': workspace:* '@rspack/dev-client': workspace:* '@rspack/dev-server': workspace:* '@rspack/plugin-react-refresh': workspace:* '@types/fs-extra': 11.0.1 + babel-loader: ^9.1.3 fs-extra: 11.1.1 postcss: ^8.4.21 postcss-loader: ^7.3.0 @@ -900,12 +928,15 @@ importers: webpack-dev-server: 4.13.1 ws: 8.8.1 devDependencies: + '@babel/core': 7.22.20 + '@babel/preset-react': 7.22.15_@babel+core@7.22.20 '@playwright/test': 1.35.0 '@rspack/core': link:../rspack '@rspack/dev-client': link:../rspack-dev-client '@rspack/dev-server': link:../rspack-dev-server '@rspack/plugin-react-refresh': link:../rspack-plugin-react-refresh '@types/fs-extra': 11.0.1 + babel-loader: 9.1.3_@babel+core@7.22.20 fs-extra: 11.1.1 postcss: 8.4.21 postcss-loader: 7.3.3_postcss@8.4.21 @@ -1989,6 +2020,13 @@ packages: dependencies: '@babel/highlight': 7.18.6 + /@babel/code-frame/7.22.13: + resolution: {integrity: sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.22.20 + chalk: 2.4.2 + /@babel/code-frame/7.22.5: resolution: {integrity: sha512-Xmwn266vad+6DAqEB2A6V/CcZVp62BbwVmcOJc2RPuwih1kw02TjQvWVWlcKGbBPd+8/0V5DEkOcizRGYsspYQ==} engines: {node: '>=6.9.0'} @@ -2004,6 +2042,11 @@ packages: engines: {node: '>=6.9.0'} dev: true + /@babel/compat-data/7.22.20: + resolution: {integrity: sha512-BQYjKbpXjoXwFW5jGqiizJQQT/aC7pFm9Ok1OWssonuguICi264lbgMzRp2ZMmRSlfkX6DsWDDcsrctK8Rwfiw==} + engines: {node: '>=6.9.0'} + dev: true + /@babel/core/7.12.9: resolution: {integrity: sha512-gTXYh3M5wb7FRXQy+FErKFAv90BnlOuNn1QkCK2lREoPAjrQCO49+HVSrFoe5uakFAF5eenS75KbO2vQiLrTMQ==} engines: {node: '>=6.9.0'} @@ -2120,6 +2163,29 @@ packages: - supports-color dev: true + /@babel/core/7.22.20: + resolution: {integrity: sha512-Y6jd1ahLubuYweD/zJH+vvOY141v4f9igNQAQ+MBgq9JlHS2iTsZKn1aMsb3vGccZsXI16VzTBw52Xx0DWmtnA==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.2.1 + '@babel/code-frame': 7.22.13 + '@babel/generator': 7.22.15 + '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-module-transforms': 7.22.20_@babel+core@7.22.20 + '@babel/helpers': 7.22.15 + '@babel/parser': 7.22.16 + '@babel/template': 7.22.15 + '@babel/traverse': 7.22.20 + '@babel/types': 7.22.19 + convert-source-map: 1.8.0 + debug: 4.3.4 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/generator/7.21.1: resolution: {integrity: sha512-1lT45bAYlQhFn/BHivJs43AiW2rg3/UbLyShGfF3C0KmHvO5fSghWd5kBJy30kpRRucGzXStvnnCFniCR2kXAA==} engines: {node: '>=6.9.0'} @@ -2148,11 +2214,21 @@ packages: '@jridgewell/trace-mapping': 0.3.17 jsesc: 2.5.2 + /@babel/generator/7.22.15: + resolution: {integrity: sha512-Zu9oWARBqeVOW0dZOjXc3JObrzuqothQ3y/n1kUtrjCoCPLkXUwMvOo/F/TCfoHMbWIFlWwpZtkZVb9ga4U2pA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.19 + '@jridgewell/gen-mapping': 0.3.2 + '@jridgewell/trace-mapping': 0.3.17 + jsesc: 2.5.2 + dev: true + /@babel/generator/7.22.5: resolution: {integrity: sha512-+lcUbnTRhd0jOewtFSedLyiPsD5tswKkbgcezOqqWFUVNEwoUTlpPOBmvhG7OXWLR4jMdv0czPGH5XbflnD1EA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.5 + '@babel/types': 7.22.19 '@jridgewell/gen-mapping': 0.3.2 '@jridgewell/trace-mapping': 0.3.17 jsesc: 2.5.2 @@ -2168,7 +2244,7 @@ packages: resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.5 + '@babel/types': 7.22.19 dev: true /@babel/helper-builder-binary-assignment-operator-visitor/7.18.9: @@ -2275,6 +2351,17 @@ packages: semver: 6.3.1 dev: true + /@babel/helper-compilation-targets/7.22.15: + resolution: {integrity: sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/compat-data': 7.22.20 + '@babel/helper-validator-option': 7.22.15 + browserslist: 4.21.10 + lru-cache: 5.1.1 + semver: 6.3.1 + dev: true + /@babel/helper-create-class-features-plugin/7.20.5: resolution: {integrity: sha512-3RCdA/EmEaikrhayahwToF0fpweU/8o2p8vhc1c/1kftHOdTKuC65kik/TLc+qfbS8JKw4qqJbne4ovICDhmww==} engines: {node: '>=6.9.0'} @@ -2388,6 +2475,26 @@ packages: - supports-color dev: true + /@babel/helper-create-class-features-plugin/7.22.5_@babel+core@7.22.20: + resolution: {integrity: sha512-xkb58MyOYIslxu3gKmVXmjTtUPvBU4odYzbiIQbWwLKIHCsx6UGZGX6F1IznMFVnDdirseUZopzN+ZRt8Xb33Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.22.20 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-environment-visitor': 7.22.5 + '@babel/helper-function-name': 7.22.5 + '@babel/helper-member-expression-to-functions': 7.22.5 + '@babel/helper-optimise-call-expression': 7.22.5 + '@babel/helper-replace-supers': 7.22.5 + '@babel/helper-skip-transparent-expression-wrappers': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.5 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/helper-create-regexp-features-plugin/7.20.5: resolution: {integrity: sha512-m68B1lkg3XDGX5yCvGO0kPx3v9WIYLnzjKfPcQiwntEQa5ZeRkPmo2X/ISJc8qxWGfwUr+kvZAeEzAwLec2r2w==} engines: {node: '>=6.9.0'} @@ -2474,6 +2581,11 @@ packages: resolution: {integrity: sha512-IYl4gZ3ETsWocUWgsFZLM5i1BYx9SoemminVEXadgLBa9TdeorzgLKm8wWLA6J1N/kT3Kch8XIk1laNzYoHKvQ==} engines: {node: '>=6.9.0'} + /@babel/helper-environment-visitor/7.22.20: + resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} + engines: {node: '>=6.9.0'} + dev: true + /@babel/helper-environment-visitor/7.22.5: resolution: {integrity: sha512-XGmhECfVA/5sAt+H+xpSg0mfrHq6FzNr9Oxh7PSEBBRUb/mL7Kz3NICXb194rCqAEdxkhPT1a88teizAFyvk8Q==} engines: {node: '>=6.9.0'} @@ -2490,28 +2602,28 @@ packages: resolution: {integrity: sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==} engines: {node: '>=6.9.0'} dependencies: - '@babel/template': 7.20.7 - '@babel/types': 7.22.5 + '@babel/template': 7.22.15 + '@babel/types': 7.22.19 /@babel/helper-function-name/7.22.5: resolution: {integrity: sha512-wtHSq6jMRE3uF2otvfuD3DIvVhOsSNshQl0Qrd7qC9oQJzHvOL4qQXlQn2916+CXGywIjpGuIkoyZRRxHPiNQQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/template': 7.22.5 - '@babel/types': 7.22.5 + '@babel/template': 7.22.15 + '@babel/types': 7.22.19 dev: true /@babel/helper-hoist-variables/7.18.6: resolution: {integrity: sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.5 + '@babel/types': 7.22.19 /@babel/helper-hoist-variables/7.22.5: resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.5 + '@babel/types': 7.22.19 dev: true /@babel/helper-member-expression-to-functions/7.18.9: @@ -2547,6 +2659,13 @@ packages: dependencies: '@babel/types': 7.21.5 + /@babel/helper-module-imports/7.22.15: + resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.19 + dev: true + /@babel/helper-module-imports/7.22.5: resolution: {integrity: sha512-8Dl6+HD/cKifutF5qGd/8ZJi84QeAKh+CEe1sBzz8UayBBGg1dAIJrdHOcOM5b2MpzWL2yuotJTtGjETq0qjXg==} engines: {node: '>=6.9.0'} @@ -2585,6 +2704,20 @@ packages: - supports-color dev: true + /@babel/helper-module-transforms/7.22.20_@babel+core@7.22.20: + resolution: {integrity: sha512-dLT7JVWIUUxKOs1UnJUBR3S70YK+pKX6AbJgB2vMIvEkZkrfJDbYDJesnPshtKV4LhDOR3Oc5YULeDizRek+5A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.22.20 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-simple-access': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/helper-validator-identifier': 7.22.20 + dev: true + /@babel/helper-module-transforms/7.22.5: resolution: {integrity: sha512-+hGKDt/Ze8GFExiVHno/2dvG5IdstpzCq0y4Qc9OJ25D4q3pKfiIP/4Vp3/JvhDkLKsDK2api3q3fpIgiIF5bw==} engines: {node: '>=6.9.0'} @@ -2735,7 +2868,7 @@ packages: resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.22.5 + '@babel/types': 7.22.19 dev: true /@babel/helper-skip-transparent-expression-wrappers/7.20.0: @@ -2756,7 +2889,7 @@ packages: resolution: {integrity: sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==} engines: {node: '>=6.9.0'} dependencies: - '@babel/types': 7.21.5 + '@babel/types': 7.22.19 /@babel/helper-split-export-declaration/7.22.5: resolution: {integrity: sha512-thqK5QFghPKWLhAV321lxF95yCg2K3Ob5yw+M3VHWfdia0IkPXUtoLH8x/6Fh486QUvzhb8YOWHChTVen2/PoQ==} @@ -2765,6 +2898,13 @@ packages: '@babel/types': 7.22.5 dev: true + /@babel/helper-split-export-declaration/7.22.6: + resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.22.19 + dev: true + /@babel/helper-string-parser/7.19.4: resolution: {integrity: sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==} engines: {node: '>=6.9.0'} @@ -2781,6 +2921,10 @@ packages: resolution: {integrity: sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==} engines: {node: '>=6.9.0'} + /@babel/helper-validator-identifier/7.22.20: + resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} + engines: {node: '>=6.9.0'} + /@babel/helper-validator-identifier/7.22.5: resolution: {integrity: sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==} engines: {node: '>=6.9.0'} @@ -2794,6 +2938,11 @@ packages: engines: {node: '>=6.9.0'} dev: true + /@babel/helper-validator-option/7.22.15: + resolution: {integrity: sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==} + engines: {node: '>=6.9.0'} + dev: true + /@babel/helper-validator-option/7.22.5: resolution: {integrity: sha512-R3oB6xlIVKUnxNUxbmgq7pKjxpru24zlimpE8WK47fACIlM0II/Hm1RS8IaOI7NgCr6LNS+jl5l75m20npAziw==} engines: {node: '>=6.9.0'} @@ -2821,11 +2970,30 @@ packages: transitivePeerDependencies: - supports-color + /@babel/helpers/7.22.15: + resolution: {integrity: sha512-7pAjK0aSdxOwR+CcYAqgWOGy5dcfvzsTIfFTb2odQqW47MDfv14UaJDY6eng8ylM2EaeKXdxaSWESbkmaQHTmw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.22.15 + '@babel/traverse': 7.22.20 + '@babel/types': 7.22.19 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/highlight/7.18.6: resolution: {integrity: sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-validator-identifier': 7.22.5 + '@babel/helper-validator-identifier': 7.22.20 + chalk: 2.4.2 + js-tokens: 4.0.0 + + /@babel/highlight/7.22.20: + resolution: {integrity: sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.22.20 chalk: 2.4.2 js-tokens: 4.0.0 @@ -2849,7 +3017,14 @@ packages: engines: {node: '>=6.0.0'} hasBin: true dependencies: - '@babel/types': 7.21.5 + '@babel/types': 7.22.19 + + /@babel/parser/7.22.16: + resolution: {integrity: sha512-+gPfKv8UWeKKeJTUxe59+OobVcrYHETCsORl61EmSkmgymguYk/X5bp7GuUIXaFsc6y++v8ZxPsLSSuujqDphA==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.22.19 /@babel/parser/7.22.5: resolution: {integrity: sha512-DFZMC9LJUG9PLOclRC32G63UXwzqS2koQC8dkx+PLdmt1xSePYpbT/NbsrJy8Q/muXz7o/h/d4A7Fuyixm559Q==} @@ -3589,13 +3764,22 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-bigint/7.8.3_@babel+core@7.21.0: + /@babel/plugin-syntax-async-generators/7.8.4_@babel+core@7.22.20: + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.20 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-bigint/7.8.3_@babel+core@7.22.20: resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.0 - '@babel/helper-plugin-utils': 7.21.5 + '@babel/core': 7.22.20 + '@babel/helper-plugin-utils': 7.22.5 dev: true /@babel/plugin-syntax-class-properties/7.12.13: @@ -3624,6 +3808,15 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true + /@babel/plugin-syntax-class-properties/7.12.13_@babel+core@7.22.20: + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.20 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-syntax-class-static-block/7.14.5: resolution: {integrity: sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==} engines: {node: '>=6.9.0'} @@ -3744,13 +3937,13 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true - /@babel/plugin-syntax-import-meta/7.10.4_@babel+core@7.21.0: + /@babel/plugin-syntax-import-meta/7.10.4_@babel+core@7.22.20: resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} peerDependencies: '@babel/core': ^7.0.0-0 dependencies: - '@babel/core': 7.21.0 - '@babel/helper-plugin-utils': 7.21.5 + '@babel/core': 7.22.20 + '@babel/helper-plugin-utils': 7.22.5 dev: true /@babel/plugin-syntax-json-strings/7.8.3: @@ -3779,6 +3972,15 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true + /@babel/plugin-syntax-json-strings/7.8.3_@babel+core@7.22.20: + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.20 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-syntax-jsx/7.12.1_@babel+core@7.12.9: resolution: {integrity: sha512-1yRi7yAtB0ETgxdY9ti/p2TivUxJkTdhu/ZbF9MshVGqOx1TdB3b7xCXs49Fupgg50N45KcAsRP/ZqWjs9SRjg==} peerDependencies: @@ -3808,6 +4010,16 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true + /@babel/plugin-syntax-jsx/7.18.6_@babel+core@7.22.20: + resolution: {integrity: sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.20 + '@babel/helper-plugin-utils': 7.20.2 + dev: true + /@babel/plugin-syntax-jsx/7.22.5_@babel+core@7.21.0: resolution: {integrity: sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==} engines: {node: '>=6.9.0'} @@ -3818,6 +4030,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-syntax-jsx/7.22.5_@babel+core@7.22.20: + resolution: {integrity: sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.20 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-syntax-logical-assignment-operators/7.10.4: resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} peerDependencies: @@ -3844,6 +4066,15 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true + /@babel/plugin-syntax-logical-assignment-operators/7.10.4_@babel+core@7.22.20: + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.20 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-syntax-nullish-coalescing-operator/7.8.3: resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} peerDependencies: @@ -3870,6 +4101,15 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true + /@babel/plugin-syntax-nullish-coalescing-operator/7.8.3_@babel+core@7.22.20: + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.20 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-syntax-numeric-separator/7.10.4: resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} peerDependencies: @@ -3896,6 +4136,15 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true + /@babel/plugin-syntax-numeric-separator/7.10.4_@babel+core@7.22.20: + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.20 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-syntax-object-rest-spread/7.8.3: resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} peerDependencies: @@ -3931,6 +4180,15 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true + /@babel/plugin-syntax-object-rest-spread/7.8.3_@babel+core@7.22.20: + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.20 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-syntax-optional-catch-binding/7.8.3: resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} peerDependencies: @@ -3957,6 +4215,15 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true + /@babel/plugin-syntax-optional-catch-binding/7.8.3_@babel+core@7.22.20: + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.20 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-syntax-optional-chaining/7.8.3: resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} peerDependencies: @@ -3983,6 +4250,15 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true + /@babel/plugin-syntax-optional-chaining/7.8.3_@babel+core@7.22.20: + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.20 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-syntax-private-property-in-object/7.14.5: resolution: {integrity: sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==} engines: {node: '>=6.9.0'} @@ -4041,6 +4317,16 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true + /@babel/plugin-syntax-top-level-await/7.14.5_@babel+core@7.22.20: + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.20 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-syntax-typescript/7.20.0: resolution: {integrity: sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==} engines: {node: '>=6.9.0'} @@ -4060,6 +4346,16 @@ packages: '@babel/helper-plugin-utils': 7.21.5 dev: true + /@babel/plugin-syntax-typescript/7.20.0_@babel+core@7.22.20: + resolution: {integrity: sha512-rd9TkG+u1CExzS4SM1BlMEhMXwFLKVjOAFFCDx9PbX5ycJWDoWMcwdJH9RhkPu1dOgn5TrxLot/Gx6lWFuAUNQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.20 + '@babel/helper-plugin-utils': 7.21.5 + dev: true + /@babel/plugin-syntax-typescript/7.22.5_@babel+core@7.21.0: resolution: {integrity: sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==} engines: {node: '>=6.9.0'} @@ -4070,6 +4366,16 @@ packages: '@babel/helper-plugin-utils': 7.22.5 dev: true + /@babel/plugin-syntax-typescript/7.22.5_@babel+core@7.22.20: + resolution: {integrity: sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.20 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-transform-arrow-functions/7.18.6: resolution: {integrity: sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ==} engines: {node: '>=6.9.0'} @@ -4746,6 +5052,20 @@ packages: - supports-color dev: true + /@babel/plugin-transform-modules-commonjs/7.22.5_@babel+core@7.22.20: + resolution: {integrity: sha512-B4pzOXj+ONRmuaQTg05b3y/4DuFz3WcCNAXPLb2Q0GT0TrGKGxNKV4jwsXts+StaM0LQczZbOpj8o1DLPDJIiA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.20 + '@babel/helper-module-transforms': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-simple-access': 7.22.5 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/plugin-transform-modules-systemjs/7.19.6: resolution: {integrity: sha512-fqGLBepcc3kErfR9R3DnVpURmckXP7gj7bAlrTQyBxrigFqszZCkFkcoxzCp2v32XmwXLvbw+8Yq9/b+QqksjQ==} engines: {node: '>=6.9.0'} @@ -5040,6 +5360,16 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true + /@babel/plugin-transform-react-display-name/7.22.5_@babel+core@7.22.20: + resolution: {integrity: sha512-PVk3WPYudRF5z4GKMEYUrLjPl38fJSKNaEOkFuoprioowGuWN6w2RKznuFNSlJx7pzzXXStPUnNSOEO0jL5EVw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.20 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-transform-react-jsx-development/7.18.6_@babel+core@7.21.0: resolution: {integrity: sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==} engines: {node: '>=6.9.0'} @@ -5050,6 +5380,16 @@ packages: '@babel/plugin-transform-react-jsx': 7.19.0_@babel+core@7.21.0 dev: true + /@babel/plugin-transform-react-jsx-development/7.22.5_@babel+core@7.22.20: + resolution: {integrity: sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.20 + '@babel/plugin-transform-react-jsx': 7.22.15_@babel+core@7.22.20 + dev: true + /@babel/plugin-transform-react-jsx/7.19.0_@babel+core@7.21.0: resolution: {integrity: sha512-UVEvX3tXie3Szm3emi1+G63jyw1w5IcMY0FSKM+CRnKRI5Mr1YbCNgsSTwoTwKphQEG9P+QqmuRFneJPZuHNhg==} engines: {node: '>=6.9.0'} @@ -5064,6 +5404,20 @@ packages: '@babel/types': 7.22.5 dev: true + /@babel/plugin-transform-react-jsx/7.22.15_@babel+core@7.22.20: + resolution: {integrity: sha512-oKckg2eZFa8771O/5vi7XeTvmM6+O9cxZu+kanTU7tD4sin5nO/G8jGJhq8Hvt2Z0kUoEDRayuZLaUlYl8QuGA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.20 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-jsx': 7.22.5_@babel+core@7.22.20 + '@babel/types': 7.22.19 + dev: true + /@babel/plugin-transform-react-pure-annotations/7.18.6_@babel+core@7.21.0: resolution: {integrity: sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ==} engines: {node: '>=6.9.0'} @@ -5075,6 +5429,17 @@ packages: '@babel/helper-plugin-utils': 7.20.2 dev: true + /@babel/plugin-transform-react-pure-annotations/7.22.5_@babel+core@7.22.20: + resolution: {integrity: sha512-gP4k85wx09q+brArVinTXhWiyzLl9UpmGva0+mWyKxk6JZequ05x3eUcIUE+FyttPKJFRRVtAvQaJ6YF9h1ZpA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.20 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + /@babel/plugin-transform-regenerator/7.20.5: resolution: {integrity: sha512-kW/oO7HPBtntbsahzQ0qSE3tFvkFwnbozz3NWFhLGqH75vLEg+sCGngLlhVkePlCs3Jv0dBBHDzCHxNiFAQKCQ==} engines: {node: '>=6.9.0'} @@ -5357,6 +5722,21 @@ packages: - supports-color dev: true + /@babel/plugin-transform-typescript/7.22.5_@babel+core@7.22.20: + resolution: {integrity: sha512-SMubA9S7Cb5sGSFFUlqxyClTA9zWJ8qGQrppNUm05LtFuN1ELRFNndkix4zUJrC9F+YivWwa1dHMSyo0e0N9dA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.20 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-create-class-features-plugin': 7.22.5_@babel+core@7.22.20 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-typescript': 7.22.5_@babel+core@7.22.20 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/plugin-transform-unicode-escapes/7.18.10: resolution: {integrity: sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==} engines: {node: '>=6.9.0'} @@ -5826,6 +6206,21 @@ packages: '@babel/plugin-transform-react-pure-annotations': 7.18.6_@babel+core@7.21.0 dev: true + /@babel/preset-react/7.22.15_@babel+core@7.22.20: + resolution: {integrity: sha512-Csy1IJ2uEh/PecCBXXoZGAZBeCATTuePzCSB7dLYWS0vOEj6CNpjxIhW4duWwZodBNueH7QO14WbGn8YyeuN9w==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.20 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-validator-option': 7.22.15 + '@babel/plugin-transform-react-display-name': 7.22.5_@babel+core@7.22.20 + '@babel/plugin-transform-react-jsx': 7.22.15_@babel+core@7.22.20 + '@babel/plugin-transform-react-jsx-development': 7.22.5_@babel+core@7.22.20 + '@babel/plugin-transform-react-pure-annotations': 7.22.5_@babel+core@7.22.20 + dev: true + /@babel/preset-typescript/7.18.6_@babel+core@7.21.0: resolution: {integrity: sha512-s9ik86kXBAnD760aybBucdpnLsAt0jK1xqJn2juOn9lkOvSHV60os5hxoVJsPzMQxvnUJFAlkont2DvvaYEBtQ==} engines: {node: '>=6.9.0'} @@ -5856,6 +6251,22 @@ packages: - supports-color dev: true + /@babel/preset-typescript/7.22.5_@babel+core@7.22.20: + resolution: {integrity: sha512-YbPaal9LxztSGhmndR46FmAbkJ/1fAsw293tSU+I5E5h+cnJ3d4GTwyUgGYmOXJYdGA+uNePle4qbaRzj2NISQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.22.20 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/helper-validator-option': 7.22.5 + '@babel/plugin-syntax-jsx': 7.22.5_@babel+core@7.22.20 + '@babel/plugin-transform-modules-commonjs': 7.22.5_@babel+core@7.22.20 + '@babel/plugin-transform-typescript': 7.22.5_@babel+core@7.22.20 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/register/7.21.0_@babel+core@7.21.0: resolution: {integrity: sha512-9nKsPmYDi5DidAqJaQooxIhsLJiNMkGr8ypQ8Uic7cIox7UCDsM7HuUGxdGT7mSDTYbqzIdsOWzfBton/YJrMw==} engines: {node: '>=6.9.0'} @@ -5884,6 +6295,14 @@ packages: '@babel/parser': 7.21.8 '@babel/types': 7.21.5 + /@babel/template/7.22.15: + resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.22.13 + '@babel/parser': 7.22.16 + '@babel/types': 7.22.19 + /@babel/template/7.22.5: resolution: {integrity: sha512-X7yV7eiwAxdj9k94NEylvbVHLiVG1nvzCV2EAowhxLTwODV1jl9UzZ48leOC0sH7OnuHrIkllaBgneUykIcZaw==} engines: {node: '>=6.9.0'} @@ -5945,6 +6364,24 @@ packages: transitivePeerDependencies: - supports-color + /@babel/traverse/7.22.20: + resolution: {integrity: sha512-eU260mPZbU7mZ0N+X10pxXhQFMGTeLb9eFS0mxehS8HZp9o1uSnFeWQuG1UPrlxgA7QoUzFhOnilHDp0AXCyHw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.22.13 + '@babel/generator': 7.22.15 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.22.5 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/parser': 7.22.16 + '@babel/types': 7.22.19 + debug: 4.3.4 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: true + /@babel/traverse/7.22.5: resolution: {integrity: sha512-7DuIjPgERaNo6r+PZwItpjCZEa5vyw4eJGufeLxrPdBXBoLcCJCIasvK6pK/9DVNrLZTLFhUGqaC6X/PA007TQ==} engines: {node: '>=6.9.0'} @@ -5979,6 +6416,14 @@ packages: '@babel/helper-validator-identifier': 7.19.1 to-fast-properties: 2.0.0 + /@babel/types/7.22.19: + resolution: {integrity: sha512-P7LAw/LbojPzkgp5oznjE6tQEIWbp4PkkfrZDINTro9zgBRtI324/EYsiSI7lhPbpIQ+DCeR2NNmMWANGGfZsg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.22.5 + '@babel/helper-validator-identifier': 7.22.20 + to-fast-properties: 2.0.0 + /@babel/types/7.22.5: resolution: {integrity: sha512-zo3MIHGOkPOfoRXitsgHLjEXmlDaD/5KU1Uzuc9GNiZPhSqVxVRtxuPaSBZDsYZ9qV88AjtMtWW7ww98loJ9KA==} engines: {node: '>=6.9.0'} @@ -6870,7 +7315,7 @@ packages: dependencies: '@jridgewell/trace-mapping': 0.3.17 callsites: 3.1.0 - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 dev: true /@jest/test-result/29.5.0: @@ -6888,7 +7333,7 @@ packages: engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: '@jest/test-result': 29.5.0 - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 jest-haste-map: 29.5.0 slash: 3.0.0 dev: true @@ -6897,7 +7342,7 @@ packages: resolution: {integrity: sha512-8vbeZWqLJOvHaDfeMuoHITGKSz5qWc9u04lnWrQE3VyuSw604PzQM824ZeX9XSjUCeDiE3GuxZe5UKa8J61NQw==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/core': 7.21.0 + '@babel/core': 7.22.20 '@jest/types': 29.5.0 '@jridgewell/trace-mapping': 0.3.17 babel-plugin-istanbul: 6.1.1 @@ -11117,8 +11562,8 @@ packages: /@types/babel__core/7.1.19: resolution: {integrity: sha512-WEOTgRsbYkvA/KCsDwVEGkd7WAr1e3g31VHQ8zy5gul/V1qKullU/BU5I68X5v7V3GnB9eotmom4v5a5gjxorw==} dependencies: - '@babel/parser': 7.22.5 - '@babel/types': 7.22.5 + '@babel/parser': 7.22.16 + '@babel/types': 7.22.19 '@types/babel__generator': 7.6.4 '@types/babel__template': 7.4.1 '@types/babel__traverse': 7.18.1 @@ -11127,14 +11572,14 @@ packages: /@types/babel__generator/7.6.4: resolution: {integrity: sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==} dependencies: - '@babel/types': 7.22.5 + '@babel/types': 7.22.19 dev: true /@types/babel__template/7.4.1: resolution: {integrity: sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==} dependencies: - '@babel/parser': 7.22.5 - '@babel/types': 7.22.5 + '@babel/parser': 7.22.16 + '@babel/types': 7.22.19 dev: true /@types/babel__traverse/7.18.1: @@ -12069,7 +12514,6 @@ packages: dependencies: webpack: 5.76.0_webpack-cli@4.10.0 webpack-cli: 4.10.0_webpack@5.76.0 - dev: true /@webpack-cli/info/1.5.0_webpack-cli@4.10.0: resolution: {integrity: sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ==} @@ -12078,7 +12522,6 @@ packages: dependencies: envinfo: 7.8.1 webpack-cli: 4.10.0_webpack@5.76.0 - dev: true /@webpack-cli/serve/1.7.0_webpack-cli@4.10.0: resolution: {integrity: sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==} @@ -12090,7 +12533,6 @@ packages: optional: true dependencies: webpack-cli: 4.10.0_webpack@5.76.0 - dev: true /@xtuc/ieee754/1.2.0: resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} @@ -12693,19 +13135,19 @@ packages: '@babel/core': 7.21.0 dev: true - /babel-jest/29.5.0_@babel+core@7.21.0: + /babel-jest/29.5.0_@babel+core@7.22.20: resolution: {integrity: sha512-mA4eCDh5mSo2EcA9xQjVTpmbbNk32Zb3Q3QFQsNhaK56Q+yoXowzFodLux30HRgyOho5rsQ6B0P9QpMkvvnJ0Q==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: '@babel/core': ^7.8.0 dependencies: - '@babel/core': 7.21.0 + '@babel/core': 7.22.20 '@jest/transform': 29.5.0 '@types/babel__core': 7.1.19 babel-plugin-istanbul: 6.1.1 - babel-preset-jest: 29.5.0_@babel+core@7.21.0 + babel-preset-jest: 29.5.0_@babel+core@7.22.20 chalk: 4.1.2 - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 slash: 3.0.0 transitivePeerDependencies: - supports-color @@ -12759,6 +13201,18 @@ packages: webpack: 5.80.0_esbuild@0.17.18 dev: true + /babel-loader/9.1.3_@babel+core@7.22.20: + resolution: {integrity: sha512-xG3ST4DglodGf8qSwv0MdeWLhrDsw/32QMdTO5T1ZIp9gQur0HkCyFs7Awskr10JKXFXwpAhiCuYX5oGXnRGbw==} + engines: {node: '>= 14.15.0'} + peerDependencies: + '@babel/core': ^7.12.0 + webpack: '>=5' + dependencies: + '@babel/core': 7.22.20 + find-cache-dir: 4.0.0 + schema-utils: 4.0.1 + dev: true + /babel-plugin-add-react-displayname/0.0.5: resolution: {integrity: sha512-LY3+Y0XVDYcShHHorshrDbt4KFWL4bSeniCtl4SYZbask+Syngk1uMPCeN9+nSiZo6zX5s0RTq/J9Pnaaf/KHw==} dev: true @@ -12802,8 +13256,8 @@ packages: resolution: {integrity: sha512-zSuuuAlTMT4mzLj2nPnUm6fsE6270vdOfnpbJ+RmruU75UhLFvL0N2NgI7xpeS7NaB6hGqmd5pVpGTDYvi4Q3w==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/template': 7.20.7 - '@babel/types': 7.22.5 + '@babel/template': 7.22.15 + '@babel/types': 7.22.19 '@types/babel__core': 7.1.19 '@types/babel__traverse': 7.18.1 dev: true @@ -12971,35 +13425,35 @@ packages: '@babel/helper-module-imports': 7.18.6 dev: false - /babel-preset-current-node-syntax/1.0.1_@babel+core@7.21.0: + /babel-preset-current-node-syntax/1.0.1_@babel+core@7.22.20: resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.21.0 - '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.21.0 - '@babel/plugin-syntax-bigint': 7.8.3_@babel+core@7.21.0 - '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.21.0 - '@babel/plugin-syntax-import-meta': 7.10.4_@babel+core@7.21.0 - '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.21.0 - '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.21.0 - '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.21.0 - '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.21.0 - '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.21.0 - '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.21.0 - '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.21.0 - '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.21.0 - dev: true - - /babel-preset-jest/29.5.0_@babel+core@7.21.0: + '@babel/core': 7.22.20 + '@babel/plugin-syntax-async-generators': 7.8.4_@babel+core@7.22.20 + '@babel/plugin-syntax-bigint': 7.8.3_@babel+core@7.22.20 + '@babel/plugin-syntax-class-properties': 7.12.13_@babel+core@7.22.20 + '@babel/plugin-syntax-import-meta': 7.10.4_@babel+core@7.22.20 + '@babel/plugin-syntax-json-strings': 7.8.3_@babel+core@7.22.20 + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4_@babel+core@7.22.20 + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3_@babel+core@7.22.20 + '@babel/plugin-syntax-numeric-separator': 7.10.4_@babel+core@7.22.20 + '@babel/plugin-syntax-object-rest-spread': 7.8.3_@babel+core@7.22.20 + '@babel/plugin-syntax-optional-catch-binding': 7.8.3_@babel+core@7.22.20 + '@babel/plugin-syntax-optional-chaining': 7.8.3_@babel+core@7.22.20 + '@babel/plugin-syntax-top-level-await': 7.14.5_@babel+core@7.22.20 + dev: true + + /babel-preset-jest/29.5.0_@babel+core@7.22.20: resolution: {integrity: sha512-JOMloxOqdiBSxMAzjRaH023/vvcaSaec49zvg+2LmNsktC7ei39LTJGw02J+9uUtTZUq6xbLyJ4dxe9sSmIuAg==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} peerDependencies: '@babel/core': ^7.0.0 dependencies: - '@babel/core': 7.21.0 + '@babel/core': 7.22.20 babel-plugin-jest-hoist: 29.5.0 - babel-preset-current-node-syntax: 1.0.1_@babel+core@7.21.0 + babel-preset-current-node-syntax: 1.0.1_@babel+core@7.22.20 dev: true /babel-preset-solid/1.6.9_@babel+core@7.20.12: @@ -14002,7 +14456,6 @@ packages: is-plain-object: 2.0.4 kind-of: 6.0.3 shallow-clone: 3.0.1 - dev: true /clone-response/1.0.2: resolution: {integrity: sha512-yjLXh88P599UOyPTFX0POsd7WxnbsVsGohcwzHOLspIhhpalPw1BcqED8NblyZLKcGrL8dTgMlcaZxV2jAD41Q==} @@ -15790,7 +16243,6 @@ packages: resolution: {integrity: sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==} engines: {node: '>=4'} hasBin: true - dev: true /err-code/2.0.3: resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} @@ -16496,7 +16948,6 @@ packages: /fastest-levenshtein/1.0.16: resolution: {integrity: sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==} engines: {node: '>= 4.9.1'} - dev: true /fastq/1.13.0: resolution: {integrity: sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==} @@ -16733,6 +17184,14 @@ packages: make-dir: 3.1.0 pkg-dir: 4.2.0 + /find-cache-dir/4.0.0: + resolution: {integrity: sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg==} + engines: {node: '>=14.16'} + dependencies: + common-path-prefix: 3.0.0 + pkg-dir: 7.0.0 + dev: true + /find-root/1.1.0: resolution: {integrity: sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==} dev: false @@ -16758,6 +17217,14 @@ packages: locate-path: 6.0.0 path-exists: 4.0.0 + /find-up/6.3.0: + resolution: {integrity: sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + locate-path: 7.2.0 + path-exists: 5.0.0 + dev: true + /find-versions/3.2.0: resolution: {integrity: sha512-P8WRou2S+oe222TOCHitLy8zj+SIsVJh52VP4lvXkaFVnOFFdoWv1H1Jjvel1aI6NCFOAaeAVm8qrI0odiLcww==} engines: {node: '>=6'} @@ -18131,7 +18598,6 @@ packages: dependencies: pkg-dir: 4.2.0 resolve-cwd: 3.0.0 - dev: true /imurmurhash/0.1.4: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} @@ -18269,7 +18735,6 @@ packages: /interpret/2.2.0: resolution: {integrity: sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==} engines: {node: '>= 0.10'} - dev: true /interpret/3.1.1: resolution: {integrity: sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==} @@ -18631,7 +19096,6 @@ packages: engines: {node: '>=0.10.0'} dependencies: isobject: 3.0.1 - dev: true /is-plain-object/5.0.0: resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} @@ -18822,7 +19286,6 @@ packages: /isobject/3.0.1: resolution: {integrity: sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==} engines: {node: '>=0.10.0'} - dev: true /isomorphic-fetch/2.2.1: resolution: {integrity: sha512-9c4TNAKYXM5PRyVcwUZrF3W09nQ+sO7+jydgs4ZGW9dhsLG2VOlISJABombdQqQRXCwuYG3sYV/puGf5rp0qmA==} @@ -18848,7 +19311,7 @@ packages: resolution: {integrity: sha512-6Lthe1hqXHBNsqvgDzGO6l03XNeu3CrG4RqQ1KM9+l5+jNGpEJfIELx1NS3SEHmJQA8np/u+E4EPRKRiu6m19A==} engines: {node: '>=8'} dependencies: - '@babel/core': 7.21.0 + '@babel/core': 7.22.20 '@babel/parser': 7.21.8 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.0 @@ -19008,11 +19471,11 @@ packages: ts-node: optional: true dependencies: - '@babel/core': 7.21.0 + '@babel/core': 7.22.20 '@jest/test-sequencer': 29.5.0 '@jest/types': 29.5.0 '@types/node': 16.11.7 - babel-jest: 29.5.0_@babel+core@7.21.0 + babel-jest: 29.5.0_@babel+core@7.22.20 chalk: 4.1.2 ci-info: 3.3.2 deepmerge: 4.2.2 @@ -19047,11 +19510,11 @@ packages: ts-node: optional: true dependencies: - '@babel/core': 7.21.0 + '@babel/core': 7.22.20 '@jest/test-sequencer': 29.5.0 '@jest/types': 29.5.0 '@types/node': 18.15.11 - babel-jest: 29.5.0_@babel+core@7.21.0 + babel-jest: 29.5.0_@babel+core@7.22.20 chalk: 4.1.2 ci-info: 3.3.2 deepmerge: 4.2.2 @@ -19302,10 +19765,10 @@ packages: resolution: {integrity: sha512-x7Wolra5V0tt3wRs3/ts3S6ciSQVypgGQlJpz2rsdQYoUKxMxPNaoHMGJN6qAuPJqS+2iQ1ZUn5kl7HCyls84g==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} dependencies: - '@babel/core': 7.21.0 + '@babel/core': 7.22.20 '@babel/generator': 7.21.5 - '@babel/plugin-syntax-jsx': 7.18.6_@babel+core@7.21.0 - '@babel/plugin-syntax-typescript': 7.20.0_@babel+core@7.21.0 + '@babel/plugin-syntax-jsx': 7.18.6_@babel+core@7.22.20 + '@babel/plugin-syntax-typescript': 7.20.0_@babel+core@7.22.20 '@babel/traverse': 7.21.5 '@babel/types': 7.22.5 '@jest/expect-utils': 29.5.0 @@ -19313,7 +19776,7 @@ packages: '@jest/types': 29.5.0 '@types/babel__traverse': 7.18.1 '@types/prettier': 2.7.0 - babel-preset-current-node-syntax: 1.0.1_@babel+core@7.21.0 + babel-preset-current-node-syntax: 1.0.1_@babel+core@7.22.20 chalk: 4.1.2 expect: 29.5.0 graceful-fs: 4.2.10 @@ -19604,7 +20067,7 @@ packages: dependencies: universalify: 2.0.0 optionalDependencies: - graceful-fs: 4.2.10 + graceful-fs: 4.2.11 /jsonparse/1.3.1: resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==} @@ -19733,7 +20196,6 @@ packages: /kind-of/6.0.3: resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} engines: {node: '>=0.10.0'} - dev: true /kleur/3.0.3: resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} @@ -20104,6 +20566,13 @@ packages: dependencies: p-locate: 5.0.0 + /locate-path/7.2.0: + resolution: {integrity: sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + p-locate: 6.0.0 + dev: true + /lodash-es/4.17.21: resolution: {integrity: sha512-mKnC+QJ9pWVzv+C4/U3rRsHapFfHvQFoFB92e52xeyGMcX6/OlIl78je1u8vePzYZSkkogMPJ2yjxxsb89cxyw==} @@ -21870,6 +22339,13 @@ packages: dependencies: yocto-queue: 0.1.0 + /p-limit/4.0.0: + resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + yocto-queue: 1.0.0 + dev: true + /p-locate/3.0.0: resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==} engines: {node: '>=6'} @@ -21889,6 +22365,13 @@ packages: dependencies: p-limit: 3.1.0 + /p-locate/6.0.0: + resolution: {integrity: sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + p-limit: 4.0.0 + dev: true + /p-map-series/1.0.0: resolution: {integrity: sha512-4k9LlvY6Bo/1FcIdV33wqZQES0Py+iKISU9Uc8p8AjWoZPnFKMpVIVD3s0EYn4jzLh1I+WeUZkJ0Yoa4Qfw3Kg==} engines: {node: '>=4'} @@ -22144,6 +22627,11 @@ packages: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} + /path-exists/5.0.0: + resolution: {integrity: sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: true + /path-is-absolute/1.0.1: resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} engines: {node: '>=0.10.0'} @@ -22342,6 +22830,13 @@ packages: find-up: 5.0.0 dev: true + /pkg-dir/7.0.0: + resolution: {integrity: sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==} + engines: {node: '>=14.16'} + dependencies: + find-up: 6.3.0 + dev: true + /playwright-core/1.35.0: resolution: {integrity: sha512-muMXyPmIx/2DPrCHOD1H1ePT01o7OdKxKj2ebmCAYvqhUy+Y1bpal7B0rdoxros7YrXI294JT/DWw2LqyiqTPA==} engines: {node: '>=16'} @@ -23744,7 +24239,6 @@ packages: engines: {node: '>= 0.10'} dependencies: resolve: 1.22.2 - dev: true /rechoir/0.8.0: resolution: {integrity: sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==} @@ -24031,7 +24525,6 @@ packages: engines: {node: '>=8'} dependencies: resolve-from: 5.0.0 - dev: true /resolve-from/4.0.0: resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} @@ -24040,7 +24533,6 @@ packages: /resolve-from/5.0.0: resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} engines: {node: '>=8'} - dev: true /resolve-pathname/3.0.0: resolution: {integrity: sha512-C7rARubxI8bXFNB/hqcp/4iUeIXJhJZvFPFPiSPRnhU5UPxzMFIl+2E6yY6c4k9giDJAhtV+enfA+G89N6Csng==} @@ -24745,7 +25237,6 @@ packages: engines: {node: '>=8'} dependencies: kind-of: 6.0.3 - dev: true /shallowequal/1.1.0: resolution: {integrity: sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ==} @@ -26249,7 +26740,7 @@ packages: schema-utils: 3.1.2 serialize-javascript: 6.0.1 terser: 5.17.1 - webpack: 5.76.0 + webpack: 5.76.0_webpack-cli@4.10.0 /terser/5.16.1: resolution: {integrity: sha512-xvQfyfA1ayT0qdK47zskQgRZeWLoOQ8JQ6mIgRGVNwZKdQMU+5FkCBjmv4QjcrTzyZquRw2FVtlJSRUmMKQslw==} @@ -27703,7 +28194,6 @@ packages: rechoir: 0.7.1 webpack: 5.76.0_webpack-cli@4.10.0 webpack-merge: 5.9.0 - dev: true /webpack-dev-middleware/5.3.3: resolution: {integrity: sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==} @@ -27978,7 +28468,6 @@ packages: dependencies: clone-deep: 4.0.1 wildcard: 2.0.0 - dev: true /webpack-sources/2.3.1: resolution: {integrity: sha512-y9EI9AO42JjEcrTJFOYmVywVZdKVUfOvDUPsJea5GIr1JOEGFVqwlY2K098fFoIjOkDzHn2AjRvM8dsBZu+gCA==} @@ -28093,7 +28582,6 @@ packages: - '@swc/core' - esbuild - uglify-js - dev: true /webpack/5.80.0_esbuild@0.17.18: resolution: {integrity: sha512-OIMiq37XK1rWO8mH9ssfFKZsXg4n6klTEDL7S8/HqbAOBBaiy8ABvXvz0dDCXeEF9gqwxSvVk611zFPjS8hJxA==} @@ -28261,7 +28749,6 @@ packages: /wildcard/2.0.0: resolution: {integrity: sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==} - dev: true /window-size/0.1.0: resolution: {integrity: sha512-1pTPQDKTdd61ozlKGNCjhNRd+KPmgLSGa3mZTHoOliaGcESD8G1PXhh7c1fgiPjVbNVfgy2Faw4BI8/m0cC8Mg==} @@ -28602,6 +29089,11 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} + /yocto-queue/1.0.0: + resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} + engines: {node: '>=12.20'} + dev: true + /zod-validation-error/1.2.0_zod@3.21.4: resolution: {integrity: sha512-laJkD/ugwEh8CpuH+xXv5L9Z+RLz3lH8alNxolfaHZJck611OJj97R4Rb+ZqA7WNly2kNtTo4QwjdjXw9scpiw==} engines: {node: ^14.17 || >=16.0.0}