71 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			71 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /**
 | |
|  * 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
 | |
|   }
 | |
| }
 |