system_assignation/node_modules/yarn-or-npm/index.js

86 lines
1.8 KiB
JavaScript
Raw Normal View History

2022-03-24 09:22:39 -04:00
const fs = require('fs');
const path = require('path');
const crossSpawn = require('cross-spawn');
const pkgDir = require('pkg-dir');
let cachedHasYarn;
let cachedHasNPM;
let cachedClient;
function clearCache() {
cachedHasYarn = undefined;
cachedHasNPM = undefined;
cachedClient = undefined;
}
function hasYarn() {
if (cachedHasYarn !== undefined) return cachedHasYarn;
try {
const cmd = crossSpawn.sync('yarn', ['--version']);
const version = cmd.stdout && cmd.stdout.toString().trim();
cachedHasYarn = !!version;
} catch (e) {
cachedHasYarn = false;
}
return cachedHasYarn;
}
function hasNpm() {
if (cachedHasNPM !== undefined) return cachedHasNPM;
try {
const cmd = crossSpawn.sync('npm', ['--version']);
const version = cmd.stdout && cmd.stdout.toString().trim();
cachedHasNPM = !!version;
} catch (e) {
cachedHasNPM = false;
}
return cachedHasNPM;
}
function yarnOrNpm() {
if (cachedClient !== undefined) return cachedClient;
const pkgRoot = pkgDir.sync();
if (pkgRoot) {
const pkgLockPath = path.join(pkgRoot, 'package-lock.json');
const yarnLockPath = path.join(pkgRoot, 'yarn.lock');
try {
fs.statSync(yarnLockPath);
cachedClient = 'yarn';
return cachedClient;
} catch (e) {}
try {
fs.statSync(pkgLockPath);
cachedClient = 'npm';
return cachedClient;
} catch (e) {}
}
return hasYarn() ? 'yarn' : 'npm';
}
function spawn(...args) {
args.unshift(yarnOrNpm());
return crossSpawn(...args);
}
function spawnSync(...args) {
args.unshift(yarnOrNpm());
return crossSpawn.sync(...args);
}
yarnOrNpm.hasYarn = hasYarn;
yarnOrNpm.hasNpm = hasNpm;
yarnOrNpm.spawn = spawn;
yarnOrNpm.spawn.sync = spawnSync;
yarnOrNpm.clearCache = clearCache;
module.exports = yarnOrNpm;