You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
70 lines
2.0 KiB
70 lines
2.0 KiB
/** |
|
* Copyright (c) 2015-present, Facebook, Inc. |
|
* |
|
* This source code is licensed under the MIT license found in the |
|
* LICENSE file at |
|
* https://github.com/facebookincubator/create-react-app/blob/master/LICENSE |
|
*/ |
|
|
|
const url = require('url') |
|
const { chalk } = require('@vue/cli-shared-utils') |
|
const address = require('address') |
|
const defaultGateway = require('default-gateway') |
|
|
|
module.exports = function prepareUrls (protocol, host, port, pathname = '/') { |
|
const formatUrl = hostname => |
|
url.format({ |
|
protocol, |
|
hostname, |
|
port, |
|
pathname |
|
}) |
|
const prettyPrintUrl = hostname => |
|
url.format({ |
|
protocol, |
|
hostname, |
|
port: chalk.bold(port), |
|
pathname |
|
}) |
|
|
|
const isUnspecifiedHost = host === '0.0.0.0' || host === '::' |
|
let prettyHost, lanUrlForConfig |
|
let lanUrlForTerminal = chalk.gray('unavailable') |
|
if (isUnspecifiedHost) { |
|
prettyHost = 'localhost' |
|
try { |
|
// This can only return an IPv4 address |
|
const result = defaultGateway.v4.sync() |
|
lanUrlForConfig = address.ip(result && result.interface) |
|
if (lanUrlForConfig) { |
|
// Check if the address is a private ip |
|
// https://en.wikipedia.org/wiki/Private_network#Private_IPv4_address_spaces |
|
if ( |
|
/^10[.]|^172[.](1[6-9]|2[0-9]|3[0-1])[.]|^192[.]168[.]/.test( |
|
lanUrlForConfig |
|
) |
|
) { |
|
// Address is private, format it for later use |
|
lanUrlForTerminal = prettyPrintUrl(lanUrlForConfig) |
|
} else { |
|
// Address is not private, so we will discard it |
|
lanUrlForConfig = undefined |
|
} |
|
} |
|
} catch (_e) { |
|
// ignored |
|
} |
|
} else { |
|
prettyHost = host |
|
lanUrlForConfig = host |
|
lanUrlForTerminal = prettyPrintUrl(lanUrlForConfig) |
|
} |
|
const localUrlForTerminal = prettyPrintUrl(prettyHost) |
|
const localUrlForBrowser = formatUrl(prettyHost) |
|
return { |
|
lanUrlForConfig, |
|
lanUrlForTerminal, |
|
localUrlForTerminal, |
|
localUrlForBrowser |
|
} |
|
}
|
|
|