feat: experimentally support using rspack instead

close #21682

Signed-off-by: JounQin <admin@1stg.me>
This commit is contained in:
JounQin
2024-08-09 01:07:39 +08:00
parent 9ad63932cf
commit 823484ba62
10 changed files with 565 additions and 145 deletions
+15
View File
@@ -166,6 +166,9 @@
"@backstage/dev-utils": "workspace:^",
"@backstage/test-utils": "workspace:^",
"@backstage/theme": "workspace:^",
"@rspack/core": "^0.7.5",
"@rspack/dev-server": "^0.7.5",
"@rspack/plugin-react-refresh": "^0.7.5",
"@types/cross-spawn": "^6.0.2",
"@types/diff": "^5.0.0",
"@types/ejs": "^3.1.3",
@@ -191,12 +194,24 @@
"vite-plugin-node-polyfills": "^0.22.0"
},
"peerDependencies": {
"@rspack/core": "^0.7.5",
"@rspack/dev-server": "^0.7.5",
"@rspack/plugin-react-refresh": "^0.7.5",
"@vitejs/plugin-react": "^4.0.4",
"vite": "^4.4.9",
"vite-plugin-html": "^3.2.0",
"vite-plugin-node-polyfills": "^0.22.0"
},
"peerDependenciesMeta": {
"@rspack/core": {
"optional": true
},
"@rspack/dev-server": {
"optional": true
},
"@rspack/plugin-react-refresh": {
"optional": true
},
"@vitejs/plugin-react": {
"optional": true
},
@@ -25,10 +25,11 @@ interface BuildAppOptions {
writeStats: boolean;
configPaths: string[];
isModuleFederationRemote?: true;
useRspack?: boolean;
}
export async function buildFrontend(options: BuildAppOptions) {
const { targetDir, writeStats, configPaths } = options;
const { targetDir, writeStats, configPaths, useRspack } = options;
const { name } = await fs.readJson(resolvePath(targetDir, 'package.json'));
await buildBundle({
@@ -44,5 +45,6 @@ export async function buildFrontend(options: BuildAppOptions) {
args: configPaths,
fromPackage: name,
})),
useRspack,
});
}
@@ -25,6 +25,8 @@ import { isValidUrl } from '../../lib/urls';
import chalk from 'chalk';
export async function command(opts: OptionValues): Promise<void> {
const useRspack = !!process.env.EXPERIMENTAL_RSPACK;
const role = await findRoleFromCommand(opts);
if (role === 'frontend' || role === 'backend') {
@@ -40,6 +42,7 @@ export async function command(opts: OptionValues): Promise<void> {
targetDir: paths.targetDir,
configPaths,
writeStats: Boolean(opts.stats),
useRspack,
});
}
return buildBackend({
@@ -62,6 +65,7 @@ export async function command(opts: OptionValues): Promise<void> {
configPaths: [],
writeStats: Boolean(opts.stats),
isModuleFederationRemote: true,
useRspack,
});
}
+11 -5
View File
@@ -38,7 +38,7 @@ function applyContextToError(error: string, moduleName: string): string {
}
export async function buildBundle(options: BuildOptions) {
const { statsJsonEnabled, schema: configSchema } = options;
const { statsJsonEnabled, schema: configSchema, useRspack } = options;
const paths = resolveBundlingPaths(options);
const publicPaths = await resolveOptionalBundlingPaths({
@@ -54,7 +54,7 @@ export async function buildBundle(options: BuildOptions) {
getFrontendAppConfigs: () => options.frontendAppConfigs,
};
const configs = [];
const configs: webpack.Configuration[] = [];
if (options.moduleFederation?.mode === 'remote') {
// Package detection is disabled for remote bundles
@@ -119,7 +119,7 @@ export async function buildBundle(options: BuildOptions) {
);
}
const { stats } = await build(configs, isCi);
const { stats } = await build(configs, isCi, useRspack);
if (!stats) {
throw new Error('No stats returned');
@@ -152,10 +152,16 @@ export async function buildBundle(options: BuildOptions) {
}
}
async function build(configs: webpack.Configuration[], isCi: boolean) {
async function build(
configs: webpack.Configuration[],
isCi: boolean,
useRspack?: boolean,
) {
const bundler: typeof webpack = useRspack ? require('@rspack/core') : webpack;
const stats = await new Promise<webpack.MultiStats | undefined>(
(resolve, reject) => {
webpack(configs, (err, buildStats) => {
bundler(configs, (err, buildStats) => {
if (err) {
if (err.message) {
const { errors } = formatWebpackMessages({
+100 -60
View File
@@ -21,7 +21,7 @@ import {
} from './types';
import { posix as posixPath, resolve as resolvePath, dirname } from 'path';
import chalk from 'chalk';
import webpack, { ProvidePlugin } from 'webpack';
import webpack from 'webpack';
import { BackstagePackage } from '@backstage/cli-node';
import { BundlingPaths } from './paths';
@@ -132,6 +132,7 @@ export async function createConfig(
frontendConfig,
moduleFederation,
publicSubPath = '',
useRspack,
} = options;
const { plugins, loaders } = transforms(options);
@@ -152,15 +153,20 @@ export async function createConfig(
options.moduleFederation,
);
plugins.push(
new ReactRefreshPlugin({
overlay: {
sockProtocol: 'ws',
sockHost: host,
sockPort: port,
},
}),
);
if (useRspack) {
const RspackReactRefreshPlugin = require('@rspack/plugin-react-refresh');
plugins.push(new RspackReactRefreshPlugin());
} else {
plugins.push(
new ReactRefreshPlugin({
overlay: {
sockProtocol: 'ws',
sockHost: host,
sockPort: port,
},
}),
);
}
}
if (checksEnabled) {
@@ -175,18 +181,24 @@ export async function createConfig(
);
}
const rspack = useRspack
? (require('@rspack/core') as typeof import('@rspack/core').rspack)
: undefined;
const bundler = useRspack ? (rspack as unknown as typeof webpack) : webpack;
// TODO(blam): process is no longer auto polyfilled by webpack in v5.
// we use the provide plugin to provide this polyfill, but lets look
// to remove this eventually!
plugins.push(
new ProvidePlugin({
process: require.resolve('process/browser'),
new bundler.ProvidePlugin({
process: require.resolve('process/browser'),,
Buffer: ['buffer', 'Buffer'],
}),
);
if (options.moduleFederation?.mode !== 'remote') {
plugins.push(
// `rspack.HtmlRspackPlugin` does not support object type `templateParameters` value, `frontendConfig` in this case
new HtmlWebpackPlugin({
meta: {
'backstage-app-mode': options?.appMode ?? 'public',
@@ -203,8 +215,13 @@ export async function createConfig(
if (options.moduleFederation) {
const isRemote = options.moduleFederation?.mode === 'remote';
const AdaptedModuleFederationPlugin = useRspack
? (rspack!.container
.ModuleFederationPlugin as unknown as typeof ModuleFederationPlugin)
: ModuleFederationPlugin;
plugins.push(
new ModuleFederationPlugin({
new AdaptedModuleFederationPlugin({
...(isRemote && {
filename: 'remoteEntry.js',
exposes: {
@@ -264,13 +281,17 @@ export async function createConfig(
}
const buildInfo = await readBuildInfo();
plugins.push(
new webpack.DefinePlugin({
new bundler.DefinePlugin({
'process.env.BUILD_INFO': JSON.stringify(buildInfo),
'process.env.APP_CONFIG': webpack.DefinePlugin.runtimeValue(
() => JSON.stringify(options.getFrontendAppConfigs()),
true,
),
'process.env.APP_CONFIG': useRspack
? // FIXME: see also https://github.com/web-infra-dev/rspack/issues/5606
JSON.stringify(options.getFrontendAppConfigs())
: bundler.DefinePlugin.runtimeValue(
() => JSON.stringify(options.getFrontendAppConfigs()),
true,
),
// This allows for conditional imports of react-dom/client, since there's no way
// to check for presence of it in source code without module resolution errors.
'process.env.HAS_REACT_DOM_CLIENT': JSON.stringify(hasReactDomClient()),
@@ -280,13 +301,17 @@ export async function createConfig(
// These files are required by the transpiled code when using React Refresh.
// They need to be excluded to the module scope plugin which ensures that files
// that exist in the package are required.
const reactRefreshFiles = [
require.resolve(
'@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js',
),
require.resolve('@pmmmwh/react-refresh-webpack-plugin/overlay/index.js'),
require.resolve('react-refresh'),
];
const reactRefreshFiles = useRspack
? []
: [
require.resolve(
'@pmmmwh/react-refresh-webpack-plugin/lib/runtime/RefreshUtils.js',
),
require.resolve(
'@pmmmwh/react-refresh-webpack-plugin/overlay/index.js',
),
require.resolve('react-refresh'),
];
const mode = isDev ? 'development' : 'production';
const optimization = optimizationConfig(options);
@@ -315,16 +340,19 @@ export async function createConfig(
// Instead, provide a custom definition which always uses "development" if
// the module is part of `react` or `react-dom`, and `config.mode` otherwise.
plugins.push(
new webpack.DefinePlugin({
'process.env.NODE_ENV': webpack.DefinePlugin.runtimeValue(
({ module }) => {
if (reactPackageDirs.some(val => module.resource.startsWith(val))) {
return '"development"';
}
new bundler.DefinePlugin({
'process.env.NODE_ENV': useRspack
? // FIXME: see also https://github.com/web-infra-dev/rspack/issues/5606
JSON.stringify(mode)
: webpack.DefinePlugin.runtimeValue(({ module }) => {
if (
reactPackageDirs.some(val => module.resource.startsWith(val))
) {
return '"development"';
}
return `"${mode}"`;
},
),
return `"${mode}"`;
}),
}),
);
}
@@ -362,13 +390,16 @@ export async function createConfig(
http: false,
util: require.resolve('util/'),
},
plugins: [
new LinkedPackageResolvePlugin(paths.rootNodeModules, externalPkgs),
new ModuleScopePlugin(
[paths.targetSrc, paths.targetDev],
[paths.targetPackageJson, ...reactRefreshFiles],
),
],
// FIXME: see also https://github.com/web-infra-dev/rspack/issues/3408
...(!useRspack && {
plugins: [
new LinkedPackageResolvePlugin(paths.rootNodeModules, externalPkgs),
new ModuleScopePlugin(
[paths.targetSrc, paths.targetDev],
[paths.targetPackageJson, ...reactRefreshFiles],
),
],
}),
},
module: {
rules: loaders,
@@ -396,16 +427,20 @@ export async function createConfig(
lazyCompilation: yn(process.env.EXPERIMENTAL_LAZY_COMPILATION),
},
plugins,
...(withCache
? {
cache: {
type: 'filesystem',
buildDependencies: {
config: [__filename],
},
},
}
: {}),
...(withCache && {
cache: {
type: 'filesystem',
buildDependencies: {
config: [__filename],
},
},
}),
...(useRspack && {
// We're still using `style-loader` for custom `insert` option
experiments: {
css: false,
},
}),
};
}
@@ -413,7 +448,7 @@ export async function createBackendConfig(
paths: BundlingPaths,
options: BackendBundlingOptions,
): Promise<webpack.Configuration> {
const { checksEnabled, isDev } = options;
const { checksEnabled, isDev, useRspack } = options;
// Find all local monorepo packages and their node_modules, and mark them as external.
const { packages } = await getPackages(cliPaths.targetDir);
@@ -484,13 +519,16 @@ export async function createBackendConfig(
extensions: ['.ts', '.mjs', '.js', '.json'],
mainFields: ['main'],
modules: [paths.rootNodeModules, ...moduleDirs],
plugins: [
new LinkedPackageResolvePlugin(paths.rootNodeModules, externalPkgs),
new ModuleScopePlugin(
[paths.targetSrc, paths.targetDev],
[paths.targetPackageJson],
),
],
// FIXME: see also https://github.com/web-infra-dev/rspack/issues/3408
...(!useRspack && {
plugins: [
new LinkedPackageResolvePlugin(paths.rootNodeModules, externalPkgs),
new ModuleScopePlugin(
[paths.targetSrc, paths.targetDev],
[paths.targetPackageJson],
),
],
}),
},
module: {
rules: loaders,
@@ -517,7 +555,9 @@ export async function createBackendConfig(
nodeArgs: runScriptNodeArgs.length > 0 ? runScriptNodeArgs : undefined,
args: process.argv.slice(3), // drop `node backstage-cli backend:dev`
}),
new webpack.HotModuleReplacementPlugin(),
new (useRspack
? require('@rspack/core').rspack.HotModuleReplacementPlugin
: webpack.HotModuleReplacementPlugin)(),
...(checksEnabled
? [
new ForkTsCheckerWebpackPlugin({
+18 -6
View File
@@ -22,22 +22,35 @@ const { EsbuildPlugin } = require('esbuild-loader');
export const optimization = (
options: BundlingOptions,
): WebpackOptionsNormalized['optimization'] => {
const { isDev } = options;
const { isDev, useRspack } = options;
const extralOptions = useRspack
? {}
: { maxAsyncRequests: Infinity, maxInitialRequests: Infinity };
const rspack = useRspack
? (require('@rspack/core') as typeof import('@rspack/core').rspack)
: undefined;
const MinifyPlugin = useRspack
? rspack!.SwcJsMinimizerRspackPlugin
: EsbuildPlugin;
return {
minimize: !isDev,
minimizer: [
new EsbuildPlugin({
new MinifyPlugin({
target: 'ES2022',
format: 'iife',
exclude: 'remoteEntry.js',
}),
// Avoid iife wrapping of module federation remote entry as it breaks the variable assignment
new EsbuildPlugin({
new MinifyPlugin({
target: 'ES2022',
format: undefined,
include: 'remoteEntry.js',
}),
useRspack && new rspack!.LightningCssMinimizerRspackPlugin(),
],
runtimeChunk: 'single',
splitChunks: {
@@ -69,9 +82,8 @@ export const optimization = (
priority: 10,
minSize: 100000,
minChunks: 1,
maxAsyncRequests: Infinity,
maxInitialRequests: Infinity,
} as any, // filename is not included in type, but we need it
...extralOptions,
}, // filename is not included in type, but we need it
// Group together the smallest modules
vendor: {
chunks: 'initial',
+11 -3
View File
@@ -106,12 +106,15 @@ DEPRECATION WARNING: React Router Beta is deprecated and support for it will be
},
});
const useRspack = !!process.env.EXPERIMENTAL_RSPACK;
const commonConfigOptions = {
...options,
checksEnabled: options.checksEnabled,
isDev: true,
baseUrl: url,
frontendConfig,
useRspack,
getFrontendAppConfigs: () => {
return latestFrontendAppConfigs;
},
@@ -163,6 +166,11 @@ DEPRECATION WARNING: React Router Beta is deprecated and support for it will be
root: paths.targetPath,
});
} else {
const bundler = useRspack ? require('@rspack/core') : webpack;
const DevServer: typeof WebpackDevServer = useRspack
? require('@rspack/dev-server').RspackDevServer
: WebpackDevServer;
const publicPaths = await resolveOptionalBundlingPaths({
entry: 'src/index-public-experimental',
dist: 'dist/public',
@@ -175,10 +183,10 @@ DEPRECATION WARNING: React Router Beta is deprecated and support for it will be
);
}
const compiler = publicPaths
? webpack([config, await createConfig(publicPaths, commonConfigOptions)])
: webpack(config);
? bundler([config, await createConfig(publicPaths, commonConfigOptions)])
: bundler(config);
webpackServer = new WebpackDevServer(
webpackServer = new DevServer(
{
hot: !process.env.CI,
devMiddleware: {
+17 -6
View File
@@ -26,10 +26,15 @@ type Transforms = {
type TransformOptions = {
isDev: boolean;
isBackend?: boolean;
useRspack?: boolean;
};
export const transforms = (options: TransformOptions): Transforms => {
const { isDev, isBackend } = options;
const { isDev, isBackend, useRspack } = options;
const CssExtractRspackPlugin: typeof MiniCssExtractPlugin = useRspack
? require('@rspack/core').CssExtractRspackPlugin
: MiniCssExtractPlugin;
// This ensures that styles inserted from the style-loader and any
// async style chunks are always given lower priority than JSS styles.
@@ -54,7 +59,9 @@ export const transforms = (options: TransformOptions): Transforms => {
exclude: /node_modules/,
use: [
{
loader: require.resolve('swc-loader'),
loader: useRspack
? 'builtin:swc-loader'
: require.resolve('swc-loader'),
options: {
jsc: {
target: 'es2022',
@@ -82,7 +89,9 @@ export const transforms = (options: TransformOptions): Transforms => {
exclude: /node_modules/,
use: [
{
loader: require.resolve('swc-loader'),
loader: useRspack
? 'builtin:swc-loader'
: require.resolve('swc-loader'),
options: {
jsc: {
target: 'es2022',
@@ -115,7 +124,9 @@ export const transforms = (options: TransformOptions): Transforms => {
test: [/\.icon\.svg$/],
use: [
{
loader: require.resolve('swc-loader'),
loader: useRspack
? 'builtin:swc-loader'
: require.resolve('swc-loader'),
options: {
jsc: {
target: 'es2022',
@@ -179,7 +190,7 @@ export const transforms = (options: TransformOptions): Transforms => {
insert: insertBeforeJssStyles,
},
}
: MiniCssExtractPlugin.loader,
: CssExtractRspackPlugin.loader,
{
loader: require.resolve('css-loader'),
options: {
@@ -194,7 +205,7 @@ export const transforms = (options: TransformOptions): Transforms => {
if (!isDev) {
plugins.push(
new MiniCssExtractPlugin({
new CssExtractRspackPlugin({
filename: 'static/[name].[contenthash:8].css',
chunkFilename: 'static/[name].[id].[contenthash:8].css',
insert: insertBeforeJssStyles, // Only applies to async chunks
+3
View File
@@ -37,6 +37,7 @@ export type BundlingOptions = {
// Mode that the app is running in, 'protected' or 'public', default is 'public'
appMode?: string;
moduleFederation?: ModuleFederationOptions;
useRspack?: boolean;
};
export type ServeOptions = BundlingPathsOptions & {
@@ -57,6 +58,7 @@ export type BuildOptions = BundlingPathsOptions & {
frontendAppConfigs: AppConfig[];
fullConfig: Config;
moduleFederation?: ModuleFederationOptions;
useRspack?: boolean;
};
export type BackendBundlingOptions = {
@@ -66,6 +68,7 @@ export type BackendBundlingOptions = {
inspectEnabled: boolean;
inspectBrkEnabled: boolean;
require?: string;
useRspack?: boolean;
};
export type BackendServeOptions = BundlingPathsOptions & {
+383 -64
View File
@@ -3958,6 +3958,9 @@ __metadata:
"@rollup/plugin-json": ^6.0.0
"@rollup/plugin-node-resolve": ^15.0.0
"@rollup/plugin-yaml": ^4.0.0
"@rspack/core": ^0.7.5
"@rspack/dev-server": ^0.7.5
"@rspack/plugin-react-refresh": ^0.7.5
"@spotify/eslint-config-base": ^15.0.0
"@spotify/eslint-config-react": ^15.0.0
"@spotify/eslint-config-typescript": ^15.0.0
@@ -4073,11 +4076,20 @@ __metadata:
yn: ^4.0.0
zod: ^3.22.4
peerDependencies:
"@rspack/core": ^0.7.5
"@rspack/dev-server": ^0.7.5
"@rspack/plugin-react-refresh": ^0.7.5
"@vitejs/plugin-react": ^4.0.4
vite: ^4.4.9
vite-plugin-html: ^3.2.0
vite-plugin-node-polyfills: ^0.22.0
peerDependenciesMeta:
"@rspack/core":
optional: true
"@rspack/dev-server":
optional: true
"@rspack/plugin-react-refresh":
optional: true
"@vitejs/plugin-react":
optional: true
vite:
@@ -11270,6 +11282,16 @@ __metadata:
languageName: node
linkType: hard
"@module-federation/runtime-tools@npm:0.1.6":
version: 0.1.6
resolution: "@module-federation/runtime-tools@npm:0.1.6"
dependencies:
"@module-federation/runtime": 0.1.6
"@module-federation/webpack-bundler-runtime": 0.1.6
checksum: a902fe7fd07707be566fec6620c71d597311cee02cc2c2605b9b796f9aad07fcc3c60939efb2e139b01b28ac599d610f5dbc054c555915cd9e5fcc9324598413
languageName: node
linkType: hard
"@module-federation/runtime-tools@npm:0.3.5":
version: 0.3.5
resolution: "@module-federation/runtime-tools@npm:0.3.5"
@@ -11280,6 +11302,15 @@ __metadata:
languageName: node
linkType: hard
"@module-federation/runtime@npm:0.1.6":
version: 0.1.6
resolution: "@module-federation/runtime@npm:0.1.6"
dependencies:
"@module-federation/sdk": 0.1.6
checksum: c564636edd5c1abf5ddf54a6d0dde8fcad1a72d2561163a841f08c354fb1a6e2c69e89d0ec3e5412d55556ea19057ad1980962fbd571aca5a0fb7945e60c0822
languageName: node
linkType: hard
"@module-federation/runtime@npm:0.3.5":
version: 0.3.5
resolution: "@module-federation/runtime@npm:0.3.5"
@@ -11289,6 +11320,13 @@ __metadata:
languageName: node
linkType: hard
"@module-federation/sdk@npm:0.1.6":
version: 0.1.6
resolution: "@module-federation/sdk@npm:0.1.6"
checksum: 99442f2269e916af78f9f77f7fc71a40e83e4dec5408d6ea8b1f053662005e5717340f91c666cce178e0d9ab92b13826f7cba5e00417bce2a3ee67c0face6ac5
languageName: node
linkType: hard
"@module-federation/sdk@npm:0.3.5":
version: 0.3.5
resolution: "@module-federation/sdk@npm:0.3.5"
@@ -11307,6 +11345,16 @@ __metadata:
languageName: node
linkType: hard
"@module-federation/webpack-bundler-runtime@npm:0.1.6":
version: 0.1.6
resolution: "@module-federation/webpack-bundler-runtime@npm:0.1.6"
dependencies:
"@module-federation/runtime": 0.1.6
"@module-federation/sdk": 0.1.6
checksum: 7dd6478cdd34881e974f67c8fe3cf668dbd881722416e214981eb423a67a7a1743564d60e652c6819445b1ab8d13fef823ea309c9c75c189001e75e81bd34fb3
languageName: node
linkType: hard
"@module-federation/webpack-bundler-runtime@npm:0.3.5":
version: 0.3.5
resolution: "@module-federation/webpack-bundler-runtime@npm:0.3.5"
@@ -15068,6 +15116,153 @@ __metadata:
languageName: node
linkType: hard
"@rspack/binding-darwin-arm64@npm:0.7.5":
version: 0.7.5
resolution: "@rspack/binding-darwin-arm64@npm:0.7.5"
conditions: os=darwin & cpu=arm64
languageName: node
linkType: hard
"@rspack/binding-darwin-x64@npm:0.7.5":
version: 0.7.5
resolution: "@rspack/binding-darwin-x64@npm:0.7.5"
conditions: os=darwin & cpu=x64
languageName: node
linkType: hard
"@rspack/binding-linux-arm64-gnu@npm:0.7.5":
version: 0.7.5
resolution: "@rspack/binding-linux-arm64-gnu@npm:0.7.5"
conditions: os=linux & cpu=arm64 & libc=glibc
languageName: node
linkType: hard
"@rspack/binding-linux-arm64-musl@npm:0.7.5":
version: 0.7.5
resolution: "@rspack/binding-linux-arm64-musl@npm:0.7.5"
conditions: os=linux & cpu=arm64 & libc=musl
languageName: node
linkType: hard
"@rspack/binding-linux-x64-gnu@npm:0.7.5":
version: 0.7.5
resolution: "@rspack/binding-linux-x64-gnu@npm:0.7.5"
conditions: os=linux & cpu=x64 & libc=glibc
languageName: node
linkType: hard
"@rspack/binding-linux-x64-musl@npm:0.7.5":
version: 0.7.5
resolution: "@rspack/binding-linux-x64-musl@npm:0.7.5"
conditions: os=linux & cpu=x64 & libc=musl
languageName: node
linkType: hard
"@rspack/binding-win32-arm64-msvc@npm:0.7.5":
version: 0.7.5
resolution: "@rspack/binding-win32-arm64-msvc@npm:0.7.5"
conditions: os=win32 & cpu=arm64
languageName: node
linkType: hard
"@rspack/binding-win32-ia32-msvc@npm:0.7.5":
version: 0.7.5
resolution: "@rspack/binding-win32-ia32-msvc@npm:0.7.5"
conditions: os=win32 & cpu=ia32
languageName: node
linkType: hard
"@rspack/binding-win32-x64-msvc@npm:0.7.5":
version: 0.7.5
resolution: "@rspack/binding-win32-x64-msvc@npm:0.7.5"
conditions: os=win32 & cpu=x64
languageName: node
linkType: hard
"@rspack/binding@npm:0.7.5":
version: 0.7.5
resolution: "@rspack/binding@npm:0.7.5"
dependencies:
"@rspack/binding-darwin-arm64": 0.7.5
"@rspack/binding-darwin-x64": 0.7.5
"@rspack/binding-linux-arm64-gnu": 0.7.5
"@rspack/binding-linux-arm64-musl": 0.7.5
"@rspack/binding-linux-x64-gnu": 0.7.5
"@rspack/binding-linux-x64-musl": 0.7.5
"@rspack/binding-win32-arm64-msvc": 0.7.5
"@rspack/binding-win32-ia32-msvc": 0.7.5
"@rspack/binding-win32-x64-msvc": 0.7.5
dependenciesMeta:
"@rspack/binding-darwin-arm64":
optional: true
"@rspack/binding-darwin-x64":
optional: true
"@rspack/binding-linux-arm64-gnu":
optional: true
"@rspack/binding-linux-arm64-musl":
optional: true
"@rspack/binding-linux-x64-gnu":
optional: true
"@rspack/binding-linux-x64-musl":
optional: true
"@rspack/binding-win32-arm64-msvc":
optional: true
"@rspack/binding-win32-ia32-msvc":
optional: true
"@rspack/binding-win32-x64-msvc":
optional: true
checksum: de25c44cc9c3a240c6f59a657d19d7170c3af1c99097fe2aa5118e2af7b0d606935ad45640102888ce1806bc67fb207189f562cfbcfe4c1628116f5b06f7c6b6
languageName: node
linkType: hard
"@rspack/core@npm:^0.7.5":
version: 0.7.5
resolution: "@rspack/core@npm:0.7.5"
dependencies:
"@module-federation/runtime-tools": 0.1.6
"@rspack/binding": 0.7.5
caniuse-lite: ^1.0.30001616
tapable: 2.2.1
webpack-sources: 3.2.3
peerDependencies:
"@swc/helpers": ">=0.5.1"
peerDependenciesMeta:
"@swc/helpers":
optional: true
checksum: 9e41005231d7a58888cb349ee26737752087f13847f6178308f04e99169187996e40cdaf8987e656a81fe1fb91aeb2e8ca2f1fa32fed46b04fe2709325e5a387
languageName: node
linkType: hard
"@rspack/dev-server@npm:^0.7.5":
version: 0.7.5
resolution: "@rspack/dev-server@npm:0.7.5"
dependencies:
chokidar: 3.5.3
connect-history-api-fallback: 2.0.0
express: 4.19.2
http-proxy-middleware: 2.0.6
mime-types: 2.1.35
webpack-dev-middleware: 6.1.2
webpack-dev-server: 4.13.1
ws: 8.8.1
peerDependencies:
"@rspack/core": "*"
checksum: d5c767726b1083797cdcc852cb0603fc81ae0225341b5cf52d15e847ced0f1672b83a42bd3237fd047ba63ebe5a9032f5de9ca8c47f318e6ac68425c91ff46d7
languageName: node
linkType: hard
"@rspack/plugin-react-refresh@npm:^0.7.5":
version: 0.7.5
resolution: "@rspack/plugin-react-refresh@npm:0.7.5"
peerDependencies:
react-refresh: ">=0.10.0 <1.0.0"
peerDependenciesMeta:
react-refresh:
optional: true
checksum: ab5f480c44563799bd5d837a608223e57ac41d535adcd22fb8f40625f6bda83e2ece28d40dce4c290249e7c9a8657781b5dfa864b14fae86017e41925d026655
languageName: node
linkType: hard
"@rushstack/node-core-library@npm:3.59.7":
version: 3.59.7
resolution: "@rushstack/node-core-library@npm:3.59.7"
@@ -17476,7 +17671,7 @@ __metadata:
languageName: node
linkType: hard
"@types/bonjour@npm:^3.5.13":
"@types/bonjour@npm:^3.5.13, @types/bonjour@npm:^3.5.9":
version: 3.5.13
resolution: "@types/bonjour@npm:3.5.13"
dependencies:
@@ -17581,7 +17776,7 @@ __metadata:
languageName: node
linkType: hard
"@types/connect-history-api-fallback@npm:^1.5.4":
"@types/connect-history-api-fallback@npm:^1.3.5, @types/connect-history-api-fallback@npm:^1.5.4":
version: 1.5.4
resolution: "@types/connect-history-api-fallback@npm:1.5.4"
dependencies:
@@ -17870,7 +18065,7 @@ __metadata:
languageName: node
linkType: hard
"@types/express@npm:*, @types/express@npm:^4.17.14, @types/express@npm:^4.17.21, @types/express@npm:^4.17.6":
"@types/express@npm:*, @types/express@npm:^4.17.13, @types/express@npm:^4.17.14, @types/express@npm:^4.17.21, @types/express@npm:^4.17.6":
version: 4.17.21
resolution: "@types/express@npm:4.17.21"
dependencies:
@@ -18365,13 +18560,6 @@ __metadata:
languageName: node
linkType: hard
"@types/mime@npm:*":
version: 3.0.4
resolution: "@types/mime@npm:3.0.4"
checksum: a6139c8e1f705ef2b064d072f6edc01f3c099023ad7c4fce2afc6c2bf0231888202adadbdb48643e8e20da0ce409481a49922e737eca52871b3dc08017455843
languageName: node
linkType: hard
"@types/mime@npm:^1":
version: 1.3.2
resolution: "@types/mime@npm:1.3.2"
@@ -18895,6 +19083,13 @@ __metadata:
languageName: node
linkType: hard
"@types/retry@npm:0.12.0":
version: 0.12.0
resolution: "@types/retry@npm:0.12.0"
checksum: 61a072c7639f6e8126588bf1eb1ce8835f2cb9c2aba795c4491cf6310e013267b0c8488039857c261c387e9728c1b43205099223f160bb6a76b4374f741b5603
languageName: node
linkType: hard
"@types/retry@npm:0.12.2":
version: 0.12.2
resolution: "@types/retry@npm:0.12.2"
@@ -18960,7 +19155,7 @@ __metadata:
languageName: node
linkType: hard
"@types/serve-index@npm:^1.9.4":
"@types/serve-index@npm:^1.9.1, @types/serve-index@npm:^1.9.4":
version: 1.9.4
resolution: "@types/serve-index@npm:1.9.4"
dependencies:
@@ -18969,14 +19164,14 @@ __metadata:
languageName: node
linkType: hard
"@types/serve-static@npm:*, @types/serve-static@npm:^1.15.5":
version: 1.15.5
resolution: "@types/serve-static@npm:1.15.5"
"@types/serve-static@npm:*, @types/serve-static@npm:^1.13.10, @types/serve-static@npm:^1.15.5":
version: 1.15.7
resolution: "@types/serve-static@npm:1.15.7"
dependencies:
"@types/http-errors": "*"
"@types/mime": "*"
"@types/node": "*"
checksum: 0ff4b3703cf20ba89c9f9e345bc38417860a88e85863c8d6fe274a543220ab7f5f647d307c60a71bb57dc9559f0890a661e8dc771a6ec5ef195d91c8afc4a893
"@types/send": "*"
checksum: bbbf00dbd84719da2250a462270dc68964006e8d62f41fe3741abd94504ba3688f420a49afb2b7478921a1544d3793183ffa097c5724167da777f4e0c7f1a7d6
languageName: node
linkType: hard
@@ -19019,7 +19214,7 @@ __metadata:
languageName: node
linkType: hard
"@types/sockjs@npm:^0.3.36":
"@types/sockjs@npm:^0.3.33, @types/sockjs@npm:^0.3.36":
version: 0.3.36
resolution: "@types/sockjs@npm:0.3.36"
dependencies:
@@ -19253,12 +19448,12 @@ __metadata:
languageName: node
linkType: hard
"@types/ws@npm:*, @types/ws@npm:^8.0.0, @types/ws@npm:^8.5.10, @types/ws@npm:^8.5.3":
version: 8.5.10
resolution: "@types/ws@npm:8.5.10"
"@types/ws@npm:*, @types/ws@npm:^8.0.0, @types/ws@npm:^8.5.1, @types/ws@npm:^8.5.10, @types/ws@npm:^8.5.3":
version: 8.5.12
resolution: "@types/ws@npm:8.5.12"
dependencies:
"@types/node": "*"
checksum: 3ec416ea2be24042ebd677932a462cf16d2080393d8d7d0b1b3f5d6eaa4a7387aaf0eefb99193c0bfd29444857cf2e0c3ac89899e130550dc6c14ada8a46d25e
checksum: ddefb6ad1671f70ce73b38a5f47f471d4d493864fca7c51f002a86e5993d031294201c5dced6d5018fb8905ad46888d65c7f20dd54fc165910b69f42fba9a6d0
languageName: node
linkType: hard
@@ -22203,7 +22398,7 @@ __metadata:
languageName: node
linkType: hard
"bonjour-service@npm:^1.2.1":
"bonjour-service@npm:^1.0.11, bonjour-service@npm:^1.2.1":
version: 1.2.1
resolution: "bonjour-service@npm:1.2.1"
dependencies:
@@ -22773,10 +22968,10 @@ __metadata:
languageName: node
linkType: hard
"caniuse-lite@npm:^1.0.0, caniuse-lite@npm:^1.0.30001629":
version: 1.0.30001632
resolution: "caniuse-lite@npm:1.0.30001632"
checksum: 95be155501650ac36a8c3bdf60886bc8f7c419e7715cdaf1c04941f8676c0bd75355aeda62563092585fbe6f9d50d2eb6dea6bd063d7f6a58004ec62d8f8fe49
"caniuse-lite@npm:^1.0.0, caniuse-lite@npm:^1.0.30001616, caniuse-lite@npm:^1.0.30001629":
version: 1.0.30001651
resolution: "caniuse-lite@npm:1.0.30001651"
checksum: c31a5a01288e70cdbbfb5cd94af3df02f295791673173b8ce6d6a16db4394a6999197d44190be5a6ff06b8c2c7d2047e94dfd5e5eb4c103ab000fca2d370afc7
languageName: node
linkType: hard
@@ -22921,6 +23116,25 @@ __metadata:
languageName: node
linkType: hard
"chokidar@npm:3.5.3":
version: 3.5.3
resolution: "chokidar@npm:3.5.3"
dependencies:
anymatch: ~3.1.2
braces: ~3.0.2
fsevents: ~2.3.2
glob-parent: ~5.1.2
is-binary-path: ~2.1.0
is-glob: ~4.0.1
normalize-path: ~3.0.0
readdirp: ~3.6.0
dependenciesMeta:
fsevents:
optional: true
checksum: b49fcde40176ba007ff361b198a2d35df60d9bb2a5aab228279eb810feae9294a6b4649ab15981304447afe1e6ffbf4788ad5db77235dc770ab777c6e771980c
languageName: node
linkType: hard
"chokidar@npm:^3.3.1, chokidar@npm:^3.4.2, chokidar@npm:^3.5.2, chokidar@npm:^3.5.3, chokidar@npm:^3.6.0":
version: 3.6.0
resolution: "chokidar@npm:3.6.0"
@@ -23758,6 +23972,13 @@ __metadata:
languageName: node
linkType: hard
"connect-history-api-fallback@npm:2.0.0, connect-history-api-fallback@npm:^2.0.0":
version: 2.0.0
resolution: "connect-history-api-fallback@npm:2.0.0"
checksum: dc5368690f4a5c413889792f8df70d5941ca9da44523cde3f87af0745faee5ee16afb8195434550f0504726642734f2683d6c07f8b460f828a12c45fbd4c9a68
languageName: node
linkType: hard
"connect-history-api-fallback@npm:^1.6.0":
version: 1.6.0
resolution: "connect-history-api-fallback@npm:1.6.0"
@@ -23765,13 +23986,6 @@ __metadata:
languageName: node
linkType: hard
"connect-history-api-fallback@npm:^2.0.0":
version: 2.0.0
resolution: "connect-history-api-fallback@npm:2.0.0"
checksum: dc5368690f4a5c413889792f8df70d5941ca9da44523cde3f87af0745faee5ee16afb8195434550f0504726642734f2683d6c07f8b460f828a12c45fbd4c9a68
languageName: node
linkType: hard
"connect-session-knex@npm:^4.0.0":
version: 4.0.0
resolution: "connect-session-knex@npm:4.0.0"
@@ -27383,7 +27597,7 @@ __metadata:
languageName: node
linkType: hard
"express@npm:^4.14.0, express@npm:^4.17.1, express@npm:^4.17.3, express@npm:^4.18.1, express@npm:^4.18.2, express@npm:^4.19.2":
"express@npm:4.19.2, express@npm:^4.14.0, express@npm:^4.17.1, express@npm:^4.17.3, express@npm:^4.18.1, express@npm:^4.18.2, express@npm:^4.19.2":
version: 4.19.2
resolution: "express@npm:4.19.2"
dependencies:
@@ -29422,7 +29636,7 @@ __metadata:
languageName: node
linkType: hard
"html-entities@npm:^2.1.0, html-entities@npm:^2.4.0, html-entities@npm:^2.5.2":
"html-entities@npm:^2.1.0, html-entities@npm:^2.3.2, html-entities@npm:^2.4.0, html-entities@npm:^2.5.2":
version: 2.5.2
resolution: "html-entities@npm:2.5.2"
checksum: b23f4a07d33d49ade1994069af4e13d31650e3fb62621e92ae10ecdf01d1a98065c78fd20fdc92b4c7881612210b37c275f2c9fba9777650ab0d6f2ceb3b99b6
@@ -29612,7 +29826,7 @@ __metadata:
languageName: node
linkType: hard
"http-proxy-middleware@npm:^2.0.0, http-proxy-middleware@npm:^2.0.3, http-proxy-middleware@npm:^2.0.6":
"http-proxy-middleware@npm:2.0.6, http-proxy-middleware@npm:^2.0.0, http-proxy-middleware@npm:^2.0.3, http-proxy-middleware@npm:^2.0.6":
version: 2.0.6
resolution: "http-proxy-middleware@npm:2.0.6"
dependencies:
@@ -30189,10 +30403,10 @@ __metadata:
languageName: node
linkType: hard
"ipaddr.js@npm:^2.1.0":
version: 2.1.0
resolution: "ipaddr.js@npm:2.1.0"
checksum: 807a054f2bd720c4d97ee479d6c9e865c233bea21f139fb8dabd5a35c4226d2621c42e07b4ad94ff3f82add926a607d8d9d37c625ad0319f0e08f9f2bd1968e2
"ipaddr.js@npm:^2.0.1, ipaddr.js@npm:^2.1.0":
version: 2.2.0
resolution: "ipaddr.js@npm:2.2.0"
checksum: 770ba8451fd9bf78015e8edac0d5abd7a708cbf75f9429ca9147a9d2f3a2d60767cd5de2aab2b1e13ca6e4445bdeff42bf12ef6f151c07a5c6cf8a44328e2859
languageName: node
linkType: hard
@@ -32700,13 +32914,13 @@ __metadata:
languageName: node
linkType: hard
"launch-editor@npm:^2.6.1":
version: 2.6.1
resolution: "launch-editor@npm:2.6.1"
"launch-editor@npm:^2.6.0, launch-editor@npm:^2.6.1":
version: 2.8.1
resolution: "launch-editor@npm:2.8.1"
dependencies:
picocolors: ^1.0.0
shell-quote: ^1.8.1
checksum: e06d193075ac09f7f8109f10cabe464a211bf7ed4cbe75f83348d6f67bf4d9f162f06e7a1ab3e1cd7fc250b5342c3b57080618aff2e646dc34248fe499227601
checksum: 69adfc913c066b0bcd685103907525789db6af3585cdc5f8c1172f0fcebe2c4ea1cff1108f76e9c591c00134329a5fb29e5911e9c0c347618a5300978b6bb767
languageName: node
linkType: hard
@@ -33947,7 +34161,7 @@ __metadata:
languageName: node
linkType: hard
"memfs@npm:^3.1.2, memfs@npm:^3.4.1":
"memfs@npm:^3.1.2, memfs@npm:^3.4.1, memfs@npm:^3.4.12, memfs@npm:^3.4.3":
version: 3.5.3
resolution: "memfs@npm:3.5.3"
dependencies:
@@ -36105,14 +36319,14 @@ __metadata:
languageName: node
linkType: hard
"open@npm:^8.0.0, open@npm:^8.4.0":
version: 8.4.0
resolution: "open@npm:8.4.0"
"open@npm:^8.0.0, open@npm:^8.0.9, open@npm:^8.4.0":
version: 8.4.2
resolution: "open@npm:8.4.2"
dependencies:
define-lazy-prop: ^2.0.0
is-docker: ^2.1.1
is-wsl: ^2.2.0
checksum: e9545bec64cdbf30a0c35c1bdc310344adf8428a117f7d8df3c0af0a0a24c513b304916a6d9b11db0190ff7225c2d578885080b761ed46a3d5f6f1eebb98b63c
checksum: 6388bfff21b40cb9bd8f913f9130d107f2ed4724ea81a8fd29798ee322b361ca31fa2cdfb491a5c31e43a3996cfe9566741238c7a741ada8d7af1cb78d85cf26
languageName: node
linkType: hard
@@ -36389,6 +36603,16 @@ __metadata:
languageName: node
linkType: hard
"p-retry@npm:^4.5.0":
version: 4.6.2
resolution: "p-retry@npm:4.6.2"
dependencies:
"@types/retry": 0.12.0
retry: ^0.13.1
checksum: 45c270bfddaffb4a895cea16cb760dcc72bdecb6cb45fef1971fa6ea2e91ddeafddefe01e444ac73e33b1b3d5d29fb0dd18a7effb294262437221ddc03ce0f2e
languageName: node
linkType: hard
"p-retry@npm:^6.2.0":
version: 6.2.0
resolution: "p-retry@npm:6.2.0"
@@ -40622,7 +40846,7 @@ __metadata:
languageName: node
linkType: hard
"selfsigned@npm:^2.0.0, selfsigned@npm:^2.4.1":
"selfsigned@npm:^2.0.0, selfsigned@npm:^2.1.1, selfsigned@npm:^2.4.1":
version: 2.4.1
resolution: "selfsigned@npm:2.4.1"
dependencies:
@@ -42397,6 +42621,13 @@ __metadata:
languageName: node
linkType: hard
"tapable@npm:2.2.1, tapable@npm:^2.0.0, tapable@npm:^2.1.1, tapable@npm:^2.2.0, tapable@npm:^2.2.1":
version: 2.2.1
resolution: "tapable@npm:2.2.1"
checksum: 3b7a1b4d86fa940aad46d9e73d1e8739335efd4c48322cb37d073eb6f80f5281889bf0320c6d8ffcfa1a0dd5bfdbd0f9d037e252ef972aca595330538aac4d51
languageName: node
linkType: hard
"tapable@npm:^1.0.0":
version: 1.1.3
resolution: "tapable@npm:1.1.3"
@@ -42404,13 +42635,6 @@ __metadata:
languageName: node
linkType: hard
"tapable@npm:^2.0.0, tapable@npm:^2.1.1, tapable@npm:^2.2.0, tapable@npm:^2.2.1":
version: 2.2.1
resolution: "tapable@npm:2.2.1"
checksum: 3b7a1b4d86fa940aad46d9e73d1e8739335efd4c48322cb37d073eb6f80f5281889bf0320c6d8ffcfa1a0dd5bfdbd0f9d037e252ef972aca595330538aac4d51
languageName: node
linkType: hard
"tar-fs@npm:^2.0.0":
version: 2.1.1
resolution: "tar-fs@npm:2.1.1"
@@ -44642,6 +44866,39 @@ __metadata:
languageName: node
linkType: hard
"webpack-dev-middleware@npm:6.1.2":
version: 6.1.2
resolution: "webpack-dev-middleware@npm:6.1.2"
dependencies:
colorette: ^2.0.10
memfs: ^3.4.12
mime-types: ^2.1.31
range-parser: ^1.2.1
schema-utils: ^4.0.0
peerDependencies:
webpack: ^5.0.0
peerDependenciesMeta:
webpack:
optional: true
checksum: 6e962341db5b3ac8526cd678fc6b128adcb92c288aab767948ab7d01591d7837d2d97cf9329d307831b1d51c831fcea4d8f2eb514efe8c8654ae2a4ae9d9f1fb
languageName: node
linkType: hard
"webpack-dev-middleware@npm:^5.3.1":
version: 5.3.4
resolution: "webpack-dev-middleware@npm:5.3.4"
dependencies:
colorette: ^2.0.10
memfs: ^3.4.3
mime-types: ^2.1.31
range-parser: ^1.2.1
schema-utils: ^4.0.0
peerDependencies:
webpack: ^4.0.0 || ^5.0.0
checksum: 90cf3e27d0714c1a745454a1794f491b7076434939340605b9ee8718ba2b85385b120939754e9fdbd6569811e749dee53eec319e0d600e70e0b0baffd8e3fb13
languageName: node
linkType: hard
"webpack-dev-middleware@npm:^7.1.0":
version: 7.2.1
resolution: "webpack-dev-middleware@npm:7.2.1"
@@ -44661,6 +44918,53 @@ __metadata:
languageName: node
linkType: hard
"webpack-dev-server@npm:4.13.1":
version: 4.13.1
resolution: "webpack-dev-server@npm:4.13.1"
dependencies:
"@types/bonjour": ^3.5.9
"@types/connect-history-api-fallback": ^1.3.5
"@types/express": ^4.17.13
"@types/serve-index": ^1.9.1
"@types/serve-static": ^1.13.10
"@types/sockjs": ^0.3.33
"@types/ws": ^8.5.1
ansi-html-community: ^0.0.8
bonjour-service: ^1.0.11
chokidar: ^3.5.3
colorette: ^2.0.10
compression: ^1.7.4
connect-history-api-fallback: ^2.0.0
default-gateway: ^6.0.3
express: ^4.17.3
graceful-fs: ^4.2.6
html-entities: ^2.3.2
http-proxy-middleware: ^2.0.3
ipaddr.js: ^2.0.1
launch-editor: ^2.6.0
open: ^8.0.9
p-retry: ^4.5.0
rimraf: ^3.0.2
schema-utils: ^4.0.0
selfsigned: ^2.1.1
serve-index: ^1.9.1
sockjs: ^0.3.24
spdy: ^4.0.2
webpack-dev-middleware: ^5.3.1
ws: ^8.13.0
peerDependencies:
webpack: ^4.37.0 || ^5.0.0
peerDependenciesMeta:
webpack:
optional: true
webpack-cli:
optional: true
bin:
webpack-dev-server: bin/webpack-dev-server.js
checksum: f70611544b7d964a31eb3d934d7c2b376b97e6927a89e03b2e21cfa5812bb639625cd18fd350de1604ba6c455b324135523a894032f28c69d90d90682e4f3b7d
languageName: node
linkType: hard
"webpack-dev-server@npm:^5.0.0":
version: 5.0.4
resolution: "webpack-dev-server@npm:5.0.4"
@@ -44715,6 +45019,13 @@ __metadata:
languageName: node
linkType: hard
"webpack-sources@npm:3.2.3, webpack-sources@npm:^3.2.3":
version: 3.2.3
resolution: "webpack-sources@npm:3.2.3"
checksum: 989e401b9fe3536529e2a99dac8c1bdc50e3a0a2c8669cbafad31271eadd994bc9405f88a3039cd2e29db5e6d9d0926ceb7a1a4e7409ece021fe79c37d9c4607
languageName: node
linkType: hard
"webpack-sources@npm:^1.4.3":
version: 1.4.3
resolution: "webpack-sources@npm:1.4.3"
@@ -44725,13 +45036,6 @@ __metadata:
languageName: node
linkType: hard
"webpack-sources@npm:^3.2.3":
version: 3.2.3
resolution: "webpack-sources@npm:3.2.3"
checksum: 989e401b9fe3536529e2a99dac8c1bdc50e3a0a2c8669cbafad31271eadd994bc9405f88a3039cd2e29db5e6d9d0926ceb7a1a4e7409ece021fe79c37d9c4607
languageName: node
linkType: hard
"webpack@npm:^5, webpack@npm:^5.70.0":
version: 5.91.0
resolution: "webpack@npm:5.91.0"
@@ -45142,6 +45446,21 @@ __metadata:
languageName: node
linkType: hard
"ws@npm:8.8.1":
version: 8.8.1
resolution: "ws@npm:8.8.1"
peerDependencies:
bufferutil: ^4.0.1
utf-8-validate: ^5.0.2
peerDependenciesMeta:
bufferutil:
optional: true
utf-8-validate:
optional: true
checksum: 2152cf862cae0693f3775bc688a6afb2e989d19d626d215e70f5fcd8eb55b1c3b0d3a6a4052905ec320e2d7734e20aeedbf9744496d62f15a26ad79cf4cf7dae
languageName: node
linkType: hard
"ws@npm:^7, ws@npm:^7.4.6, ws@npm:^7.5.5":
version: 7.5.10
resolution: "ws@npm:7.5.10"