deadcode
Version:
Deadcode shows you source files that are not required
351 lines (293 loc) • 12.2 kB
JavaScript
;
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports["default"] = void 0;
var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
var babel = _interopRequireWildcard(require("@babel/core"));
var _fs = _interopRequireDefault(require("fs"));
var _path = _interopRequireDefault(require("path"));
var _glob = _interopRequireDefault(require("glob"));
var _minimatch = _interopRequireDefault(require("minimatch"));
var _traverse = _interopRequireDefault(require("./traverse"));
var promisify = function promisify(func) {
return function () {
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
args[_key] = arguments[_key];
}
return new Promise(function (resolve, reject) {
func.apply(void 0, args.concat([function (error) {
if (error) {
reject(error);
} else {
for (var _len2 = arguments.length, rest = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
rest[_key2 - 1] = arguments[_key2];
}
resolve.apply(void 0, rest);
}
}]));
});
};
};
var readFileAsync = promisify(_fs["default"].readFile);
var globAsync = promisify(_glob["default"]);
var none = function none() {};
var getDeadFiles =
/*#__PURE__*/
function () {
var _ref2 = (0, _asyncToGenerator2["default"])(
/*#__PURE__*/
_regenerator["default"].mark(function _callee(_ref) {
var _ref$entry, entry, _ref$include, include, _ref$ignore, ignore, _ref$onTraverseFile, onTraverseFile, _ref3, dependencies, dynamicDependencies, unparsedDependencies, unresolvedDependencies, ignoredDependencies, includedFiles, deadFiles;
return _regenerator["default"].wrap(function _callee$(_context) {
while (1) {
switch (_context.prev = _context.next) {
case 0:
_ref$entry = _ref.entry, entry = _ref$entry === void 0 ? [] : _ref$entry, _ref$include = _ref.include, include = _ref$include === void 0 ? babel.DEFAULT_EXTENSIONS.map(function (ext) {
return "".concat(process.cwd(), "/**/*").concat(ext);
}) : _ref$include, _ref$ignore = _ref.ignore, ignore = _ref$ignore === void 0 ? ["**/node_modules/**"] : _ref$ignore, _ref$onTraverseFile = _ref.onTraverseFile, onTraverseFile = _ref$onTraverseFile === void 0 ? none : _ref$onTraverseFile;
if (!Array.isArray(entry)) {
entry = [entry];
}
if (!Array.isArray(include)) {
include = [include];
}
if (!Array.isArray(ignore)) {
ignore = [ignore];
}
_context.next = 6;
return getDependencies({
entry: entry,
ignore: ignore,
onTraverseFile: onTraverseFile
});
case 6:
_ref3 = _context.sent;
dependencies = _ref3.dependencies;
dynamicDependencies = _ref3.dynamicDependencies;
unparsedDependencies = _ref3.unparsedDependencies;
unresolvedDependencies = _ref3.unresolvedDependencies;
ignoredDependencies = _ref3.ignoredDependencies;
_context.next = 14;
return getIncludedFiles({
include: include,
ignore: ignore
});
case 14:
includedFiles = _context.sent;
deadFiles = includedFiles.filter(function (file) {
return dependencies.indexOf(file) === -1;
});
return _context.abrupt("return", {
deadFiles: deadFiles,
dependencies: dependencies,
dynamicDependencies: dynamicDependencies,
unparsedDependencies: unparsedDependencies,
unresolvedDependencies: unresolvedDependencies,
ignoredDependencies: ignoredDependencies
});
case 17:
case "end":
return _context.stop();
}
}
}, _callee);
}));
return function getDeadFiles(_x) {
return _ref2.apply(this, arguments);
};
}();
var getDependencies =
/*#__PURE__*/
function () {
var _ref5 = (0, _asyncToGenerator2["default"])(
/*#__PURE__*/
_regenerator["default"].mark(function _callee3(_ref4) {
var entry, ignore, onTraverseFile, traverseStack, dependencies, dynamicDependencies, unparsedDependencies, unresolvedDependencies, ignoredDependencies, traverseNext;
return _regenerator["default"].wrap(function _callee3$(_context3) {
while (1) {
switch (_context3.prev = _context3.next) {
case 0:
entry = _ref4.entry, ignore = _ref4.ignore, onTraverseFile = _ref4.onTraverseFile;
_context3.next = 3;
return Promise.all(entry.map(function (filename) {
return require.resolve(_path["default"].resolve(process.cwd(), filename));
}));
case 3:
traverseStack = _context3.sent;
dependencies = [];
dynamicDependencies = [];
unparsedDependencies = [];
unresolvedDependencies = [];
ignoredDependencies = [];
traverseNext =
/*#__PURE__*/
function () {
var _ref6 = (0, _asyncToGenerator2["default"])(
/*#__PURE__*/
_regenerator["default"].mark(function _callee2() {
var filename, dirname, src, res, ast;
return _regenerator["default"].wrap(function _callee2$(_context2) {
while (1) {
switch (_context2.prev = _context2.next) {
case 0:
if (traverseStack.length) {
_context2.next = 2;
break;
}
return _context2.abrupt("return");
case 2:
filename = traverseStack.shift();
if (!ignore.find(function (pattern) {
return (0, _minimatch["default"])(filename, pattern);
})) {
_context2.next = 6;
break;
}
ignoredDependencies.push(filename);
return _context2.abrupt("return", traverseNext());
case 6:
dirname = _path["default"].dirname(filename);
_context2.next = 9;
return readFileAsync(filename, "UTF-8")["catch"](function () {});
case 9:
src = _context2.sent;
dependencies.push(filename);
onTraverseFile(filename);
_context2.prev = 12;
_context2.next = 15;
return (0, babel.parseAsync)(src, {
filename: filename
});
case 15:
ast = _context2.sent;
res = (0, _traverse["default"])(ast);
_context2.next = 23;
break;
case 19:
_context2.prev = 19;
_context2.t0 = _context2["catch"](12);
unparsedDependencies.push(filename);
return _context2.abrupt("return", traverseNext());
case 23:
res.dependencies.forEach(function (dependency) {
var filename;
try {
if (dependency.match(/^[.\/]/)) {
filename = require.resolve(_path["default"].join(dirname, dependency));
} else {
filename = require.resolve(dependency);
}
} catch (error) {
if (unresolvedDependencies.indexOf(dependency) === -1) {
unresolvedDependencies.push(dependency);
}
return;
}
if (traverseStack.indexOf(filename) === -1 && dependencies.indexOf(filename) === -1) {
traverseStack.push(filename);
}
});
if (res.dynamicDependencies.length) {
dynamicDependencies.push(filename);
}
_context2.next = 27;
return traverseNext();
case 27:
case "end":
return _context2.stop();
}
}
}, _callee2, null, [[12, 19]]);
}));
return function traverseNext() {
return _ref6.apply(this, arguments);
};
}();
_context3.next = 12;
return traverseNext();
case 12:
return _context3.abrupt("return", {
dependencies: dependencies,
dynamicDependencies: dynamicDependencies,
unparsedDependencies: unparsedDependencies,
unresolvedDependencies: unresolvedDependencies,
ignoredDependencies: ignoredDependencies
});
case 13:
case "end":
return _context3.stop();
}
}
}, _callee3);
}));
return function getDependencies(_x2) {
return _ref5.apply(this, arguments);
};
}();
var getIncludedFiles =
/*#__PURE__*/
function () {
var _ref8 = (0, _asyncToGenerator2["default"])(
/*#__PURE__*/
_regenerator["default"].mark(function _callee5(_ref7) {
var include, ignore, files;
return _regenerator["default"].wrap(function _callee5$(_context5) {
while (1) {
switch (_context5.prev = _context5.next) {
case 0:
include = _ref7.include, ignore = _ref7.ignore;
files = [];
_context5.next = 4;
return Promise.all(include.map(
/*#__PURE__*/
function () {
var _ref9 = (0, _asyncToGenerator2["default"])(
/*#__PURE__*/
_regenerator["default"].mark(function _callee4(pattern) {
return _regenerator["default"].wrap(function _callee4$(_context4) {
while (1) {
switch (_context4.prev = _context4.next) {
case 0:
_context4.next = 2;
return globAsync(pattern, {
ignore: ignore,
realpath: true,
nodir: true
});
case 2:
_context4.t0 = function (file) {
if (files.indexOf(file) === -1) {
files.push(file);
}
};
_context4.sent.forEach(_context4.t0);
case 4:
case "end":
return _context4.stop();
}
}
}, _callee4);
}));
return function (_x4) {
return _ref9.apply(this, arguments);
};
}()));
case 4:
return _context5.abrupt("return", files);
case 5:
case "end":
return _context5.stop();
}
}
}, _callee5);
}));
return function getIncludedFiles(_x3) {
return _ref8.apply(this, arguments);
};
}();
var _default = getDeadFiles;
exports["default"] = _default;