12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 |
- /**
- * 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
- }
- }
|