| 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('chalk')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  }}
 |