aud
Version:
Use `npx aud` instead of `npm audit`, whether you have a lockfile or not!
82 lines (76 loc) • 2.26 kB
JavaScript
;
const tmp = require('tmp');
const nodeCleanup = require('node-cleanup');
const semver = require('semver');
const colors = require('colors/safe');
const path = require('path');
const { exec, execSync } = require('child_process');
const { rmSync } = require('fs');
const { writeFile } = require('fs').promises;
const cleanupHandlers = [];
const finalCleanup = function finalCleanup() {
for (let i = 0; i < cleanupHandlers.length; ++i) {
cleanupHandlers[i]();
}
};
let rootTempDir;
const getRootTempDir = function getRootTempDir(npmNeeded, logger = () => {}) {
if (!rootTempDir) {
logger(colors.blue('Creating root temp directory, to hold temporary lockfiles...'));
rootTempDir = new Promise((resolve, reject) => {
tmp.dir((err, tmpDir, cleanup) => {
if (err) {
reject(err);
} else {
resolve(tmpDir);
cleanupHandlers.push(cleanup);
nodeCleanup(finalCleanup);
}
});
}).then((tmpDir) => {
const npmV = execSync('npm --version', { encoding: 'utf-8', cwd: tmpDir }).trim();
logger(`${colors.blue('Checking npm version:')} \`npm --version\` -> v${npmV}`);
if (!semver.satisfies(npmV, npmNeeded)) {
const pkgContents = {
private: true,
name: 'npm-jail',
dependencies: {
npm: npmNeeded,
},
};
return writeFile(
path.join(tmpDir, 'package.json'),
JSON.stringify(pkgContents),
).then(() => new Promise((resolve, reject) => {
cleanupHandlers.unshift(() => {
rmSync(path.join(tmpDir, '*'), { recursive: true, force: true });
});
exec('npm install --no-package-lock --silent >/dev/null', { cwd: tmpDir }, (err) => {
if (err) {
reject(err);
} else {
resolve(tmpDir);
}
});
}));
}
return tmpDir;
});
}
return rootTempDir;
};
module.exports = function getProjectTempDir({ npmNeeded = '^6.9.0-0', logger = undefined } = {}) {
return getRootTempDir(npmNeeded, logger).then((rootDir) => {
const projectDir = path.join(rootDir, 'XXXXXX');
return new Promise((resolve, reject) => {
tmp.dir({ template: projectDir }, (err, tmpDir, cleanup) => {
if (err) {
reject(err);
} else {
resolve(tmpDir);
cleanupHandlers.unshift(cleanup);
}
});
});
});
};