Skip to content

Commit 832fafb

Browse files
fix: prefer to open the host option
1 parent ca0b534 commit 832fafb

File tree

3 files changed

+218
-139
lines changed

3 files changed

+218
-139
lines changed

lib/Server.js

Lines changed: 66 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -586,92 +586,90 @@ class Server {
586586

587587
showStatus() {
588588
const useColor = getColorsOption(getCompilerConfigArray(this.compiler));
589-
590589
const protocol = this.options.https ? 'https' : 'http';
591-
const { address: hostname, port } = this.server.address();
590+
const { address, port } = this.server.address();
592591
const prettyPrintUrl = (newHostname) =>
593592
url.format({ protocol, hostname: newHostname, port, pathname: '/' });
594593

595-
let localhostForTerminal;
596-
let networkUrlForTerminalIPv4;
597-
let networkUrlForTerminalIPv6;
594+
let server;
595+
let localhost;
596+
let loopbackIPv4;
597+
let loopbackIPv6;
598+
let networkUrlIPv4;
599+
let networkUrlIPv6;
600+
601+
if (this.hostname && this.hostname !== 'localhost') {
602+
let isIP;
603+
604+
try {
605+
isIP = ipaddr.parse(this.hostname);
606+
} catch (error) {
607+
// Ignore
608+
}
609+
610+
if (!isIP) {
611+
server = prettyPrintUrl(this.hostname);
612+
}
613+
}
598614

599-
const parsedIP = ipaddr.parse(hostname);
600-
const isUnspecified = parsedIP.range() === 'unspecified';
615+
const parsedIP = ipaddr.parse(address);
601616

602-
if (isUnspecified) {
603-
localhostForTerminal = prettyPrintUrl('localhost');
617+
if (parsedIP.range() === 'unspecified') {
618+
localhost = prettyPrintUrl('localhost');
604619

605620
const networkIPv4 = internalIp.v4.sync();
606621

607622
if (networkIPv4) {
608-
networkUrlForTerminalIPv4 = prettyPrintUrl(networkIPv4);
623+
networkUrlIPv4 = prettyPrintUrl(networkIPv4);
609624
}
610625

611-
if (hostname === '::') {
612-
const networkIPv6 = internalIp.v6.sync();
626+
const networkIPv6 = internalIp.v6.sync();
613627

614-
if (networkIPv6) {
615-
networkUrlForTerminalIPv6 = prettyPrintUrl(networkIPv6);
616-
}
617-
}
618-
} else {
619-
if (parsedIP.range() === 'loopback') {
620-
localhostForTerminal = prettyPrintUrl('localhost');
628+
if (networkIPv6) {
629+
networkUrlIPv6 = prettyPrintUrl(networkIPv6);
621630
}
631+
} else if (parsedIP.range() === 'loopback') {
632+
localhost = prettyPrintUrl('localhost');
622633

623-
if (parsedIP.kind() === 'ipv6') {
624-
if (parsedIP.isIPv4MappedAddress()) {
625-
networkUrlForTerminalIPv4 = prettyPrintUrl(
626-
parsedIP.toIPv4Address().toString()
627-
);
628-
}
629-
} else {
630-
networkUrlForTerminalIPv4 = prettyPrintUrl(hostname);
634+
if (parsedIP.kind() === 'ipv4') {
635+
loopbackIPv4 = prettyPrintUrl(parsedIP.toString());
636+
} else if (parsedIP.kind() === 'ipv6') {
637+
loopbackIPv6 = prettyPrintUrl(parsedIP.toString());
631638
}
639+
} else {
640+
networkUrlIPv4 =
641+
parsedIP.kind() === 'ipv6' && parsedIP.isIPv4MappedAddress()
642+
? prettyPrintUrl(parsedIP.toIPv4Address().toString())
643+
: prettyPrintUrl(address);
632644

633645
if (parsedIP.kind() === 'ipv6') {
634-
networkUrlForTerminalIPv6 = prettyPrintUrl(hostname);
646+
networkUrlIPv6 = prettyPrintUrl(address);
635647
}
636648
}
637649

638-
if (isUnspecified) {
639-
this.logger.info('Project is running at:');
640-
this.logger.info(`Local: ${colors.info(useColor, localhostForTerminal)}`);
641-
642-
const networkUrlsForTerminal = []
643-
.concat(
644-
networkUrlForTerminalIPv4
645-
? [`${colors.info(useColor, networkUrlForTerminalIPv4)} (IPv4)`]
646-
: []
647-
)
648-
.concat(
649-
networkUrlForTerminalIPv6
650-
? [`${colors.info(useColor, networkUrlForTerminalIPv6)} (IPv6)`]
651-
: []
652-
);
650+
this.logger.info('Project is running at:');
653651

654-
this.logger.info(`On Your Network: ${networkUrlsForTerminal.join(', ')}`);
655-
} else {
656-
const networkUrlsForTerminal = []
657-
.concat(
658-
localhostForTerminal
659-
? [`${colors.info(useColor, localhostForTerminal)}`]
660-
: []
661-
)
662-
.concat(
663-
networkUrlForTerminalIPv4
664-
? [`${colors.info(useColor, networkUrlForTerminalIPv4)} (IPv4)`]
665-
: []
666-
)
667-
.concat(
668-
networkUrlForTerminalIPv6
669-
? [`${colors.info(useColor, networkUrlForTerminalIPv6)} (IPv6)`]
670-
: []
671-
);
652+
if (server) {
653+
this.logger.info(`Server: ${colors.info(useColor, server)}`);
654+
}
655+
656+
if (localhost) {
657+
const loopbacks = [colors.info(useColor, localhost)]
658+
.concat(loopbackIPv4 ? [colors.info(useColor, loopbackIPv4)] : [])
659+
.concat(loopbackIPv6 ? [colors.info(useColor, loopbackIPv6)] : []);
660+
661+
this.logger.info(`Loopback: ${loopbacks.join(', ')}`);
662+
}
663+
664+
if (networkUrlIPv4) {
665+
this.logger.info(
666+
`On Your Network (IPv4): ${colors.info(useColor, networkUrlIPv4)}`
667+
);
668+
}
672669

670+
if (networkUrlIPv6) {
673671
this.logger.info(
674-
`Project is running at ${networkUrlsForTerminal.join(', ')}`
672+
`On Your Network (IPv6): ${colors.info(useColor, networkUrlIPv6)}`
675673
);
676674
}
677675

@@ -716,12 +714,9 @@ class Server {
716714
}
717715

718716
if (this.options.open || this.options.openPage) {
719-
const uri =
720-
localhostForTerminal ||
721-
networkUrlForTerminalIPv4 ||
722-
networkUrlForTerminalIPv6;
717+
const openTarget = prettyPrintUrl(this.hostname || 'localhost');
723718

724-
runOpen(uri, this.options, this.logger);
719+
runOpen(openTarget, this.options, this.logger);
725720
}
726721
}
727722

@@ -740,7 +735,7 @@ class Server {
740735
.then((port) => {
741736
this.port = port;
742737

743-
return this.server.listen(port, hostname, (err) => {
738+
return this.server.listen(port, hostname, (error) => {
744739
if (this.options.hot || this.options.liveReload) {
745740
this.createSocketServer();
746741
}
@@ -752,17 +747,17 @@ class Server {
752747
this.showStatus();
753748

754749
if (fn) {
755-
fn.call(this.server, err);
750+
fn.call(this.server, error);
756751
}
757752

758753
if (typeof this.options.onListening === 'function') {
759754
this.options.onListening(this);
760755
}
761756
});
762757
})
763-
.catch((err) => {
758+
.catch((error) => {
764759
if (fn) {
765-
fn.call(this.server, err);
760+
fn.call(this.server, error);
766761
}
767762
})
768763
);

test/cli/__snapshots__/cli.test.js.snap

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,51 +2,61 @@
22

33
exports[`CLI --host :: (IPv6): stderr 1`] = `
44
"<i> [webpack-dev-server] Project is running at:
5-
<i> [webpack-dev-server] Local: http://localhost:<port>/
6-
<i> [webpack-dev-server] On Your Network: http://<network-ip-v4>:<port>/ (IPv4), http://[<network-ip-v6>]:<port>/ (IPv6)
5+
<i> [webpack-dev-server] Loopback: http://localhost:<port>/
6+
<i> [webpack-dev-server] On Your Network (IPv4): http://<network-ip-v4>:<port>/
7+
<i> [webpack-dev-server] On Your Network (IPv6): http://[<network-ip-v6>]:<port>/
78
<i> [webpack-dev-server] Content not from webpack is served from '<cwd>/public' directory"
89
`;
910
1011
exports[`CLI --host ::1 (IPv6): stderr 1`] = `
11-
"<i> [webpack-dev-server] Project is running at http://localhost:<port>/, http://[::1]:<port>/ (IPv6)
12+
"<i> [webpack-dev-server] Project is running at:
13+
<i> [webpack-dev-server] Loopback: http://localhost:<port>/, http://[::1]:<port>/
1214
<i> [webpack-dev-server] Content not from webpack is served from '<cwd>/public' directory"
1315
`;
1416
1517
exports[`CLI --host <IPv4>: stderr 1`] = `
16-
"<i> [webpack-dev-server] Project is running at http://<network-ip-v4>:<port>/ (IPv4)
18+
"<i> [webpack-dev-server] Project is running at:
19+
<i> [webpack-dev-server] On Your Network (IPv4): http://<network-ip-v4>:<port>/
1720
<i> [webpack-dev-server] Content not from webpack is served from '<cwd>/public' directory"
1821
`;
1922
2023
exports[`CLI --host 0.0.0.0 (IPv4): stderr 1`] = `
2124
"<i> [webpack-dev-server] Project is running at:
22-
<i> [webpack-dev-server] Local: http://localhost:<port>/
23-
<i> [webpack-dev-server] On Your Network: http://<network-ip-v4>:<port>/ (IPv4)
25+
<i> [webpack-dev-server] Loopback: http://localhost:<port>/
26+
<i> [webpack-dev-server] On Your Network (IPv4): http://<network-ip-v4>:<port>/
27+
<i> [webpack-dev-server] On Your Network (IPv6): http://[<network-ip-v6>]:<port>/
2428
<i> [webpack-dev-server] Content not from webpack is served from '<cwd>/public' directory"
2529
`;
2630
2731
exports[`CLI --host 0:0:0:0:0:FFFF:7F00:0001 (IPv6): stderr 1`] = `
28-
"<i> [webpack-dev-server] Project is running at http://127.0.0.1:<port>/ (IPv4), http://[::ffff:127.0.0.1]:<port>/ (IPv6)
32+
"<i> [webpack-dev-server] Project is running at:
33+
<i> [webpack-dev-server] On Your Network (IPv4): http://127.0.0.1:<port>/
34+
<i> [webpack-dev-server] On Your Network (IPv6): http://[::ffff:127.0.0.1]:<port>/
2935
<i> [webpack-dev-server] Content not from webpack is served from '<cwd>/public' directory"
3036
`;
3137
3238
exports[`CLI --host 127.0.0.1 (IPv4): stderr 1`] = `
33-
"<i> [webpack-dev-server] Project is running at http://localhost:<port>/, http://127.0.0.1:<port>/ (IPv4)
39+
"<i> [webpack-dev-server] Project is running at:
40+
<i> [webpack-dev-server] Loopback: http://localhost:<port>/, http://127.0.0.1:<port>/
3441
<i> [webpack-dev-server] Content not from webpack is served from '<cwd>/public' directory"
3542
`;
3643
3744
exports[`CLI --host and --port are unspecified: stderr 1`] = `
3845
"<i> [webpack-dev-server] Project is running at:
39-
<i> [webpack-dev-server] Local: http://localhost:<port>/
40-
<i> [webpack-dev-server] On Your Network: http://<network-ip-v4>:<port>/ (IPv4), http://[<network-ip-v6>]:<port>/ (IPv6)
46+
<i> [webpack-dev-server] Loopback: http://localhost:<port>/
47+
<i> [webpack-dev-server] On Your Network (IPv4): http://<network-ip-v4>:<port>/
48+
<i> [webpack-dev-server] On Your Network (IPv6): http://[<network-ip-v6>]:<port>/
4149
<i> [webpack-dev-server] Content not from webpack is served from '<cwd>/public' directory"
4250
`;
4351
4452
exports[`CLI --host localhost --port 9999: stderr 1`] = `
45-
"<i> [webpack-dev-server] Project is running at http://localhost:<port>/, http://127.0.0.1:<port>/ (IPv4)
53+
"<i> [webpack-dev-server] Project is running at:
54+
<i> [webpack-dev-server] Loopback: http://localhost:<port>/, http://127.0.0.1:<port>/
4655
<i> [webpack-dev-server] Content not from webpack is served from '<cwd>/public' directory"
4756
`;
4857
4958
exports[`CLI --host localhost: stderr 1`] = `
50-
"<i> [webpack-dev-server] Project is running at http://localhost:<port>/, http://127.0.0.1:<port>/ (IPv4)
59+
"<i> [webpack-dev-server] Project is running at:
60+
<i> [webpack-dev-server] Loopback: http://localhost:<port>/, http://127.0.0.1:<port>/
5161
<i> [webpack-dev-server] Content not from webpack is served from '<cwd>/public' directory"
5262
`;

0 commit comments

Comments
 (0)