Skip to content

Commit 7c5a2ba

Browse files
authored
fix: resolve dev server hot options correctly (#2022)
1 parent ba6f304 commit 7c5a2ba

File tree

7 files changed

+42
-9
lines changed

7 files changed

+42
-9
lines changed

packages/serve/__tests__/createConfig.test.ts

+3-2
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ describe('createConfig', () => {
2727
hotOnly: true,
2828
};
2929
expect(createConfig(args)).toEqual({
30-
hot: 'only',
30+
hotOnly: true,
3131
});
3232
});
3333

@@ -37,7 +37,8 @@ describe('createConfig', () => {
3737
hotOnly: true,
3838
};
3939
expect(createConfig(args)).toEqual({
40-
hot: 'only',
40+
hot: true,
41+
hotOnly: true,
4142
});
4243
});
4344
});

packages/serve/src/createConfig.ts

+15-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
1+
import { utils } from 'webpack-cli';
2+
13
import { devServerOptionsType } from './types';
24

5+
const { logger } = utils;
6+
37
/**
48
*
59
* Creates a devServer config from CLI args
@@ -10,6 +14,16 @@ import { devServerOptionsType } from './types';
1014
*/
1115
export default function createConfig(args): devServerOptionsType {
1216
const options = { ...args };
17+
let isDevServer4 = false,
18+
devServerVersion;
19+
try {
20+
// eslint-disable-next-line node/no-extraneous-require
21+
devServerVersion = require('webpack-dev-server/package.json').version;
22+
} catch (err) {
23+
logger.error(`You need to install 'webpack-dev-server' for running 'webpack serve'.\n${err}`);
24+
process.exit(2);
25+
}
26+
isDevServer4 = devServerVersion.startsWith('4');
1327

1428
if (options.clientLogging) {
1529
options.client = {
@@ -18,8 +32,7 @@ export default function createConfig(args): devServerOptionsType {
1832
// clientLogging is not a valid devServer option
1933
delete options.clientLogging;
2034
}
21-
22-
if (options.hotOnly) {
35+
if (isDevServer4 && options.hotOnly) {
2336
options.hot = 'only';
2437
// hotOnly is not a valid devServer option
2538
delete options.hotOnly;

packages/serve/src/index.ts

+10-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
1-
import WebpackCLI from 'webpack-cli';
1+
import WebpackCLI, { utils } from 'webpack-cli';
22
import startDevServer from './startDevServer';
33
import parseArgs from './parseArgs';
44

5+
const { logger } = utils;
6+
57
/**
68
*
79
* Creates a webpack compiler and runs the devServer
@@ -10,6 +12,13 @@ import parseArgs from './parseArgs';
1012
* @returns {Function} invokes the devServer API
1113
*/
1214
export default function serve(...args: string[]): void {
15+
try {
16+
// eslint-disable-next-line node/no-extraneous-require
17+
require('webpack-dev-server');
18+
} catch (err) {
19+
logger.error(`You need to install 'webpack-dev-server' for running 'webpack serve'.\n${err}`);
20+
process.exit(2);
21+
}
1322
const cli = new WebpackCLI();
1423

1524
const { webpackArgs, devServerArgs } = parseArgs(cli, args);

packages/serve/src/parseArgs.ts

+3-2
Original file line numberDiff line numberDiff line change
@@ -23,12 +23,13 @@ type ArgsType = {
2323
* @returns {Object} parsed webpack args and dev server args objects
2424
*/
2525
export default function parseArgs(cli: WebpackCLIType, args: string[]): ArgsType {
26-
let devServerFlags: object[];
26+
let devServerFlags;
2727
try {
2828
// eslint-disable-next-line node/no-extraneous-require
2929
devServerFlags = require('webpack-dev-server/bin/cli-flags').devServer;
3030
} catch (err) {
31-
throw new Error(`You need to install 'webpack-dev-server' for running 'webpack serve'.\n${err}`);
31+
logger.error(`You need to install 'webpack-dev-server' for running 'webpack serve'.\n${err}`);
32+
process.exit(2);
3233
}
3334

3435
const core = cli.getCoreFlags();

packages/serve/src/startDevServer.ts

-1
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ export default function startDevServer(compiler, devServerArgs): object[] {
2222
const usedPorts: number[] = [];
2323
devServerOptions.forEach((devServerOpts): void => {
2424
const options = mergeOptions(cliOptions, devServerOpts);
25-
2625
options.host = options.host || 'localhost';
2726
options.port = options.port || 8080;
2827

test/serve/basic/serve-basic.test.js

+8-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
const { yellow, options } = require('colorette');
44
const path = require('path');
55
const getPort = require('get-port');
6-
const { runServe } = require('../../utils/test-utils');
6+
const { runServe, isDevServer4 } = require('../../utils/test-utils');
77

88
const testPath = path.resolve(__dirname);
99

@@ -56,6 +56,13 @@ describe('basic serve usage', () => {
5656
expect(stderr).toHaveLength(0);
5757
});
5858

59+
it('uses hot-only flag to alter bundle', async () => {
60+
const { stdout, stderr } = await runServe(['--port', port, isDevServer4 ? '--hot only' : '--hot-only'], testPath);
61+
expect(stdout).toContain('main.js');
62+
expect(stdout).toContain('HotModuleReplacementPlugin');
63+
expect(stderr).toBeFalsy();
64+
});
65+
5966
it('uses no-hot flag', async () => {
6067
const { stdout, stderr } = await runServe(['--port', port, '--no-hot'], testPath);
6168
expect(stdout).toContain('main.js');

test/utils/test-utils.js

+3
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,13 @@ const { sync: spawnSync, node: execaNode } = execa;
77
const { Writable } = require('readable-stream');
88
const concat = require('concat-stream');
99
const { version } = require('webpack');
10+
const { version: devServerVersion } = require('webpack-dev-server/package.json');
1011
const { hyphenToUpperCase } = require('../../packages/webpack-cli/lib/utils/arg-utils');
1112

1213
const WEBPACK_PATH = path.resolve(__dirname, '../../packages/webpack-cli/bin/cli.js');
1314
const ENABLE_LOG_COMPILATION = process.env.ENABLE_PIPE || false;
1415
const isWebpack5 = version.startsWith('5');
16+
const isDevServer4 = devServerVersion.startsWith('4');
1517
const isWindows = process.platform === 'win32';
1618

1719
/**
@@ -248,5 +250,6 @@ module.exports = {
248250
runInfo,
249251
hyphenToUpperCase,
250252
isWebpack5,
253+
isDevServer4,
251254
isWindows,
252255
};

0 commit comments

Comments
 (0)