autoinst
Version:
Automatically install missing dependencies!
58 lines (50 loc) • 1.47 kB
JavaScript
;
const fs = require('fs');
const path = require('path');
const cp = require('child_process');
const prefix = '[autoinst]';
const { cmd, installer } = (function () {
let yarn;
try {
cp.execSync('yarn --version', { stdio: 'ignore' });
yarn = true;
} catch (err) {
yarn = false;
}
return {
cmd: yarn ? 'yarn add' : 'npm install',
installer: yarn ? '[yarn]' : '[npm]'
};
})();
const _require = require;
require = function require (dep) {
if (!fs.existsSync(module.parent.paths[0])) {
fs.mkdirSync(module.parent.paths[0]);
}
try {
module.parent.require(dep);
} catch (err) {
console.error(`${prefix} ${err.name}: ${err.message}`);
console.log(`${prefix} ${installer} installing: '${dep}'`);
try {
cp.execSync(`${cmd} ${dep}`, { stdio: 'ignore' });
} catch (err) {
console.error(`${prefix} ${installer} error: '${dep}'`);
console.error(`${prefix} message: ${err.name}: ${err.message}`);
console.error(`${prefix} exit code: ${err.status}`);
process.exit();
}
console.log(`${prefix} ok: '${dep}'`);
cp.spawnSync(
process.argv[0], [
...process.argv.slice(1),
...process.execArgv
], { stdio: 'inherit' });
process.exit();
}
return module.parent.require(dep);
};
Object.keys(_require).forEach(key => {
require[key] = typeof _require[key] === 'function' ? _require[key].bind(_require) : _require[key];
});
module.exports = require;