Skip to content

Commit 5b104e0

Browse files
author
shuangxu
committed
feat(ko): add change port for dev action
1 parent ed7e110 commit 5b104e0

File tree

4 files changed

+3081
-1585
lines changed

4 files changed

+3081
-1585
lines changed

package.json

+7-7
Original file line numberDiff line numberDiff line change
@@ -24,15 +24,15 @@
2424
}
2525
},
2626
"devDependencies": {
27-
"@changesets/cli": "^2.22.0",
28-
"@commitlint/cli": "^17.0.0",
29-
"@commitlint/config-conventional": "^17.0.0",
27+
"@changesets/cli": "^2.26.0",
28+
"@commitlint/cli": "^17.4.4",
29+
"@commitlint/config-conventional": "^17.4.4",
3030
"@tsconfig/node14": "^1.0.3",
31-
"@types/node": "^17.0.35",
32-
"commitizen": "^4.2.4",
31+
"@types/node": "^17.0.45",
32+
"commitizen": "^4.3.0",
3333
"cz-conventional-changelog": "^3.3.0",
34-
"husky": "^8.0.1",
35-
"prettier": "^2.6.2"
34+
"husky": "^8.0.3",
35+
"prettier": "^2.8.4"
3636
},
3737
"packageManager": "[email protected]"
3838
}

packages/ko/package.json

+4
Original file line numberDiff line numberDiff line change
@@ -57,9 +57,11 @@
5757
"crypto-browserify": "^3.12.0",
5858
"css-loader": "^6.7.1",
5959
"css-minimizer-webpack-plugin": "^4.0.0",
60+
"detect-port": "^1.3.0",
6061
"dynamic-resolve-webpack-plugin": "workspace:^2.0.0",
6162
"esbuild-loader": "^2.19.0",
6263
"html-webpack-plugin": "^5.5.0",
64+
"inquirer": "^8.2.2",
6365
"ko-lints": "workspace:^4.0.0",
6466
"less": "^3.13.1",
6567
"less-loader": "^9.1.0",
@@ -86,6 +88,8 @@
8688
},
8789
"devDependencies": {
8890
"@types/case-sensitive-paths-webpack-plugin": "^2.1.6",
91+
"@types/detect-port": "^1.3.2",
92+
"@types/inquirer": "^8.2.2",
8993
"@types/jest": "^27.5.1",
9094
"@types/lodash": "^4.14.182",
9195
"@types/webpack-bundle-analyzer": "^4.4.1",

packages/ko/src/actions/dev.ts

+34-1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ import Service from '../core/service';
66
import WebpackConfig from '../webpack';
77
import ActionFactory from './factory';
88
import { ICliOptions } from '../types';
9+
import detect from 'detect-port';
10+
import inquirer from 'inquirer';
911

1012
class Dev extends ActionFactory {
1113
private webpackConfig: WebpackConfig;
@@ -92,13 +94,44 @@ class Dev extends ActionFactory {
9294
this.service.commander.bindAction(cmdName, this.action.bind(this));
9395
}
9496

97+
private async changePort(newPort: number, port: number) {
98+
const question = {
99+
type: 'confirm',
100+
name: 'changePort',
101+
message: `port: ${port} has been used,use new port ${newPort} instead?`,
102+
default: true,
103+
};
104+
const answer = await inquirer.prompt([question]);
105+
if (answer.changePort) {
106+
return newPort;
107+
}
108+
this.errorStdout(`so sorry, ${port} already in use!!`);
109+
process.exit(0);
110+
}
111+
112+
private async checkPort(port: number) {
113+
const newPort = await detect(port);
114+
if (newPort === port) {
115+
return newPort;
116+
}
117+
const isInteractive = process.stdout.isTTY;
118+
if (isInteractive) {
119+
return this.changePort(newPort, port);
120+
}
121+
}
122+
95123
protected async action(cliOpts: ICliOptions) {
96124
process.title = 'ko-dev';
97125
process.env.NODE_ENV = 'development';
98126
this.service.freezeCliOptsWith(cliOpts);
99127
const config = await this.generateConfig();
128+
const port = config.devServer?.port as number;
129+
const newPort = (await this.checkPort(port)) as number;
100130
const compiler = Webpack(config);
101-
const devServer = new WebpackDevServer(config.devServer, compiler);
131+
const devServer = new WebpackDevServer(
132+
{ ...config.devServer, port: newPort },
133+
compiler
134+
);
102135
await devServer.start();
103136
const exitProcess = (callback?: () => void) => () => {
104137
callback && callback();

0 commit comments

Comments
 (0)