UNPKG

deadcode

Version:

Deadcode shows you source files that are not required

351 lines (293 loc) 12.2 kB
"use strict"; 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;