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