Spaces:
Sleeping
Sleeping
| 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 | |
| } | |