Skip to content

Commit

Permalink
chore: improve performance by caching loads to package.json
Browse files Browse the repository at this point in the history
  • Loading branch information
satazor committed Sep 25, 2018
1 parent 3908fb7 commit 1e47e9d
Show file tree
Hide file tree
Showing 13 changed files with 55 additions and 34 deletions.
31 changes: 28 additions & 3 deletions index.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,30 @@
'use strict';

const fs = require('fs');
const path = require('path');
const loadJsonFile = require('load-json-file');
const requireDirectory = require('require-directory');
const detectors = requireDirectory(module, './lib', { recurse: false });

function createLoadPackageJson(dir) {
let packageJsonPromise;

return () => {
if (!packageJsonPromise) {
packageJsonPromise = loadJsonFile(path.join(dir, 'package.json'))
.catch((err) => {
if (err.code === 'ENOENT') {
return null;
}

throw err;
});
}

return packageJsonPromise;
};
}

function detectRepoLinters(dir) {
// Check if dir exists
return new Promise((resolve, reject) => {
Expand All @@ -17,9 +38,13 @@ function detectRepoLinters(dir) {
})
// Run the linter detectors and build the results
.then(() => {
return Promise.all(Object.keys(detectors)
.map((name) => detectors[name](dir)
.then((detected) => detected && name)));
const loadPackageJson = createLoadPackageJson(dir);

return Promise.all(
Object.keys(detectors)
.map((name) => detectors[name](dir, loadPackageJson)
.then((detected) => detected && name))
);
})
.then((linters) => linters.filter((linter) => linter));
}
Expand Down
4 changes: 2 additions & 2 deletions lib/coffeelint.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,13 @@ const path = require('path');
const tryFiles = require('./util/tryFiles');
const tryPackageJson = require('./util/tryPackageJson');

function detectCoffeeLint(dir) {
function detectCoffeeLint(dir, loadPackageJson) {
const paths = ['coffeelint.json']
.map((entry) => path.join(dir, entry));

return Promise.all([
tryFiles(paths),
tryPackageJson(dir, ['coffeelintConfig', 'devDependencies.coffeelint']),
tryPackageJson(loadPackageJson, ['coffeelintConfig', 'devDependencies.coffeelint']),
])
.then((booleans) => booleans.some((bool) => bool));
}
Expand Down
4 changes: 2 additions & 2 deletions lib/csslint.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,13 @@ const path = require('path');
const tryFiles = require('./util/tryFiles');
const tryPackageJson = require('./util/tryPackageJson');

function detectCssLint(dir) {
function detectCssLint(dir, loadPackageJson) {
const paths = ['.csslintrc']
.map((entry) => path.join(dir, entry));

return Promise.all([
tryFiles(paths),
tryPackageJson(dir, ['devDependencies.csslint']),
tryPackageJson(loadPackageJson, ['devDependencies.csslint']),
])
.then((booleans) => booleans.some((bool) => bool));
}
Expand Down
4 changes: 2 additions & 2 deletions lib/eslint.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,13 @@ const path = require('path');
const tryFiles = require('./util/tryFiles');
const tryPackageJson = require('./util/tryPackageJson');

function detectEslint(dir) {
function detectEslint(dir, loadPackageJson) {
const paths = ['.eslintrc.js', '.eslintrc.yaml', '.eslintrc.yml', '.eslintrc.json', '.eslintrc']
.map((entry) => path.join(dir, entry));

return Promise.all([
tryFiles(paths),
tryPackageJson(dir, ['devDependencies.eslint', 'eslintConfig', 'eslintIgnore']),
tryPackageJson(loadPackageJson, ['devDependencies.eslint', 'eslintConfig', 'eslintIgnore']),
])
.then((booleans) => booleans.some((bool) => bool));
}
Expand Down
4 changes: 2 additions & 2 deletions lib/htmlhint.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,13 @@ const path = require('path');
const tryFiles = require('./util/tryFiles');
const tryPackageJson = require('./util/tryPackageJson');

function detectHtmlHint(dir) {
function detectHtmlHint(dir, loadPackageJson) {
const paths = ['.htmlhintrc']
.map((entry) => path.join(dir, entry));

return Promise.all([
tryFiles(paths),
tryPackageJson(dir, ['devDependencies.htmlhint']),
tryPackageJson(loadPackageJson, ['devDependencies.htmlhint']),
])
.then((booleans) => booleans.some((bool) => bool));
}
Expand Down
4 changes: 2 additions & 2 deletions lib/jscs.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,13 @@ const path = require('path');
const tryFiles = require('./util/tryFiles');
const tryPackageJson = require('./util/tryPackageJson');

function detectJscs(dir) {
function detectJscs(dir, loadPackageJson) {
const paths = ['.jscsrc', '.jscs.json']
.map((entry) => path.join(dir, entry));

return Promise.all([
tryFiles(paths),
tryPackageJson(dir, ['jscsConfig']),
tryPackageJson(loadPackageJson, ['jscsConfig']),
])
.then((booleans) => booleans.some((bool) => bool));
}
Expand Down
4 changes: 2 additions & 2 deletions lib/jshint.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,13 @@ const path = require('path');
const tryFiles = require('./util/tryFiles');
const tryPackageJson = require('./util/tryPackageJson');

function detectJsHint(dir) {
function detectJsHint(dir, loadPackageJson) {
const paths = ['.jshintrc']
.map((entry) => path.join(dir, entry));

return Promise.all([
tryFiles(paths),
tryPackageJson(dir, ['devDependencies.jshint', 'jshintConfig']),
tryPackageJson(loadPackageJson, ['devDependencies.jshint', 'jshintConfig']),
])
.then((booleans) => booleans.some((bool) => bool));
}
Expand Down
4 changes: 2 additions & 2 deletions lib/prettier.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,13 @@ const path = require('path');
const tryFiles = require('./util/tryFiles');
const tryPackageJson = require('./util/tryPackageJson');

function detectPrettierLint(dir) {
function detectPrettierLint(dir, loadPackageJson) {
const paths = ['.prettierrc', '.prettierrc.yaml', '.prettierrc.yml', '.prettierrc.json', '.prettierrc.js', 'prettier.config.js']
.map((entry) => path.join(dir, entry));

return Promise.all([
tryFiles(paths),
tryPackageJson(dir, ['devDependencies.prettier', 'prettier']),
tryPackageJson(loadPackageJson, ['devDependencies.prettier', 'prettier']),
])
.then((booleans) => booleans.some((bool) => bool));
}
Expand Down
4 changes: 2 additions & 2 deletions lib/standard.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@

const tryPackageJson = require('./util/tryPackageJson');

function detectStandardLint(dir) {
return tryPackageJson(dir, ['devDependencies.standard', 'standard']);
function detectStandardLint(dir, loadPackageJson) {
return tryPackageJson(loadPackageJson, ['devDependencies.standard', 'standard']);
}

module.exports = detectStandardLint;
4 changes: 2 additions & 2 deletions lib/stylelint.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,13 @@ const path = require('path');
const tryFiles = require('./util/tryFiles');
const tryPackageJson = require('./util/tryPackageJson');

function detectStyleLint(dir) {
function detectStyleLint(dir, loadPackageJson) {
const paths = ['.stylelintrc.js', '.stylelintrc.yaml', '.stylelintrc.json', '.stylelintrc']
.map((entry) => path.join(dir, entry));

return Promise.all([
tryFiles(paths),
tryPackageJson(dir, ['devDependencies.stylelint', 'stylelint']),
tryPackageJson(loadPackageJson, ['devDependencies.stylelint', 'stylelint']),
])
.then((booleans) => booleans.some((bool) => bool));
}
Expand Down
4 changes: 2 additions & 2 deletions lib/tslint.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,13 @@ const path = require('path');
const tryFiles = require('./util/tryFiles');
const tryPackageJson = require('./util/tryPackageJson');

function detectTsLint(dir) {
function detectTsLint(dir, loadPackageJson) {
const paths = ['tslint.json']
.map((entry) => path.join(dir, entry));

return Promise.all([
tryFiles(paths),
tryPackageJson(dir, ['devDependencies.tslint']),
tryPackageJson(loadPackageJson, ['devDependencies.tslint']),
])
.then((booleans) => booleans.some((bool) => bool));
}
Expand Down
14 changes: 5 additions & 9 deletions lib/util/tryPackageJson.js
Original file line number Diff line number Diff line change
@@ -1,19 +1,15 @@
'use strict';

const path = require('path');
const loadJsonFile = require('load-json-file');
const get = require('lodash.get');

function tryPackageJson(dir, props) {
return loadJsonFile(path.join(dir, 'package.json'))
.then((json) => {
return props.some((prop) => get(json, prop));
}, (err) => {
if (err.code === 'ENOENT') {
function tryPackageJson(loadPackageJson, props) {
return loadPackageJson()
.then((packageJson) => {
if (!packageJson) {
return false;
}

throw err;
return props.some((prop) => get(packageJson, prop));
});
}

Expand Down
4 changes: 2 additions & 2 deletions lib/xo.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@

const tryPackageJson = require('./util/tryPackageJson');

function detectXOLint(dir) {
return tryPackageJson(dir, ['devDependencies.xo', 'xo']);
function detectXOLint(dir, loadPackageJson) {
return tryPackageJson(loadPackageJson, ['devDependencies.xo', 'xo']);
}

module.exports = detectXOLint;

0 comments on commit 1e47e9d

Please sign in to comment.