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