You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
218 lines
5.2 KiB
218 lines
5.2 KiB
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 |
|
}
|
|
|