219 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			219 lines
		
	
	
		
			5.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| const { execSync } = require('child_process')
 | |
| const fs = require('fs')
 | |
| const path = require('path')
 | |
| const LRU = require('lru-cache')
 | |
| const semver = require('semver')
 | |
| 
 | |
| let _hasYarn
 | |
| const _yarnProjects = new LRU({
 | |
|   max: 10,
 | |
|   maxAge: 1000
 | |
| })
 | |
| let _hasGit
 | |
| const _gitProjects = new LRU({
 | |
|   max: 10,
 | |
|   maxAge: 1000
 | |
| })
 | |
| 
 | |
| // env detection
 | |
| exports.hasYarn = () => {
 | |
|   if (process.env.VUE_CLI_TEST) {
 | |
|     return true
 | |
|   }
 | |
|   if (_hasYarn != null) {
 | |
|     return _hasYarn
 | |
|   }
 | |
|   try {
 | |
|     execSync('yarn --version', { stdio: 'ignore' })
 | |
|     return (_hasYarn = true)
 | |
|   } catch (e) {
 | |
|     return (_hasYarn = false)
 | |
|   }
 | |
| }
 | |
| 
 | |
| exports.hasProjectYarn = (cwd) => {
 | |
|   if (_yarnProjects.has(cwd)) {
 | |
|     return checkYarn(_yarnProjects.get(cwd))
 | |
|   }
 | |
| 
 | |
|   const lockFile = path.join(cwd, 'yarn.lock')
 | |
|   const result = fs.existsSync(lockFile)
 | |
|   _yarnProjects.set(cwd, result)
 | |
|   return checkYarn(result)
 | |
| }
 | |
| 
 | |
| function checkYarn (result) {
 | |
|   if (result && !exports.hasYarn()) throw new Error(`The project seems to require yarn but it's not installed.`)
 | |
|   return result
 | |
| }
 | |
| 
 | |
| exports.hasGit = () => {
 | |
|   if (process.env.VUE_CLI_TEST) {
 | |
|     return true
 | |
|   }
 | |
|   if (_hasGit != null) {
 | |
|     return _hasGit
 | |
|   }
 | |
|   try {
 | |
|     execSync('git --version', { stdio: 'ignore' })
 | |
|     return (_hasGit = true)
 | |
|   } catch (e) {
 | |
|     return (_hasGit = false)
 | |
|   }
 | |
| }
 | |
| 
 | |
| exports.hasProjectGit = (cwd) => {
 | |
|   if (_gitProjects.has(cwd)) {
 | |
|     return _gitProjects.get(cwd)
 | |
|   }
 | |
| 
 | |
|   let result
 | |
|   try {
 | |
|     execSync('git status', { stdio: 'ignore', cwd })
 | |
|     result = true
 | |
|   } catch (e) {
 | |
|     result = false
 | |
|   }
 | |
|   _gitProjects.set(cwd, result)
 | |
|   return result
 | |
| }
 | |
| 
 | |
| let _hasPnpm
 | |
| let _pnpmVersion
 | |
| const _pnpmProjects = new LRU({
 | |
|   max: 10,
 | |
|   maxAge: 1000
 | |
| })
 | |
| 
 | |
| function getPnpmVersion () {
 | |
|   if (_pnpmVersion != null) {
 | |
|     return _pnpmVersion
 | |
|   }
 | |
|   try {
 | |
|     _pnpmVersion = execSync('pnpm --version', {
 | |
|       stdio: ['pipe', 'pipe', 'ignore']
 | |
|     }).toString()
 | |
|     // there's a critical bug in pnpm 2
 | |
|     // https://github.com/pnpm/pnpm/issues/1678#issuecomment-469981972
 | |
|     // so we only support pnpm >= 3.0.0
 | |
|     _hasPnpm = true
 | |
|   } catch (e) {}
 | |
|   return _pnpmVersion || '0.0.0'
 | |
| }
 | |
| 
 | |
| exports.hasPnpmVersionOrLater = (version) => {
 | |
|   if (process.env.VUE_CLI_TEST) {
 | |
|     return true
 | |
|   }
 | |
|   return semver.gte(getPnpmVersion(), version)
 | |
| }
 | |
| 
 | |
| exports.hasPnpm3OrLater = () => {
 | |
|   return this.hasPnpmVersionOrLater('3.0.0')
 | |
| }
 | |
| 
 | |
| exports.hasProjectPnpm = (cwd) => {
 | |
|   if (_pnpmProjects.has(cwd)) {
 | |
|     return checkPnpm(_pnpmProjects.get(cwd))
 | |
|   }
 | |
| 
 | |
|   const lockFile = path.join(cwd, 'pnpm-lock.yaml')
 | |
|   const result = fs.existsSync(lockFile)
 | |
|   _pnpmProjects.set(cwd, result)
 | |
|   return checkPnpm(result)
 | |
| }
 | |
| 
 | |
| function checkPnpm (result) {
 | |
|   if (result && !exports.hasPnpm3OrLater()) {
 | |
|     throw new Error(`The project seems to require pnpm${_hasPnpm ? ' >= 3' : ''} but it's not installed.`)
 | |
|   }
 | |
|   return result
 | |
| }
 | |
| 
 | |
| const _npmProjects = new LRU({
 | |
|   max: 10,
 | |
|   maxAge: 1000
 | |
| })
 | |
| exports.hasProjectNpm = (cwd) => {
 | |
|   if (_npmProjects.has(cwd)) {
 | |
|     return _npmProjects.get(cwd)
 | |
|   }
 | |
| 
 | |
|   const lockFile = path.join(cwd, 'package-lock.json')
 | |
|   const result = fs.existsSync(lockFile)
 | |
|   _npmProjects.set(cwd, result)
 | |
|   return result
 | |
| }
 | |
| 
 | |
| // OS
 | |
| exports.isWindows = process.platform === 'win32'
 | |
| exports.isMacintosh = process.platform === 'darwin'
 | |
| exports.isLinux = process.platform === 'linux'
 | |
| 
 | |
| const browsers = {}
 | |
| let hasCheckedBrowsers = false
 | |
| 
 | |
| function tryRun (cmd) {
 | |
|   try {
 | |
|     return execSync(cmd, {
 | |
|       stdio: [0, 'pipe', 'ignore'],
 | |
|       timeout: 10000
 | |
|     }).toString().trim()
 | |
|   } catch (e) {
 | |
|     return ''
 | |
|   }
 | |
| }
 | |
| 
 | |
| function getLinuxAppVersion (binary) {
 | |
|   return tryRun(`${binary} --version`).replace(/^.* ([^ ]*)/g, '$1')
 | |
| }
 | |
| 
 | |
| function getMacAppVersion (bundleIdentifier) {
 | |
|   const bundlePath = tryRun(`mdfind "kMDItemCFBundleIdentifier=='${bundleIdentifier}'"`)
 | |
| 
 | |
|   if (bundlePath) {
 | |
|     return tryRun(`/usr/libexec/PlistBuddy -c Print:CFBundleShortVersionString ${
 | |
|       bundlePath.replace(/(\s)/g, '\\ ')
 | |
|     }/Contents/Info.plist`)
 | |
|   }
 | |
| }
 | |
| 
 | |
| exports.getInstalledBrowsers = () => {
 | |
|   if (hasCheckedBrowsers) {
 | |
|     return browsers
 | |
|   }
 | |
|   hasCheckedBrowsers = true
 | |
| 
 | |
|   if (exports.isLinux) {
 | |
|     browsers.chrome = getLinuxAppVersion('google-chrome')
 | |
|     browsers.firefox = getLinuxAppVersion('firefox')
 | |
|   } else if (exports.isMacintosh) {
 | |
|     browsers.chrome = getMacAppVersion('com.google.Chrome')
 | |
|     browsers.firefox = getMacAppVersion('org.mozilla.firefox')
 | |
|   } else if (exports.isWindows) {
 | |
|     // get chrome stable version
 | |
|     // https://stackoverflow.com/a/51773107/2302258
 | |
|     const chromeQueryResult = tryRun(
 | |
|       'reg query "HKLM\\Software\\Google\\Update\\Clients\\{8A69D345-D564-463c-AFF1-A69D9E530F96}" /v pv /reg:32'
 | |
|     ) || tryRun(
 | |
|       'reg query "HKCU\\Software\\Google\\Update\\Clients\\{8A69D345-D564-463c-AFF1-A69D9E530F96}" /v pv /reg:32'
 | |
|     )
 | |
|     if (chromeQueryResult) {
 | |
|       const matched = chromeQueryResult.match(/REG_SZ\s+(\S*)$/)
 | |
|       browsers.chrome = matched && matched[1]
 | |
|     }
 | |
| 
 | |
|     // get firefox version
 | |
|     // https://community.spiceworks.com/topic/111518-how-to-determine-version-of-installed-firefox-in-windows-batchscript
 | |
|     const ffQueryResult = tryRun(
 | |
|       'reg query "HKLM\\Software\\Mozilla\\Mozilla Firefox" /v CurrentVersion'
 | |
|     )
 | |
|     if (ffQueryResult) {
 | |
|       const matched = ffQueryResult.match(/REG_SZ\s+(\S*)$/)
 | |
|       browsers.firefox = matched && matched[1]
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   return browsers
 | |
| }
 |