diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 0000000..bb612a0 --- /dev/null +++ b/.eslintrc @@ -0,0 +1,27 @@ +{ + "root": true, + "extends": "@ljharb", + "parserOptions": { + "ecmaVersion": "2018" + }, + "env": { + "es6": true + }, + "rules": { + "consistent-return": 1, + "dot-notation": [2, { "allowKeywords": true }], + "func-name-matching": 0, + "max-nested-callbacks": 0, + "max-params": [2, 4], + "no-console": 0, + "sort-keys": 0, + }, + "overrides": [ + { + "files": "test*", + "rules": { + "max-nested-callbacks": 0, + }, + }, + ], +} diff --git a/bin.js b/bin.js index 812c995..5abf018 100755 --- a/bin.js +++ b/bin.js @@ -13,27 +13,33 @@ const { filename } = finder(process.cwd()).next(); const getLockfile = require('./getLockfile'); -const { argv: { output, date, package: pkg } } = require('yargs') +const { + argv: { + output, + date, + 'package': pkg + } +} = require('yargs') .help() .option('date', { type: 'string', describe: '“now”, or a date (same format as `new Date()`)', demandOption: true, - coerce(arg) { return arg === 'now' ? arg : new Date(arg); }, + coerce: function (arg) { return arg === 'now' ? arg : new Date(arg); } }) .option('package', { type: 'string', describe: 'path to a `package.json` file', normalize: true, - coerce(arg) { return path.resolve(arg); }, + coerce: function (arg) { return path.resolve(arg); } }) .default('package', filename, path.relative(process.cwd(), filename)) .option('output', { alias: 'o', describe: 'output file path', normalize: true, - demandOption: true, - }) + demandOption: true + }); getLockfile(pkg, date === 'now' ? undefined : date, console.log.bind(console)) .then(lockfile => writeFile(output, lockfile)) diff --git a/getLockfile.js b/getLockfile.js index c8ce708..c8cbb9b 100644 --- a/getLockfile.js +++ b/getLockfile.js @@ -28,11 +28,14 @@ module.exports = function getLockfile(packageFile, date, logger = () => {}) { return Promise.all([tmpDirP, copyPkg]).then(([tmpDir]) => new Promise((resolve, reject) => { const PATH = path.join(tmpDir, '../node_modules/.bin'); logger(chalk.blue(`Running npm install to create lockfile for ${dateStr}...`)); - exec(`PATH=${PATH}:\$PATH npm install --package-lock-only --before=${dateStr}`, { cwd: tmpDir }, (err) => { - if (err) { reject(err); } - else { resolve(tmpDir); } + exec(`PATH=${PATH}:$PATH npm install --package-lock-only --before=${dateStr}`, { cwd: tmpDir }, err => { + if (err) { + reject(err); + } else { + resolve(tmpDir); + } }); - })).then((tmpDir) => { + })).then(tmpDir => { logger(chalk.blue(`Reading lockfile contents for ${dateStr}...`)); const lockfile = path.join(tmpDir, 'package-lock.json'); return readFile(lockfile, { encoding: 'utf-8' }); diff --git a/getProjectTempDir.js b/getProjectTempDir.js index c5332d9..f3bb4c1 100644 --- a/getProjectTempDir.js +++ b/getProjectTempDir.js @@ -13,26 +13,28 @@ const writeFile = promisify(require('fs').writeFile); const npmNeeded = '^6.9.0-0'; const pkgContents = { - private: true, + 'private': true, name: 'npm-jail', dependencies: { - npm: npmNeeded, + npm: npmNeeded } }; const cleanupHandlers = []; -function finalCleanup() { +const finalCleanup = function finalCleanup() { for (let i = 0; i < cleanupHandlers.length; ++i) { cleanupHandlers[i](); } -} +}; let rootTempDir; -function getRootTempDir(logger = () => {}) { +const getRootTempDir = function getRootTempDir(logger = () => {}) { if (!rootTempDir) { logger(chalk.blue('Creating root temp directory, to hold temporary lockfiles...')); rootTempDir = new Promise((resolve, reject) => tmp.dir((err, tmpDir, cleanup) => { - if (err) { return reject(err); } + if (err) { + return reject(err); + } resolve(tmpDir); cleanupHandlers.push(cleanup); nodeCleanup(finalCleanup); @@ -44,9 +46,13 @@ function getRootTempDir(logger = () => {}) { path.join(tmpDir, 'package.json'), JSON.stringify(pkgContents) ).then(() => new Promise((resolve, reject) => { - cleanupHandlers.unshift(() => { rimraf.sync(path.join(tmpDir, '*')); }); - exec(`npm install --no-package-lock --silent >/dev/null`, { cwd: tmpDir }, (err) => { - if (err) { return reject(err); } + cleanupHandlers.unshift(() => { + rimraf.sync(path.join(tmpDir, '*')); + }); + exec('npm install --no-package-lock --silent >/dev/null', { cwd: tmpDir }, err => { + if (err) { + return reject(err); + } resolve(tmpDir); }); })); @@ -55,13 +61,15 @@ function getRootTempDir(logger = () => {}) { }); } return rootTempDir; -} +}; module.exports = function getProjectTempDir(logger = undefined) { return getRootTempDir(logger).then(rootDir => { const projectDir = path.join(rootDir, 'XXXXXX'); return new Promise((resolve, reject) => tmp.dir({ template: projectDir }, (err, tmpDir, cleanup) => { - if (err) { return reject(err); } + if (err) { + return reject(err); + } resolve(tmpDir); cleanupHandlers.unshift(cleanup); })); diff --git a/package.json b/package.json index e449ceb..bfd94cb 100644 --- a/package.json +++ b/package.json @@ -4,6 +4,8 @@ "description": "Safely generate an npm lockfile and output it to the filename of your choice.", "bin": "./bin.js", "scripts": { + "lint": "eslint .", + "pretest": "npm run lint", "test": "echo \"Error: no test specified\" && exit 1" }, "repository": { @@ -38,5 +40,10 @@ }, "engines": { "node": ">= 6" + }, + "devDependencies": { + "@ljharb/eslint-config": "^13.1.1", + "eslint": "^5.14.1", + "tape": "^4.10.1" } }