react/packages/react-devtools-shell/webpack-server.js
Ruslan Lesiutin ff6e05a705
chore[react-devtools]: unify console patching and default to ansi escape symbols (#29869)
Stacked on https://github.com/facebook/react/pull/29856.

## Summary

By default, React DevTools will apply dimming with ANSI escape symbols,
so it works for both terminals and browser consoles.

For Firefox, which doesn't support ANSI escape symbols console stylings,
we fallback to css properties, like we used to do before.

## How did you test this change?

| Environment | Dark mode | Light mode |
|--------|--------|--------|
| Terminal | ![Screenshot 2024-06-12 at 19 39
46](https://github.com/facebook/react/assets/28902667/2d470eee-ec5f-4362-be7d-8d80c6c72d09)
| ![Screenshot 2024-06-12 at 19 39
09](https://github.com/facebook/react/assets/28902667/616f2c58-a251-406b-aee6-841e07d652ba)
|
| Fusebox console | ![Screenshot 2024-06-12 at 21 03
14](https://github.com/facebook/react/assets/28902667/6050f730-8e82-4aa1-acbc-7179aac3a8aa)
| ![Screenshot 2024-06-12 at 21 02
48](https://github.com/facebook/react/assets/28902667/6708b938-8a90-476f-a057-427963d58caa)
|
| Firefox console | ![Screenshot 2024-06-12 at 21 40
29](https://github.com/facebook/react/assets/28902667/4721084f-bbfa-438c-b61b-395da8ded590)
| ![Screenshot 2024-06-12 at 21 40
42](https://github.com/facebook/react/assets/28902667/72bbf001-2d3d-49e7-91c9-20a4f0914d4d)
|
| Chrome console | ![Screenshot 2024-06-12 at 21 43
09](https://github.com/facebook/react/assets/28902667/93c47881-a0dd-44f8-8dc2-8710149774e5)
| ![Screenshot 2024-06-12 at 21 43
00](https://github.com/facebook/react/assets/28902667/07ea4ff5-4322-4db9-9c12-4321d9577c9d)
|
2024-06-17 16:31:36 +01:00

215 lines
5.6 KiB
JavaScript

const {resolve} = require('path');
const Webpack = require('webpack');
const WebpackDevServer = require('webpack-dev-server');
const {
GITHUB_URL,
getVersionString,
} = require('react-devtools-extensions/utils');
const {resolveFeatureFlags} = require('react-devtools-shared/buildUtils');
const semver = require('semver');
const {SUCCESSFUL_COMPILATION_MESSAGE} = require('./constants');
const {ReactVersion: currentReactVersion} = require('../../ReactVersions');
const NODE_ENV = process.env.NODE_ENV;
if (!NODE_ENV) {
console.error('NODE_ENV not set');
process.exit(1);
}
const EDITOR_URL = process.env.EDITOR_URL || null;
const builtModulesDir = resolve(
__dirname,
'..',
'..',
'build',
'oss-experimental',
);
const __DEV__ = NODE_ENV === 'development';
const DEVTOOLS_VERSION = getVersionString();
// If the React version isn't set, we will use the
// current React version instead. Likewise if the
// React version isnt' set, we'll use the build folder
// for both React DevTools and React
const REACT_VERSION = process.env.REACT_VERSION
? semver.coerce(process.env.REACT_VERSION).version
: currentReactVersion;
const E2E_APP_BUILD_DIR = process.env.REACT_VERSION
? resolve(__dirname, '..', '..', 'build-regression', 'node_modules')
: builtModulesDir;
const makeConfig = (entry, alias) => ({
mode: __DEV__ ? 'development' : 'production',
devtool: __DEV__ ? 'cheap-source-map' : 'source-map',
stats: 'normal',
entry,
output: {
publicPath: '/dist/',
},
node: {
global: false,
},
resolve: {
alias,
},
optimization: {
minimize: false,
},
plugins: [
new Webpack.ProvidePlugin({
process: 'process/browser',
}),
new Webpack.DefinePlugin({
__DEV__,
__EXPERIMENTAL__: true,
__EXTENSION__: false,
__PROFILE__: false,
__TEST__: NODE_ENV === 'test',
'process.env.GITHUB_URL': `"${GITHUB_URL}"`,
'process.env.EDITOR_URL': EDITOR_URL != null ? `"${EDITOR_URL}"` : null,
'process.env.DEVTOOLS_PACKAGE': `"react-devtools-shell"`,
'process.env.DEVTOOLS_VERSION': `"${DEVTOOLS_VERSION}"`,
'process.env.E2E_APP_REACT_VERSION': `"${REACT_VERSION}"`,
}),
],
module: {
rules: [
{
test: /\.js$/,
loader: 'babel-loader',
options: {
configFile: resolve(
__dirname,
'..',
'react-devtools-shared',
'babel.config.js',
),
},
},
{
test: /\.css$/,
use: [
{
loader: 'style-loader',
},
{
loader: 'css-loader',
options: {
sourceMap: true,
modules: true,
localIdentName: '[local]',
},
},
],
},
],
},
});
const app = makeConfig(
{
'app-index': './src/app/index.js',
'app-devtools': './src/app/devtools.js',
'e2e-app': './src/e2e/app.js',
'e2e-devtools': './src/e2e/devtools.js',
'e2e-devtools-regression': './src/e2e-regression/devtools.js',
'multi-left': './src/multi/left.js',
'multi-devtools': './src/multi/devtools.js',
'multi-right': './src/multi/right.js',
'e2e-regression': './src/e2e-regression/app.js',
'perf-regression-app': './src/perf-regression/app.js',
'perf-regression-devtools': './src/perf-regression/devtools.js',
},
{
react: resolve(builtModulesDir, 'react'),
'react-debug-tools': resolve(builtModulesDir, 'react-debug-tools'),
'react-devtools-feature-flags': resolveFeatureFlags('shell'),
'react-dom/client': resolve(builtModulesDir, 'react-dom/unstable_testing'),
'react-dom': resolve(builtModulesDir, 'react-dom'),
'react-is': resolve(builtModulesDir, 'react-is'),
scheduler: resolve(builtModulesDir, 'scheduler'),
},
);
// Prior to React 18, we use ReactDOM.render rather than
// createRoot.
// We also use a separate build folder to build the React App
// so that we can test the current DevTools against older version of React
const e2eRegressionApp = semver.lt(REACT_VERSION, '18.0.0')
? makeConfig(
{
'e2e-app-regression': './src/e2e-regression/app-legacy.js',
},
{
react: resolve(E2E_APP_BUILD_DIR, 'react'),
'react-dom': resolve(E2E_APP_BUILD_DIR, 'react-dom'),
...(semver.satisfies(REACT_VERSION, '16.5')
? {schedule: resolve(E2E_APP_BUILD_DIR, 'schedule')}
: {scheduler: resolve(E2E_APP_BUILD_DIR, 'scheduler')}),
},
)
: makeConfig(
{
'e2e-app-regression': './src/e2e-regression/app.js',
},
{
react: resolve(E2E_APP_BUILD_DIR, 'react'),
'react-dom': resolve(E2E_APP_BUILD_DIR, 'react-dom'),
'react-dom/client': resolve(E2E_APP_BUILD_DIR, 'react-dom/client'),
scheduler: resolve(E2E_APP_BUILD_DIR, 'scheduler'),
},
);
const appCompiler = Webpack(app);
const appServer = new WebpackDevServer(
{
hot: true,
open: true,
port: 8080,
client: {
logging: 'warn',
},
static: {
directory: __dirname,
publicPath: '/',
},
},
appCompiler,
);
const e2eRegressionAppCompiler = Webpack(e2eRegressionApp);
const e2eRegressionAppServer = new WebpackDevServer(
{
port: 8181,
client: {
logging: 'warn',
},
static: {
publicPath: '/dist/',
},
headers: {
'Access-Control-Allow-Origin': '*',
},
},
e2eRegressionAppCompiler,
);
const runServer = async () => {
console.log('Starting server...');
appServer.compiler.hooks.done.tap('done', () =>
console.log(SUCCESSFUL_COMPILATION_MESSAGE),
);
await e2eRegressionAppServer.start();
await appServer.start();
};
runServer();