diff --git a/dev/app-main/src/components/constant.tsx b/dev/app-main/src/components/constant.tsx index 92a9185af..ab86874e8 100644 --- a/dev/app-main/src/components/constant.tsx +++ b/dev/app-main/src/components/constant.tsx @@ -36,6 +36,16 @@ export const subAppMenus = [ { path: 'react18/about', title: '关于' }, ], }, + { + key: 'react19', + path: '/react19', + icon: , + title: '【子应用】react19', + routes: [ + { path: 'react19/home', title: '首页' }, + { path: 'react19/about', title: '关于' }, + ], + }, { key: 'vue3', path: '/vue3', diff --git a/dev/app-main/src/constant.ts b/dev/app-main/src/constant.ts index 87a4e0c85..9c1bfefa2 100644 --- a/dev/app-main/src/constant.ts +++ b/dev/app-main/src/constant.ts @@ -38,6 +38,11 @@ export const localApps: AppInfo = [ activeWhen: '/react18', entry: getProxyHost('dev/react18'), }, + { + name: 'react19', + activeWhen: '/react19', + entry: getProxyHost('dev/react19'), + }, { name: 'vue3', activeWhen: '/vue3', diff --git a/dev/app-react-19/.babelrc b/dev/app-react-19/.babelrc new file mode 100644 index 000000000..3b6a9a63a --- /dev/null +++ b/dev/app-react-19/.babelrc @@ -0,0 +1,33 @@ +{ + "presets": [ + "@babel/preset-env", + "@babel/preset-typescript", + [ + "@babel/preset-react", { + "runtime": "automatic" + } + ] + ], + "plugins": [ + "@babel/plugin-syntax-dynamic-import", + [ + "@babel/plugin-transform-runtime", + { + "regenerator": true + } + ], + [ + "@babel/plugin-proposal-decorators", + { + "legacy": true + } + ], + "@babel/plugin-proposal-class-properties", + [ + "@babel/plugin-transform-react-jsx", + { + "runtime": "automatic" + } + ] + ] +} diff --git a/dev/app-react-19/LICENSE b/dev/app-react-19/LICENSE new file mode 100644 index 000000000..c454bffe8 --- /dev/null +++ b/dev/app-react-19/LICENSE @@ -0,0 +1,48 @@ +MIT License + +Copyright (c) 2021 Bytedance Inc. + +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. + + +The code implementation modified from external library are: + +- single-spa + + License (MIT) + + Copyright (c) 2020 single-spa + + 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/dev/app-react-19/package.json b/dev/app-react-19/package.json new file mode 100644 index 000000000..5f591ede5 --- /dev/null +++ b/dev/app-react-19/package.json @@ -0,0 +1,62 @@ +{ + "name": "@garfish-dev/react19", + "private": true, + "dependencies": { + "@garfish/bridge-react-v19": "workspace:*", + "babel-runtime": "^6.26.0", + "history": "^5.1.0", + "react": "19.1.0", + "react-dom": "19.1.0", + "react-router-dom": "6.3.0", + "redux": "^4.1.2", + "typescript": "^4.1.2", + "web-vitals": "^1.1.2", + "mobx": "^6.3.6", + "@arco-design/web-react": "^2.28.1" + }, + "browserslist": { + "production": [ + ">0.2%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 1 chrome version", + "last 1 firefox version", + "last 1 safari version" + ] + }, + "devDependencies": { + "@babel/core": "^7.13.15", + "@babel/plugin-proposal-class-properties": "^7.16.0", + "@babel/plugin-proposal-decorators": "^7.16.0", + "@babel/plugin-transform-react-jsx": "^7.16.0", + "@babel/plugin-transform-runtime": "^7.14.5", + "@babel/preset-env": "^7.13.15", + "@babel/preset-react": "^7.16.0", + "@babel/preset-typescript": "^7.14.5", + "@babel/register": "^7.13.14", + "@babel/runtime": "^7.14.6", + "babel-loader": "^8.1.0", + "babel-register": "^6.26.0", + "cross-env": "^7.0.3", + "css-loader": "^5.2.7", + "file-loader": "^6.2.0", + "html-webpack-plugin": "^5.3.1", + "less": "^3.13.1", + "less-loader": "^5.0.0", + "mini-css-extract-plugin": "^2.4.2", + "style-loader": "^2.0.0", + "url-loader": "^4.1.1", + "webpack": "^5.35.0", + "webpack-cli": "^4.6.0", + "webpack-dev-server": "^4.2.1", + "@uiw/react-md-editor": "3.9.0", + "@pmmmwh/react-refresh-webpack-plugin": "^0.5.4", + "react-refresh": "^0.11.0" + }, + "scripts": { + "start": "cross-env NODE_ENV=development webpack-dev-server --hot", + "build": "cross-env NODE_ENV=production webpack --progress" + } +} diff --git a/dev/app-react-19/public/index.html b/dev/app-react-19/public/index.html new file mode 100644 index 000000000..5f4d800c1 --- /dev/null +++ b/dev/app-react-19/public/index.html @@ -0,0 +1,10 @@ + + + + + app react v19 + + +
+ + diff --git a/dev/app-react-19/src/App.less b/dev/app-react-19/src/App.less new file mode 100644 index 000000000..b07ef864c --- /dev/null +++ b/dev/app-react-19/src/App.less @@ -0,0 +1,58 @@ +@import '../node_modules/@arco-design/web-react/dist/css/index.less'; + +@prefix: sub-app-react16; + +.@{prefix}-layout-content { + .App { + text-align: center; + background-color: #282c34; + font-size: 18px; + overflow: hidden; + color: white; + } + + .App-logo { + height: 200px; + pointer-events: none; + } + + .App ul { + display: inline-block; + list-style: none; + } + + .App li { + display: inline-block; + list-style: none; + padding: 10px; + } + + .App a:visited { + color: #61dafb; + } + + .App a.active { + color: #7fffd4; + } + + @media (prefers-reduced-motion: no-preference) { + .App-logo { + animation: App-logo-spin infinite 20s linear; + } + } + + .click-btn { + color: coral; + cursor: pointer; + margin-top: 6px; + } + + @keyframes App-logo-spin { + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } + } +} diff --git a/dev/app-react-19/src/App.tsx b/dev/app-react-19/src/App.tsx new file mode 100644 index 000000000..25bb7bb6d --- /dev/null +++ b/dev/app-react-19/src/App.tsx @@ -0,0 +1,65 @@ +import { useEffect, useState, createContext } from 'react'; +import { NavLink, Outlet, useLocation } from 'react-router-dom'; +import { AppInfo } from '@garfish/bridge-react-v19'; +import { Layout } from '@arco-design/web-react'; +import logo from './logo.svg'; +import './App.less'; + +export const SubAppContext = createContext({} as AppInfo); +const Content = Layout.Content; + +export const prefixCls = 'sub-app-react19'; + +const App = () => { + const location = useLocation(); + const [isActive, setIsActive] = useState('home'); + + useEffect(() => { + setIsActive(location.pathname.includes('about') ? 'about' : 'home'); + }, [location.pathname]); + + return ( + + {(appInfo) => { + return ( + +
+
+ logo +

+ Thank you for the React applications use garfish. + This is React19. +

+

+ Edit src/App.js and save to reload. +

+ +
    +
  • setIsActive('home')}> + + Home + +
  • +
  • setIsActive('about')}> + + About + +
  • +
+
+ +
+
+ ); + }} +
+ ); +}; + +export default App; diff --git a/dev/app-react-19/src/ErrorBoundary.tsx b/dev/app-react-19/src/ErrorBoundary.tsx new file mode 100644 index 000000000..63c4c6604 --- /dev/null +++ b/dev/app-react-19/src/ErrorBoundary.tsx @@ -0,0 +1,13 @@ +import { Result } from '@arco-design/web-react'; + +const Error = () => { + return ( + + ); +}; + +export default Error; diff --git a/dev/app-react-19/src/PageNotFound.tsx b/dev/app-react-19/src/PageNotFound.tsx new file mode 100644 index 000000000..dfb4fb008 --- /dev/null +++ b/dev/app-react-19/src/PageNotFound.tsx @@ -0,0 +1,8 @@ +import React from 'react'; +import { Result } from '@arco-design/web-react'; + +const PageNotFound = () => { + return ; +}; + +export default PageNotFound; diff --git a/dev/app-react-19/src/index.tsx b/dev/app-react-19/src/index.tsx new file mode 100644 index 000000000..a69b3bb69 --- /dev/null +++ b/dev/app-react-19/src/index.tsx @@ -0,0 +1,38 @@ +import { createRoot } from 'react-dom/client'; +import { reactBridge } from '@garfish/bridge-react-v19'; +import RootComponent from './root'; +import ErrorBoundary from './ErrorBoundary'; + +export const provider = reactBridge({ + el: '#root', //mount node + rootComponent: RootComponent, // a class or stateless function component + errorBoundary: (e: any) => , +}); + +// 在首次加载和执行时会触发该函数 +// export const provider = () => { +// let root = null; +// return { +// render({ basename, dom, store, props }) { +// const container = dom.querySelector('#root'); +// root = createRoot(container!); +// (root as any).render(); +// }, +// destroy({ dom }) { +// (root as any).unmount(); +// }, +// }; +// }; + +// 这能够让子应用独立运行起来,以保证后续子应用能脱离主应用独立运行,方便调试、开发 +if (!window.__GARFISH__) { + const container = document.getElementById('root'); + const root = createRoot(container!); + root.render( + , + ); +} diff --git a/dev/app-react-19/src/logo.svg b/dev/app-react-19/src/logo.svg new file mode 100644 index 000000000..6b60c1042 --- /dev/null +++ b/dev/app-react-19/src/logo.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/dev/app-react-19/src/reportWebVitals.js b/dev/app-react-19/src/reportWebVitals.js new file mode 100644 index 000000000..532f29b0b --- /dev/null +++ b/dev/app-react-19/src/reportWebVitals.js @@ -0,0 +1,13 @@ +const reportWebVitals = (onPerfEntry) => { + if (onPerfEntry && onPerfEntry instanceof Function) { + import('web-vitals').then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => { + getCLS(onPerfEntry); + getFID(onPerfEntry); + getFCP(onPerfEntry); + getLCP(onPerfEntry); + getTTFB(onPerfEntry); + }); + } +}; + +export default reportWebVitals; diff --git a/dev/app-react-19/src/root.tsx b/dev/app-react-19/src/root.tsx new file mode 100644 index 000000000..5278937f7 --- /dev/null +++ b/dev/app-react-19/src/root.tsx @@ -0,0 +1,30 @@ +import { ConfigProvider } from '@arco-design/web-react'; +import { BrowserRouter, Routes, Route } from 'react-router-dom'; +import App from './App'; +import PageNotFound from './PageNotFound'; +import './App.less'; +import { AppInfo } from '@garfish/bridge-react-v18'; + +export const prefixCls = 'sub-app-react16'; + +const Index =
This is Home Page.
; +const About =
This is About Page.
; + +const RootComponent = (appInfo: AppInfo) => { + const routes = ( + + }> + + + } /> + + + ); + return ( + + {routes} + + ); +}; + +export default RootComponent; diff --git a/dev/app-react-19/tsconfig.json b/dev/app-react-19/tsconfig.json new file mode 100644 index 000000000..05ea63b1f --- /dev/null +++ b/dev/app-react-19/tsconfig.json @@ -0,0 +1,41 @@ +{ + "compilerOptions": { + "baseUrl": ".", + "outDir": "build", + "target": "esnext", + "module": "esnext", + "strict": true, + "lib": ["esnext", "dom", "dom.iterable", "scripthost"], + "experimentalDecorators": true, + "sourceMap": true, + "allowJs": false, + "jsx": "react-jsx", + "moduleResolution": "node", + "resolveJsonModule": true, + "forceConsistentCasingInFileNames": true, + "noImplicitReturns": true, + "noImplicitThis": true, + "noImplicitAny": false, + "strictNullChecks": true, + "suppressImplicitAnyIndexErrors": true, + "esModuleInterop": true, + "skipLibCheck": true, + "skipDefaultLibCheck": true, + "isolatedModules": false, + "noUnusedLocals": true, + "plugins": [ + { + "name": "typescript-styled-plugin" + } + ] + }, + "exclude": ["node_modules"], + "include": [ + "src/**/*.ts", + "src/**/*.tsx", + "./typings.d.ts" + ], + "paths": { + "@/*": ["src/*"] + } +} diff --git a/dev/app-react-19/typings.d.ts b/dev/app-react-19/typings.d.ts new file mode 100644 index 000000000..4391afcdc --- /dev/null +++ b/dev/app-react-19/typings.d.ts @@ -0,0 +1,15 @@ +declare interface Window { + Garfish: any; + __GARFISH__: any; +} + +declare module '*.css'; +declare module '*.less'; +declare module '*.png'; +declare module '*.svg' { + export function ReactComponent( + props: React.SVGProps, + ): React.ReactElement; + const url: string; + export default url; +} diff --git a/dev/app-react-19/webpack.config.babel.js b/dev/app-react-19/webpack.config.babel.js new file mode 100644 index 000000000..1039ecb27 --- /dev/null +++ b/dev/app-react-19/webpack.config.babel.js @@ -0,0 +1 @@ +module.exports = require('./webpack.config.js'); diff --git a/dev/app-react-19/webpack.config.js b/dev/app-react-19/webpack.config.js new file mode 100644 index 000000000..fe695667f --- /dev/null +++ b/dev/app-react-19/webpack.config.js @@ -0,0 +1,99 @@ +import { DefinePlugin } from 'webpack'; +import HtmlWebpackPlugin from 'html-webpack-plugin'; +import { getPublicPath, isDevelopment, getPort } from '../util'; +const ReactRefreshWebpackPlugin = require('@pmmmwh/react-refresh-webpack-plugin'); +const appName = 'dev/react19'; + +const webpackConfig = { + devtool: isDevelopment ? 'source-map' : false, + entry: { + main: './src/index.tsx', + }, + output: { + // 开发环境设置 true 将会导致热更新失效 + clean: isDevelopment ? false : true, + filename: '[name].[contenthash].js', + chunkFilename: '[name].[contenthash].js', + // 需要配置成 umd 规范 + libraryTarget: 'umd', + // 修改不规范的代码格式,避免逃逸沙箱 + globalObject: 'window', + // webpack5 此参数不是必须,webpack5 将会直接使用 package.json name 作为唯一值,请确保应用间的 name 各不相同 + // 若为 webpack4,此处应将 chunkLoadingGlobal 改为 jsonpFunction, 并确保每个子应用该值都不相同,否则可能出现 webpack chunk 互相影响的可能 + chunkLoadingGlobal: 'Garfish-demo-react19', + // 保证子应用的资源路径变为绝对路径,避免子应用的相对资源在变为主应用上的相对资源,因为子应用和主应用在同一个文档流,相对路径是相对于主应用而言的 + publicPath: getPublicPath(appName), + }, + node: false, // 避免 global 逃逸 + resolve: { + extensions: ['.tsx', '.ts', '.js', '.json'], + }, + module: { + rules: [ + { + test: /\.(j|t)sx?$/, + exclude: /node_modules/, + loader: 'babel-loader', + options: { + presets: [ + '@babel/preset-typescript', + '@babel/preset-react', + '@babel/preset-env', + ], + }, + }, + { + test: /\.css$|\.less$/, + use: [ + { + loader: 'style-loader', // creates style nodes from JS strings + }, + { + loader: 'css-loader', // translates CSS into CommonJS + }, + { + loader: 'less-loader', + options: { javascriptEnabled: true }, + }, + ], + }, + { + test: /\.(svg|png|jpg|gif|svg)$/, + loader: 'url-loader', + options: { + name: '[name].[ext]?[hash]', + }, + }, + { + test: /\.woff|woff2|eot|ttf$/, + use: [ + { + loader: 'url-loader', + options: { + limit: 100000, + }, + }, + ], + }, + ], + }, + devServer: { + hot: true, + // open: true, + historyApiFallback: true, + port: getPort(appName), + headers: { + 'Access-Control-Allow-Origin': '*', + }, + allowedHosts: 'all', + }, + plugins: [ + new HtmlWebpackPlugin({ + template: './public/index.html', + }), + new DefinePlugin({ + 'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV), + }), + ].concat(isDevelopment ? [new ReactRefreshWebpackPlugin()] : []), +}; +export default webpackConfig; diff --git a/dev/config.json b/dev/config.json index a3b82b1a2..453848a60 100644 --- a/dev/config.json +++ b/dev/config.json @@ -2,7 +2,7 @@ "dev/main": { "pkgName": "@garfish-dev/main", "port": 8090 - }, + }, "dev/react17": { "pkgName": "@garfish-dev/react17", "port": 8091 @@ -10,20 +10,24 @@ "dev/react16": { "pkgName": "@garfish-dev/react16", "port": 8092 - }, - "dev/react18": { + }, + "dev/react18": { "pkgName": "@garfish-dev/react18", "port": 8098 - }, + }, + "dev/react19": { + "pkgName": "@garfish-dev/react19", + "port": 8100 + }, "dev/vue3": { "pkgName": "@garfish-dev/vue3", "port": 8093 - }, + }, "dev/vue2": { "pkgName": "@garfish-dev/vue2", "port": 8094 - }, - "dev/vite": { + }, + "dev/vite": { "pkgName": "@garfish-dev/vite", "port": 8095 }, diff --git a/packages/bridge-react-v19/LICENSE b/packages/bridge-react-v19/LICENSE new file mode 100644 index 000000000..604da0823 --- /dev/null +++ b/packages/bridge-react-v19/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021 Bytedance Inc. + +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/packages/bridge-react-v19/README.md b/packages/bridge-react-v19/README.md new file mode 100644 index 000000000..9a0a2ada5 --- /dev/null +++ b/packages/bridge-react-v19/README.md @@ -0,0 +1,27 @@ +# `@garfish/bridge-react-v19` + +[![NPM version](https://img.shields.io/npm/v/@garfish/bridge-react-v19.svg?style=flat-square)](https://www.npmjs.com/package/@garfish/bridge-react-v19) + +## Usage + +```jsx +// child app +import { reactBridge } from '@garfish/bridge-react-v19'; + +function App() { + return
content
; +} + +export const provider = reactBridge({ + el: '#root', + rootComponent: App, +}); +``` + +## Contributing + +- [Contributing Guide](https://github.com/modern-js-dev/garfish/blob/main/CONTRIBUTING.md) + +## Credit + +- [single-spa](https://github.com/single-spa/single-spa) for community raised a hot wave of micro front-end solutions, and we refer to the implementation of the bridge part in [single-spa](https://github.com/single-spa/single-spa) and we think it is a good design, so we fork the code of the bridge implementation part and make some adjustments for the lifecycles in Garfish. diff --git a/packages/bridge-react-v19/__tests__/reactBridge.spec.ts b/packages/bridge-react-v19/__tests__/reactBridge.spec.ts new file mode 100644 index 000000000..7ba0cb750 --- /dev/null +++ b/packages/bridge-react-v19/__tests__/reactBridge.spec.ts @@ -0,0 +1,313 @@ +// The logic of vue-bridge-test is referenced from single-spa typography +// Because the Garfish lifecycle does not agree with that of single-spa part logical coupling in the framework +// https://github.com/single-spa/single-spa-vue/blob/main/src/single-spa-vue.test.js + +import { reactBridge } from '../src/reactBridge'; +import '@testing-library/jest-dom'; +import assert from 'assert'; + +const domElId = '#sub-app-container'; +const cssSelector = '#app'; + +describe('react-bridge', () => { + let React, + createRoot, + hydrateRoot, + props, + appInfo, + appContainer, + container, + rootComponent, + loadRootComponent, + $el, + rootInstanceMock, + hydrateRootInstanceMock, + $createElement, + $render, + $unmount, + errorBoundary; + + beforeEach(() => { + React = { + createElement: $createElement, + version: '19.1.0', + }; + + createRoot = jest.fn(); + rootInstanceMock = jest.fn(); + rootInstanceMock.render = $render; + rootInstanceMock.unmount = $unmount; + createRoot.mockReturnValue(rootInstanceMock); + + hydrateRoot = jest.fn(); + hydrateRootInstanceMock = jest.fn(); + hydrateRootInstanceMock.render = $render; + hydrateRootInstanceMock.unmount = $unmount; + hydrateRoot.mockReturnValue(hydrateRootInstanceMock); + + container = document.createElement('div'); + container.setAttribute('id', domElId.replace('#', '')); + document.body.appendChild(container); + + appContainer = document.createElement('div'); + container.setAttribute('id', cssSelector.replace('#', '')); + container.appendChild(appContainer); + + $el = '#app2'; + + appInfo = { + appName: 'test-app', + basename: '/demo', + dom: container, + }; + props = { + store: { counter: 100 }, + }; + + $createElement = jest.fn(); + $render = jest.fn(); + $unmount = jest.fn(); + rootComponent = jest.fn(); + loadRootComponent = jest.fn(); + errorBoundary = jest.fn(); + }); + + afterEach(() => { + document.querySelectorAll(cssSelector).forEach((node) => { + node.remove(); + }); + }); + + it('throws an error when required parameters are not provided', () => { + expect(() => reactBridge(null as any)).toThrow(); + expect(() => reactBridge({} as any)).toThrow(); + expect(() => reactBridge({ el: $el } as any)).toThrow(); + expect(() => reactBridge({ createRoot } as any)).toThrow(); + expect(() => reactBridge({ loadRootComponent })).not.toThrow(); + expect(() => reactBridge({ rootComponent })).not.toThrow(); + expect(() => reactBridge({ el: $el, rootComponent })).not.toThrow(); + expect(() => reactBridge({ createRoot, rootComponent })).not.toThrow(); + expect(() => reactBridge({ hydrateRoot, rootComponent })).not.toThrow(); + + expect(() => + reactBridge({ + createRoot, + hydrateRoot, + el: $el, + rootComponent, + }), + ).not.toThrow(); + + expect(() => + reactBridge({ + createRoot, + hydrateRoot, + el: $el, + loadRootComponent, + errorBoundary, + }), + ).not.toThrow(); + }); + + it('throws an error when react version is lower then react v18', async () => { + expect(() => + reactBridge({ + React: { + ...React, + version: '15.2.0', + }, + createRoot, + rootComponent, + }), + ).toThrow(); + }); + + it('throws an error when opts.el is provided and opts.el.dom does not exist in the dom during mount', async () => { + const provider = reactBridge({ + React, + createRoot, + el: '#invalid_app', + rootComponent, + }); + + const lifeCycles = await provider(appInfo, props); + expect(() => lifeCycles.render({ ...appInfo, props })).toThrow(); + }); + + it('throws an error when opts.errorBoundary is provided and the type is not function', async () => { + expect(() => + reactBridge({ + React, + createRoot, + loadRootComponent, + errorBoundary: {} as any, + }), + ).toThrow(); + }); + + it('function called when mounts and unmounts a React component', async () => { + const provider = reactBridge({ + React, + createRoot, + rootComponent, + }); + + const lifeCycles = await provider(appInfo, props); + expect(createRoot).not.toHaveBeenCalled(); + + lifeCycles.render({ ...appInfo, props }); + expect(createRoot).toHaveBeenCalled(); + expect(rootInstanceMock.render).toHaveBeenCalled(); + expect(rootInstanceMock.unmount).not.toHaveBeenCalled(); + + lifeCycles.destroy({ ...appInfo, props }); + expect(rootInstanceMock.unmount).toHaveBeenCalled(); + }); + + // eslint-disable-next-line quotes + it("mounts and unmounts a React component with a 'renderType' of 'hydrate'", async () => { + const provider = reactBridge({ + React, + createRoot, + hydrateRoot, + rootComponent, + renderType: 'hydrate', + }); + + const lifeCycles = await provider(appInfo, props); + expect(hydrateRoot).not.toHaveBeenCalled(); + + lifeCycles.render({ ...appInfo, props }); + expect(hydrateRoot).toHaveBeenCalled(); + + expect(hydrateRootInstanceMock.render).toHaveBeenCalled(); + expect(hydrateRootInstanceMock.unmount).not.toHaveBeenCalled(); + + lifeCycles.destroy({ ...appInfo, props }); + expect(hydrateRootInstanceMock.unmount).toHaveBeenCalled(); + }); + + it('implements a render function for you if you provide loadRootComponent', async () => { + const opts = { + React, + createRoot, + loadRootComponent, + }; + + opts.loadRootComponent.mockReturnValue(Promise.resolve({})); + + const provider = reactBridge(opts); + const lifeCycles = await provider(appInfo, props); + lifeCycles.render({ ...appInfo, props }); + expect(opts.loadRootComponent).toHaveBeenCalled(); + }); + + it('loadRootComponent function will recieve the props provided at mount', async () => { + const opts = { + React, + createRoot, + loadRootComponent, + }; + opts.loadRootComponent.mockReturnValue(Promise.resolve({})); + + const provider = reactBridge({ + React, + createRoot, + loadRootComponent, + }); + + const lifeCycles = await provider(appInfo, props); + lifeCycles.render({ ...appInfo, props }); + expect(loadRootComponent.mock.calls[0][0]).toEqual({ ...appInfo, props }); + expect(loadRootComponent.mock.calls[0][0].appName).toBe('test-app'); + expect(loadRootComponent.mock.calls[0][0].props.store.counter).toBe(100); + + lifeCycles.destroy({ ...appInfo, props }); + }); + + describe('opts.el', () => { + // eslint-disable-next-line quotes + it("mounts into the div you provided in the opts.el if you provide an 'el' in opts", async () => { + const opts = { + React, + createRoot, + rootComponent, + el: '#test_el', + }; + const $testEl = document.createElement('div'); + $testEl.setAttribute('id', 'test_el'); + container.appendChild($testEl); + + const provider = reactBridge(opts); + const lifeCycles = await provider(appInfo, props); + + lifeCycles.render({ ...appInfo, props }); + expect(React.createElement).toHaveBeenCalled(); + expect(document.getElementById('test_el')).toBeInTheDocument(); + expect(document.getElementById('test_el')).not.toBeNull; + + assert(document.getElementById('test_el')); + expect(document.getElementById('test_el')).not.toBeNull; + expect(document.getElementById('test_el')?.children).not.toBeNull; + expect(document.getElementById('app')).toBeNull; + }); + + // eslint-disable-next-line quotes + it("mounts into the garfish-react-bridge div if you don't provide an 'el' in opts", async () => { + const opts = { + React, + createRoot, + rootComponent, + }; + + const provider = reactBridge(opts); + const lifeCycles = await provider(appInfo, props); + + lifeCycles.render({ ...appInfo, props }); + expect(React.createElement).toHaveBeenCalled(); + + assert(document.getElementById('app')); + expect(document.getElementById('app')).not.toBeNull; + expect(document.getElementById('app')?.children).not.toBeNull; + }); + + it('register sync provider', async () => { + const opts = { + React, + createRoot, + rootComponent, + }; + + window.__GARFISH__ = true; + window.__GARFISH_EXPORTS__ = { + provider: null, + } as any; + + reactBridge(opts); + + expect(window.__GARFISH_EXPORTS__.provider).toBeTruthy(); + }); + + it('register async provider', async () => { + const opts = { + React, + createRoot, + rootComponent, + }; + let asyncProvider: any; + + window.__GARFISH__ = true; + window.__GARFISH_EXPORTS__ = { + provider: null, + registerProvider(fn: any) { + asyncProvider = fn; + }, + } as any; + + reactBridge(opts); + + expect(asyncProvider).toBeTruthy(); + expect(window.__GARFISH_EXPORTS__.provider).toBe(null); + }); + }); +}); diff --git a/packages/bridge-react-v19/package.json b/packages/bridge-react-v19/package.json new file mode 100644 index 000000000..1b92478ed --- /dev/null +++ b/packages/bridge-react-v19/package.json @@ -0,0 +1,53 @@ +{ + "name": "@garfish/bridge-react-v19", + "version": "0.0.1", + "description": "garfish bridge for react v19", + "keywords": [ + "garfish", + "micro frontend" + ], + "files": [ + "dist" + ], + "author": "rain120 <1085131904@qq.com>", + "homepage": "https://github.com/bytedance/garfish", + "license": "MIT", + "repository": { + "type": "git", + "url": "git+https://github.com/bytedance/garfish.git" + }, + "bugs": { + "url": "https://github.com/bytedance/garfish/issues" + }, + "exports": { + ".": { + "types": "./dist/index.d.ts", + "import": "./dist/esm/index.js", + "require": "./dist/index.js" + }, + "./*": "./*" + }, + "main": "dist/index.js", + "module": "dist/esm/index.js", + "types": "dist/index.d.ts", + "scripts": { + "build": "rimraf dist && tsup src/index.ts", + "dev": "cross-env WATCH=true tsup src/index.ts" + }, + "dependencies": { + "@garfish/utils": "workspace:*" + }, + "devDependencies": { + "react": "19.1.0", + "react-dom": "19.1.0" + }, + "peerDependencies": { + "react": "=19", + "react-dom": "=19" + }, + "publishConfig": { + "registry": "https://registry.npmjs.org", + "access": "public" + }, + "gitHead": "da33dd16bb9e99588f34079f8b961d0cf9f059fc" +} diff --git a/packages/bridge-react-v19/src/index.ts b/packages/bridge-react-v19/src/index.ts new file mode 100644 index 000000000..3fc9ad40f --- /dev/null +++ b/packages/bridge-react-v19/src/index.ts @@ -0,0 +1,2 @@ +export { reactBridge } from './reactBridge'; +export type { AppInfo } from './types'; diff --git a/packages/bridge-react-v19/src/reactBridge.ts b/packages/bridge-react-v19/src/reactBridge.ts new file mode 100644 index 000000000..a06eaa4cb --- /dev/null +++ b/packages/bridge-react-v19/src/reactBridge.ts @@ -0,0 +1,306 @@ +// The logic of reactBridge is referenced from single-spa typography +// Because the Garfish lifecycle does not agree with that of single-spa part logical coupling in the framework +// https://github.com/single-spa/single-spa-react/blob/main/src/single-spa-react.js + +import * as React from 'react'; +import { createRoot, hydrateRoot, Root } from 'react-dom/client'; +import type { UserOptions, PropsInfo } from './types'; +import { warn } from '@garfish/utils'; + +type typeReact = typeof React; + +type Options = UserOptions< + typeof React, + typeof createRoot, + typeof hydrateRoot, + Root, + any, + React.ReactNode +>; + +const defaultOpts = { + // required - one or the other or both + rootComponent: undefined, + loadRootComponent: undefined, + + // optional opts + renderType: undefined, + errorBoundary: undefined, + el: undefined, + canUpdate: true, // by default, allow parcels created with garfish-react-bridge to be updated + suppressComponentDidCatchWarning: false, + domElements: {}, + renderResults: {}, + updateResolves: {}, +}; + +declare const __GARFISH_EXPORTS__: { + provider: Object; + registerProvider?: (provider: any) => void; +}; + +declare global { + interface Window { + __GARFISH__: boolean; + } +} + +export function reactBridge(this: any, userOpts: Options) { + if (typeof userOpts !== 'object') { + throw new Error('garfish-react-bridge requires a configuration object'); + } + + const opts: Options = { + ...defaultOpts, + ...userOpts, + }; + + opts.React = opts.React || React; + opts.createRoot = opts.createRoot || createRoot; + opts.hydrateRoot = opts.hydrateRoot || hydrateRoot; + + if (!opts.rootComponent && !opts.loadRootComponent) { + throw new Error( + 'garfish-react-bridge must be passed opts.rootComponent or opts.loadRootComponent', + ); + } + + if (opts.errorBoundary && typeof opts.errorBoundary !== 'function') { + throw Error( + 'The errorBoundary opt for garfish-react-bridge must either be omitted or be a function that returns React elements', + ); + } + if (!atLeastReact19(opts.React)) { + throw Error( + 'Please make sure than the react version is higher than or equal to v19.', + ); + } + + const providerLifeCycle = { + render: (appInfo: PropsInfo) => mount.call(this, opts, appInfo), + destroy: (appInfo: PropsInfo) => unmount.call(this, opts, appInfo), + // update: (appInfo: PropsInfo) => + // opts.canUpdate && update.call(this, opts, appInfo), + }; + + const provider = async function (this: any, appInfo, props) { + await bootstrap.call(this, opts, appInfo, props); + return providerLifeCycle; + }; + + if ( + window.__GARFISH__ && + typeof __GARFISH_EXPORTS__ === 'object' && + __GARFISH_EXPORTS__ + ) { + if (__GARFISH_EXPORTS__.registerProvider) { + __GARFISH_EXPORTS__.registerProvider(provider); + } else { + __GARFISH_EXPORTS__.provider = provider; + } + } + return provider; +} + +function bootstrap(opts: Options, appInfo, props) { + if (opts.loadRootComponent) { + // They passed a promise that resolves with the react component. Wait for it to resolve before mounting + return opts + .loadRootComponent({ + ...appInfo, + props, + }) + .then((resolvedComponent) => { + opts.rootComponent = resolvedComponent; + }); + } else { + // This is a class or stateless function component + return Promise.resolve(); + } +} + +function mount(opts: Options, appInfo: PropsInfo) { + if ( + !opts.suppressComponentDidCatchWarning && + atLeastReact18(opts.React) && + !opts.errorBoundary + ) { + if (!opts.rootComponent.prototype) { + warn( + `garfish-react-bridge: ${appInfo.appName}'s rootComponent does not implement an error boundary. If using a functional component, consider providing an opts.errorBoundary to reactBridge(opts).`, + ); + } else if (!opts.rootComponent.prototype.componentDidCatch) { + warn( + `garfish-react-bridge: ${appInfo.appName}'s rootComponent should implement componentDidCatch to avoid accidentally unmounting the entire garfish application.`, + ); + } + } + + const elementToRender = getElementToRender(opts, appInfo); + const domElement = chooseDomElementGetter(opts, appInfo); + const renderResult = callCreateRoot({ + elementToRender, + domElement, + opts, + }); + + if (opts.domElements) { + opts.domElements[appInfo.appName] = domElement; + } + if (opts.renderResults) { + opts.renderResults[appInfo.appName] = renderResult; + } +} + +function unmount(opts: Options, appInfo: PropsInfo) { + if (opts.renderResults) { + const root = opts.renderResults[appInfo.appName]; + root.unmount(); + opts.domElements && delete opts.domElements[appInfo.appName]; + delete opts.renderResults[appInfo.appName]; + } +} + +// function update(opts: Options, appInfo: PropsInfo) { +// return new Promise((resolve) => { +// if (!opts.updateResolves[appInfo.appName]) { +// opts.updateResolves[appInfo.appName] = []; +// } + +// opts.updateResolves[appInfo.appName].push(resolve); +// const elementToRender = getElementToRender(opts, appInfo); +// const renderRoot = opts.renderResults[appInfo.appName]; +// renderRoot.render(elementToRender); +// }); +// } + +function atLeastReact18(React?: typeReact) { + if ( + React && + typeof React.version === 'string' && + React.version.indexOf('.') >= 0 + ) { + const majorVersionString = React.version.split('.')[0]; + try { + return Number(majorVersionString) >= 18; + } catch (err) { + return false; + } + } else { + return false; + } +} + +function atLeastReact19(React?: typeReact) { + if ( + React && + typeof React.version === 'string' && + React.version.indexOf('.') >= 0 + ) { + const majorVersionString = React.version.split('.')[0]; + try { + return Number(majorVersionString) >= 19; + } catch (err) { + return false; + } + } else { + return false; + } +} + +function callCreateRoot({ opts, elementToRender, domElement }) { + const renderType = + typeof opts.renderType === 'function' ? opts.renderType() : opts.renderType; + + let root; + if (renderType === 'hydrate') { + root = opts.hydrateRoot(elementToRender, domElement); + root.render(elementToRender); + } else { + // default to this if 'renderType' is null or doesn't match the other options + root = opts.createRoot(domElement); + root.render(elementToRender); + } + + return root; +} + +function getElementToRender(opts: Options, appInfo: PropsInfo) { + const rootComponentElement = opts.React?.createElement( + opts.rootComponent as any, + appInfo, + ); + + let elementToRender = rootComponentElement; + + if (opts.errorBoundary) { + elementToRender = opts.React?.createElement( + createErrorBoundary(opts) as any, + appInfo, + elementToRender, + ); + } + return elementToRender; +} + +function createErrorBoundary(opts: Options) { + // Avoiding babel output for class syntax and super() + // to avoid bloat + function GarfishSubAppReactErrorBoundary(this: any, appInfo: PropsInfo) { + // super + opts.React?.Component.apply(this, arguments); + + this.state = { + caughtError: null, + caughtErrorInfo: null, + }; + + ( + GarfishSubAppReactErrorBoundary as any + ).displayName = `ReactBridgeReactErrorBoundary(${appInfo.appName})`; + } + + GarfishSubAppReactErrorBoundary.prototype = + opts.React && Object.create(opts.React.Component.prototype); + + GarfishSubAppReactErrorBoundary.prototype.render = function () { + if (this.state.caughtError) { + const errorBoundary = opts.errorBoundary; + + return errorBoundary && errorBoundary(this.state.caughtError, this.props); + } else { + return this.props.children; + } + }; + + GarfishSubAppReactErrorBoundary.prototype.componentDidCatch = function ( + err, + info, + ) { + this.setState({ + caughtError: err, + caughtErrorInfo: info, + }); + }; + + return GarfishSubAppReactErrorBoundary; +} + +function chooseDomElementGetter(opts: Options, appInfo: PropsInfo) { + const { dom: container } = appInfo; + let el; + if (typeof opts.el === 'string') { + el = container.querySelector(opts.el); + } else { + el = container; + } + + if (!(el instanceof HTMLElement)) { + throw Error( + `react bridge's dom-element-getter-helpers: el is an invalid dom element for application'${ + appInfo.appName + }'. Expected HTMLElement, received ${typeof el}`, + ); + } + return el; +} diff --git a/packages/bridge-react-v19/src/types.d.ts b/packages/bridge-react-v19/src/types.d.ts new file mode 100644 index 000000000..964c1f55e --- /dev/null +++ b/packages/bridge-react-v19/src/types.d.ts @@ -0,0 +1,51 @@ +export type PropsInfo = { + appName: string; + dom: Element | ShadowRoot | Document; + basename: string; + appRenderInfo: Record; + props: Record; +}; + +export type AppInfo = PropsInfo; + +export type LoadRootComponent = (opts: PropsInfo) => Promise; + +export type TypeComponent = + | { + rootComponent: T; + loadRootComponent?: LoadRootComponent; + } + | { + rootComponent?: T; + loadRootComponent: LoadRootComponent; + }; + +export type ErrorBoundary = ( + caughtError: Error | any, + props: any, +) => T | null; + +export type RenderTypes = + | 'createRoot' + | 'unstable_createRoot' + | 'createBlockingRoot' + | 'unstable_createBlockingRoot' + | 'render' + | 'hydrate'; + +export type OptionalType = { + React: T; + createRoot: U; + hydrateRoot: H; + errorBoundary: ErrorBoundary; + renderResults: Record; + renderType: RenderTypes | (() => RenderTypes); + el: string; + canUpdate: boolean; // by default, allow parcels created with garfish-react-bridge to be updated + suppressComponentDidCatchWarning: boolean; + domElements: Record; + updateResolves: Record>; +}; + +export type UserOptions = TypeComponent & + Partial>; diff --git a/packages/bridge-react-v19/tsup.config.ts b/packages/bridge-react-v19/tsup.config.ts new file mode 100644 index 000000000..c4655d114 --- /dev/null +++ b/packages/bridge-react-v19/tsup.config.ts @@ -0,0 +1,4 @@ +import pkg from './package.json'; +import { baseTsup } from '../../tsup.config'; + +export const tsup = baseTsup(pkg); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index eae2cad3d..71196fcd4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1,4 +1,4 @@ -lockfileVersion: 5.3 +lockfileVersion: 5.4 overrides: esbuild: 0.14.22 @@ -63,8 +63,8 @@ importers: '@types/jasmine': 3.10.18 '@types/jest': 27.0.2 '@types/node': 12.20.55 - '@typescript-eslint/eslint-plugin': 5.4.0_5cb9d12ba4cd7885c166a557f6a0199b - '@typescript-eslint/parser': 5.4.0_eslint@7.32.0+typescript@4.6.4 + '@typescript-eslint/eslint-plugin': 5.4.0_ls45ck5ezv4ilqlguvl7niaztm + '@typescript-eslint/parser': 5.4.0_e4zyhrvfnqudwdx5bevnvkluy4 axios: 0.24.0 babel-polyfill: 6.26.0 chalk: 4.1.2 @@ -91,7 +91,7 @@ importers: prettier-eslint-cli: 5.0.1 rimraf: 3.0.2 semver: 7.7.2 - ts-jest: 27.0.7_af55d4cbc787ed4cc2d7ab1ebb0a0b8a + ts-jest: 27.0.7_v5k5js6hq7wuzqwxvmplwcqlri tslib: 2.3.1 tsup: 5.7.2_typescript@4.6.4 typescript: 4.6.4 @@ -136,25 +136,25 @@ importers: zone.js: 0.10.3 dependencies: '@angular/animations': 13.2.4_@angular+core@13.2.4 - '@angular/common': 13.2.4_@angular+core@13.2.4+rxjs@6.6.7 + '@angular/common': 13.2.4_pqxaee6iec7l3sirejczfyzsde '@angular/core': 13.2.4_rxjs@6.6.7+zone.js@0.10.3 - '@angular/forms': 13.2.4_78e8f54f4b7d4eb9dc979bb523a2106c - '@angular/platform-browser': 13.2.4_c32bbd9c696d1f00f3275fe5fdf76654 - '@angular/platform-browser-dynamic': 13.2.4_98e1c8b4efa66ebacfe1bdf50b64dc0f - '@angular/router': 13.2.4_78e8f54f4b7d4eb9dc979bb523a2106c + '@angular/forms': 13.2.4_pdupkt2lpvhltxexto2shiqqnq + '@angular/platform-browser': 13.2.4_ymv33hdjnupqb4zhl7s7353gkq + '@angular/platform-browser-dynamic': 13.2.4_tdq4rnhpuzxlvt7bxx2qwzg4b4 + '@angular/router': 13.2.4_pdupkt2lpvhltxexto2shiqqnq rxjs: 6.6.7 tslib: 2.3.1 zone.js: 0.10.3 devDependencies: - '@angular-builders/custom-webpack': 13.1.0_ff77c83933f2e4de9ef567d09e80cad9 - '@angular-devkit/build-angular': 13.3.11_95387d0f0cbecb06fbe15b0a7fb69ee9 + '@angular-builders/custom-webpack': 13.1.0_v32iakm4necosqlnffo5c6akwa + '@angular-devkit/build-angular': 13.3.11_h2chezy3wgvfe6prav6uk6dymu '@angular/cli': 13.3.11 '@angular/compiler': 13.4.0 - '@angular/compiler-cli': 13.4.0_8bfaebc4ac9a2d191bac49412227a952 + '@angular/compiler-cli': 13.4.0_rp5oxrfmtiwrsg5mjfasej5jki '@types/jasmine': 3.10.18 '@types/jasminewd2': 2.0.13 '@types/node': 12.20.55 - codelyzer: 6.0.2_tslint@6.1.3 + codelyzer: 6.0.2_dq7hearxic3slctgwagd6bnwpa html-webpack-plugin: 5.6.3_webpack@5.100.2 jasmine-core: 3.6.0 jasmine-spec-reporter: 5.0.2 @@ -162,12 +162,12 @@ importers: karma-chrome-launcher: 3.2.0 karma-coverage-istanbul-reporter: 3.0.3 karma-jasmine: 4.0.2_karma@5.2.3 - karma-jasmine-html-reporter: 1.7.0_83b524e6b05909328d7801c9bc9b7922 + karma-jasmine-html-reporter: 1.7.0_qo2sjzvqleetfdlyahe3zg3zei protractor: 7.0.0 ts-node: 8.10.2_typescript@4.4.3 tslint: 6.1.3_typescript@4.4.3 typescript: 4.4.3 - webpack: 5.100.2_@swc+core@1.13.2 + webpack: 5.100.2 dev/app-esm: specifiers: @@ -219,19 +219,19 @@ importers: webpack-cli: ^4.6.0 webpack-dev-server: ^4.2.1 dependencies: - '@arco-design/web-react': 2.66.2_react-dom@17.0.2+react@17.0.2 + '@arco-design/web-react': 2.66.2_sfoxds7t5ydpegc3knd667wn6m '@garfish/css-scope': link:../../packages/css-scope '@garfish/es-module': link:../../packages/es-module - '@uiw/react-md-editor': 3.25.6_react-dom@17.0.2+react@17.0.2 + '@uiw/react-md-editor': 3.25.6_sfoxds7t5ydpegc3knd667wn6m babel-runtime: 6.26.0 garfish: link:../../packages/garfish history: 5.3.0 mobx: 6.13.7 - mobx-react: 7.6.0_823aee0b6ad81eb6055e2299c84e0cfd - mobx-react-lite: 3.4.3_823aee0b6ad81eb6055e2299c84e0cfd + mobx-react: 7.6.0_qi5o4c3k3aplmbk6ekm4qtqm7u + mobx-react-lite: 3.4.3_qi5o4c3k3aplmbk6ekm4qtqm7u react: 17.0.2 react-dom: 17.0.2_react@17.0.2 - react-router-dom: 6.30.1_react-dom@17.0.2+react@17.0.2 + react-router-dom: 6.30.1_sfoxds7t5ydpegc3knd667wn6m redux: 4.2.1 typescript: 4.9.5 devDependencies: @@ -245,22 +245,22 @@ importers: '@babel/preset-typescript': 7.27.1_@babel+core@7.28.0 '@babel/register': 7.27.1_@babel+core@7.28.0 '@babel/runtime': 7.28.2 - '@pmmmwh/react-refresh-webpack-plugin': 0.5.17_325577fcdd1dc632e2708ed34b67deaf - babel-loader: 8.4.1_1f04fbb924cd1fb984eb862020a49672 + '@pmmmwh/react-refresh-webpack-plugin': 0.5.17_gjkxp7g5dxddfytqr3juwz66v4 + babel-loader: 8.4.1_d4cpxojezup3tbhlqyqcbjewoi babel-register: 6.26.0 cross-env: 7.0.3 css-loader: 5.2.7_webpack@5.100.2 file-loader: 6.2.0_webpack@5.100.2 html-webpack-plugin: 5.6.3_webpack@5.100.2 less: 3.13.1 - less-loader: 5.0.0_less@3.13.1+webpack@5.100.2 + less-loader: 5.0.0_plbcidfwhrv3gnbjs3auswajau mini-css-extract-plugin: 2.9.2_webpack@5.100.2 react-refresh: 0.11.0 style-loader: 2.0.0_webpack@5.100.2 - url-loader: 4.1.1_7dd85ce9aa6ee9f21630ee3b2a7ea123 - webpack: 5.100.2_e895a1b7cf9a7664b898a75f8f813ceb - webpack-cli: 4.10.0_3497eda2b4c6c624c213829ca27e2a7e - webpack-dev-server: 4.15.2_490d0688265d0e6d0d10495397f9e4cc + url-loader: 4.1.1_pxmfz2nkn3u7efrq5y5su7vbem + webpack: 5.100.2_webpack-cli@4.10.0 + webpack-cli: 4.10.0_gsl63ivuy3dcjqqtqkoke7rkpy + webpack-dev-server: 4.15.2_jegqncbgluhg2diqjfjzp6pezq dev/app-react-16: specifiers: @@ -303,8 +303,8 @@ importers: webpack-cli: ^4.6.0 webpack-dev-server: ^4.2.1 dependencies: - '@arco-design/web-react': 2.66.2_react-dom@16.14.0+react@16.14.0 - '@garfish/bridge-react': file:packages/bridge-react_react-dom@16.14.0+react@16.14.0 + '@arco-design/web-react': 2.66.2_wcqkhtmu7mswc6yz4uyexck3ty + '@garfish/bridge-react': file:packages/bridge-react_wcqkhtmu7mswc6yz4uyexck3ty babel-runtime: 6.26.0 history: 5.3.0 react: 16.14.0 @@ -324,8 +324,8 @@ importers: '@babel/preset-typescript': 7.27.1_@babel+core@7.28.0 '@babel/register': 7.27.1_@babel+core@7.28.0 '@babel/runtime': 7.28.2 - '@pmmmwh/react-refresh-webpack-plugin': 0.5.17_325577fcdd1dc632e2708ed34b67deaf - babel-loader: 8.4.1_1f04fbb924cd1fb984eb862020a49672 + '@pmmmwh/react-refresh-webpack-plugin': 0.5.17_gjkxp7g5dxddfytqr3juwz66v4 + babel-loader: 8.4.1_d4cpxojezup3tbhlqyqcbjewoi babel-register: 6.26.0 copy-webpack-plugin: 10.2.3_webpack@5.100.2 cross-env: 7.0.3 @@ -333,15 +333,15 @@ importers: file-loader: 6.2.0_webpack@5.100.2 html-webpack-plugin: 5.6.3_webpack@5.100.2 less: 3.13.1 - less-loader: 5.0.0_less@3.13.1+webpack@5.100.2 + less-loader: 5.0.0_plbcidfwhrv3gnbjs3auswajau mini-css-extract-plugin: 2.9.2_webpack@5.100.2 react-refresh: 0.11.0 - react-svg: 15.1.9_react-dom@16.14.0+react@16.14.0 + react-svg: 15.1.9_wcqkhtmu7mswc6yz4uyexck3ty style-loader: 2.0.0_webpack@5.100.2 - url-loader: 4.1.1_7dd85ce9aa6ee9f21630ee3b2a7ea123 - webpack: 5.100.2_e895a1b7cf9a7664b898a75f8f813ceb - webpack-cli: 4.10.0_3497eda2b4c6c624c213829ca27e2a7e - webpack-dev-server: 4.15.2_490d0688265d0e6d0d10495397f9e4cc + url-loader: 4.1.1_pxmfz2nkn3u7efrq5y5su7vbem + webpack: 5.100.2_webpack-cli@4.10.0 + webpack-cli: 4.10.0_gsl63ivuy3dcjqqtqkoke7rkpy + webpack-dev-server: 4.15.2_jegqncbgluhg2diqjfjzp6pezq dependenciesMeta: '@garfish/bridge-react': injected: true @@ -387,14 +387,14 @@ importers: webpack-cli: ^4.6.0 webpack-dev-server: ^4.2.1 dependencies: - '@arco-design/web-react': 2.66.2_react-dom@17.0.2+react@17.0.2 - '@garfish/bridge-react': file:packages/bridge-react_react-dom@17.0.2+react@17.0.2 + '@arco-design/web-react': 2.66.2_sfoxds7t5ydpegc3knd667wn6m + '@garfish/bridge-react': file:packages/bridge-react_sfoxds7t5ydpegc3knd667wn6m babel-runtime: 6.26.0 history: 5.3.0 mobx: 6.13.7 react: 17.0.2 react-dom: 17.0.2_react@17.0.2 - react-router-dom: 6.30.1_react-dom@17.0.2+react@17.0.2 + react-router-dom: 6.30.1_sfoxds7t5ydpegc3knd667wn6m redux: 4.2.1 typescript: 4.9.5 web-vitals: 1.1.2 @@ -409,23 +409,23 @@ importers: '@babel/preset-typescript': 7.27.1_@babel+core@7.28.0 '@babel/register': 7.27.1_@babel+core@7.28.0 '@babel/runtime': 7.28.2 - '@pmmmwh/react-refresh-webpack-plugin': 0.5.17_325577fcdd1dc632e2708ed34b67deaf - '@uiw/react-md-editor': 3.9.0_react-dom@17.0.2+react@17.0.2 - babel-loader: 8.4.1_1f04fbb924cd1fb984eb862020a49672 + '@pmmmwh/react-refresh-webpack-plugin': 0.5.17_gjkxp7g5dxddfytqr3juwz66v4 + '@uiw/react-md-editor': 3.9.0_sfoxds7t5ydpegc3knd667wn6m + babel-loader: 8.4.1_d4cpxojezup3tbhlqyqcbjewoi babel-register: 6.26.0 cross-env: 7.0.3 css-loader: 5.2.7_webpack@5.100.2 file-loader: 6.2.0_webpack@5.100.2 html-webpack-plugin: 5.6.3_webpack@5.100.2 less: 3.13.1 - less-loader: 5.0.0_less@3.13.1+webpack@5.100.2 + less-loader: 5.0.0_plbcidfwhrv3gnbjs3auswajau mini-css-extract-plugin: 2.9.2_webpack@5.100.2 react-refresh: 0.11.0 style-loader: 2.0.0_webpack@5.100.2 - url-loader: 4.1.1_7dd85ce9aa6ee9f21630ee3b2a7ea123 - webpack: 5.100.2_e895a1b7cf9a7664b898a75f8f813ceb - webpack-cli: 4.10.0_3497eda2b4c6c624c213829ca27e2a7e - webpack-dev-server: 4.15.2_490d0688265d0e6d0d10495397f9e4cc + url-loader: 4.1.1_pxmfz2nkn3u7efrq5y5su7vbem + webpack: 5.100.2_webpack-cli@4.10.0 + webpack-cli: 4.10.0_gsl63ivuy3dcjqqtqkoke7rkpy + webpack-dev-server: 4.15.2_jegqncbgluhg2diqjfjzp6pezq dependenciesMeta: '@garfish/bridge-react': injected: true @@ -471,14 +471,14 @@ importers: webpack-cli: ^4.6.0 webpack-dev-server: ^4.2.1 dependencies: - '@arco-design/web-react': 2.66.2_react-dom@18.1.0+react@18.1.0 + '@arco-design/web-react': 2.66.2_ef5jwxihqo6n7gxfmzogljlgcm '@garfish/bridge-react-v18': link:../../packages/bridge-react-v18 babel-runtime: 6.26.0 history: 5.3.0 mobx: 6.13.7 react: 18.1.0 react-dom: 18.1.0_react@18.1.0 - react-router-dom: 6.3.0_react-dom@18.1.0+react@18.1.0 + react-router-dom: 6.3.0_ef5jwxihqo6n7gxfmzogljlgcm redux: 4.2.1 typescript: 4.9.5 web-vitals: 1.1.2 @@ -493,23 +493,104 @@ importers: '@babel/preset-typescript': 7.27.1_@babel+core@7.28.0 '@babel/register': 7.27.1_@babel+core@7.28.0 '@babel/runtime': 7.28.2 - '@pmmmwh/react-refresh-webpack-plugin': 0.5.17_325577fcdd1dc632e2708ed34b67deaf - '@uiw/react-md-editor': 3.9.0_react-dom@18.1.0+react@18.1.0 - babel-loader: 8.4.1_1f04fbb924cd1fb984eb862020a49672 + '@pmmmwh/react-refresh-webpack-plugin': 0.5.17_gjkxp7g5dxddfytqr3juwz66v4 + '@uiw/react-md-editor': 3.9.0_ef5jwxihqo6n7gxfmzogljlgcm + babel-loader: 8.4.1_d4cpxojezup3tbhlqyqcbjewoi babel-register: 6.26.0 cross-env: 7.0.3 css-loader: 5.2.7_webpack@5.100.2 file-loader: 6.2.0_webpack@5.100.2 html-webpack-plugin: 5.6.3_webpack@5.100.2 less: 3.13.1 - less-loader: 5.0.0_less@3.13.1+webpack@5.100.2 + less-loader: 5.0.0_plbcidfwhrv3gnbjs3auswajau mini-css-extract-plugin: 2.9.2_webpack@5.100.2 react-refresh: 0.11.0 style-loader: 2.0.0_webpack@5.100.2 - url-loader: 4.1.1_7dd85ce9aa6ee9f21630ee3b2a7ea123 - webpack: 5.100.2_e895a1b7cf9a7664b898a75f8f813ceb - webpack-cli: 4.10.0_3497eda2b4c6c624c213829ca27e2a7e - webpack-dev-server: 4.15.2_490d0688265d0e6d0d10495397f9e4cc + url-loader: 4.1.1_pxmfz2nkn3u7efrq5y5su7vbem + webpack: 5.100.2_webpack-cli@4.10.0 + webpack-cli: 4.10.0_gsl63ivuy3dcjqqtqkoke7rkpy + webpack-dev-server: 4.15.2_jegqncbgluhg2diqjfjzp6pezq + + dev/app-react-19: + specifiers: + '@arco-design/web-react': ^2.28.1 + '@babel/core': ^7.13.15 + '@babel/plugin-proposal-class-properties': ^7.16.0 + '@babel/plugin-proposal-decorators': ^7.16.0 + '@babel/plugin-transform-react-jsx': ^7.16.0 + '@babel/plugin-transform-runtime': ^7.14.5 + '@babel/preset-env': ^7.13.15 + '@babel/preset-react': ^7.16.0 + '@babel/preset-typescript': ^7.14.5 + '@babel/register': ^7.13.14 + '@babel/runtime': ^7.14.6 + '@garfish/bridge-react-v19': workspace:* + '@pmmmwh/react-refresh-webpack-plugin': ^0.5.4 + '@uiw/react-md-editor': 3.9.0 + babel-loader: ^8.1.0 + babel-register: ^6.26.0 + babel-runtime: ^6.26.0 + cross-env: ^7.0.3 + css-loader: ^5.2.7 + file-loader: ^6.2.0 + history: ^5.1.0 + html-webpack-plugin: ^5.3.1 + less: ^3.13.1 + less-loader: ^5.0.0 + mini-css-extract-plugin: ^2.4.2 + mobx: ^6.3.6 + react: 19.1.0 + react-dom: 19.1.0 + react-refresh: ^0.11.0 + react-router-dom: 6.3.0 + redux: ^4.1.2 + style-loader: ^2.0.0 + typescript: ^4.1.2 + url-loader: ^4.1.1 + web-vitals: ^1.1.2 + webpack: ^5.35.0 + webpack-cli: ^4.6.0 + webpack-dev-server: ^4.2.1 + dependencies: + '@arco-design/web-react': 2.66.2_j6k6oay3ugsr56slyfvma2drry + '@garfish/bridge-react-v19': link:../../packages/bridge-react-v19 + babel-runtime: 6.26.0 + history: 5.3.0 + mobx: 6.13.7 + react: 19.1.0 + react-dom: 19.1.0_react@19.1.0 + react-router-dom: 6.3.0_j6k6oay3ugsr56slyfvma2drry + redux: 4.2.1 + typescript: 4.6.4 + web-vitals: 1.1.2 + devDependencies: + '@babel/core': 7.28.0 + '@babel/plugin-proposal-class-properties': 7.18.6_@babel+core@7.28.0 + '@babel/plugin-proposal-decorators': 7.28.0_@babel+core@7.28.0 + '@babel/plugin-transform-react-jsx': 7.27.1_@babel+core@7.28.0 + '@babel/plugin-transform-runtime': 7.28.0_@babel+core@7.28.0 + '@babel/preset-env': 7.28.0_@babel+core@7.28.0 + '@babel/preset-react': 7.27.1_@babel+core@7.28.0 + '@babel/preset-typescript': 7.27.1_@babel+core@7.28.0 + '@babel/register': 7.27.1_@babel+core@7.28.0 + '@babel/runtime': 7.28.2 + '@pmmmwh/react-refresh-webpack-plugin': 0.5.17_gjkxp7g5dxddfytqr3juwz66v4 + '@uiw/react-md-editor': 3.9.0_j6k6oay3ugsr56slyfvma2drry + babel-loader: 8.4.1_d4cpxojezup3tbhlqyqcbjewoi + babel-register: 6.26.0 + cross-env: 7.0.3 + css-loader: 5.2.7_webpack@5.100.2 + file-loader: 6.2.0_webpack@5.100.2 + html-webpack-plugin: 5.6.3_webpack@5.100.2 + less: 3.13.1 + less-loader: 5.0.0_plbcidfwhrv3gnbjs3auswajau + mini-css-extract-plugin: 2.9.2_webpack@5.100.2 + react-refresh: 0.11.0 + style-loader: 2.0.0_webpack@5.100.2 + url-loader: 4.1.1_pxmfz2nkn3u7efrq5y5su7vbem + webpack: 5.100.2_webpack-cli@4.10.0 + webpack-cli: 4.10.0_gsl63ivuy3dcjqqtqkoke7rkpy + webpack-dev-server: 4.15.2_jegqncbgluhg2diqjfjzp6pezq dev/app-vue: specifiers: @@ -538,18 +619,18 @@ importers: garfish: link:../../packages/garfish mobx-vue: 2.2.0_vue@2.6.13 vue: 2.6.13 - vue-router: 3.6.5 + vue-router: 3.6.5_vue@2.6.13 vuex: 3.6.2_vue@2.6.13 devDependencies: - '@vue/cli-plugin-babel': 4.5.0_f63cd59c39f55c2bc2f73f0c888a1d85 - '@vue/cli-plugin-eslint': 4.5.0_f29ccfad51a698c7c8cc61a308f276d2 - '@vue/cli-service': 4.5.0_f09f984259919b34ea31afdf24956a0d + '@vue/cli-plugin-babel': 4.5.0_r3icu6bqybxoc5zr7k7ekzrqui + '@vue/cli-plugin-eslint': 4.5.0_6kom7lkru2mmpsgmmgrqr4tw2i + '@vue/cli-service': 4.5.0_nixqlmt6zp7dzdzrxupl7pgsaa babel-eslint: 10.1.0_eslint@6.8.0 element-ui: 2.15.14_vue@2.6.13 eslint: 6.8.0 eslint-plugin-vue: 8.7.1_eslint@6.8.0 less-loader: 5.0.0 - vue-loader: 15.9.8_53627ebac05ecb7d1ca56520271ef4da + vue-loader: 15.9.8_iz65jxxzpozjtfy2ypfjfwww74 vue-template-compiler: 2.6.13_vue@2.6.13 dependenciesMeta: vue-template-compiler: @@ -583,19 +664,19 @@ importers: garfish: link:../../packages/garfish mobx-vue: 2.2.0_vue@2.6.13 vue: 2.6.13 - vue-router: 3.6.5 + vue-router: 3.6.5_vue@2.6.13 vuex: 3.6.2_vue@2.6.13 devDependencies: - '@vue/cli-plugin-babel': 4.5.19_46ef8989204bb780dad9061a88bdd719 - '@vue/cli-plugin-eslint': 4.5.19_291eed2a4b15311c68aabdde8b2cf70f - '@vue/cli-service': 4.5.19_f09f984259919b34ea31afdf24956a0d + '@vue/cli-plugin-babel': 4.5.19_j6atvxajrz6zpejie6ym5ku4ty + '@vue/cli-plugin-eslint': 4.5.19_fepo2kslcuyry2fkxxpiwlhxb4 + '@vue/cli-service': 4.5.19_nixqlmt6zp7dzdzrxupl7pgsaa babel-eslint: 10.1.0_eslint@6.8.0 element-ui: 2.15.14_vue@2.6.13 eslint: 6.8.0 eslint-plugin-vue: 8.7.1_eslint@6.8.0 less-loader: 5.0.0 url-loader: 4.1.1 - vue-loader: 15.9.8_53627ebac05ecb7d1ca56520271ef4da + vue-loader: 15.9.8_iz65jxxzpozjtfy2ypfjfwww74 vue-template-compiler: 2.6.13_vue@2.6.13 dev/app-vue-3: @@ -626,9 +707,9 @@ importers: vue-router: 4.0.12_vue@3.2.31 vuex: 3.6.2_vue@3.2.31 devDependencies: - '@vue/cli-plugin-babel': 4.5.15_c1ebd2c327b9916f1b14476e6a7b1d20 - '@vue/cli-plugin-eslint': 4.5.15_159f9ca94908a7070131e2c321d72521 - '@vue/cli-service': 4.5.15_0f5d62cf88f3efebf60206232b803f28 + '@vue/cli-plugin-babel': 4.5.15_yecqdxnkw2wdliv6nfjhbfqysq + '@vue/cli-plugin-eslint': 4.5.15_cwpzzkkjbctqoajr4lbsdvzfee + '@vue/cli-service': 4.5.15_ee7biujstwg456ue5i7k23lvau '@vue/compiler-sfc': 3.2.31 babel-eslint: 10.1.0_eslint@6.8.0 eslint: 6.8.0 @@ -670,6 +751,17 @@ importers: react: 18.1.0 react-dom: 18.1.0_react@18.1.0 + packages/bridge-react-v19: + specifiers: + '@garfish/utils': workspace:* + react: 19.1.0 + react-dom: 19.1.0 + dependencies: + '@garfish/utils': link:../utils + devDependencies: + react: 19.1.0 + react-dom: 19.1.0_react@19.1.0 + packages/bridge-vue-v2: specifiers: vue: 2.6.13 @@ -878,15 +970,15 @@ packages: '@jridgewell/trace-mapping': 0.3.29 dev: true - /@angular-builders/custom-webpack/13.1.0_ff77c83933f2e4de9ef567d09e80cad9: + /@angular-builders/custom-webpack/13.1.0_v32iakm4necosqlnffo5c6akwa: resolution: {integrity: sha512-qhtnAv1i7agk14zeKZZfXjrckYt37OZ+3tsTBLhf3ZFbwREK8L1SNi8xhZ1j1JLGsf2Dp0GEcZrSYeFDweo0WA==} engines: {node: '>=12.20.0'} dependencies: '@angular-devkit/architect': 0.1303.11 - '@angular-devkit/build-angular': 13.3.11_95387d0f0cbecb06fbe15b0a7fb69ee9 + '@angular-devkit/build-angular': 13.3.11_h2chezy3wgvfe6prav6uk6dymu '@angular-devkit/core': 13.3.11 lodash: 4.17.21 - ts-node: 10.9.2_b5ef9a98e3d44ef05ac403c9fc81607a + ts-node: 10.9.2_mdb3dbfqy5sebt7ydoefkswigu tsconfig-paths: 3.15.0 webpack-merge: 5.10.0 transitivePeerDependencies: @@ -925,7 +1017,7 @@ packages: - chokidar dev: true - /@angular-devkit/build-angular/13.3.11_95387d0f0cbecb06fbe15b0a7fb69ee9: + /@angular-devkit/build-angular/13.3.11_h2chezy3wgvfe6prav6uk6dymu: resolution: {integrity: sha512-H4tpdmRu+6HSjsL+swV/8qj8v0YSDq6lpb31EYajlBB6fDj+YJQvHgaWvexSWl6eIqgDKXcujhNUjNi1enjwHw==} engines: {node: ^12.20.0 || ^14.15.0 || >=16.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} peerDependencies: @@ -953,9 +1045,9 @@ packages: dependencies: '@ampproject/remapping': 2.2.0 '@angular-devkit/architect': 0.1303.11 - '@angular-devkit/build-webpack': 0.1303.11_5fb2e690a7eccb2533600cb2707e450d + '@angular-devkit/build-webpack': 0.1303.11_l6zonefh5tfskm3abszha7sfbu '@angular-devkit/core': 13.3.11 - '@angular/compiler-cli': 13.4.0_8bfaebc4ac9a2d191bac49412227a952 + '@angular/compiler-cli': 13.4.0_rp5oxrfmtiwrsg5mjfasej5jki '@babel/core': 7.16.12 '@babel/generator': 7.16.8 '@babel/helper-annotate-as-pure': 7.16.7 @@ -966,9 +1058,9 @@ packages: '@babel/runtime': 7.16.7 '@babel/template': 7.16.7 '@discoveryjs/json-ext': 0.5.6 - '@ngtools/webpack': 13.3.11_940eb16eadb3ede826838fb517e7bf55 + '@ngtools/webpack': 13.3.11_sqhlc3vnwpw6qjudr62rpz57ku ansi-colors: 4.1.1 - babel-loader: 8.2.5_7dddd9639c99a92327862aa45340f942 + babel-loader: 8.2.5_pxo5sy44tgusgj4gfksfgqhzii babel-plugin-istanbul: 6.1.1 browserslist: 4.25.1 cacache: 15.3.0 @@ -996,7 +1088,7 @@ packages: piscina: 3.2.0 postcss: 8.4.5 postcss-import: 14.0.2_postcss@8.4.5 - postcss-loader: 6.2.1_postcss@8.4.5+webpack@5.76.1 + postcss-loader: 6.2.1_2zav35mtvqhznskbbcl7zq3hti postcss-preset-env: 7.2.3_postcss@8.4.5 protractor: 7.0.0 regenerator-runtime: 0.13.9 @@ -1008,17 +1100,17 @@ packages: source-map-loader: 3.0.1_webpack@5.76.1 source-map-support: 0.5.21 stylus: github.com/stylus/stylus/14462ea7e7bffce8f192f7a933114ffbf577aa84 - stylus-loader: 6.2.0_stylus@0.56.0+webpack@5.76.1 + stylus-loader: 6.2.0_tflq7wolhb5jandkcgy52zew2y terser: 5.14.2 text-table: 0.2.0 tree-kill: 1.2.2 tslib: 2.3.1 typescript: 4.4.3 - webpack: 5.76.1_@swc+core@1.13.2+esbuild@0.14.22 + webpack: 5.76.1_esbuild@0.14.22 webpack-dev-middleware: 5.3.0_webpack@5.76.1 webpack-dev-server: 4.7.3_webpack@5.76.1 webpack-merge: 5.8.0 - webpack-subresource-integrity: 5.1.0_b1cc9547adf104f675bf29e24358ec6a + webpack-subresource-integrity: 5.1.0_whgjkr5n6ecpm5n7fhregwhmni optionalDependencies: esbuild: 0.14.22 transitivePeerDependencies: @@ -1037,7 +1129,7 @@ packages: - webpack-cli dev: true - /@angular-devkit/build-webpack/0.1303.11_5fb2e690a7eccb2533600cb2707e450d: + /@angular-devkit/build-webpack/0.1303.11_l6zonefh5tfskm3abszha7sfbu: resolution: {integrity: sha512-599pWAQLq7i/fmEZLb7PaNU6nmPC3EZbJk1nU/UBcpx7FWs9e0o2XQE2PCAs0buqtQxVjSgY6kMO8ex5dUmgUQ==} engines: {node: ^12.20.0 || ^14.15.0 || >=16.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} peerDependencies: @@ -1046,7 +1138,7 @@ packages: dependencies: '@angular-devkit/architect': 0.1303.11 rxjs: 6.6.7 - webpack: 5.76.1_@swc+core@1.13.2+esbuild@0.14.22 + webpack: 5.76.1_esbuild@0.14.22 webpack-dev-server: 4.7.3_webpack@5.76.1 transitivePeerDependencies: - chokidar @@ -1123,7 +1215,7 @@ packages: - supports-color dev: true - /@angular/common/13.2.4_@angular+core@13.2.4+rxjs@6.6.7: + /@angular/common/13.2.4_pqxaee6iec7l3sirejczfyzsde: resolution: {integrity: sha512-telHfROR8QYZ0IE7rZF8yQG4PkKIZ9oKpl3HwybSzTTbvWwHPtScqvr4b1oKjb0Q6F4OkH3QtrZ+PXMAp0Hv/w==} engines: {node: ^12.20.0 || ^14.15.0 || >=16.10.0} peerDependencies: @@ -1135,7 +1227,7 @@ packages: tslib: 2.3.1 dev: false - /@angular/compiler-cli/13.4.0_8bfaebc4ac9a2d191bac49412227a952: + /@angular/compiler-cli/13.4.0_rp5oxrfmtiwrsg5mjfasej5jki: resolution: {integrity: sha512-OQD0w9aZXbpcyWDEaozoHH/n3eYDLhBsmJcIBVqUN8Awx8m17v2u2R6m7DIEpVRbBzYtTscAMTKONNVwsTolHA==} engines: {node: ^12.20.0 || ^14.15.0 || >=16.10.0} hasBin: true @@ -1165,14 +1257,6 @@ packages: dependencies: tslib: 2.3.1 - /@angular/compiler/9.0.0_tslib@1.14.1: - resolution: {integrity: sha512-ctjwuntPfZZT2mNj2NDIVu51t9cvbhl/16epc5xEwyzyDt76pX9UgwvY+MbXrf/C/FWwdtmNtfP698BKI+9leQ==} - peerDependencies: - tslib: ^1.10.0 - dependencies: - tslib: 1.14.1 - dev: true - /@angular/core/13.2.4_rxjs@6.6.7+zone.js@0.10.3: resolution: {integrity: sha512-cCgf8Crx86hvZQX8lc7Yy5fedRI4trAXYsysrJ7ISRohfFk31Z/W5BEpKO8CkX51Ja5IfJPyoI2DVVTvrwzsEQ==} engines: {node: ^12.20.0 || ^14.15.0 || >=16.10.0} @@ -1183,21 +1267,8 @@ packages: rxjs: 6.6.7 tslib: 2.3.1 zone.js: 0.10.3 - dev: false - - /@angular/core/9.0.0_ed6f97b6c42afc3b298adb4ba822fb67: - resolution: {integrity: sha512-6Pxgsrf0qF9iFFqmIcWmjJGkkCaCm6V5QNnxMy2KloO3SDq6QuMVRbN9RtC8Urmo25LP+eZ6ZgYqFYpdD8Hd9w==} - peerDependencies: - rxjs: ^6.5.3 - tslib: ^1.10.0 - zone.js: ~0.10.2 - dependencies: - rxjs: 6.6.7 - tslib: 1.14.1 - zone.js: 0.10.3 - dev: true - /@angular/forms/13.2.4_78e8f54f4b7d4eb9dc979bb523a2106c: + /@angular/forms/13.2.4_pdupkt2lpvhltxexto2shiqqnq: resolution: {integrity: sha512-XdWJZy4zfJ4ZGEhKZBceHAAozBQZPp1BRl7m2j09EV2I6l/nLdrYhgKGd4UBUtJWyXElPEuEgLiKKdmlPKF5eQ==} engines: {node: ^12.20.0 || ^14.15.0 || >=16.10.0} peerDependencies: @@ -1206,14 +1277,14 @@ packages: '@angular/platform-browser': 13.2.4 rxjs: ^6.5.3 || ^7.4.0 dependencies: - '@angular/common': 13.2.4_@angular+core@13.2.4+rxjs@6.6.7 + '@angular/common': 13.2.4_pqxaee6iec7l3sirejczfyzsde '@angular/core': 13.2.4_rxjs@6.6.7+zone.js@0.10.3 - '@angular/platform-browser': 13.2.4_c32bbd9c696d1f00f3275fe5fdf76654 + '@angular/platform-browser': 13.2.4_ymv33hdjnupqb4zhl7s7353gkq rxjs: 6.6.7 tslib: 2.3.1 dev: false - /@angular/platform-browser-dynamic/13.2.4_98e1c8b4efa66ebacfe1bdf50b64dc0f: + /@angular/platform-browser-dynamic/13.2.4_tdq4rnhpuzxlvt7bxx2qwzg4b4: resolution: {integrity: sha512-9GOG46hjxrSHAL0pO90LPcaGoGleqlhKgoeSd6MVjNHOU2B2JWMuiu3NmJa0PjYFzqC89b0ypRoitf68+XTEjA==} engines: {node: ^12.20.0 || ^14.15.0 || >=16.10.0} peerDependencies: @@ -1222,14 +1293,14 @@ packages: '@angular/core': 13.2.4 '@angular/platform-browser': 13.2.4 dependencies: - '@angular/common': 13.2.4_@angular+core@13.2.4+rxjs@6.6.7 + '@angular/common': 13.2.4_pqxaee6iec7l3sirejczfyzsde '@angular/compiler': 13.4.0 '@angular/core': 13.2.4_rxjs@6.6.7+zone.js@0.10.3 - '@angular/platform-browser': 13.2.4_c32bbd9c696d1f00f3275fe5fdf76654 + '@angular/platform-browser': 13.2.4_ymv33hdjnupqb4zhl7s7353gkq tslib: 2.3.1 dev: false - /@angular/platform-browser/13.2.4_c32bbd9c696d1f00f3275fe5fdf76654: + /@angular/platform-browser/13.2.4_ymv33hdjnupqb4zhl7s7353gkq: resolution: {integrity: sha512-zyQ5wtCY+V+ww9Lx6fDdCYTJ7lRuszcN4eqogbtLak8uNnC+DjZSjNbgsrCwZ/v5q712DtCTQlSOFtRg9SWYug==} engines: {node: ^12.20.0 || ^14.15.0 || >=16.10.0} peerDependencies: @@ -1241,12 +1312,12 @@ packages: optional: true dependencies: '@angular/animations': 13.2.4_@angular+core@13.2.4 - '@angular/common': 13.2.4_@angular+core@13.2.4+rxjs@6.6.7 + '@angular/common': 13.2.4_pqxaee6iec7l3sirejczfyzsde '@angular/core': 13.2.4_rxjs@6.6.7+zone.js@0.10.3 tslib: 2.3.1 dev: false - /@angular/router/13.2.4_78e8f54f4b7d4eb9dc979bb523a2106c: + /@angular/router/13.2.4_pdupkt2lpvhltxexto2shiqqnq: resolution: {integrity: sha512-ZNahK4W+DAHThGwCOkW2MN12/Zx9PgNL/DRhGyPpL8vBBIgmOjoLB5N5QWMICauIgGQ635oorSN6lGxX6ZPbCA==} engines: {node: ^12.20.0 || ^14.15.0 || >=16.10.0} peerDependencies: @@ -1255,9 +1326,9 @@ packages: '@angular/platform-browser': 13.2.4 rxjs: ^6.5.3 || ^7.4.0 dependencies: - '@angular/common': 13.2.4_@angular+core@13.2.4+rxjs@6.6.7 + '@angular/common': 13.2.4_pqxaee6iec7l3sirejczfyzsde '@angular/core': 13.2.4_rxjs@6.6.7+zone.js@0.10.3 - '@angular/platform-browser': 13.2.4_c32bbd9c696d1f00f3275fe5fdf76654 + '@angular/platform-browser': 13.2.4_ymv33hdjnupqb4zhl7s7353gkq rxjs: 6.6.7 tslib: 2.3.1 dev: false @@ -1268,7 +1339,7 @@ packages: color: 3.2.1 dev: false - /@arco-design/web-react/2.66.2_react-dom@16.14.0+react@16.14.0: + /@arco-design/web-react/2.66.2_ef5jwxihqo6n7gxfmzogljlgcm: resolution: {integrity: sha512-2GyBa+V1MX4HFkfTQSTv5gNtX7y3PZQQgcEpmae3SgEonz6elvuaPYDGZQ3g/kzSryJXDLRHw6zVjwWdFRZnHQ==} peerDependencies: react: '>=16' @@ -1282,11 +1353,37 @@ packages: dayjs: 1.11.13 lodash: 4.17.21 number-precision: 1.6.0 - react: 16.14.0 - react-dom: 16.14.0_react@16.14.0 - react-focus-lock: 2.13.6_react@16.14.0 + react: 18.1.0 + react-dom: 18.1.0_react@18.1.0 + react-focus-lock: 2.13.6_react@18.1.0 + react-is: 18.3.1 + react-transition-group: 4.4.5_ef5jwxihqo6n7gxfmzogljlgcm + resize-observer-polyfill: 1.5.1 + scroll-into-view-if-needed: 2.2.31 + shallowequal: 1.1.0 + transitivePeerDependencies: + - '@types/react' + dev: false + + /@arco-design/web-react/2.66.2_j6k6oay3ugsr56slyfvma2drry: + resolution: {integrity: sha512-2GyBa+V1MX4HFkfTQSTv5gNtX7y3PZQQgcEpmae3SgEonz6elvuaPYDGZQ3g/kzSryJXDLRHw6zVjwWdFRZnHQ==} + peerDependencies: + react: '>=16' + react-dom: '>=16' + dependencies: + '@arco-design/color': 0.4.0 + '@babel/runtime': 7.28.2 + b-tween: 0.3.3 + b-validate: 1.5.3 + compute-scroll-into-view: 1.0.20 + dayjs: 1.11.13 + lodash: 4.17.21 + number-precision: 1.6.0 + react: 19.1.0 + react-dom: 19.1.0_react@19.1.0 + react-focus-lock: 2.13.6_react@19.1.0 react-is: 18.3.1 - react-transition-group: 4.4.5_react-dom@16.14.0+react@16.14.0 + react-transition-group: 4.4.5_j6k6oay3ugsr56slyfvma2drry resize-observer-polyfill: 1.5.1 scroll-into-view-if-needed: 2.2.31 shallowequal: 1.1.0 @@ -1294,7 +1391,7 @@ packages: - '@types/react' dev: false - /@arco-design/web-react/2.66.2_react-dom@17.0.2+react@17.0.2: + /@arco-design/web-react/2.66.2_sfoxds7t5ydpegc3knd667wn6m: resolution: {integrity: sha512-2GyBa+V1MX4HFkfTQSTv5gNtX7y3PZQQgcEpmae3SgEonz6elvuaPYDGZQ3g/kzSryJXDLRHw6zVjwWdFRZnHQ==} peerDependencies: react: '>=16' @@ -1312,7 +1409,7 @@ packages: react-dom: 17.0.2_react@17.0.2 react-focus-lock: 2.13.6_react@17.0.2 react-is: 18.3.1 - react-transition-group: 4.4.5_react-dom@17.0.2+react@17.0.2 + react-transition-group: 4.4.5_sfoxds7t5ydpegc3knd667wn6m resize-observer-polyfill: 1.5.1 scroll-into-view-if-needed: 2.2.31 shallowequal: 1.1.0 @@ -1320,7 +1417,7 @@ packages: - '@types/react' dev: false - /@arco-design/web-react/2.66.2_react-dom@18.1.0+react@18.1.0: + /@arco-design/web-react/2.66.2_wcqkhtmu7mswc6yz4uyexck3ty: resolution: {integrity: sha512-2GyBa+V1MX4HFkfTQSTv5gNtX7y3PZQQgcEpmae3SgEonz6elvuaPYDGZQ3g/kzSryJXDLRHw6zVjwWdFRZnHQ==} peerDependencies: react: '>=16' @@ -1334,11 +1431,11 @@ packages: dayjs: 1.11.13 lodash: 4.17.21 number-precision: 1.6.0 - react: 18.1.0 - react-dom: 18.1.0_react@18.1.0 - react-focus-lock: 2.13.6_react@18.1.0 + react: 16.14.0 + react-dom: 16.14.0_react@16.14.0 + react-focus-lock: 2.13.6_react@16.14.0 react-is: 18.3.1 - react-transition-group: 4.4.5_react-dom@18.1.0+react@18.1.0 + react-transition-group: 4.4.5_wcqkhtmu7mswc6yz4uyexck3ty resize-observer-polyfill: 1.5.1 scroll-into-view-if-needed: 2.2.31 shallowequal: 1.1.0 @@ -3773,7 +3870,7 @@ packages: postcss-value-parser: 4.2.0 dev: true - /@csstools/selector-specificity/2.2.0_postcss-selector-parser@6.1.2: + /@csstools/selector-specificity/2.2.0_j747yjqyvnzekvomyruvypt3ti: resolution: {integrity: sha512-+OJ9konv95ClSTOJCmMZqpd5+YGsB2S+x6w3E1oaM8UuR5j8nTNHYSz8c9BEPGDOCMQYIEEGlVPj/VY64iTbGw==} engines: {node: ^14 || ^16 || >=18} peerDependencies: @@ -4432,7 +4529,7 @@ packages: dev: false optional: true - /@ngtools/webpack/13.3.11_940eb16eadb3ede826838fb517e7bf55: + /@ngtools/webpack/13.3.11_sqhlc3vnwpw6qjudr62rpz57ku: resolution: {integrity: sha512-gB33hTbc/RJmHyIgSUYj8ErPazhYYm7yfapOnvwHdYhCjrj1TKkR1ierOlhJtpfBYUQg6FChdl2YpyIQNPjWMA==} engines: {node: ^12.20.0 || ^14.15.0 || >=16.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} peerDependencies: @@ -4440,9 +4537,9 @@ packages: typescript: '>=4.4.3 <4.7' webpack: ^5.30.0 dependencies: - '@angular/compiler-cli': 13.4.0_8bfaebc4ac9a2d191bac49412227a952 + '@angular/compiler-cli': 13.4.0_rp5oxrfmtiwrsg5mjfasej5jki typescript: 4.4.3 - webpack: 5.76.1_@swc+core@1.13.2+esbuild@0.14.22 + webpack: 5.76.1_esbuild@0.14.22 dev: true /@node-ipc/js-queue/2.0.3: @@ -4564,7 +4661,7 @@ packages: dev: true optional: true - /@pmmmwh/react-refresh-webpack-plugin/0.5.17_325577fcdd1dc632e2708ed34b67deaf: + /@pmmmwh/react-refresh-webpack-plugin/0.5.17_gjkxp7g5dxddfytqr3juwz66v4: resolution: {integrity: sha512-tXDyE1/jzFsHXjhRZQ3hMl0IVhYe5qula43LDWIhVfjp9G/nT5OQY5AORVOrkEGAUltBJOfOWeETbmhm6kHhuQ==} engines: {node: '>= 10.13'} peerDependencies: @@ -4598,8 +4695,8 @@ packages: react-refresh: 0.11.0 schema-utils: 4.3.2 source-map: 0.7.6 - webpack: 5.100.2_e895a1b7cf9a7664b898a75f8f813ceb - webpack-dev-server: 4.15.2_490d0688265d0e6d0d10495397f9e4cc + webpack: 5.100.2_webpack-cli@4.10.0 + webpack-dev-server: 4.15.2_jegqncbgluhg2diqjfjzp6pezq dev: true /@remix-run/router/1.23.0: @@ -4801,7 +4898,7 @@ packages: react: 19.1.0 react-dom: 19.1.0_react@19.1.0 react-lazy-with-preload: 2.2.1 - react-router-dom: 6.30.1_react-dom@19.1.0+react@19.1.0 + react-router-dom: 6.30.1_j6k6oay3ugsr56slyfvma2drry rehype-external-links: 3.0.0 rehype-raw: 7.0.0 remark: 15.0.1 @@ -4931,7 +5028,7 @@ packages: '@unhead/react': 2.0.12_react@19.1.0 react: 19.1.0 react-dom: 19.1.0_react@19.1.0 - react-router-dom: 6.30.1_react-dom@19.1.0+react@19.1.0 + react-router-dom: 6.30.1_j6k6oay3ugsr56slyfvma2drry dev: false /@rspress/shared/2.0.0-beta.21: @@ -5782,7 +5879,7 @@ packages: dev: true optional: true - /@typescript-eslint/eslint-plugin/5.4.0_5cb9d12ba4cd7885c166a557f6a0199b: + /@typescript-eslint/eslint-plugin/5.4.0_ls45ck5ezv4ilqlguvl7niaztm: resolution: {integrity: sha512-9/yPSBlwzsetCsGEn9j24D8vGQgJkOTr4oMLas/w886ZtzKIs1iyoqFrwsX2fqYEeUwsdBpC21gcjRGo57u0eg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -5793,8 +5890,8 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/experimental-utils': 5.4.0_eslint@7.32.0+typescript@4.6.4 - '@typescript-eslint/parser': 5.4.0_eslint@7.32.0+typescript@4.6.4 + '@typescript-eslint/experimental-utils': 5.4.0_e4zyhrvfnqudwdx5bevnvkluy4 + '@typescript-eslint/parser': 5.4.0_e4zyhrvfnqudwdx5bevnvkluy4 '@typescript-eslint/scope-manager': 5.4.0 debug: 4.4.1 eslint: 7.32.0 @@ -5820,7 +5917,7 @@ packages: eslint-scope: 4.0.3 dev: true - /@typescript-eslint/experimental-utils/5.4.0_eslint@7.32.0+typescript@4.6.4: + /@typescript-eslint/experimental-utils/5.4.0_e4zyhrvfnqudwdx5bevnvkluy4: resolution: {integrity: sha512-Nz2JDIQUdmIGd6p33A+naQmwfkU5KVTLb/5lTk+tLVTDacZKoGQisj8UCxk7onJcrgjIvr8xWqkYI+DbI3TfXg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -5851,7 +5948,7 @@ packages: eslint-visitor-keys: 1.3.0 dev: true - /@typescript-eslint/parser/5.4.0_eslint@7.32.0+typescript@4.6.4: + /@typescript-eslint/parser/5.4.0_e4zyhrvfnqudwdx5bevnvkluy4: resolution: {integrity: sha512-JoB41EmxiYpaEsRwpZEYAJ9XQURPFer8hpkIW9GiaspVLX8oqbqNM8P4EP8HOZg96yaALiLEVWllA2E8vwsIKw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -5929,7 +6026,7 @@ packages: resolution: {integrity: sha512-O2GUHV90Iw2VrSLVLK0OmNIMdZ5fgEg4NhvtwINsX+eZ/Wf6DWD0TdsK9xwV7dNRnK/UI2mQtl0a2/kRgm1m1A==} dev: false - /@uiw/react-markdown-preview/3.4.5_react-dom@17.0.2+react@17.0.2: + /@uiw/react-markdown-preview/3.4.5_ef5jwxihqo6n7gxfmzogljlgcm: resolution: {integrity: sha512-oYZXqezHSuVu9f4RWWfcQe7RLVlJ+uqGrZsy0apVwfdXisfLEUv2GY3mJSh+KM02fGdzkLY+VX5WSoUt5TbLtg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} peerDependencies: @@ -5939,9 +6036,9 @@ packages: '@babel/runtime': 7.16.3 '@mapbox/rehype-prism': 0.8.0 '@uiw/copy-to-clipboard': 1.0.12 - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 - react-markdown: 7.1.1_react@17.0.2 + react: 18.1.0 + react-dom: 18.1.0_react@18.1.0 + react-markdown: 7.1.1_react@18.1.0 rehype-attr: 2.0.6 rehype-autolink-headings: 6.1.0 rehype-raw: 6.1.0 @@ -5953,7 +6050,7 @@ packages: - supports-color dev: true - /@uiw/react-markdown-preview/3.4.5_react-dom@18.1.0+react@18.1.0: + /@uiw/react-markdown-preview/3.4.5_j6k6oay3ugsr56slyfvma2drry: resolution: {integrity: sha512-oYZXqezHSuVu9f4RWWfcQe7RLVlJ+uqGrZsy0apVwfdXisfLEUv2GY3mJSh+KM02fGdzkLY+VX5WSoUt5TbLtg==} engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} peerDependencies: @@ -5963,9 +6060,33 @@ packages: '@babel/runtime': 7.16.3 '@mapbox/rehype-prism': 0.8.0 '@uiw/copy-to-clipboard': 1.0.12 - react: 18.1.0 - react-dom: 18.1.0_react@18.1.0 - react-markdown: 7.1.1_react@18.1.0 + react: 19.1.0 + react-dom: 19.1.0_react@19.1.0 + react-markdown: 7.1.1_react@19.1.0 + rehype-attr: 2.0.6 + rehype-autolink-headings: 6.1.0 + rehype-raw: 6.1.0 + rehype-rewrite: 3.0.4 + rehype-slug: 5.0.0 + remark-gfm: 3.0.1 + transitivePeerDependencies: + - '@types/react' + - supports-color + dev: true + + /@uiw/react-markdown-preview/3.4.5_sfoxds7t5ydpegc3knd667wn6m: + resolution: {integrity: sha512-oYZXqezHSuVu9f4RWWfcQe7RLVlJ+uqGrZsy0apVwfdXisfLEUv2GY3mJSh+KM02fGdzkLY+VX5WSoUt5TbLtg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + dependencies: + '@babel/runtime': 7.16.3 + '@mapbox/rehype-prism': 0.8.0 + '@uiw/copy-to-clipboard': 1.0.12 + react: 17.0.2 + react-dom: 17.0.2_react@17.0.2 + react-markdown: 7.1.1_react@17.0.2 rehype-attr: 2.0.6 rehype-autolink-headings: 6.1.0 rehype-raw: 6.1.0 @@ -5977,7 +6098,7 @@ packages: - supports-color dev: true - /@uiw/react-markdown-preview/4.2.2_react-dom@17.0.2+react@17.0.2: + /@uiw/react-markdown-preview/4.2.2_sfoxds7t5ydpegc3knd667wn6m: resolution: {integrity: sha512-Jy3GtAqcF2pKgvFtgLUEwR8u2t0Yk/DAnLTl6cf1RzhNYcAxm1auDs3KndZRBDP01xhmYLX4KiOcOg/qv+Jc0A==} peerDependencies: react: '>=16.8.0' @@ -6002,14 +6123,14 @@ packages: - supports-color dev: false - /@uiw/react-md-editor/3.25.6_react-dom@17.0.2+react@17.0.2: + /@uiw/react-md-editor/3.25.6_sfoxds7t5ydpegc3knd667wn6m: resolution: {integrity: sha512-YuDv5KiM931WFYBDCyk9/HvtLdIWk9DXvzC6d1riaLufvchM7IUHkqTkSl3HqmTod1exSN+5ZsUtKZ+S+GAsug==} peerDependencies: react: '>=16.8.0' react-dom: '>=16.8.0' dependencies: '@babel/runtime': 7.28.2 - '@uiw/react-markdown-preview': 4.2.2_react-dom@17.0.2+react@17.0.2 + '@uiw/react-markdown-preview': 4.2.2_sfoxds7t5ydpegc3knd667wn6m react: 17.0.2 react-dom: 17.0.2_react@17.0.2 rehype: 12.0.1 @@ -6019,16 +6140,16 @@ packages: - supports-color dev: false - /@uiw/react-md-editor/3.9.0_react-dom@17.0.2+react@17.0.2: + /@uiw/react-md-editor/3.9.0_ef5jwxihqo6n7gxfmzogljlgcm: resolution: {integrity: sha512-PTcPADC2aYJJdhHyoLJFnMjkIeo5EkVTCc1d97HmN46OFLRiLt40o2ec6DrFSvbW5w+P5i0ZlAxMJlC7r5pEVw==} peerDependencies: react: '>=16.8.0' react-dom: '>=16.8.0' dependencies: '@babel/runtime': 7.28.2 - '@uiw/react-markdown-preview': 3.4.5_react-dom@17.0.2+react@17.0.2 - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 + '@uiw/react-markdown-preview': 3.4.5_ef5jwxihqo6n7gxfmzogljlgcm + react: 18.1.0 + react-dom: 18.1.0_react@18.1.0 rehype: 12.0.0 rehype-sanitize: 5.0.1 transitivePeerDependencies: @@ -6036,16 +6157,33 @@ packages: - supports-color dev: true - /@uiw/react-md-editor/3.9.0_react-dom@18.1.0+react@18.1.0: + /@uiw/react-md-editor/3.9.0_j6k6oay3ugsr56slyfvma2drry: resolution: {integrity: sha512-PTcPADC2aYJJdhHyoLJFnMjkIeo5EkVTCc1d97HmN46OFLRiLt40o2ec6DrFSvbW5w+P5i0ZlAxMJlC7r5pEVw==} peerDependencies: react: '>=16.8.0' react-dom: '>=16.8.0' dependencies: '@babel/runtime': 7.28.2 - '@uiw/react-markdown-preview': 3.4.5_react-dom@18.1.0+react@18.1.0 - react: 18.1.0 - react-dom: 18.1.0_react@18.1.0 + '@uiw/react-markdown-preview': 3.4.5_j6k6oay3ugsr56slyfvma2drry + react: 19.1.0 + react-dom: 19.1.0_react@19.1.0 + rehype: 12.0.0 + rehype-sanitize: 5.0.1 + transitivePeerDependencies: + - '@types/react' + - supports-color + dev: true + + /@uiw/react-md-editor/3.9.0_sfoxds7t5ydpegc3knd667wn6m: + resolution: {integrity: sha512-PTcPADC2aYJJdhHyoLJFnMjkIeo5EkVTCc1d97HmN46OFLRiLt40o2ec6DrFSvbW5w+P5i0ZlAxMJlC7r5pEVw==} + peerDependencies: + react: '>=16.8.0' + react-dom: '>=16.8.0' + dependencies: + '@babel/runtime': 7.28.2 + '@uiw/react-markdown-preview': 3.4.5_sfoxds7t5ydpegc3knd667wn6m + react: 17.0.2 + react-dom: 17.0.2_react@17.0.2 rehype: 12.0.0 rehype-sanitize: 5.0.1 transitivePeerDependencies: @@ -6138,9 +6276,10 @@ packages: - supports-color dev: true - /@vue/babel-preset-app/4.5.19_vue@2.6.13: + /@vue/babel-preset-app/4.5.19_core-js@3.21.1+vue@3.2.31: resolution: {integrity: sha512-VCNRiAt2P/bLo09rYt3DLe6xXUMlhJwrvU18Ddd/lYJgC7s8+wvhgYs+MTx4OiAXdu58drGwSBO9SPx7C6J82Q==} peerDependencies: + core-js: ^3 vue: ^2 || ^3.0.0-0 peerDependenciesMeta: core-js: @@ -6159,19 +6298,20 @@ packages: '@babel/preset-env': 7.28.0_@babel+core@7.28.0 '@babel/runtime': 7.28.2 '@vue/babel-plugin-jsx': 1.4.0_@babel+core@7.28.0 - '@vue/babel-preset-jsx': 1.4.0_@babel+core@7.28.0+vue@2.6.13 + '@vue/babel-preset-jsx': 1.4.0_65kpeyri3jnbu3dvh5ub6hqr4m babel-plugin-dynamic-import-node: 2.3.3 core-js: 3.21.1 core-js-compat: 3.44.0 semver: 6.3.1 - vue: 2.6.13 + vue: 3.2.31 transitivePeerDependencies: - supports-color dev: true - /@vue/babel-preset-app/4.5.19_vue@3.2.31: + /@vue/babel-preset-app/4.5.19_core-js@3.44.0+vue@2.6.13: resolution: {integrity: sha512-VCNRiAt2P/bLo09rYt3DLe6xXUMlhJwrvU18Ddd/lYJgC7s8+wvhgYs+MTx4OiAXdu58drGwSBO9SPx7C6J82Q==} peerDependencies: + core-js: ^3 vue: ^2 || ^3.0.0-0 peerDependenciesMeta: core-js: @@ -6190,17 +6330,17 @@ packages: '@babel/preset-env': 7.28.0_@babel+core@7.28.0 '@babel/runtime': 7.28.2 '@vue/babel-plugin-jsx': 1.4.0_@babel+core@7.28.0 - '@vue/babel-preset-jsx': 1.4.0_@babel+core@7.28.0+vue@3.2.31 + '@vue/babel-preset-jsx': 1.4.0_cwp7afjzkzrk7xnk6qdf7pfw5u babel-plugin-dynamic-import-node: 2.3.3 - core-js: 3.21.1 + core-js: 3.44.0 core-js-compat: 3.44.0 semver: 6.3.1 - vue: 3.2.31 + vue: 2.6.13 transitivePeerDependencies: - supports-color dev: true - /@vue/babel-preset-jsx/1.4.0_@babel+core@7.28.0+vue@2.6.13: + /@vue/babel-preset-jsx/1.4.0_65kpeyri3jnbu3dvh5ub6hqr4m: resolution: {integrity: sha512-QmfRpssBOPZWL5xw7fOuHNifCQcNQC1PrOo/4fu6xlhlKJJKSA3HqX92Nvgyx8fqHZTUGMPHmFA+IDqwXlqkSA==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -6218,12 +6358,12 @@ packages: '@vue/babel-sugar-inject-h': 1.4.0_@babel+core@7.28.0 '@vue/babel-sugar-v-model': 1.4.0_@babel+core@7.28.0 '@vue/babel-sugar-v-on': 1.4.0_@babel+core@7.28.0 - vue: 2.6.13 + vue: 3.2.31 transitivePeerDependencies: - supports-color dev: true - /@vue/babel-preset-jsx/1.4.0_@babel+core@7.28.0+vue@3.2.31: + /@vue/babel-preset-jsx/1.4.0_cwp7afjzkzrk7xnk6qdf7pfw5u: resolution: {integrity: sha512-QmfRpssBOPZWL5xw7fOuHNifCQcNQC1PrOo/4fu6xlhlKJJKSA3HqX92Nvgyx8fqHZTUGMPHmFA+IDqwXlqkSA==} peerDependencies: '@babel/core': ^7.0.0-0 @@ -6241,7 +6381,7 @@ packages: '@vue/babel-sugar-inject-h': 1.4.0_@babel+core@7.28.0 '@vue/babel-sugar-v-model': 1.4.0_@babel+core@7.28.0 '@vue/babel-sugar-v-on': 1.4.0_@babel+core@7.28.0 - vue: 3.2.31 + vue: 2.6.13 transitivePeerDependencies: - supports-color dev: true @@ -6315,76 +6455,79 @@ packages: resolution: {integrity: sha512-GdxvNSmOw7NHIazCO8gTK+xZbaOmScTtxj6eHVeMbYpDYVPJ+th3VMLWNpw/b6uOjwzzcyKlA5dRQ1DAb+gF/g==} dev: true - /@vue/cli-plugin-babel/4.5.0_f63cd59c39f55c2bc2f73f0c888a1d85: + /@vue/cli-plugin-babel/4.5.0_r3icu6bqybxoc5zr7k7ekzrqui: resolution: {integrity: sha512-o2FmvSPyeZ1hP7tnwP3qCoWyNzSd3Mi99yu7Ml/DNaJiz86eF6cL8GcTEgnYvtaq+jiMaCl+Ut69WXLoP5Qd6w==} peerDependencies: '@vue/cli-service': ^3.0.0 || ^4.0.0-0 dependencies: '@babel/core': 7.28.0 - '@vue/babel-preset-app': 4.5.19_vue@2.6.13 - '@vue/cli-service': 4.5.0_f09f984259919b34ea31afdf24956a0d + '@vue/babel-preset-app': 4.5.19_core-js@3.44.0+vue@2.6.13 + '@vue/cli-service': 4.5.0_nixqlmt6zp7dzdzrxupl7pgsaa '@vue/cli-shared-utils': 4.5.19 - babel-loader: 8.4.1_9972647875b9ef9f7f84547ae14472ad + babel-loader: 8.4.1_tfzgi6dvxhxz674ekr5ocrdsvu cache-loader: 4.1.0_webpack@4.47.0 thread-loader: 2.1.3_webpack@4.47.0 webpack: 4.47.0 transitivePeerDependencies: + - core-js - supports-color - vue - webpack-cli - webpack-command dev: true - /@vue/cli-plugin-babel/4.5.15_c1ebd2c327b9916f1b14476e6a7b1d20: + /@vue/cli-plugin-babel/4.5.15_yecqdxnkw2wdliv6nfjhbfqysq: resolution: {integrity: sha512-hBLrwYfFkHldEe34op/YNgPhpOWI5n5DB2Qt9I/1Epeif4M4iFaayrgjvOR9AVM6WbD3Yx7WCFszYpWrQZpBzQ==} peerDependencies: '@vue/cli-service': ^3.0.0 || ^4.0.0-0 dependencies: '@babel/core': 7.28.0 - '@vue/babel-preset-app': 4.5.19_vue@3.2.31 - '@vue/cli-service': 4.5.15_0f5d62cf88f3efebf60206232b803f28 + '@vue/babel-preset-app': 4.5.19_core-js@3.21.1+vue@3.2.31 + '@vue/cli-service': 4.5.15_ee7biujstwg456ue5i7k23lvau '@vue/cli-shared-utils': 4.5.19 - babel-loader: 8.4.1_9972647875b9ef9f7f84547ae14472ad + babel-loader: 8.4.1_tfzgi6dvxhxz674ekr5ocrdsvu cache-loader: 4.1.0_webpack@4.47.0 thread-loader: 2.1.3_webpack@4.47.0 webpack: 4.47.0 transitivePeerDependencies: + - core-js - supports-color - vue - webpack-cli - webpack-command dev: true - /@vue/cli-plugin-babel/4.5.19_46ef8989204bb780dad9061a88bdd719: + /@vue/cli-plugin-babel/4.5.19_j6atvxajrz6zpejie6ym5ku4ty: resolution: {integrity: sha512-8ebXzaMW9KNTMAN6+DzkhFsjty1ieqT7hIW5Lbk4v30Qhfjkms7lBWyXPGkoq+wAikXFa1Gnam2xmWOBqDDvWg==} peerDependencies: '@vue/cli-service': ^3.0.0 || ^4.0.0-0 dependencies: '@babel/core': 7.28.0 - '@vue/babel-preset-app': 4.5.19_vue@2.6.13 - '@vue/cli-service': 4.5.19_f09f984259919b34ea31afdf24956a0d + '@vue/babel-preset-app': 4.5.19_core-js@3.44.0+vue@2.6.13 + '@vue/cli-service': 4.5.19_nixqlmt6zp7dzdzrxupl7pgsaa '@vue/cli-shared-utils': 4.5.19 - babel-loader: 8.4.1_9972647875b9ef9f7f84547ae14472ad + babel-loader: 8.4.1_tfzgi6dvxhxz674ekr5ocrdsvu cache-loader: 4.1.0_webpack@4.47.0 thread-loader: 2.1.3_webpack@4.47.0 webpack: 4.47.0 transitivePeerDependencies: + - core-js - supports-color - vue - webpack-cli - webpack-command dev: true - /@vue/cli-plugin-eslint/4.5.0_f29ccfad51a698c7c8cc61a308f276d2: + /@vue/cli-plugin-eslint/4.5.0_6kom7lkru2mmpsgmmgrqr4tw2i: resolution: {integrity: sha512-jlQuU738duqJZ5j9nwncMVeg6JeoLjXteDpnFDYYW5kNAWQPr6C1x7EayQ98puaC6TukitOtt1fvUdlyxj+TOg==} peerDependencies: '@vue/cli-service': ^3.0.0 || ^4.0.0-0 eslint: '>= 1.6.0' dependencies: - '@vue/cli-service': 4.5.0_f09f984259919b34ea31afdf24956a0d + '@vue/cli-service': 4.5.0_nixqlmt6zp7dzdzrxupl7pgsaa '@vue/cli-shared-utils': 4.5.19 eslint: 6.8.0 - eslint-loader: 2.2.1_eslint@6.8.0+webpack@4.47.0 + eslint-loader: 2.2.1_wsjju5mmssk4epkfodpe6kyapq globby: 9.2.0 inquirer: 7.3.3 webpack: 4.47.0 @@ -6395,16 +6538,16 @@ packages: - webpack-command dev: true - /@vue/cli-plugin-eslint/4.5.15_159f9ca94908a7070131e2c321d72521: + /@vue/cli-plugin-eslint/4.5.15_cwpzzkkjbctqoajr4lbsdvzfee: resolution: {integrity: sha512-/2Fl6wY/5bz3HD035oSnFRMsKNxDxU396KqBdpCQdwdvqk4mm6JAbXqihpcBRTNPeTO6w+LwGe6FE56PVbJdbg==} peerDependencies: '@vue/cli-service': ^3.0.0 || ^4.0.0-0 eslint: '>= 1.6.0 < 7.0.0' dependencies: - '@vue/cli-service': 4.5.15_0f5d62cf88f3efebf60206232b803f28 + '@vue/cli-service': 4.5.15_ee7biujstwg456ue5i7k23lvau '@vue/cli-shared-utils': 4.5.19 eslint: 6.8.0 - eslint-loader: 2.2.1_eslint@6.8.0+webpack@4.47.0 + eslint-loader: 2.2.1_wsjju5mmssk4epkfodpe6kyapq globby: 9.2.0 inquirer: 7.3.3 webpack: 4.47.0 @@ -6415,16 +6558,16 @@ packages: - webpack-command dev: true - /@vue/cli-plugin-eslint/4.5.19_291eed2a4b15311c68aabdde8b2cf70f: + /@vue/cli-plugin-eslint/4.5.19_fepo2kslcuyry2fkxxpiwlhxb4: resolution: {integrity: sha512-53sa4Pu9j5KajesFlj494CcO8vVo3e3nnZ1CCKjGGnrF90id1rUeepcFfz5XjwfEtbJZp2x/NoX/EZE6zCzSFQ==} peerDependencies: '@vue/cli-service': ^3.0.0 || ^4.0.0-0 eslint: '>= 1.6.0 < 7.0.0' dependencies: - '@vue/cli-service': 4.5.19_f09f984259919b34ea31afdf24956a0d + '@vue/cli-service': 4.5.19_nixqlmt6zp7dzdzrxupl7pgsaa '@vue/cli-shared-utils': 4.5.19 eslint: 6.8.0 - eslint-loader: 2.2.1_eslint@6.8.0+webpack@4.47.0 + eslint-loader: 2.2.1_wsjju5mmssk4epkfodpe6kyapq globby: 9.2.0 inquirer: 7.3.3 webpack: 4.47.0 @@ -6440,7 +6583,7 @@ packages: peerDependencies: '@vue/cli-service': ^3.0.0 || ^4.0.0-0 dependencies: - '@vue/cli-service': 4.5.0_f09f984259919b34ea31afdf24956a0d + '@vue/cli-service': 4.5.0_nixqlmt6zp7dzdzrxupl7pgsaa '@vue/cli-shared-utils': 4.5.19 dev: true @@ -6449,7 +6592,7 @@ packages: peerDependencies: '@vue/cli-service': ^3.0.0 || ^4.0.0-0 dependencies: - '@vue/cli-service': 4.5.15_0f5d62cf88f3efebf60206232b803f28 + '@vue/cli-service': 4.5.15_ee7biujstwg456ue5i7k23lvau '@vue/cli-shared-utils': 4.5.19 dev: true @@ -6458,7 +6601,7 @@ packages: peerDependencies: '@vue/cli-service': ^3.0.0 || ^4.0.0-0 dependencies: - '@vue/cli-service': 4.5.19_f09f984259919b34ea31afdf24956a0d + '@vue/cli-service': 4.5.19_nixqlmt6zp7dzdzrxupl7pgsaa '@vue/cli-shared-utils': 4.5.19 dev: true @@ -6467,7 +6610,7 @@ packages: peerDependencies: '@vue/cli-service': ^3.0.0 || ^4.0.0-0 dependencies: - '@vue/cli-service': 4.5.0_f09f984259919b34ea31afdf24956a0d + '@vue/cli-service': 4.5.0_nixqlmt6zp7dzdzrxupl7pgsaa dev: true /@vue/cli-plugin-vuex/4.5.19_@vue+cli-service@4.5.15: @@ -6475,7 +6618,7 @@ packages: peerDependencies: '@vue/cli-service': ^3.0.0 || ^4.0.0-0 dependencies: - '@vue/cli-service': 4.5.15_0f5d62cf88f3efebf60206232b803f28 + '@vue/cli-service': 4.5.15_ee7biujstwg456ue5i7k23lvau dev: true /@vue/cli-plugin-vuex/4.5.19_@vue+cli-service@4.5.19: @@ -6483,10 +6626,10 @@ packages: peerDependencies: '@vue/cli-service': ^3.0.0 || ^4.0.0-0 dependencies: - '@vue/cli-service': 4.5.19_f09f984259919b34ea31afdf24956a0d + '@vue/cli-service': 4.5.19_nixqlmt6zp7dzdzrxupl7pgsaa dev: true - /@vue/cli-service/4.5.0_f09f984259919b34ea31afdf24956a0d: + /@vue/cli-service/4.5.0_nixqlmt6zp7dzdzrxupl7pgsaa: resolution: {integrity: sha512-cemIjRvjuaP3c5Srsvp3a0/KqQVB3D1x9lPKdwLZ+2IPNplNwEOKi72LR7+HZomPLLazDa4sf5yoJ7PPkrW36g==} engines: {node: '>=8'} hasBin: true @@ -6524,8 +6667,8 @@ packages: '@vue/cli-plugin-router': 4.5.19_@vue+cli-service@4.5.0 '@vue/cli-plugin-vuex': 4.5.19_@vue+cli-service@4.5.0 '@vue/cli-shared-utils': 4.5.19 - '@vue/component-compiler-utils': 3.3.0_lodash@4.17.21 - '@vue/preload-webpack-plugin': 1.1.2_c22798690011568ecfa607ecb6af1e3a + '@vue/component-compiler-utils': 3.3.0 + '@vue/preload-webpack-plugin': 1.1.2_yitzq2iacfli5t5ga7wlnly6hi '@vue/web-component-wrapper': 1.3.0 acorn: 7.4.1 acorn-walk: 7.2.0 @@ -6556,14 +6699,14 @@ packages: lodash.transform: 4.6.0 mini-css-extract-plugin: 0.9.0_webpack@4.47.0 minimist: 1.2.8 - pnp-webpack-plugin: 1.7.0_typescript@4.6.4 + pnp-webpack-plugin: 1.7.0 portfinder: 1.0.37 postcss-loader: 3.0.0 ssri: 7.1.1 terser-webpack-plugin: 2.3.8_webpack@4.47.0 thread-loader: 2.1.3_webpack@4.47.0 - url-loader: 2.3.0_file-loader@4.3.0+webpack@4.47.0 - vue-loader: 15.9.8_2f3b929802a1687b12f0475f183a1979 + url-loader: 2.3.0_xnfab4wkhg6qoyn7pkd7if7xei + vue-loader: 15.9.8_i3ab2kpwkutymjqxim3t6dbkae vue-loader-v16: /vue-loader/16.8.3_vue@2.6.13+webpack@4.47.0 vue-style-loader: 4.1.3 vue-template-compiler: 2.6.13_vue@2.6.13 @@ -6636,7 +6779,7 @@ packages: - whiskers dev: true - /@vue/cli-service/4.5.15_0f5d62cf88f3efebf60206232b803f28: + /@vue/cli-service/4.5.15_ee7biujstwg456ue5i7k23lvau: resolution: {integrity: sha512-sFWnLYVCn4zRfu45IcsIE9eXM0YpDV3S11vlM2/DVbIPAGoYo5ySpSof6aHcIvkeGsIsrHFpPHzNvDZ/efs7jA==} engines: {node: '>=8'} hasBin: true @@ -6675,8 +6818,8 @@ packages: '@vue/cli-plugin-vuex': 4.5.19_@vue+cli-service@4.5.15 '@vue/cli-shared-utils': 4.5.19 '@vue/compiler-sfc': 3.2.31 - '@vue/component-compiler-utils': 3.3.0_lodash@4.17.21 - '@vue/preload-webpack-plugin': 1.1.2_c22798690011568ecfa607ecb6af1e3a + '@vue/component-compiler-utils': 3.3.0 + '@vue/preload-webpack-plugin': 1.1.2_yitzq2iacfli5t5ga7wlnly6hi '@vue/web-component-wrapper': 1.3.0 acorn: 7.4.1 acorn-walk: 7.2.0 @@ -6706,15 +6849,15 @@ packages: lodash.transform: 4.6.0 mini-css-extract-plugin: 0.9.0_webpack@4.47.0 minimist: 1.2.8 - pnp-webpack-plugin: 1.7.0_typescript@4.6.4 + pnp-webpack-plugin: 1.7.0 portfinder: 1.0.37 postcss-loader: 3.0.0 sass-loader: 10.2.1 ssri: 8.0.1 terser-webpack-plugin: 1.4.6_webpack@4.47.0 thread-loader: 2.1.3_webpack@4.47.0 - url-loader: 2.3.0_file-loader@4.3.0+webpack@4.47.0 - vue-loader: 15.11.1_4c9b0935bcd0246a9317c6bc95e832a5 + url-loader: 2.3.0_xnfab4wkhg6qoyn7pkd7if7xei + vue-loader: 15.11.1_3jfighbeskmcwdfhyt5x5eb77a vue-style-loader: 4.1.3 webpack: 4.47.0 webpack-bundle-analyzer: 3.9.0 @@ -6722,7 +6865,7 @@ packages: webpack-dev-server: 3.11.3_webpack@4.47.0 webpack-merge: 4.2.2 optionalDependencies: - vue-loader-v16: /vue-loader/16.8.3_3412b4a9c35740e71a1246c1c6a47a90 + vue-loader-v16: /vue-loader/16.8.3_gqjljkodk5aoogqsi3a4njd2sa transitivePeerDependencies: - arc-templates - atpl @@ -6787,7 +6930,7 @@ packages: - whiskers dev: true - /@vue/cli-service/4.5.19_f09f984259919b34ea31afdf24956a0d: + /@vue/cli-service/4.5.19_nixqlmt6zp7dzdzrxupl7pgsaa: resolution: {integrity: sha512-+Wpvj8fMTCt9ZPOLu5YaLkFCQmB4MrZ26aRmhhKiCQ/4PMoL6mLezfqdt6c+m2htM+1WV5RunRo+0WHl2DfwZA==} engines: {node: '>=8'} hasBin: true @@ -6825,8 +6968,8 @@ packages: '@vue/cli-plugin-router': 4.5.19_@vue+cli-service@4.5.19 '@vue/cli-plugin-vuex': 4.5.19_@vue+cli-service@4.5.19 '@vue/cli-shared-utils': 4.5.19 - '@vue/component-compiler-utils': 3.3.0_lodash@4.17.21 - '@vue/preload-webpack-plugin': 1.1.2_c22798690011568ecfa607ecb6af1e3a + '@vue/component-compiler-utils': 3.3.0 + '@vue/preload-webpack-plugin': 1.1.2_yitzq2iacfli5t5ga7wlnly6hi '@vue/web-component-wrapper': 1.3.0 acorn: 7.4.1 acorn-walk: 7.2.0 @@ -6857,14 +7000,14 @@ packages: lodash.transform: 4.6.0 mini-css-extract-plugin: 0.9.0_webpack@4.47.0 minimist: 1.2.8 - pnp-webpack-plugin: 1.7.0_typescript@4.6.4 + pnp-webpack-plugin: 1.7.0 portfinder: 1.0.37 postcss-loader: 3.0.0 ssri: 8.0.1 terser-webpack-plugin: 1.4.6_webpack@4.47.0 thread-loader: 2.1.3_webpack@4.47.0 - url-loader: 2.3.0_file-loader@4.3.0+webpack@4.47.0 - vue-loader: 15.9.8_2f3b929802a1687b12f0475f183a1979 + url-loader: 2.3.0_xnfab4wkhg6qoyn7pkd7if7xei + vue-loader: 15.9.8_i3ab2kpwkutymjqxim3t6dbkae vue-style-loader: 4.1.3 vue-template-compiler: 2.6.13_vue@2.6.13 webpack: 4.47.0 @@ -7026,10 +7169,10 @@ packages: '@vue/shared': 3.5.18 dev: true - /@vue/component-compiler-utils/3.3.0_lodash@4.17.21: + /@vue/component-compiler-utils/3.3.0: resolution: {integrity: sha512-97sfH2mYNU+2PzGrmK2haqffDpVASuib9/w2/noxiFi31Z54hW+q3izKQXXQZSNhtiUpAI36uSuYepeBe4wpHQ==} dependencies: - consolidate: 0.15.1_lodash@4.17.21 + consolidate: 0.15.1 hash-sum: 1.0.2 lru-cache: 4.1.5 merge-source-map: 1.1.0 @@ -7038,7 +7181,7 @@ packages: source-map: 0.6.1 vue-template-es2015-compiler: 1.9.1 optionalDependencies: - prettier: 2.8.8 + prettier: 2.4.1 transitivePeerDependencies: - arc-templates - atpl @@ -7099,7 +7242,7 @@ packages: resolution: {integrity: sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==} dev: false - /@vue/preload-webpack-plugin/1.1.2_c22798690011568ecfa607ecb6af1e3a: + /@vue/preload-webpack-plugin/1.1.2_yitzq2iacfli5t5ga7wlnly6hi: resolution: {integrity: sha512-LIZMuJk38pk9U9Ur4YzHjlIyMuxPlACdBIHH9/nGYVTsaGKOSnSuELiE8vS9wa+dJpIYspYUOqk+L1Q4pgHQHQ==} engines: {node: '>=6.0.0'} peerDependencies: @@ -7496,14 +7639,14 @@ packages: '@xtuc/long': 4.2.2 dev: true - /@webpack-cli/configtest/1.2.0_490d0688265d0e6d0d10495397f9e4cc: + /@webpack-cli/configtest/1.2.0_jegqncbgluhg2diqjfjzp6pezq: resolution: {integrity: sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==} peerDependencies: webpack: 4.x.x || 5.x.x webpack-cli: 4.x.x dependencies: - webpack: 5.100.2_e895a1b7cf9a7664b898a75f8f813ceb - webpack-cli: 4.10.0_3497eda2b4c6c624c213829ca27e2a7e + webpack: 5.100.2_webpack-cli@4.10.0 + webpack-cli: 4.10.0_gsl63ivuy3dcjqqtqkoke7rkpy dev: true /@webpack-cli/info/1.5.0_webpack-cli@4.10.0: @@ -7512,10 +7655,10 @@ packages: webpack-cli: 4.x.x dependencies: envinfo: 7.14.0 - webpack-cli: 4.10.0_3497eda2b4c6c624c213829ca27e2a7e + webpack-cli: 4.10.0_gsl63ivuy3dcjqqtqkoke7rkpy dev: true - /@webpack-cli/serve/1.7.0_4d04dd523775bfae9098c877d1cbab67: + /@webpack-cli/serve/1.7.0_jucn2urxow725eeyzb35ds5lm4: resolution: {integrity: sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==} peerDependencies: webpack-cli: 4.x.x @@ -7524,8 +7667,8 @@ packages: webpack-dev-server: optional: true dependencies: - webpack-cli: 4.10.0_3497eda2b4c6c624c213829ca27e2a7e - webpack-dev-server: 4.15.2_490d0688265d0e6d0d10495397f9e4cc + webpack-cli: 4.10.0_gsl63ivuy3dcjqqtqkoke7rkpy + webpack-dev-server: 4.15.2_jegqncbgluhg2diqjfjzp6pezq dev: true /@xtuc/ieee754/1.2.0: @@ -7736,7 +7879,7 @@ packages: ajv: optional: true dependencies: - ajv: 8.9.0 + ajv: 8.17.1 dev: true /ajv-keywords/3.5.2_ajv@6.12.6: @@ -8349,7 +8492,7 @@ packages: - supports-color dev: true - /babel-loader/8.2.5_7dddd9639c99a92327862aa45340f942: + /babel-loader/8.2.5_pxo5sy44tgusgj4gfksfgqhzii: resolution: {integrity: sha512-OSiFfH89LrEMiWd4pLNqGz4CwJDtbs2ZVc+iGu2HrkRfPxId9F2anQj38IxWpmRfsUY0aBZYi1EFcd3mhtRMLQ==} engines: {node: '>= 8.9'} peerDependencies: @@ -8361,10 +8504,10 @@ packages: loader-utils: 2.0.4 make-dir: 3.1.0 schema-utils: 2.7.1 - webpack: 5.76.1_@swc+core@1.13.2+esbuild@0.14.22 + webpack: 5.76.1_esbuild@0.14.22 dev: true - /babel-loader/8.4.1_1f04fbb924cd1fb984eb862020a49672: + /babel-loader/8.4.1_d4cpxojezup3tbhlqyqcbjewoi: resolution: {integrity: sha512-nXzRChX+Z1GoE6yWavBQg6jDslyFF3SDjl2paADuoQtQW10JqShJt62R6eJQ5m/pjJFDT8xgKIWSP85OY8eXeA==} engines: {node: '>= 8.9'} peerDependencies: @@ -8376,10 +8519,10 @@ packages: loader-utils: 2.0.4 make-dir: 3.1.0 schema-utils: 2.7.1 - webpack: 5.100.2_e895a1b7cf9a7664b898a75f8f813ceb + webpack: 5.100.2_webpack-cli@4.10.0 dev: true - /babel-loader/8.4.1_9972647875b9ef9f7f84547ae14472ad: + /babel-loader/8.4.1_tfzgi6dvxhxz674ekr5ocrdsvu: resolution: {integrity: sha512-nXzRChX+Z1GoE6yWavBQg6jDslyFF3SDjl2paADuoQtQW10JqShJt62R6eJQ5m/pjJFDT8xgKIWSP85OY8eXeA==} engines: {node: '>= 8.9'} peerDependencies: @@ -9062,7 +9205,7 @@ packages: mississippi: 3.0.0 mkdirp: 0.5.6 move-concurrently: 1.0.1 - promise-inflight: 1.0.1 + promise-inflight: 1.0.1_bluebird@3.7.2 rimraf: 2.7.1 ssri: 6.0.2 unique-filename: 1.1.1 @@ -9497,7 +9640,7 @@ packages: peerDependencies: webpack: '>=4.0.1' dependencies: - webpack: 5.76.1_@swc+core@1.13.2+esbuild@0.14.22 + webpack: 5.76.1_esbuild@0.14.22 dev: true /cjs-module-lexer/1.4.3: @@ -9703,13 +9846,15 @@ packages: - supports-color dev: true - /codelyzer/6.0.2_tslint@6.1.3: + /codelyzer/6.0.2_dq7hearxic3slctgwagd6bnwpa: resolution: {integrity: sha512-v3+E0Ucu2xWJMOJ2fA/q9pDT/hlxHftHGPUay1/1cTgyPV5JTHFdO9hqo837Sx2s9vKBMTt5gO+lhF95PO6J+g==} peerDependencies: + '@angular/compiler': '>=2.3.1 <13.0.0 || ^12.0.0-next || ^12.1.0-next || ^12.2.0-next' + '@angular/core': '>=2.3.1 <13.0.0 || ^12.0.0-next || ^12.1.0-next || ^12.2.0-next' tslint: ^5.0.0 || ^6.0.0 dependencies: - '@angular/compiler': 9.0.0_tslib@1.14.1 - '@angular/core': 9.0.0_ed6f97b6c42afc3b298adb4ba822fb67 + '@angular/compiler': 13.4.0 + '@angular/core': 13.2.4_rxjs@6.6.7+zone.js@0.10.3 app-root-path: 3.1.0 aria-query: 3.0.0 axobject-query: 2.0.2 @@ -9993,7 +10138,7 @@ packages: resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} dev: true - /consolidate/0.15.1_lodash@4.17.21: + /consolidate/0.15.1: resolution: {integrity: sha512-DW46nrsMJgy9kqAbPt5rKaCr7uFtpo4mSUvLHIUbJEjm0vo+aY5QLwBUq3FK4tRnJr/X0Psc0C4jf/h+HtXSMw==} engines: {node: '>= 0.10.0'} deprecated: Please upgrade to consolidate v1.0.0+ as it has been modernized with several long-awaited fixes implemented. Maintenance is supported by Forward Email at https://forwardemail.net ; follow/watch https://github.com/ladjs/consolidate for updates and release changelog @@ -10025,7 +10170,7 @@ packages: lodash: ^4.17.20 marko: ^3.14.4 mote: ^0.2.0 - mustache: ^4.0.1 + mustache: ^3.0.0 nunjucks: ^3.2.2 plates: ~0.4.11 pug: ^3.0.0 @@ -10160,7 +10305,6 @@ packages: optional: true dependencies: bluebird: 3.7.2 - lodash: 4.17.21 dev: true /constants-browserify/1.0.0: @@ -10242,7 +10386,7 @@ packages: normalize-path: 3.0.0 schema-utils: 4.3.2 serialize-javascript: 6.0.2 - webpack: 5.76.1_@swc+core@1.13.2+esbuild@0.14.22 + webpack: 5.76.1_esbuild@0.14.22 dev: true /copy-webpack-plugin/10.2.3_webpack@5.100.2: @@ -10257,7 +10401,7 @@ packages: normalize-path: 3.0.0 schema-utils: 4.3.2 serialize-javascript: 6.0.2 - webpack: 5.100.2_e895a1b7cf9a7664b898a75f8f813ceb + webpack: 5.100.2_webpack-cli@4.10.0 dev: true /copy-webpack-plugin/5.1.2_webpack@4.47.0: @@ -10548,7 +10692,7 @@ packages: postcss-value-parser: 4.2.0 schema-utils: 3.3.0 semver: 7.7.2 - webpack: 5.100.2_e895a1b7cf9a7664b898a75f8f813ceb + webpack: 5.100.2_webpack-cli@4.10.0 dev: true /css-loader/6.5.1_webpack@5.76.1: @@ -10565,7 +10709,7 @@ packages: postcss-modules-values: 4.0.0_postcss@8.4.5 postcss-value-parser: 4.2.0 semver: 7.3.5 - webpack: 5.76.1_@swc+core@1.13.2+esbuild@0.14.22 + webpack: 5.76.1_esbuild@0.14.22 dev: true /css-prefers-color-scheme/6.0.3_postcss@8.4.5: @@ -12158,7 +12302,7 @@ packages: source-map: 0.6.1 dev: true - /eslint-loader/2.2.1_eslint@6.8.0+webpack@4.47.0: + /eslint-loader/2.2.1_wsjju5mmssk4epkfodpe6kyapq: resolution: {integrity: sha512-RLgV9hoCVsMLvOxCuNjdqOrUqIj9oJg8hF44vzJaYqsAHuY9G2YAeN3joQ9nxP0p5Th9iFSIpKo+SD8KISxXRg==} deprecated: This loader has been deprecated. Please use eslint-webpack-plugin peerDependencies: @@ -13044,7 +13188,7 @@ packages: dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.100.2_e895a1b7cf9a7664b898a75f8f813ceb + webpack: 5.100.2_webpack-cli@4.10.0 dev: true /file-uri-to-path/1.0.0: @@ -13677,7 +13821,7 @@ packages: fs.realpath: 1.0.0 inflight: 1.0.6 inherits: 2.0.4 - minimatch: 3.0.5 + minimatch: 3.1.2 once: 1.4.0 path-is-absolute: 1.0.1 dev: true @@ -14584,7 +14728,7 @@ packages: lodash: 4.17.21 pretty-error: 4.0.0 tapable: 2.2.2 - webpack: 5.100.2_@swc+core@1.13.2 + webpack: 5.100.2 dev: true /htmlparser2/6.1.0: @@ -14655,12 +14799,12 @@ packages: dependencies: '@tootallnate/once': 2.0.0 agent-base: 6.0.2 - debug: 4.3.3 + debug: 4.4.1 transitivePeerDependencies: - supports-color dev: true - /http-proxy-middleware/0.19.1_debug@4.4.1+supports-color@6.1.0: + /http-proxy-middleware/0.19.1_2exdtx4mwvr4bxk6slc5i6wlxq: resolution: {integrity: sha512-yHYTgWMQO8VvwNS22eLLloAkvungsKdKTLO8AJlftYIKNfJr3GK3zK0ZCfzDDGUBttdGc8xFy1mCitvNKQtC3Q==} engines: {node: '>=4.0.0'} dependencies: @@ -15826,7 +15970,7 @@ packages: resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} engines: {node: '>=8'} dependencies: - '@babel/core': 7.16.12 + '@babel/core': 7.28.0 '@babel/parser': 7.28.0 '@istanbuljs/schema': 0.1.3 istanbul-lib-coverage: 3.2.2 @@ -16656,7 +16800,7 @@ packages: - supports-color dev: true - /karma-jasmine-html-reporter/1.7.0_83b524e6b05909328d7801c9bc9b7922: + /karma-jasmine-html-reporter/1.7.0_qo2sjzvqleetfdlyahe3zg3zei: resolution: {integrity: sha512-pzum1TL7j90DTE86eFt48/s12hqwQuiD+e5aXx2Dc9wDEn2LfGq6RoAxEZZjFiN0RDSCOnosEKRZWxbQ+iMpQQ==} peerDependencies: jasmine-core: '>=3.8' @@ -16819,7 +16963,7 @@ packages: dependencies: klona: 2.0.6 less: 4.1.2 - webpack: 5.76.1_@swc+core@1.13.2+esbuild@0.14.22 + webpack: 5.76.1_esbuild@0.14.22 dev: true /less-loader/5.0.0: @@ -16834,7 +16978,7 @@ packages: pify: 4.0.1 dev: true - /less-loader/5.0.0_less@3.13.1+webpack@5.100.2: + /less-loader/5.0.0_plbcidfwhrv3gnbjs3auswajau: resolution: {integrity: sha512-bquCU89mO/yWLaUq0Clk7qCsKhsF/TZpJUzETRvJa9KSVEL9SO3ovCvdEHISBhrC81OwC8QSVX7E0bzElZj9cg==} engines: {node: '>= 4.8.0'} peerDependencies: @@ -16845,7 +16989,7 @@ packages: less: 3.13.1 loader-utils: 1.4.2 pify: 4.0.1 - webpack: 5.100.2_e895a1b7cf9a7664b898a75f8f813ceb + webpack: 5.100.2_webpack-cli@4.10.0 dev: true /less/3.13.1: @@ -16930,7 +17074,7 @@ packages: webpack-sources: optional: true dependencies: - webpack: 5.76.1_@swc+core@1.13.2+esbuild@0.14.22 + webpack: 5.76.1_esbuild@0.14.22 webpack-sources: 3.3.3 dev: true @@ -17341,7 +17485,7 @@ packages: resolution: {integrity: sha512-xTYd4JVHpSCW+aqDof6w/MebaMVNTVYBZhbB/vi513xXdiPT92JMVCo0Jq8W2UZnzYRFeVbQiQ+I25l13JuKvA==} hasBin: true optionalDependencies: - minimist: 1.2.8 + minimist: 1.2.5 dev: true /makeerror/1.0.12: @@ -18490,7 +18634,7 @@ packages: webpack: ^5.0.0 dependencies: schema-utils: 4.3.2 - webpack: 5.76.1_@swc+core@1.13.2+esbuild@0.14.22 + webpack: 5.76.1_esbuild@0.14.22 dev: true /mini-css-extract-plugin/2.9.2_webpack@5.100.2: @@ -18501,7 +18645,7 @@ packages: dependencies: schema-utils: 4.3.2 tapable: 2.2.2 - webpack: 5.100.2_e895a1b7cf9a7664b898a75f8f813ceb + webpack: 5.100.2_webpack-cli@4.10.0 dev: true /minimalistic-assert/1.0.1: @@ -18672,7 +18816,7 @@ packages: hasBin: true dev: true - /mobx-react-lite/3.4.3_823aee0b6ad81eb6055e2299c84e0cfd: + /mobx-react-lite/3.4.3_qi5o4c3k3aplmbk6ekm4qtqm7u: resolution: {integrity: sha512-NkJREyFTSUXR772Qaai51BnE1voWx56LOL80xG7qkZr6vo8vEaLF3sz1JNUVh+rxmUzxYaqOhfuxTfqUh0FXUg==} peerDependencies: mobx: ^6.1.0 @@ -18690,7 +18834,7 @@ packages: react-dom: 17.0.2_react@17.0.2 dev: false - /mobx-react/7.6.0_823aee0b6ad81eb6055e2299c84e0cfd: + /mobx-react/7.6.0_qi5o4c3k3aplmbk6ekm4qtqm7u: resolution: {integrity: sha512-+HQUNuh7AoQ9ZnU6c4rvbiVVl+wEkb9WqYsVDzGLng+Dqj1XntHu79PvEWKtSMoMj67vFp/ZPXcElosuJO8ckA==} peerDependencies: mobx: ^6.1.0 @@ -18704,7 +18848,7 @@ packages: optional: true dependencies: mobx: 6.13.7 - mobx-react-lite: 3.4.3_823aee0b6ad81eb6055e2299c84e0cfd + mobx-react-lite: 3.4.3_qi5o4c3k3aplmbk6ekm4qtqm7u react: 17.0.2 react-dom: 17.0.2_react@17.0.2 dev: false @@ -18760,7 +18904,7 @@ packages: kleur: 3.0.3 listify: 1.0.3 lodash: 4.17.21 - minimist: 1.2.8 + minimist: 1.2.5 prop-ini: 0.0.2 rc: 1.2.8 readme-badger: 0.3.0 @@ -18788,7 +18932,7 @@ packages: lodash: 4.17.21 longest: 2.0.1 middleearth-names: 1.1.0 - minimist: 1.2.8 + minimist: 1.2.5 mrm-core: 6.1.7 semver-utils: 1.1.4 update-notifier: 4.1.3 @@ -20037,11 +20181,11 @@ packages: semver-compare: 1.0.0 dev: true - /pnp-webpack-plugin/1.7.0_typescript@4.6.4: + /pnp-webpack-plugin/1.7.0: resolution: {integrity: sha512-2Rb3vm+EXble/sMXNSu6eoBx8e79gKqhNq9F5ZWW6ERNCTE/Q0wQNne5541tE5vKjfM8hpNCYL+LGc1YTfI0dg==} engines: {node: '>=6'} dependencies: - ts-pnp: 1.2.0_typescript@4.6.4 + ts-pnp: 1.2.0 transitivePeerDependencies: - typescript dev: true @@ -20389,7 +20533,7 @@ packages: schema-utils: 1.0.0 dev: true - /postcss-loader/6.2.1_postcss@8.4.5+webpack@5.76.1: + /postcss-loader/6.2.1_2zav35mtvqhznskbbcl7zq3hti: resolution: {integrity: sha512-WbbYpmAaKcux/P66bZ40bpWsBucjx/TTgVVzRZ9yUO8yQfVBlameJ0ZGVaPfH64hNSBh63a+ICP5nqOpBA0w+Q==} engines: {node: '>= 12.13.0'} peerDependencies: @@ -20400,7 +20544,7 @@ packages: klona: 2.0.6 postcss: 8.4.5 semver: 7.3.5 - webpack: 5.76.1_@swc+core@1.13.2+esbuild@0.14.22 + webpack: 5.76.1_esbuild@0.14.22 dev: true /postcss-logical/5.0.4_postcss@8.4.5: @@ -20613,7 +20757,7 @@ packages: peerDependencies: postcss: ^8.2 dependencies: - '@csstools/selector-specificity': 2.2.0_postcss-selector-parser@6.1.2 + '@csstools/selector-specificity': 2.2.0_j747yjqyvnzekvomyruvypt3ti postcss: 8.4.5 postcss-selector-parser: 6.1.2 dev: true @@ -20952,7 +21096,7 @@ packages: dependencies: '@typescript-eslint/parser': 1.13.0_eslint@5.16.0 common-tags: 1.8.2 - core-js: 3.44.0 + core-js: 3.21.1 dlv: 1.1.3 eslint: 5.16.0 indent-string: 4.0.0 @@ -20979,14 +21123,6 @@ packages: hasBin: true dev: true - /prettier/2.8.8: - resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} - engines: {node: '>=10.13.0'} - hasBin: true - requiresBuild: true - dev: true - optional: true - /pretty-bytes/5.6.0: resolution: {integrity: sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==} engines: {node: '>=6'} @@ -21055,6 +21191,17 @@ packages: optional: true dev: true + /promise-inflight/1.0.1_bluebird@3.7.2: + resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} + peerDependencies: + bluebird: '*' + peerDependenciesMeta: + bluebird: + optional: true + dependencies: + bluebird: 3.7.2 + dev: true + /promise-polyfill/8.3.0: resolution: {integrity: sha512-H5oELycFml5yto/atYqmjyigJoAo3+OXwolYiH7OfQuYlAqhxNvTfiNMbV9hsC6Yp83yE5r2KTVmtrG6R9i6Pg==} @@ -21342,7 +21489,7 @@ packages: dependencies: deep-extend: 0.6.0 ini: 1.3.8 - minimist: 1.2.8 + minimist: 1.2.5 strip-json-comments: 2.0.1 dev: true @@ -21373,6 +21520,15 @@ packages: react: 18.1.0 dev: false + /react-clientside-effect/1.2.8_react@19.1.0: + resolution: {integrity: sha512-ma2FePH0z3px2+WOu6h+YycZcEvFmmxIlAb62cF52bG86eMySciO/EQZeQMXd07kPCYB0a1dWDT5J+KE9mCDUw==} + peerDependencies: + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + dependencies: + '@babel/runtime': 7.28.2 + react: 19.1.0 + dev: false + /react-dom/16.14.0_react@16.14.0: resolution: {integrity: sha512-1gCeQXDLoIqMgqD3IO2Ah9bnf0w9kzhwN5q4FGnHZ67hBm9yePzB5JJAIQCc8x3pFnNlwFq4RidZggNAAkzWWw==} peerDependencies: @@ -21410,7 +21566,6 @@ packages: dependencies: react: 19.1.0 scheduler: 0.26.0 - dev: false /react-focus-lock/2.13.6_react@16.14.0: resolution: {integrity: sha512-ehylFFWyYtBKXjAO9+3v8d0i+cnc1trGS0vlTGhzFW1vbFXVUTmR8s2tt/ZQG8x5hElg6rhENlLG1H3EZK0Llg==} @@ -21466,6 +21621,24 @@ packages: use-sidecar: 1.1.3_react@18.1.0 dev: false + /react-focus-lock/2.13.6_react@19.1.0: + resolution: {integrity: sha512-ehylFFWyYtBKXjAO9+3v8d0i+cnc1trGS0vlTGhzFW1vbFXVUTmR8s2tt/ZQG8x5hElg6rhENlLG1H3EZK0Llg==} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + '@babel/runtime': 7.28.2 + focus-lock: 1.3.6 + prop-types: 15.8.1 + react: 19.1.0 + react-clientside-effect: 1.2.8_react@19.1.0 + use-callback-ref: 1.3.3_react@19.1.0 + use-sidecar: 1.1.3_react@19.1.0 + dev: false + /react-is/16.13.1: resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==} @@ -21531,6 +21704,31 @@ packages: - supports-color dev: true + /react-markdown/7.1.1_react@19.1.0: + resolution: {integrity: sha512-bXS7indkcPlCLB6wRFFzX8Xdghr62TBxUF2587o+CUkaZlNaoILb2qNt+5pYmTZuCOC+OeEcdJ+06mu5whtCVQ==} + peerDependencies: + '@types/react': '>=16' + react: '>=16' + dependencies: + '@types/hast': 2.3.10 + '@types/unist': 2.0.11 + comma-separated-tokens: 2.0.3 + hast-util-whitespace: 2.0.1 + prop-types: 15.8.1 + property-information: 6.5.0 + react: 19.1.0 + react-is: 17.0.2 + remark-parse: 10.0.2 + remark-rehype: 9.1.0 + space-separated-tokens: 2.0.2 + style-to-object: 0.3.0 + unified: 10.1.2 + unist-util-visit: 4.1.2 + vfile: 5.3.7 + transitivePeerDependencies: + - supports-color + dev: true + /react-markdown/8.0.7_react@17.0.2: resolution: {integrity: sha512-bvWbzG4MtOU62XqBx3Xx+zB2raaFFsq4mYiAzfjXJMEz2sixgeAfraA3tvzULF02ZdOMUOKTBFFaZJDDrq+BJQ==} peerDependencies: @@ -21582,7 +21780,7 @@ packages: tiny-warning: 1.0.3 dev: false - /react-router-dom/6.3.0_react-dom@18.1.0+react@18.1.0: + /react-router-dom/6.3.0_ef5jwxihqo6n7gxfmzogljlgcm: resolution: {integrity: sha512-uaJj7LKytRxZNQV8+RbzJWnJ8K2nPsOOEuX7aQstlMZKQT0164C+X2w6bnkqU3sjtLvpd5ojrezAyfZ1+0sStw==} peerDependencies: react: '>=16.8' @@ -21594,20 +21792,19 @@ packages: react-router: 6.3.0_react@18.1.0 dev: false - /react-router-dom/6.30.1_react-dom@17.0.2+react@17.0.2: - resolution: {integrity: sha512-llKsgOkZdbPU1Eg3zK8lCn+sjD9wMRZZPuzmdWWX5SUs8OFkN5HnFVC0u5KMeMaC9aoancFI/KoLuKPqN+hxHw==} - engines: {node: '>=14.0.0'} + /react-router-dom/6.3.0_j6k6oay3ugsr56slyfvma2drry: + resolution: {integrity: sha512-uaJj7LKytRxZNQV8+RbzJWnJ8K2nPsOOEuX7aQstlMZKQT0164C+X2w6bnkqU3sjtLvpd5ojrezAyfZ1+0sStw==} peerDependencies: react: '>=16.8' react-dom: '>=16.8' dependencies: - '@remix-run/router': 1.23.0 - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 - react-router: 6.30.1_react@17.0.2 + history: 5.3.0 + react: 19.1.0 + react-dom: 19.1.0_react@19.1.0 + react-router: 6.3.0_react@19.1.0 dev: false - /react-router-dom/6.30.1_react-dom@19.1.0+react@19.1.0: + /react-router-dom/6.30.1_j6k6oay3ugsr56slyfvma2drry: resolution: {integrity: sha512-llKsgOkZdbPU1Eg3zK8lCn+sjD9wMRZZPuzmdWWX5SUs8OFkN5HnFVC0u5KMeMaC9aoancFI/KoLuKPqN+hxHw==} engines: {node: '>=14.0.0'} peerDependencies: @@ -21620,6 +21817,19 @@ packages: react-router: 6.30.1_react@19.1.0 dev: false + /react-router-dom/6.30.1_sfoxds7t5ydpegc3knd667wn6m: + resolution: {integrity: sha512-llKsgOkZdbPU1Eg3zK8lCn+sjD9wMRZZPuzmdWWX5SUs8OFkN5HnFVC0u5KMeMaC9aoancFI/KoLuKPqN+hxHw==} + engines: {node: '>=14.0.0'} + peerDependencies: + react: '>=16.8' + react-dom: '>=16.8' + dependencies: + '@remix-run/router': 1.23.0 + react: 17.0.2 + react-dom: 17.0.2_react@17.0.2 + react-router: 6.30.1_react@17.0.2 + dev: false + /react-router/5.3.4_react@16.14.0: resolution: {integrity: sha512-Ys9K+ppnJah3QuaRiLxk+jDWOR1MekYQrlytiXxC1RyfbdsZkS5pvKAzCCr031xHixZwpnsYNT5xysdFHQaYsA==} peerDependencies: @@ -21646,6 +21856,15 @@ packages: react: 18.1.0 dev: false + /react-router/6.3.0_react@19.1.0: + resolution: {integrity: sha512-7Wh1DzVQ+tlFjkeo+ujvjSqSJmkt1+8JO+T5xklPlgrh70y7ogx75ODRW0ThWhY7S+6yEDks8TYrtQe/aoboBQ==} + peerDependencies: + react: '>=16.8' + dependencies: + history: 5.3.0 + react: 19.1.0 + dev: false + /react-router/6.30.1_react@17.0.2: resolution: {integrity: sha512-X1m21aEmxGXqENEPG3T6u0Th7g0aS4ZmoNynhbs+Cn+q+QGTLt+d5IQ2bHAXKzKcxGJjxACpVbnYQSCRcfxHlQ==} engines: {node: '>=14.0.0'} @@ -21666,7 +21885,7 @@ packages: react: 19.1.0 dev: false - /react-svg/15.1.9_react-dom@16.14.0+react@16.14.0: + /react-svg/15.1.9_wcqkhtmu7mswc6yz4uyexck3ty: resolution: {integrity: sha512-N+/eD+jadXUpUN3ckdVYUJPgJSKDY42pae+Vlt6bHhP7y8pn+wtFqy2J+REZiyMjpyvoyt/opk74vrlsZqOhog==} peerDependencies: react: ^16.0.0 || ^17.0.0 || ^18.0.0 @@ -21680,7 +21899,7 @@ packages: react-dom: 16.14.0_react@16.14.0 dev: true - /react-transition-group/4.4.5_react-dom@16.14.0+react@16.14.0: + /react-transition-group/4.4.5_ef5jwxihqo6n7gxfmzogljlgcm: resolution: {integrity: sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==} peerDependencies: react: '>=16.6.0' @@ -21690,11 +21909,25 @@ packages: dom-helpers: 5.2.1 loose-envify: 1.4.0 prop-types: 15.8.1 - react: 16.14.0 - react-dom: 16.14.0_react@16.14.0 + react: 18.1.0 + react-dom: 18.1.0_react@18.1.0 + dev: false + + /react-transition-group/4.4.5_j6k6oay3ugsr56slyfvma2drry: + resolution: {integrity: sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==} + peerDependencies: + react: '>=16.6.0' + react-dom: '>=16.6.0' + dependencies: + '@babel/runtime': 7.28.2 + dom-helpers: 5.2.1 + loose-envify: 1.4.0 + prop-types: 15.8.1 + react: 19.1.0 + react-dom: 19.1.0_react@19.1.0 dev: false - /react-transition-group/4.4.5_react-dom@17.0.2+react@17.0.2: + /react-transition-group/4.4.5_sfoxds7t5ydpegc3knd667wn6m: resolution: {integrity: sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==} peerDependencies: react: '>=16.6.0' @@ -21708,7 +21941,7 @@ packages: react-dom: 17.0.2_react@17.0.2 dev: false - /react-transition-group/4.4.5_react-dom@18.1.0+react@18.1.0: + /react-transition-group/4.4.5_wcqkhtmu7mswc6yz4uyexck3ty: resolution: {integrity: sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==} peerDependencies: react: '>=16.6.0' @@ -21718,8 +21951,8 @@ packages: dom-helpers: 5.2.1 loose-envify: 1.4.0 prop-types: 15.8.1 - react: 18.1.0 - react-dom: 18.1.0_react@18.1.0 + react: 16.14.0 + react-dom: 16.14.0_react@16.14.0 dev: false /react/16.14.0: @@ -21746,7 +21979,6 @@ packages: /react/19.1.0: resolution: {integrity: sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==} engines: {node: '>=0.10.0'} - dev: false /read-cache/1.0.0: resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} @@ -22954,7 +23186,7 @@ packages: klona: 2.0.6 neo-async: 2.6.2 sass: 1.49.9 - webpack: 5.76.1_@swc+core@1.13.2+esbuild@0.14.22 + webpack: 5.76.1_esbuild@0.14.22 dev: true /sass/1.49.9: @@ -23009,7 +23241,6 @@ packages: /scheduler/0.26.0: resolution: {integrity: sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==} - dev: false /schema-utils/1.0.0: resolution: {integrity: sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==} @@ -23642,7 +23873,7 @@ packages: engines: {node: '>= 10'} dependencies: agent-base: 6.0.2 - debug: 4.3.3 + debug: 4.4.1 socks: 2.8.6 transitivePeerDependencies: - supports-color @@ -23653,7 +23884,7 @@ packages: engines: {node: '>= 10'} dependencies: agent-base: 6.0.2 - debug: 4.3.3 + debug: 4.4.1 socks: 2.8.6 transitivePeerDependencies: - supports-color @@ -23691,7 +23922,7 @@ packages: abab: 2.0.6 iconv-lite: 0.6.3 source-map-js: 1.2.1 - webpack: 5.76.1_@swc+core@1.13.2+esbuild@0.14.22 + webpack: 5.76.1_esbuild@0.14.22 dev: true /source-map-resolve/0.5.3: @@ -24220,7 +24451,7 @@ packages: dependencies: loader-utils: 2.0.4 schema-utils: 3.3.0 - webpack: 5.100.2_e895a1b7cf9a7664b898a75f8f813ceb + webpack: 5.100.2_webpack-cli@4.10.0 dev: true /style-to-js/1.1.17: @@ -24256,7 +24487,7 @@ packages: postcss-selector-parser: 3.1.2 dev: true - /stylus-loader/6.2.0_stylus@0.56.0+webpack@5.76.1: + /stylus-loader/6.2.0_tflq7wolhb5jandkcgy52zew2y: resolution: {integrity: sha512-5dsDc7qVQGRoc6pvCL20eYgRUxepZ9FpeK28XhdXaIPP6kXr6nI1zAAKFQgP5OBkOfKaURp4WUpJzspg1f01Gg==} engines: {node: '>= 12.13.0'} peerDependencies: @@ -24267,7 +24498,7 @@ packages: klona: 2.0.6 normalize-path: 3.0.0 stylus: github.com/stylus/stylus/14462ea7e7bffce8f192f7a933114ffbf577aa84 - webpack: 5.76.1_@swc+core@1.13.2+esbuild@0.14.22 + webpack: 5.76.1_esbuild@0.14.22 dev: true /sucrase/3.35.0: @@ -24534,7 +24765,7 @@ packages: - bluebird dev: true - /terser-webpack-plugin/5.3.14_2cc24e4f6230cbace50dae83595efcbc: + /terser-webpack-plugin/5.3.14_uxpskue2li3bnzylg2ijqeom6q: resolution: {integrity: sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==} engines: {node: '>= 10.13.0'} peerDependencies: @@ -24551,16 +24782,15 @@ packages: optional: true dependencies: '@jridgewell/trace-mapping': 0.3.29 - '@swc/core': 1.13.2 esbuild: 0.14.22 jest-worker: 27.5.1 schema-utils: 4.3.2 serialize-javascript: 6.0.2 terser: 5.43.1 - webpack: 5.76.1_@swc+core@1.13.2+esbuild@0.14.22 + webpack: 5.76.1_esbuild@0.14.22 dev: true - /terser-webpack-plugin/5.3.14_@swc+core@1.13.2+webpack@5.100.2: + /terser-webpack-plugin/5.3.14_webpack@5.100.2: resolution: {integrity: sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==} engines: {node: '>= 10.13.0'} peerDependencies: @@ -24577,12 +24807,11 @@ packages: optional: true dependencies: '@jridgewell/trace-mapping': 0.3.29 - '@swc/core': 1.13.2 jest-worker: 27.5.1 schema-utils: 4.3.2 serialize-javascript: 6.0.2 terser: 5.43.1 - webpack: 5.100.2_@swc+core@1.13.2 + webpack: 5.100.2 dev: true /terser/4.8.1: @@ -24624,7 +24853,7 @@ packages: dependencies: '@istanbuljs/schema': 0.1.3 glob: 7.2.0 - minimatch: 3.0.5 + minimatch: 3.1.2 dev: true /text-table/0.2.0: @@ -24870,7 +25099,7 @@ packages: resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} dev: true - /ts-jest/27.0.7_af55d4cbc787ed4cc2d7ab1ebb0a0b8a: + /ts-jest/27.0.7_v5k5js6hq7wuzqwxvmplwcqlri: resolution: {integrity: sha512-O41shibMqzdafpuP+CkrOL7ykbmLh+FqQrXEmV9CydQ5JBk0Sj0uAEF5TNNe94fZWKm3yYvWa/IbyV4Yg1zK2Q==} engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} hasBin: true @@ -24901,7 +25130,7 @@ packages: yargs-parser: 20.2.9 dev: true - /ts-node/10.9.2_b5ef9a98e3d44ef05ac403c9fc81607a: + /ts-node/10.9.2_mdb3dbfqy5sebt7ydoefkswigu: resolution: {integrity: sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==} hasBin: true peerDependencies: @@ -24916,7 +25145,6 @@ packages: optional: true dependencies: '@cspotcode/source-map-support': 0.8.1 - '@swc/core': 1.13.2 '@tsconfig/node10': 1.0.11 '@tsconfig/node12': 1.0.11 '@tsconfig/node14': 1.0.3 @@ -24948,7 +25176,7 @@ packages: yn: 3.1.1 dev: true - /ts-pnp/1.2.0_typescript@4.6.4: + /ts-pnp/1.2.0: resolution: {integrity: sha512-csd+vJOb/gkzvcCHgTGSChYpy5f1/XKNsmvBGO4JXS+z1v2HobugDz4s1IeFXM3wZB44uczs+eazB5Q/ccdhQw==} engines: {node: '>=6'} peerDependencies: @@ -24956,8 +25184,6 @@ packages: peerDependenciesMeta: typescript: optional: true - dependencies: - typescript: 4.6.4 dev: true /tsconfig-paths/3.15.0: @@ -25190,7 +25416,6 @@ packages: resolution: {integrity: sha512-9ia/jWHIEbo49HfjrLGfKbZSuWo9iTMwXO+Ca3pRsSpbsMbc7/IU8NKdCZVRRBafVPGnoJeFL76ZOAA84I9fEg==} engines: {node: '>=4.2.0'} hasBin: true - dev: true /typescript/4.9.5: resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} @@ -25602,7 +25827,7 @@ packages: resolution: {integrity: sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA==} dev: true - /url-loader/2.3.0_file-loader@4.3.0+webpack@4.47.0: + /url-loader/2.3.0_xnfab4wkhg6qoyn7pkd7if7xei: resolution: {integrity: sha512-goSdg8VY+7nPZKUEChZSEtW5gjbS66USIGCeSJ1OVOJ7Yfuh/36YxCwMi5HVEJh6mqUYOoy3NJ0vlOMrWsSHog==} engines: {node: '>= 8.9.0'} peerDependencies: @@ -25634,7 +25859,7 @@ packages: schema-utils: 3.3.0 dev: true - /url-loader/4.1.1_7dd85ce9aa6ee9f21630ee3b2a7ea123: + /url-loader/4.1.1_pxmfz2nkn3u7efrq5y5su7vbem: resolution: {integrity: sha512-3BTV812+AVHHOJQO8O5MkWgZ5aosP7GnROJwvzLS9hWDj00lZ6Z0wNak423Lp9PBZN05N+Jk/N5Si8jRAlGyWA==} engines: {node: '>= 10.13.0'} peerDependencies: @@ -25648,7 +25873,7 @@ packages: loader-utils: 2.0.4 mime-types: 2.1.35 schema-utils: 3.3.0 - webpack: 5.100.2_e895a1b7cf9a7664b898a75f8f813ceb + webpack: 5.100.2_webpack-cli@4.10.0 dev: true /url-parse-lax/1.0.0: @@ -25728,6 +25953,20 @@ packages: tslib: 2.8.1 dev: false + /use-callback-ref/1.3.3_react@19.1.0: + resolution: {integrity: sha512-jQL3lRnocaFtu3V00JToYz/4QkNWswxijDaCVNZRiRTO3HQDLsdu1ZtmIUvV4yPp+rvWm5j0y0TG/S61cuijTg==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + react: 19.1.0 + tslib: 2.8.1 + dev: false + /use-sidecar/1.1.3_react@16.14.0: resolution: {integrity: sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==} engines: {node: '>=10'} @@ -25773,6 +26012,21 @@ packages: tslib: 2.8.1 dev: false + /use-sidecar/1.1.3_react@19.1.0: + resolution: {integrity: sha512-Fedw0aZvkhynoPYlA5WXrMCAMm+nSWdZt6lzJQ7Ok8S6Q+VsHmHpRWndVRJ8Be0ZbkfPc5LRYH+5XrzXcEeLRQ==} + engines: {node: '>=10'} + peerDependencies: + '@types/react': '*' + react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0 || ^19.0.0-rc + peerDependenciesMeta: + '@types/react': + optional: true + dependencies: + detect-node-es: 1.1.0 + react: 19.1.0 + tslib: 2.8.1 + dev: false + /use/3.1.1: resolution: {integrity: sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==} engines: {node: '>=0.10.0'} @@ -26041,7 +26295,7 @@ packages: resolution: {integrity: sha512-BXq3jwIagosjgNVae6tkHzzIk6a8MHFtzAdwhnV5VlvPTFxDCvIttgSiHWjdGoTJvXtmRu5HacExfdarRcFhog==} dev: true - /vue-loader/15.11.1_4c9b0935bcd0246a9317c6bc95e832a5: + /vue-loader/15.11.1_3jfighbeskmcwdfhyt5x5eb77a: resolution: {integrity: sha512-0iw4VchYLePqJfJu9s62ACWUXeSqM30SQqlIftbYWM3C+jpPcEHKSPUZBLjSF9au4HTHQ/naF6OGnO3Q/qGR3Q==} peerDependencies: '@vue/compiler-sfc': ^3.0.8 @@ -26061,12 +26315,11 @@ packages: optional: true dependencies: '@vue/compiler-sfc': 3.2.31 - '@vue/component-compiler-utils': 3.3.0_lodash@4.17.21 + '@vue/component-compiler-utils': 3.3.0 cache-loader: 4.1.0_webpack@4.47.0 css-loader: 3.6.0_webpack@4.47.0 hash-sum: 1.0.2 loader-utils: 1.4.2 - prettier: 2.4.1 vue-hot-reload-api: 2.3.4 vue-style-loader: 4.1.3 webpack: 4.47.0 @@ -26126,7 +26379,7 @@ packages: - whiskers dev: true - /vue-loader/15.9.8_2f3b929802a1687b12f0475f183a1979: + /vue-loader/15.9.8_i3ab2kpwkutymjqxim3t6dbkae: resolution: {integrity: sha512-GwSkxPrihfLR69/dSV3+5CdMQ0D+jXg8Ma1S4nQXKJAznYFX14vHdc/NetQc34Dw+rBbIJyP7JOuVb9Fhprvog==} peerDependencies: '@vue/compiler-sfc': ^3.0.8 @@ -26142,7 +26395,7 @@ packages: vue-template-compiler: optional: true dependencies: - '@vue/component-compiler-utils': 3.3.0_lodash@4.17.21 + '@vue/component-compiler-utils': 3.3.0 cache-loader: 4.1.0_webpack@4.47.0 css-loader: 3.6.0_webpack@4.47.0 hash-sum: 1.0.2 @@ -26207,7 +26460,7 @@ packages: - whiskers dev: true - /vue-loader/15.9.8_53627ebac05ecb7d1ca56520271ef4da: + /vue-loader/15.9.8_iz65jxxzpozjtfy2ypfjfwww74: resolution: {integrity: sha512-GwSkxPrihfLR69/dSV3+5CdMQ0D+jXg8Ma1S4nQXKJAznYFX14vHdc/NetQc34Dw+rBbIJyP7JOuVb9Fhprvog==} peerDependencies: '@vue/compiler-sfc': ^3.0.8 @@ -26223,7 +26476,7 @@ packages: vue-template-compiler: optional: true dependencies: - '@vue/component-compiler-utils': 3.3.0_lodash@4.17.21 + '@vue/component-compiler-utils': 3.3.0 hash-sum: 1.0.2 loader-utils: 1.4.2 vue-hot-reload-api: 2.3.4 @@ -26285,7 +26538,7 @@ packages: - whiskers dev: true - /vue-loader/16.8.3_3412b4a9c35740e71a1246c1c6a47a90: + /vue-loader/16.8.3_gqjljkodk5aoogqsi3a4njd2sa: resolution: {integrity: sha512-7vKN45IxsKxe5GcVCbc2qFU5aWzyiLrYJyUuMz4BQLKctCj/fmCa0w6fGiiQ2cLFetNcek1ppGJQDCup0c1hpA==} peerDependencies: '@vue/compiler-sfc': ^3.0.8 @@ -26325,8 +26578,12 @@ packages: webpack: 4.47.0 dev: true - /vue-router/3.6.5: + /vue-router/3.6.5_vue@2.6.13: resolution: {integrity: sha512-VYXZQLtjuvKxxcshuRAwjHnciqZVoXAjTjcqBTz4rKc8qih9g9pI3hbDjmqXaHdgL3v8pV6P8Z335XvHzESxLQ==} + peerDependencies: + vue: ^2 + dependencies: + vue: 2.6.13 dev: false /vue-router/4.0.12_vue@3.2.31: @@ -26543,7 +26800,7 @@ packages: javascript-stringify: 2.1.0 dev: true - /webpack-cli/4.10.0_3497eda2b4c6c624c213829ca27e2a7e: + /webpack-cli/4.10.0_gsl63ivuy3dcjqqtqkoke7rkpy: resolution: {integrity: sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w==} engines: {node: '>=10.13.0'} hasBin: true @@ -26564,9 +26821,9 @@ packages: optional: true dependencies: '@discoveryjs/json-ext': 0.5.7 - '@webpack-cli/configtest': 1.2.0_490d0688265d0e6d0d10495397f9e4cc + '@webpack-cli/configtest': 1.2.0_jegqncbgluhg2diqjfjzp6pezq '@webpack-cli/info': 1.5.0_webpack-cli@4.10.0 - '@webpack-cli/serve': 1.7.0_4d04dd523775bfae9098c877d1cbab67 + '@webpack-cli/serve': 1.7.0_jucn2urxow725eeyzb35ds5lm4 colorette: 2.0.20 commander: 7.2.0 cross-spawn: 7.0.6 @@ -26574,8 +26831,8 @@ packages: import-local: 3.2.0 interpret: 2.2.0 rechoir: 0.7.1 - webpack: 5.100.2_e895a1b7cf9a7664b898a75f8f813ceb - webpack-dev-server: 4.15.2_490d0688265d0e6d0d10495397f9e4cc + webpack: 5.100.2_webpack-cli@4.10.0 + webpack-dev-server: 4.15.2_jegqncbgluhg2diqjfjzp6pezq webpack-merge: 5.10.0 dev: true @@ -26604,7 +26861,7 @@ packages: mime-types: 2.1.35 range-parser: 1.2.1 schema-utils: 4.3.2 - webpack: 5.76.1_@swc+core@1.13.2+esbuild@0.14.22 + webpack: 5.76.1_esbuild@0.14.22 dev: true /webpack-dev-middleware/5.3.4_webpack@5.100.2: @@ -26618,7 +26875,7 @@ packages: mime-types: 2.1.35 range-parser: 1.2.1 schema-utils: 4.3.2 - webpack: 5.100.2_e895a1b7cf9a7664b898a75f8f813ceb + webpack: 5.100.2_webpack-cli@4.10.0 dev: true /webpack-dev-server/3.11.3_webpack@4.47.0: @@ -26641,7 +26898,7 @@ packages: del: 4.1.1 express: 4.21.2_supports-color@6.1.0 html-entities: 1.4.0 - http-proxy-middleware: 0.19.1_debug@4.4.1+supports-color@6.1.0 + http-proxy-middleware: 0.19.1_2exdtx4mwvr4bxk6slc5i6wlxq import-local: 2.0.0 internal-ip: 4.3.0 ip: 1.1.9 @@ -26671,7 +26928,7 @@ packages: - utf-8-validate dev: true - /webpack-dev-server/4.15.2_490d0688265d0e6d0d10495397f9e4cc: + /webpack-dev-server/4.15.2_jegqncbgluhg2diqjfjzp6pezq: resolution: {integrity: sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g==} engines: {node: '>= 12.13.0'} hasBin: true @@ -26712,8 +26969,8 @@ packages: serve-index: 1.9.1 sockjs: 0.3.24 spdy: 4.0.2 - webpack: 5.100.2_e895a1b7cf9a7664b898a75f8f813ceb - webpack-cli: 4.10.0_3497eda2b4c6c624c213829ca27e2a7e + webpack: 5.100.2_webpack-cli@4.10.0 + webpack-cli: 4.10.0_gsl63ivuy3dcjqqtqkoke7rkpy webpack-dev-middleware: 5.3.4_webpack@5.100.2 ws: 8.18.3 transitivePeerDependencies: @@ -26761,7 +27018,7 @@ packages: sockjs: 0.3.24 spdy: 4.0.2 strip-ansi: 7.1.0 - webpack: 5.76.1_@swc+core@1.13.2+esbuild@0.14.22 + webpack: 5.76.1_esbuild@0.14.22 webpack-dev-middleware: 5.3.0_webpack@5.76.1 ws: 8.18.3 transitivePeerDependencies: @@ -26815,7 +27072,7 @@ packages: engines: {node: '>=10.13.0'} dev: true - /webpack-subresource-integrity/5.1.0_b1cc9547adf104f675bf29e24358ec6a: + /webpack-subresource-integrity/5.1.0_whgjkr5n6ecpm5n7fhregwhmni: resolution: {integrity: sha512-sacXoX+xd8r4WKsy9MvH/q/vBtEHr86cpImXwyg74pFIpERKt6FmB8cXpeuh0ZLgclOlHI4Wcll7+R5L02xk9Q==} engines: {node: '>= 12'} peerDependencies: @@ -26827,7 +27084,7 @@ packages: dependencies: html-webpack-plugin: 5.6.3_webpack@5.100.2 typed-assert: 1.0.9 - webpack: 5.76.1_@swc+core@1.13.2+esbuild@0.14.22 + webpack: 5.76.1_esbuild@0.14.22 dev: true /webpack/4.47.0: @@ -26870,7 +27127,7 @@ packages: - supports-color dev: true - /webpack/5.100.2_@swc+core@1.13.2: + /webpack/5.100.2: resolution: {integrity: sha512-QaNKAvGCDRh3wW1dsDjeMdDXwZm2vqq3zn6Pvq4rHOEOGSaUMgOOjG2Y9ZbIGzpfkJk9ZYTHpDqgDfeBDcnLaw==} engines: {node: '>=10.13.0'} hasBin: true @@ -26902,7 +27159,7 @@ packages: neo-async: 2.6.2 schema-utils: 4.3.2 tapable: 2.2.2 - terser-webpack-plugin: 5.3.14_@swc+core@1.13.2+webpack@5.100.2 + terser-webpack-plugin: 5.3.14_webpack@5.100.2 watchpack: 2.4.4 webpack-sources: 3.3.3 transitivePeerDependencies: @@ -26911,7 +27168,7 @@ packages: - uglify-js dev: true - /webpack/5.100.2_e895a1b7cf9a7664b898a75f8f813ceb: + /webpack/5.100.2_webpack-cli@4.10.0: resolution: {integrity: sha512-QaNKAvGCDRh3wW1dsDjeMdDXwZm2vqq3zn6Pvq4rHOEOGSaUMgOOjG2Y9ZbIGzpfkJk9ZYTHpDqgDfeBDcnLaw==} engines: {node: '>=10.13.0'} hasBin: true @@ -26943,9 +27200,9 @@ packages: neo-async: 2.6.2 schema-utils: 4.3.2 tapable: 2.2.2 - terser-webpack-plugin: 5.3.14_@swc+core@1.13.2+webpack@5.100.2 + terser-webpack-plugin: 5.3.14_webpack@5.100.2 watchpack: 2.4.4 - webpack-cli: 4.10.0_3497eda2b4c6c624c213829ca27e2a7e + webpack-cli: 4.10.0_gsl63ivuy3dcjqqtqkoke7rkpy webpack-sources: 3.3.3 transitivePeerDependencies: - '@swc/core' @@ -26953,7 +27210,7 @@ packages: - uglify-js dev: true - /webpack/5.76.1_@swc+core@1.13.2+esbuild@0.14.22: + /webpack/5.76.1_esbuild@0.14.22: resolution: {integrity: sha512-4+YIK4Abzv8172/SGqObnUjaIHjLEuUasz9EwQj/9xmPPkYJy2Mh03Q/lJfSD3YLzbxy5FeTq5Uw0323Oh6SJQ==} engines: {node: '>=10.13.0'} hasBin: true @@ -26984,7 +27241,7 @@ packages: neo-async: 2.6.2 schema-utils: 3.3.0 tapable: 2.2.2 - terser-webpack-plugin: 5.3.14_2cc24e4f6230cbace50dae83595efcbc + terser-webpack-plugin: 5.3.14_uxpskue2li3bnzylg2ijqeom6q watchpack: 2.4.4 webpack-sources: 3.3.3 transitivePeerDependencies: @@ -27512,32 +27769,32 @@ packages: - encoding dev: true - file:packages/bridge-react_react-dom@16.14.0+react@16.14.0: + file:packages/bridge-react_sfoxds7t5ydpegc3knd667wn6m: resolution: {directory: packages/bridge-react, type: directory} id: file:packages/bridge-react name: '@garfish/bridge-react' - version: 1.19.4 + version: 1.19.5 peerDependencies: react: '>=16' react-dom: '>=16' dependencies: '@garfish/utils': link:packages/utils - react: 16.14.0 - react-dom: 16.14.0_react@16.14.0 + react: 17.0.2 + react-dom: 17.0.2_react@17.0.2 dev: false - file:packages/bridge-react_react-dom@17.0.2+react@17.0.2: + file:packages/bridge-react_wcqkhtmu7mswc6yz4uyexck3ty: resolution: {directory: packages/bridge-react, type: directory} id: file:packages/bridge-react name: '@garfish/bridge-react' - version: 1.19.4 + version: 1.19.5 peerDependencies: react: '>=16' react-dom: '>=16' dependencies: '@garfish/utils': link:packages/utils - react: 17.0.2 - react-dom: 17.0.2_react@17.0.2 + react: 16.14.0 + react-dom: 16.14.0_react@16.14.0 dev: false github.com/stylus/stylus/14462ea7e7bffce8f192f7a933114ffbf577aa84: @@ -27548,7 +27805,7 @@ packages: dependencies: css: 3.0.0 debug: 4.4.1 - glob: 7.2.0 + glob: 7.2.3 safer-buffer: 2.1.2 sax: 1.2.4 source-map: 0.7.6 diff --git a/website-new/docs/guide/concept/bridge.mdx b/website-new/docs/guide/concept/bridge.mdx index 78a428905..06c9c10ee 100644 --- a/website-new/docs/guide/concept/bridge.mdx +++ b/website-new/docs/guide/concept/bridge.mdx @@ -10,7 +10,7 @@ Garfish bridge 是 `garfish` 提供的帮助用户降低接入成本的工具函 :::info 1. garfish bridge 应用在子应用接入场景; 2. 使用 garfish bridge 后不再需要显示提供 `render` 和 `destroy` 函数; -3. 目前 garfish 仅针对 react 和 vue 框架提供 bridge 函数支持,支持的版本分别为 react v16、v17、v18,vue v2、v3; +3. 目前 garfish 仅针对 react 和 vue 框架提供 bridge 函数支持,支持的版本分别为 react v16、v17、v18、v19,vue v2、v3; 4. garfish bridge 暂未针对构建工具如 webpack、vite 提供相应的构建工具插件,我们后期会针对这块能力进行补全,请持续关注; ::: @@ -24,6 +24,10 @@ Garfish bridge 是 `garfish` 提供的帮助用户降低接入成本的工具函 [@garfish/bridge-react-v18](https://www.npmjs.com/package/@garfish/bridge-react-v18) 工具包是 garfish 为 react v18 应用 提供的 bridge 工具函数包,其导出的 [reactBridge](/guide/concept/bridge#reactBridge) 可用于 react v18 子应用的接入,`@garfish/bridge-react-v18` 的使用见 [demo](/guide/demo/react#react-v18-导出)。 +### @garfish/bridge-react-v19 + +[@garfish/bridge-react-v19](https://www.npmjs.com/package/@garfish/bridge-react-v19) 工具包是 garfish 为 react v19 应用 提供的 bridge 工具函数包,其导出的 [reactBridge](/guide/concept/bridge#reactBridge) 可用于 react v19 子应用的接入,`@garfish/bridge-react-v19` 的使用见 [demo](/guide/demo/react#react-v19-导出)。 + ### @garfish/bridge-vue-v2 [@garfish/bridge-vue-v2](https://www.npmjs.com/package/@garfish/bridge-vue-v2) 工具包是 garfish 为 vue v2 应用 提供的 bridge 工具函数包,其导出的 [vueBridge](/guide/concept/bridge#vuebridge) 可用于 vue v2 子应用的接入,`@garfish/bridge-vue-v2` 的使用见 [demo](/guide/demo/vue#vue2-导出)。 @@ -56,17 +60,18 @@ Garfish bridge 是 `garfish` 提供的帮助用户降低接入成本的工具函 -## reactBridge(for react v16/v17/v18) +## reactBridge(for react v16/v17/v18/v19) reactBridge 是 `@garfish/bridge-react` 工具包为 react 子应用提供的 bridge 工具函数。 :::info - 针对 react v16/v17 子应用,请使用 `@garfish/bridge-react` 工具包 - 针对 react v18 子应用,请使用 `@garfish/bridge-react-v18` 工具包 +- 针对 react v19 子应用,请使用 `@garfish/bridge-react-v19` 工具包 ::: -reactBridge 是 `@garfish/bridge-react` 或 `@garfish/bridge-react-v18` 工具包为 react 子应用提供的 bridge 工具函数。 +reactBridge 是 `@garfish/bridge-react` 或 `@garfish/bridge-react-v18` 或 `@garfish/bridge-react-v19` 工具包为 react 子应用提供的 bridge 工具函数。 ### Type ```ts @@ -81,7 +86,7 @@ function reactBridge(userOpts: Options): ( ``` ### 示例 -> 可访问 [react16 子应用](https://github.com/modern-js-dev/garfish/tree/main/dev/app-react-16)、 [react17 子应用](https://github.com/modern-js-dev/garfish/tree/main/dev/app-react-17)、[react18 子应用](https://github.com/modern-js-dev/garfish/tree/main/dev/app-react-18) 查看完整 demo +> 可访问 [react16 子应用](https://github.com/modern-js-dev/garfish/tree/main/dev/app-react-16)、 [react17 子应用](https://github.com/modern-js-dev/garfish/tree/main/dev/app-react-17)、[react18 子应用](https://github.com/modern-js-dev/garfish/tree/main/dev/app-react-18)、[react19 子应用](https://github.com/modern-js-dev/garfish/tree/main/dev/app-react-19) 查看完整 demo @@ -106,6 +111,21 @@ import { reactBridge } from '@garfish/bridge-react-v18'; import RootComponent from './components/root'; import ErrorComponent from './components/ErrorBoundary'; +export const provider = reactBridge({ + el: '#root', + rootComponent: RootComponent, + errorBoundary: () => , +}); +``` + + + + +```ts +import { reactBridge } from '@garfish/bridge-react-v19'; +import RootComponent from './components/root'; +import ErrorComponent from './components/ErrorBoundary'; + export const provider = reactBridge({ el: '#root', rootComponent: RootComponent, diff --git a/website-new/docs/guide/demo/react.mdx b/website-new/docs/guide/demo/react.mdx index f50d3e260..1f02ab094 100644 --- a/website-new/docs/guide/demo/react.mdx +++ b/website-new/docs/guide/demo/react.mdx @@ -119,6 +119,53 @@ export const provider = () => { +### react v19 导出 + + + + +```tsx +// src/index.tsx +import { reactBridge } from '@garfish/bridge-react-v19'; +import RootComponent from './root'; +import ErrorBoundary from './ErrorBoundary'; + +export const provider = reactBridge({ + el: '#root', + rootComponent: RootComponent, + errorBoundary: (e: any) => , +}); + +``` + + + + + +```tsx +// src/index.tsx +import { createRoot } from 'react-dom/client'; +import RootComponent from './root'; + +// 在首次加载和执行时会触发该函数 +export const provider = () => { + let root = null; + return { + render({ basename, dom, store, props }) { + const container = dom.querySelector('#root'); + root = createRoot(container!); + (root as any).render(); + }, + destroy({ dom }) { + (root as any).unmount(); + }, + }; +}; +``` + + + + ### 3. 根组件设置路由的 basename :::info