123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218 |
- 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
- }
|