Select Git revision
-
Rhys Arkins authoredRhys Arkins authored
npm.js 3.42 KiB
const fs = require('fs');
const cp = require('child_process');
const tmp = require('tmp');
const path = require('path');
let logger = require('../../logger');
module.exports = {
generateLockFile,
getLockFile,
maintainLockFile,
};
async function generateLockFile(newPackageJson, npmrcContent) {
logger.debug('Generating new package-lock.json file');
const tmpDir = tmp.dirSync({ unsafeCleanup: true });
let packageLock;
try {
fs.writeFileSync(path.join(tmpDir.name, 'package.json'), newPackageJson);
if (npmrcContent) {
fs.writeFileSync(path.join(tmpDir.name, '.npmrc'), npmrcContent);
}
logger.debug('Spawning npm install');
const result = cp.spawnSync('npm', ['install', '--ignore-scripts'], {
cwd: tmpDir.name,
shell: true,
});
logger.debug(
{ stdout: String(result.stdout), stderr: String(result.stderr) },
'npm install complete'
);
packageLock = fs.readFileSync(path.join(tmpDir.name, 'package-lock.json'));
} catch (error) /* istanbul ignore next */ {
try {
tmpDir.removeCallback();
} catch (err2) {
logger.warn(`Failed to remove tmpDir ${tmpDir.name}`);
}
throw error;
}
try {
tmpDir.removeCallback();
} catch (err2) {
logger.warn(`Failed to remove tmpDir ${tmpDir.name}`);
}
return packageLock;
}
async function getLockFile(
packageFile,
packageContent,
api,
npmVersion,
parentLogger
) {
logger = parentLogger || logger;
// Detect if a package-lock.json file is in use
const packageLockFileName = path.join(
path.dirname(packageFile),
'package-lock.json'
);
if (!await api.getFileContent(packageLockFileName)) {
return null;
}
if (npmVersion === '') {
throw new Error(
'Need to generate package-lock.json but npm is not installed'
);
}
// TODO: have a more forwards-compatible check