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('yarnpkg --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 _hasPnpm3orLater const _pnpmProjects = new LRU({ max: 10, maxAge: 1000 }) exports.hasPnpm3OrLater = () => { if (process.env.VUE_CLI_TEST) { return true } if (_hasPnpm3orLater != null) { return _hasPnpm3orLater } try { const 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 _hasPnpm3orLater = semver.gte(pnpmVersion, '3.0.0') return _hasPnpm3orLater } catch (e) { return (_hasPnpm3orLater = false) } } 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 } // OS exports.isWindows = process.platform === 'win32' exports.isMacintosh = process.platform === 'darwin' exports.isLinux = process.platform === 'linux'