Skip to content
This repository has been archived by the owner on Nov 15, 2018. It is now read-only.

Run function refactored #103

Merged
merged 3 commits into from
May 12, 2017
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
46 changes: 8 additions & 38 deletions bin/cli.js
Original file line number Diff line number Diff line change
@@ -1,62 +1,32 @@
'use strict';
const path = require('path');
const reader = require('../lib/reader');
const searcher = require('../lib/searcher');
const reporter = require('../lib/reporter');
const log = require('../lib/log-color');
const builder = require('../lib/dependency-builder');

module.exports = function run (directory, options) {
return new Promise((resolve, reject) => {
options = options || {};
let packageJson;
options = options || {};

try {
packageJson = reader.getFileLines(`${directory}/package.json`);
} catch (e) {
const error = 'package.json is require';
log.red(error);
return reject(error);
}
const dependencies = searcher.searchDependencies(packageJson, options.dev);
const files = searcher.searchJsFiles(directory, [], options.ignore);
const result = [];
const missingDependencies = new Set();
const requires = new Set();
files.forEach(file => {
const lines = reader.getFileLines(file);
if (options.summary) {
const missing = searcher.searchMissingDependencies(lines, dependencies);
if (missing.length) {
missingDependencies.add(missing.toString());
}
}
const declarations = searcher.searchDeclarations(lines, dependencies[0]);
const require = searcher.searchRequires(lines);
if (require.length) {
require.forEach(r => {
let m = null;
if (r.includes('"')) {
m = r.split('"')[1];
} else if (r.includes("'")) {
m = r.split("'")[1];
} else {
return;
}
m = m.trim();
const dirFile = path.dirname(file);
const completePath = path.resolve(dirFile, m);
requires.add(path.relative(process.cwd(), completePath));
});
}

const usage = searcher.searchUsage(lines, file, declarations);
if (usage.length) {
result.push(usage);
}
});
const files = searcher.searchJsFiles(directory, [], options.ignore);
const dependencies = builder.buildDependencies(packageJson, options);
const result = builder.buildResult(files, dependencies);
const requires = builder.buildRequires(files);

const jsonReport = reporter.jsonReport(result, dependencies, requires);

if (options.summary) {
const missingDependencies = new Set(builder.buildMissingDependencies(files, dependencies));
reporter.summary(jsonReport, Array.from(missingDependencies));
} else {
if (jsonReport.unused !== 'None.' && options.ci) {
Expand Down
59 changes: 59 additions & 0 deletions lib/dependency-builder.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
'use strict';
const path = require('path');
const reader = require('./reader');
const searcher = require('./searcher');

function buildDependencies (packageJson, options) {
return searcher.searchDependencies(packageJson, options.dev);
}

function buildRequires (files) {
const requires = new Set();
files.forEach(file => {
const lines = reader.getFileLines(file);
const require = searcher.searchRequires(lines).filter(e => e != null);
if (require.length) {
require.forEach(r => {
const requireText = searcher.getTextFromRequire(r);
if (requireText) {
const dirFile = path.dirname(file);
const completePath = path.resolve(dirFile, requireText);
requires.add(path.relative(process.cwd(), completePath));
}
});
}
});
return requires;
}

function buildResult (files, dependencies) {
const result = [];
files.filter(file => {
const lines = reader.getFileLines(file);
const declarations = searcher.searchDeclarations(lines, dependencies[0]);
const usage = searcher.searchUsage(lines, file, declarations);
if (usage.length) {
result.push(usage);
}
});
return result;
}

function buildMissingDependencies (files, dependencies) {
const missingDependencies = files
.filter(file => {
const lines = reader.getFileLines(file);
const missing = searcher.searchMissingDependencies(lines, dependencies);
return missing.length > 0;
})
.map(file => file.toString());

return new Set(missingDependencies);
}

module.exports = {
buildDependencies,
buildRequires,
buildResult,
buildMissingDependencies
};
2 changes: 1 addition & 1 deletion lib/reporter.js
Original file line number Diff line number Diff line change
Expand Up @@ -214,7 +214,7 @@ function summary (jsonReport, missing) {
log.red(jsonReport.unused.map(dependency => dependency.name));

header('[ Missing dependencies ]');
if (missing.length) {
if (missing && missing.length) {
log.red(missing);
} else {
log.red('None.');
Expand Down
10 changes: 8 additions & 2 deletions lib/searcher.js
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,12 @@ function getRequireFromLine (l) {
* @return {String}
*/
function getTextFromRequire (req) {
return req.match(/["'](.*?)["']/)[1];
const match = req.match(/["'](.*?)["']/);
if (match && match.length >= 1) {
return match[1];
} else {
return null;
}
}

function searchMissingDependencies (lines, dependencies) {
Expand Down Expand Up @@ -189,5 +194,6 @@ module.exports = {
searchUsage,
searchMissingDependencies,
searchRequires,
searchJsFiles
searchJsFiles,
getTextFromRequire
};
2 changes: 1 addition & 1 deletion test/szero-test.js
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ test('Should find javascript files.', (t) => {
test('Should find javascript files ignoring some directories.', (t) => {
t.plan(2);
const files = searcher.searchJsFiles(path.join(__dirname, '../.'), [], ['fixtures', 'sample_project']);
t.equal(files.length, 11, `szero project has ${files.length} .js files, excluding fixtures and sample_project directories.`);
t.equal(files.length, 12, `szero project has ${files.length} .js files, excluding fixtures and sample_project directories.`);
t.equal(files.toString().includes('reader.js'), true, 'reader.js file was found.');
t.end();
});
Expand Down